_EDA技术与VHDL第三章课后习题答案及相关考试题目(南师大)(第3版)潘松_黄继业
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第3章 VHDL基础
3-1:画出与下例实体描述对应的原理图符号元件:
ENTITY buf3s IS -- 实体1:三态缓冲器
PORT (input : IN STD_LOGIC ; -- 输入端
enable : IN STD_LOGIC ; -- 使能端
output : OUT STD_LOGIC ) ; -- 输出端
END buf3x ;
ENTITY mux21 IS --实体2: 2 选1 多路选择器
PORT (in0, in1, sel : IN STD_LOGIC;
output : OUT STD_LOGIC);
3-1.答案
3-2. 图3-30 所示的是4 选1 多路选择器,试分别用IF_THEN 语句和CASE 语句的表达方式写出此电路的VHDL 程序。
选择控制的信号s1 和s0 的数据类型为STD_LOGIC_VECTOR;当s1='0',s0='0';s1='0',s0='1';s1='1',s0='0'
和s1='1',s0='1'分别执行y<=a、y<=b、y<=c、y<=d。
3-2.答案
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY MUX41 IS
PORT(s:IN STD_LOGIC_VECTOR(1 DOWNTO 0); --输入选择信号
a,b,c,d:IN STD_LOGIC; --输入信号
y:OUT STD_LOGIC);--输出端
END ENTITY;
ARCHITECTURE ART OF MUX41 IS
BEGIN
PROCESS(s)
BEGIN
IF (S="00") THEN y<=a;
ELSIF (S="01") TH EN y<=b;
ELSIF (S="10") TH EN y<=c;
ELSIF (S="11") TH EN y<=d;
ELSE y<=NULL;
END IF;
EDN PROCESS;
END ART;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY MUX41 IS
PORT(s:IN STD_LOGIC_VECTOR(1 DOWNTO 0); --输入选择信号
a,b,c,d:IN STD_LOGIC; --输入信号
y:OUT STD_LOGIC);--输出端
END MUX41;
ARCHITECTURE ART OF MUX41 IS
BEGIN
PROCESS(s)
BEGIN
CASE s IS
WHEN “00” => y<=a;
WHEN “01” => y<=b;
WHEN “10” => y<=c;
WHEN “11” => y<=d;
WHEN OTHERS =>NULL;
END CASE;
END PROCESS;
END ART;
3-3. 图3-31 所示的是双 2 选 1 多路选择器构成的电路MUXK,对于其中MUX21A,当s='0'和'1'时,分别有y<='a'和y<='b'。
试在一个结构体中用两个进程来表达此电路,每个进程中用CASE 语句描述一个 2 选 1 多路选择器MUX21A。
3-3.答案
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY MUX221 IS
PORT(a1,a2,a3:IN STD_LOGIC_VECTOR(1 DOWNTO 0); --输入信号
s0,s1:IN STD_LOGIC;
outy:OUT STD_LOGIC);--输出端
END ENTITY;
ARCHITECTURE ONE OF MUX221 IS
SIGNAL tmp : STD_LOGIC;
BEGIN
PR01:PROCESS(s0)
BEGIN
IF s0=”0” THEN tmp<=a2;
ELSE tmp<=a3;
END IF;
END PROCESS;
PR02:PROCESS(s1)
BEGIN
IF s1=”0” THEN outy<=a1;
ELSE outy<=tmp;
END IF;
END PROCESS;
END ARCHITECTURE ONE;
END CASE;
3-5.下图是一个含有上升沿触发的D 触发器的时序电路,试写出此电路的VHDL 设计文件。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY MULTI IS
PORT(CL:IN STD_LOGIC; --输入选择信号
CLK0:IN STD_LOGIC; --输入信号
OUT1:OUT STD_LOGIC);--输出端
END ENTITY;
ARCHITECTURE ONE OF MULTI IS
SIGNAL Q : STD_LOGIC;
BEGIN
PR01: PROCESS(CLK0)
BEGIN
IF CLK ‘EVENT AND CLK=’1’
THEN Q<=NOT(CL OR Q);ELSE
END IF;
END PROCESS;
PR02: PROCESS(CLK0)
BEGIN
OUT1<=Q;
END PROCESS;
END ARCHITECTURE ONE;
END PROCESS;
3-4.给出1 位全减器的VHDL 描述。
要求:
(1) 首先设计1 位半减器,然后用例化语句将它们连接起来,图3-32 中h_suber 是半减器,diff 是输出差,s_out 是借位输出,sub_in 是借位输入。
(2) 以1 位全减器为基本硬件,构成串行借位的8 位减法器,要求用例化语句来完成此项设计(减法运算是x –y - sun_in = diffr)
3-4.答案
底层文件1:or2a.VHD 实现或门操作
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY or2a IS
PORT(a,b:IN STD_LOGIC;
c:OUT STD_LOGIC);
END ENTITY or2a;
ARCHITECTURE one OF or2a IS
BEGIN
c <= a OR b;
END ARCHITECTURE one;
底层文件2:h_subber.VHD 实现一位半减器
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY h_subber IS
PORT(x,y:IN STD_LOGIC;
diff,s_out::OUT STD_LOGIC);
END ENTITY h_subber;
ARCHITECTURE ONE OF h_subber IS
SIGNAL xyz: STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN
xyz <= x & y;
PROCESS(xyz)
BEGIN
CASE xyz IS
WHEN "00" => diff<='0';s_out<='0';
WHEN "01" => diff<='1';s_out<='1';
WHEN "10" => diff<='1';s_out<='0';
WHEN "11" => diff<='0';s_out<='0';
WHEN OTHERS => NULL;
END CASE;
END PROCESS;
END ARCHITECTURE ONE;
顶层文件:f_subber.VHD 实现一位全减器
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY f_subber IS
PORT(x,y,sub_in:IN STD_LOGIC;
diffr,sub_out:OUT STD_LOGIC);
END ENTITY f_subber;
ARCHITECTURE ONE OF f_subber IS
COMPONENT h_subber
PORT(x,y:IN STD_LOGIC;
diff,S_out:OUT STD_LOGIC);
END COMPONENT;
COMPONENT or2a
PORT(a,b:IN STD_LOGIC;
c:OUT STD_LOGIC);
END COMPONENT;
SIGNAL d,e,f: STD_LOGIC;
BEGIN
u1: h_subber PORT MAP(x=>x,y=>y,diff=>d,s_out=>e);
u2: h_subber PORT MAP(x=>d,y=>sub_in,diff=>diffr,s_out=>f); u3: or2a PORT MAP(a=>f,b=>e,c=>sub_out);
END ARCHITECTURE ONE;
END ARCHITECTURE ART;
3-6.根据下图,写出顶层文件MX3256.VHD 的VHDL 设计文件。
MAX3256 顶层文件
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY MAX3256 IS
PORT (INA,INB,INCK: IN STD_LOGIC;
INC: IN STD_LOGIC;
E,OUT:OUT STD_LOGIC);
END ENTITY MAX3256;
ARCHITECTURE ONE OF MAX3256 IS
COMPONENT LK35 --调用LK35 声明语句
PORT(A1,A2:IN STD_LOGIC;
CLK:IN STD_LOGIC;
Q1,Q2:OUT STD_LOGIC);
END COMPONENT;
COMPONENT D --调用D 触发器声明语句
PORT(D,C:IN STD_LOGIC;
CLK:IN STD_LOGIC;
Q:OUT STD_LOGIC);
END COMPONENT;
COMPONENT MUX21--调用二选一选择器声明语句
PORT(B,A:IN STD_LOGIC;
S:IN STD_LOGIC;
C:OUT STD_LOGIC);
END COMPONENT;
SIGNAL AA,BB,CC,DD: STD_LOGIC;
BEGIN
u1: LK35 PORT MAP(A1=>INA,A2=>INB,CLK=INCK, Q1=>AA,Q2=>BB); u2: D PORT MAP(D=>BB;CLK=>INCK,C=>INC,Q=>CC);
u3: LK35 PORT MAP (A1=>BB,A2=>CC,CLK=INCK, Q1=>DD,Q2=>OUT1);u4: MUX21 PORT MAP (B=>AA,A=>DD,S=>BB,C=>E);
END ARCHITECTURE ONE;
3-7设计含有异步清零和计数使能的16 位二进制加减可控计数器。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT16 IS
PORT(CLK,RST,EN:IN STD_LOGIC;
CHOOSE:IN BIT;
SETDATA:BUFFER INTEGER RANCE 65535 DOWNTO 0;
COUT: BUFFER INTEGER RANCE 65535 DOWNTO 0);
END CNT16;
ARCHITECTURE ONE OF CNT16 IS
BEGIN
PROCESS(CLK,RST,SDATA)
VARIABLE QI:STD_LOGIC_VECTOR(65535 DOWNTO 0);
BEGIN
IF RST='1' THEN --计数器异步复位
QI:=(OTHERS=>'0');
ELSIF SET=’1’ THEN--计数器一步置位
QI:=SETDATA;
ELSIF CLK'EVENT AND CLK='1' THEN --检测时钟上升沿
IF EN=’1’ THEN –检测是否允许计数
IF CHOOSE=’1’ THEN --选择加法计数
QI:=QI+1; --计数器加一
ELSE QI=QI-1; --计数器加一
END IF;
END IF;
END IF;
COUT<=QI;--将计数值向端口输出
END PROCESS;
END ONE;
3-8 什么是固有延时?什么是惯性延时?
答:固有延时(Inertial Delay)也称为惯性延时,固有延时的主要物理机制是分布电容效应
3-9哪些情况下需要用到程序包STD_LOGIC_UNSIGNED?试举一例。
VHDL描述中若有不同类型数据相加、相减时需要用到程序包STD_LOGIC_UNSIGNED中的“+”、“-”算符重载函数。
如: SIGNAL Q1 :STD_LOGIC_VECTOR (3 DOWNTO 0 );
BEGIN
PROCESS ( CLK )
BEGIN
IF CLK’EVENT AND CLK=‘1’ THEN
Q1<=Q1+1 ;
END IF;
3-10:说明信号和变量的功能特点,以及应用上的异同点。
习题6-4(解答):
变量的特性:
a. 变量不能将信息带出它的使用范围。
b. 变量的赋值是立即实现,不存在延时。
c.在进程中可以对一个变量多次赋值,但后赋的值将改变先赋的值。
信号的特性:
a. 信号赋值语句,可以出现在进程中,也可以出现在结构体的并行语句中。
b. 进程中可以对同一个信号多次赋值,但只有最后一次赋值才被执行。
c. 在进程外的并行语句中对同一个信号不能有多次赋值。
d. 信号赋值要经历一个延时,这一点和器件传输延时吻合。
进程中的信号与变量赋值特性的异同分析:
①从硬件电路系统来看,变量和信号都相当于逻辑电路中的连线和连线上的信号值。
②从行为仿真和VHDL语句功能上看,信号和变量具有明显区别:
a. 信号可以设置传输延迟量,而变量不能。
b. 变量只能在定义它的进程中有效,而信号在进程内外都能传递信息。
c. 进程中的变量赋值是语句执行时立即完成,而进程中的信号赋值则并不是语句执行时立即赋值,而是要等到进程结束时才赋值。
一般完成一次进程需要δ时间,因此说信号的赋值要延迟δ时间才能完成。
3-11同步复位和异步复位。
同步复位是指与时钟同步,当复位信号有效之后,出现时钟有效边沿时才对电路模块进行复位操作;而异步复位与时钟信号无关,只要复位信号有效,无论这时时钟信号是什么样,都对电路模块进行复位操作。
例如同步复位D触发器:
IF clock'event AND clock='1' THEN
IF reset_n='0' THEN
q <= (OTHERS => '0');
ELSE
q <= d;
END IF;
END IF;
异步复位D触发器:
IF reset_n='0' THEN
q <= (OTHERS => '0');
ELSIF clock'event AND clock='1' THEN
q <= d;
END IF;
10: EDA中组合电路,时序电路的特点、区别构成:
组合逻辑电路在逻辑功能上的特点是任意时刻的输出仅仅取决于该时刻的输入,与电路原来的状态无关。
而时序逻辑电路在逻辑功能上的特点是任意时刻的输出不仅取决于当时
的输入信号,而且还取决于电路原来的状态,或者说,还与以前的输入有关。
组合逻辑电路可以有若个输入变量和若干个输出变量,其每个输出变量是其输入的逻辑函
数,其每个时刻的输出变量的状态仅与当时的输入变量的状态有关,与本输出的原来状态及
输入的原状态无关,也就是输入状态的变化立即反映在输出状态的变化。
时序逻辑电路任意
时刻的输出不仅取决于该时刻的输入,而且还和电路原来的状态有关。
也就是说,组合逻辑
电路没有记忆功能,而时序电路具有记忆功能。
11,函数定义方式:函数的定义由函数首和函数体两部分组成,在进程或结构体中不必定义函数首,而在程序包中必须定义函数首。
17,四位加法器:LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_arith.all;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY add4 IS
PORT(C4: IN STD_LOGIC;--前一位的进位C
A4: IN STD_LOGIC_VECTOR(3 DOWNTO 0);--被加数A
B4: IN STD_LOGIC_VECTOR(3 DOWNTO 0);--被加数B
S4: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--相加的和S
CO4: OUT STD_LOGIC);--相加产生的进位C
END ENTITY add4;
ARCHITECTURE ART OF add4 IS
SIGNAL S5: STD_LOGIC_VECTOR(4 DOWNTO 0);
SIGNAL A5,B5: STD_LOGIC_VECTOR(4 DOWNTO 0);
BEGIN
A5<='0'&A4;--扩展被加数A高位为0
B5<='0'&B4;--扩展被加数B高位为0
S5<=A5+B5+C4;--二数相加,并加上前一位的进位
S4<=S5(3 DOWNTO 0);--相加和的结果
CO4<=S5(4);--相加后的进位
END ARCHITECTURE ART;
六位加法器。
6位加法器可以对两个6位二进制数进行加法运算,并且产生进位。
其真值表如下表所示。
输入输出
A[5..0] B[5..0] S[5..0] Cout
A B A+B 进位
6位加法器应具备的脚位:
输入端:A[5..0]、B[5..0] ;
输出端:S、Cout。
2、VHDL源程序
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY half_add IS
PORT (A, B : IN STD_LOGIC;
S, C : OUT STD_LOGIC);
END half_add;
ARCHITECTURE a OF half_add IS
SIGNAL temp : STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN
temp <= ('0'& A)+B;
S <= temp(0);
C <= temp(1);
END a;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY full_add IS
PORT (A, B, Ci : IN STD_LOGIC;
S, Co : OUT STD_LOGIC);
END full_add;
ARCHITECTURE a OF full_add IS
SIGNAL temp : STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN
temp <= ('0' & A)+B+Ci;
S <= temp(0);
Co <= temp(1);
END a;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY add6 IS --顶层文件名ADD6
PORT(A,B : IN STD_LOGIC_VECTOR(5 DOWNTO 0);
S : OUT STD_LOGIC_VECTOR(5 DOWNTO 0); Cout : OUT STD_LOGIC
);
END add6;
ARCHITECTURE a OF add6 IS
COMPONENT half_add
PORT (A, B : IN STD_LOGIC;
S, Co : OUT STD_LOGIC);
END COMPONENT;
COMPONENT full_add
PORT (A, B, Ci : IN STD_LOGIC;
S, Cout : OUT STD_LOGIC);
END COMPONENT;
Signal N1, N2, N3, N4, N5: STD_LOGIC;
BEGIN
h0: half_add
PORT MAP (a =>A(0),b =>B(0),s =>S(0),c=>N1 );
f1: full_add
PORT MAP (a =N1,b =>A(1),ci=>B(1),s =>S(1),co=>N2 );
f2: full_add
PORT MAP (a =>N2,b =>A(2),ci=>B(2),s =>S(2),co=>N3 ); f3: full_add
PORT MAP (a =>N3,b =>A(3),ci=>B(3),s =>S(3),co=>N4 ); f4: full_add
PORT MAP (a =>N4,b =>A(4),ci=>B(4),s =>S(4),co=>N5 ); f5: full_add
PORT MAP (a =>N5,b =>A(5),ci=>B(5),s =>S(5),co=>Cout ); END a;
17,3-8译码器
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity TE is
port(input:in std_logic_vector(2 downto 0);
output:out std_logic_vector(7 downto 0));
end TE;
architecture one of TE is
begin
output(0)<='1' when input="000" else '0';
output(1)<='1' when input="001" else '0';
output(2)<='1' when input="010" else '0';
output(3)<='1' when input="011" else '0';
output(4)<='1' when input="100" else '0';
output(5)<='1' when input="101" else '0';
output(6)<='1' when input="110" else '0';
output(7)<='1' when input="111" else '0';
end one;
17,2选1多路选择器
module 2sel1(y,s,a,b);input a,b,s;output y;reg y;
assign y=s?a:b;END 2SEL1;
8选1: LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY EIGHT_XUAN_1 IS
PORT( ST: IN STD_LOGIC;
A: IN STD_LOGIC_VECTOR(2 DOWNTO 0); D: IN STD_LOGIC_VECTOR(7 DOWNTO 0); Q: OUT STD_LOGIC);
END;
ARCHITECTURE HBV OF EIGHT_XUAN_1 IS SIGNAL Q1: STD_LOGIC;
BEGIN
PROCESS(A)
BEGIN
IF ST='1' THEN Q1<='0';
ELSE
CASE A IS
WHEN "000"=> Q1 <= D(0);
WHEN "001"=> Q1 <= D(1);
WHEN "010"=> Q1 <= D(2);
WHEN "011"=> Q1 <= D(3);
WHEN "100"=> Q1 <= D(4);
WHEN "101"=> Q1 <= D(5);
WHEN "110"=> Q1 <= D(6);
WHEN "111"=> Q1 <= D(7);
WHEN OTHERS => NULL;
END CASE;
END IF;
END PROCESS;
Q<= Q1;
END HBV;
实验,优先编码器
library ieee;
use ieee.std_logic_1164.all;
entity encode is
port(
d: in std_logic_vector(7 downto 0);
ein : in std_logic;
a0n,a1n,a2n,gsn,eon : out std_logic);
end encode;
architecture behav of encode is
signal q : std_logic_vector(2 downto 0);
begin
a0n<=q(0);a1n<=q(1);a2n<=q(2);
process(d)
begin
if ein='1' then
q<="111";gsn<='1';eon<='1';
elsif d(7)='0' then
q<="000";gsn<='0';eon<='1';
elsif d(6)='0' then
q<="001";gsn<='0';eon<='1';
elsif d(5)='0' then
q<="010";gsn<='0';eon<='1';
elsif d(4)='0' then
q<="011";gsn<='0';eon<='1';
elsif d(3)='0' then
q<="100";gsn<='0';eon<='1';
elsif d(2)='0' then
q<="101";gsn<='0';eon<='1';
elsif d(1)='0' then
q<="110";gsn<='0';eon<='1';
elsif d(0)='0' then
q<="111";gsn<='0';eon<='1';
elsif d="11111111" then
q<="111";gsn<='1';eon<='0';
end if;
end process;
end behav;
多位减法器;1、半减器程序library ieee;
use ieee.std_logic_1164.all; entity h_suber is
port(x,y:in std_logic;
diff,s_out:out std_logic); end entity h_suber; architecture bhv of h_suber is begin
process(x,y)
begin
diff<=x xor y;
s_out<=(not x) and y;
end process;
end architecture bhv;
2、一位全减器程序
library ieee;
use ieee.std_logic_1164.all; entity suber is
port(x,y,sub_in:in std_logic;
diffr,sub_out:out std_logic);
end entity suber;
architecture bhv of suber is
component h_suber
port(x,y:in std_logic;
diff,s_out:out std_logic);
end component;
signal t0,t1,t2:std_logic;
begin
u1:h_suber port map(x=>x,y=>y,diff=>t0,s_out=>t1);
u2:h_suber port map(x=>t0,y=>sub_in,diff=>diffr,s_out=>t2);
sub_out<=t1 or t2;
end architecture bhv;
3、8位全减器程序
library ieee;
use ieee.std_logic_1164.all;
entity sub8 is
port(a,b: in std_logic_vector(7 downto 0);
sin: in std_logic;
sout: out std_logic;
c: out std_logic_vector(7 downto 0));
end entity sub8;
architecture bhv of sub8 is
component suber
port(x,y,sub_in:in std_logic;
diffr,sub_out:out std_logic);
end component;
signal t:std_logic_vector(6 downto 0);
begin
u0:suber port map(x=>a(0),y=>b(0),sub_in=>sin,diffr=>c(0),sub_out=>t(0)); u1:suber port map(x=>a(1),y=>b(1),sub_in=>t(0),diffr=>c(1),sub_out=>t(1)); u2:suber port map(x=>a(2),y=>b(2),sub_in=>t(1),diffr=>c(2),sub_out=>t(2)); u3:suber port map(x=>a(3),y=>b(3),sub_in=>t(2),diffr=>c(3),sub_out=>t(3)); u4:suber port map(x=>a(4),y=>b(4),sub_in=>t(3),diffr=>c(4),sub_out=>t(4)); u5:suber port map(x=>a(5),y=>b(5),sub_in=>t(4),diffr=>c(5),sub_out=>t(5)); u6:suber port map(x=>a(6),y=>b(6),sub_in=>t(5),diffr=>c(6),sub_out=>t(6)); u7:suber port map(x=>a(7),y=>b(7),sub_in=>t(6),diffr=>c(7),sub_out=>sout); end architecture bhv;
下面程序是1位十进制计数器的VHDL描述,试补充完整。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT10 IS
PORT ( CLK : IN STD_LOGIC ;
Q : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)) ;
END CNT10;
ARCHITECTURE bhv OF CNT10 IS
SIGNAL Q1 : STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
PROCESS (CLK)
BEGIN
IF CLK'EVENT AND CLK = '1' THEN -- 边沿检测
IF Q1 > 10 THEN
Q1 <= (OTHERS => '0'); -- 置零
ELSE
Q1 <= Q1 + 1 ; -- 加1
END IF;
END IF;
END PROCESS ;
Q <= Q1;
END bhv;
2. 下面是一个多路选择器的VHDL描述,试补充完整。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY bmux IS
PORT ( sel :IN STD_LOGIC;
A, B : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
Y : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)) ;
END bmux;
ARCHITECTURE bhv OF bmux IS
BEGIN
y <= A when sel = '1'ELSE
B;
END bhv;
三、VHDL程序改错
仔细阅读下列程序,回答问题
LIBRARY IEEE; -- 1 USE IEEE.STD_LOGIC_1164.ALL; -- 2 ENTITY LED7SEG IS -- 3 PORT ( A : IN STD_LOGIC_VECTOR(3 DOWNTO 0); -- 4 CLK : IN STD_LOGIC; -- 5 LED7S : OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); -- 6 END LED7SEG; -- 7
ARCHITECTURE one OF LED7SEG IS -- 8 SIGNAL TMP : STD_LOGIC; -- 9 BEGIN -- 10 SYNC : PROCESS(CLK, A) -- 11
BEGIN -- 12 IF CLK'EVENT AND CLK = '1' THEN -- 13 TMP <= A; -- 14 END IF; -- 15 END PROCESS; -- 16
OUTLED : PROCESS(TMP) -- 17
BEGIN -- 18 CASE TMP IS -- 19
WHEN "0000" => LED7S <= "0111111"; -- 20
WHEN "0001" => LED7S <= "0000110"; -- 21
WHEN "0010" => LED7S <= "1011011"; -- 22
WHEN "0011" => LED7S <= "1001111"; -- 23
WHEN "0100" => LED7S <= "1100110"; -- 24
WHEN "0101" => LED7S <= "1101101"; -- 25
WHEN "0110" => LED7S <= "1111101"; -- 26
WHEN "0111" => LED7S <= "0000111"; -- 27
WHEN "1000" => LED7S <= "1111111"; -- 28
WHEN "1001" => LED7S <= "1101111"; -- 29
END CASE; -- 30 END PROCESS; -- 31 END one; -- 32 1.在程序中存在两处错误,试指出,并说明理由:
第14行 TMP附值错误
第29与30行之间,缺少WHEN OTHERS语句
2.修改相应行的程序:
错误1 行号:9程序改为:
TMP : STD_LOGIC_VECTOR(3 DOWNTO 0);
错误2 行号: 29 程序改为:
该语句后添加 WHEN OTHERS => LED7S <= "0000000";
四、阅读下列VHDL程序,画出原理图(RTL级)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY HAD IS
PORT ( a : IN STD_LOGIC;
b : IN STD_LOGIC;
c : OUT STD_LOGIC;
d : OUT STD_LOGIC);
END ENTITY HAD;
ARCHITECTURE fh1 OF HAD IS
BEGIN
c <= NOT(a NAND b);
d <= (a OR b)AND(a NAND b);
END ARCHITECTURE fh1;
五、请按题中要求写出相应VHDL程序
1.带计数使能的异步复位计数器
输入端口:clk时钟信号 rst异步复位信号。
en 计数使能
load 同步装载
data (装载)数据输入,位宽为10 输出端口:q 计数输出,位宽为10
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT1024 IS
PORT ( CLK, RST, EN, LOAD : IN STD_LOGIC;
DATA : IN STD_LOGIC_VECTOR (9 DOWNTO 0);
Q : OUT STD_LOGIC_VECTOR (9 DOWNTO 0) );
END CNT1024;
ARCHITECTURE ONE OF CNT1024 IS
BEGIN
PROCESS (CLK, RST, EN, LOAD, DATA)
VARIABLE Q1 : STD_LOGIC_VECTOR (9 DOWNTO 0);
BEGIN
IF RST = '1' THEN
Q1 := (OTHERS => '0');
ELSIF CLK = '1' AND CLK'EVENT THEN
IF LOAD = '1' THEN
Q1 := DATA;
ELSE
IF EN = '1' THEN
Q1 := Q1 + 1;
END IF;
END IF;
END IF;
Q <= Q1;
END PROCESS;
END ONE;
2. 看下面原理图,写出相应VHDL 描述
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY TRI_STATE IS
PORT ( E, A : IN STD_LOGIC; Y : INOUT STD_LOGIC; B : OUT STD_LOGIC); END TRI_STATE;
ARCHITECTURE BEHAV OF TRI_STATE IS BEGIN
PROCESS (E, A, Y) BEGIN
IF E = '0' THEN B <= Y; Y <= 'Z'; ELSE
B <= 'Z'; Y <= A; END IF; END PROCESS; END BEHAV;
信号与变量的区别:信号赋值语句在进程外作为并行语句,并发执行,与语句所处的位置无关。
变赋值语句在进程内或子程序内作为顺序语句,按顺序执行,与语句所处的位置有关。
信号赋值符号为 <=,变量赋值符号位 := 。
信号赋值符号用于信号赋值动作,不立即生效,变量赋值符号用于变量赋值动作,立即生效。
5、 硬件描述语言(HDL)是EDA 技术的重要组成部分,是电子系统硬件行为描述、结构描述、数据流描述的语言,它的种类很多,如VHDL 、Verilog HDL 、AHDL
6、 WHEN_ELSE 条件信号赋值语句 和 IF_ELSE 顺序语句的异同: * WHEN_ELSE 条件信号赋值语句中无标点,只有最后有分号;必须成对出现;是并行语句,必须放在结构体中。
* IF_ELSE 顺序语句中有分号;是顺序语句,必须放在进程中
12、在VHDL 的端口声明语句中,端口方向包括 in 、out 、buffer 、inout 、linkage 。
“BUFFER ”为缓冲端口,与OUT 类似,只是缓冲端口允许实体内部使用该端口信号,它可以用于输出,也可以用于端口信号的反馈。
当一个结构体用“BUFFER ”说明输出端口时,与其连接的另一个结构体的端口也要用BUFFER 说明。
以“LINKAGE ”定义的端口不指定方向,无论哪个方向的信号都可以连接。
13、VHDL 的PROCESS (进程)语句是由顺序语句 组成的,但其本身却是并行语句 。
14、VHDL 的子程序有 过程(PROCEDURE) 和 函数(FUNCTION) 两种类型,具有可重载性特点。
e
a b y。