附带:
一.问答题
1信号赋值语句在什么情况下作为并行语句?在什么情况下作顺序语句?信号赋值和变量赋值符号分别是什么?两种赋值符号有什么区别?
●信号赋值语句在进程外作并行语句,并发执行,与语句所处的位置无关。信号赋值语句在进程内
或子程序内做顺序语句,按顺序执行,与语句所处的位置有关。
●信号赋值符号为“<=”变量赋值用“:=”。信号赋值符号用于信号赋值动作,不立即生效。
变量,赋值符号用于变量赋值动作,立即生效。
2进程的敏感信号表指的是什么?简述敏感信号表在进程中的作用?
●进程的“敏感信号表”也称敏感表,是进程的激活条件,可由一个或多个信号组成,各信号
间以“,”号分隔。当敏感信号表中的任一个信号有事件发生,即发生任意变化,此时,进程被激活,进程中的语句将从上到下逐句执行一遍,当最后一条语句执行完毕之后,进程即进入等待挂起状态,直到下一次敏感表中的信号有事件发生,进程再次被激活,如此循环往复。
3什么是库、程序包、子程序、过程调用和函数调用?
●库和程序包用来描述和保存元件、类型说明和子程序等,以便在其它设计中通过其目录可查询、
调用。子程序由过程和函数组成。在子程序调用过程中,过程能返回多个变量,函数只能返回一个变量。若子程序调用的是一个过程,就称为过程调用,若子程序调用的是一个函数,则称为函数调用。过程调用、函数调用都是子程序调用。
二.改错题
1.已知sel为STD_LOGIC_VECTOR(1 DOWNTO 0)类型的信号,而a、b、c、d、q均为STD_LOGIC类型的
信号,请判断下面给出的CASE语句程序片段:
●CASE sel IS
●WHEN“00”=>q<=a;
●WHEN“01”=>q<=b;
●WHEN“10”=>q<=c;
●WHEN“11”=>q<=d;
●END CASE;
●答案:CASE语句缺“WHEN OTHERS”语句。
2.已知data_in1, data_in2为STD_LOGIC_VECTOR(15 DOWNTO 0) 类型的输入端口,data_out为STD_LOGIC_VECTOR(15 DOWNTO 0)类型的输出端口,add_sub为STD_LOGIC类型的输入端口,请判断下面给出的程序片段:
●LIBRARY IEEE;
●USE IEEE.STD_LOGIC_1164.ALL;
●ENTITY add IS
● PORT(data_in1, data_in2:IN INTEGER;
● data_out:OUT INTEGER);
●END add;
●ARCHTECTURE add_arch OF add IS
●CONSTANT a:INTEGER<=2;
●BEGIN
●data_out<=( data_in1+ data_in2) * a;
●END addsub_arch;
答案:常量声明时赋初值的“<=”符号应改用“:=”符号。
3.已知Q为STD_LOGIC类型的输出端口,请判断下面的程序片段:
●ARCHITECTURE test_arch OF test IS
●BEGIN
●SIGNAL B:STD_LOGIC;
●Q<= B;
END test_arch
答案:信号SIGNAL的声明语句应该放在BEGIN语句之前。
4.已知A和Q均为BIT类型的信号,请判断下面的程序片段:
●ARCHITECTURE archtest OF test IS
●BEGIN
●CASE A IS
●WHEN ‘0’=>Q<=‘1’;
●WHEN ‘1’=>Q<=‘0’;
●END CASE;
●END archtest;
答案:CASE语句应该存在于进程PROCESS内。
三.程序设计
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ADDER4B IS --4位二进制并行加法器
PORT(CIN:IN STD_LOGIC; --低位进位
A: IN STD_LOGIC_VECTOR(3 DOWNTO 0); --4位加数
B: IN STD_LOGIC_VECTOR(3 DOWNTO 0); --4位被加数
S: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --4位和
CONT: OUT STD_LOGIC);
END ADDER4B;
ARCHITECTURE ART OF ADDER4B IS
SIGNAL SINT:STD_LOGIC_VECTOR(4 DOWNTO 0);
SIGNAL AA,BB: STD_LOGIC_VECTOR(4 DOWNTO 0);
BEGIN
AA<='0'& A; --将4位加数矢量扩为5位,为进位提供空间 BB<='0'& B; --将4位被加数矢量扩为5位,为进位提供空间 SINT<=AA+BB+CIN ;
S<=SINT(3 DOWNTO 0);
CONT<=SINT(4);
END ART;
2@ 8位二进制加法器的源程序ADDER8B.VHD LIBRARY IEEE;
USE IEEE_STD.LOGIC_1164.ALL;
USE IEEE_STD.LOGIC_UNSIGNED.ALL:
ENTITY ADDER8B IS
--由4位二进制并行加法器级联而成的8位二进制加法器
PORT(CIN:IN STD_LOGIC;
A:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
B:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
S:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
COUT:OUT STD_LOGIC);
END ADDER8B;
ARCHICTURE ART OF ADDER8B IS
COMPONENET ADDER4B
--对要调用的元件ADDER4B的界面端口进行定义
PORT(CIN:IN STD_LOGIC;
A:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
B:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
S:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
CONT:OUT STD_LOGIC);
END COMPONENT ;
SIGNAL CARRY_OUT:STD_LOGIC; --4位加法器的进位标志
BEGIN
U1:ADDER4B --例化(安装)一个4位二进制加法器U1
PORT MAP(CIN=>CIN,A=>A(3 DOWNTO 0),B=>B(3 DOWNTO0),
S=>S(3 DOWNTO 0),COUT=>CARRY_OUT);
U2:ADDER4B --例化(安装)一个4位二进制加法器U2
PORT MAP(CIN=>CARRY_OUT,A=>A(7 DOWNTO 4),B=>B(7 DOWNTO 4), S=>S (7 DOWNTO 4);CONT=>CONT);
END ART;
3.@触发器和缓冲器
D触发器:Process(clk) begin
if(clk’event and clk=‘1’) then
q <= d;
end if;
end process;
缓冲器:Process(clk)
begin
if(clk=‘1’) then
q <= d;
end if; end process;
T触发器:Process(clk)
begin
if(clk’event and clk=‘1’) then
if(t = ‘1’) then
q <= not(q);
else
q <= q;
end if;
end if;
end process;
4.@16位锁存器的源程序
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY REG16B IS --16位锁存器
PORT (CLK:IN STD_LOGIC;--锁存信号
CLR:IN STD_LOGIC;--清零信号
D:IN STD_LOGIC_VECTOR (8 DOWNTO 0) --8位数据输入 Q:OUT STD_LOGIC_VECTOR(15 DOWNTO 0));--16位数据输出END REG16B;
ARCHITECTURE ART OF REG16B IS
SIGNAL R16S:STD_LOGIC_VECTOR(15 DOWNTO 0);
--16位寄存器设置
BEGIN
PROCESS (CLK,CLR)
BEGIN
IF CLR = '1' THEN R16S<= "00000";
--异步复位信号
ELSIF CLK'EVENT AND CLK = '1' THEN
--时钟到来时,锁存输入值
R16S(6 DOWNTO 0)<=R16S(7 DOWNTO 1);
--右移低8位
R16S(15 DOWNTO 7)<=D;
--将输入锁到高能位
END IF;
END PROCESS;
Q<=R16S;
END ART;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;--8位右移寄存器
ENTITY SREG8B IS
PORT (CLK:IN STD_LOGIC; LOAD :IN STD _LOGIC;
BIN:IN STD_LOGIC_VECTOR(7DOWNTO 0);
QB:OUT STD_LOGIC );
END SREG8B;
ARCHITECTURE ART OF SREG8B IS
SIGNAL REG8B:STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
PROCESS (CLK,LOAD)
BEGIN
IF CLK'EVENT AND CLK= '1' THEN
IF LOAD = '1' THEN REG8<=DIN;--装载新数据 ELSE REG8(6 DOWNTO0)<=REG8(7 DOWNTO 1);--数据右移
END IF;
END IF;
END PROCESS;
QB<= REG8 (0);--输出最低位
END ART;
6@8位乘法器的源程序
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; --8位乘法器顶层设计
ENTITY MULTI8X8 IS
PORT(CLK:IN STD_LOGIC;
START:IN STD_LOGIC;
--乘法启动信号,高电平复位与加载,低电平运算
A:IN STD_LOGIC_VECTOR(7 DOWNTO 0); --8位被乘数
B:IN STD_LOGIC_VECTOR(7 DOWNTO 0); --8位乘数
ARIEND:OUT STD_LOGIC; --乘法运算结束标志位
DOUT:OUT STD_LOGIC_VECTOR(15 DOWNTO 0));--16位乘积输出END MULTI8X8;
ARCHITECTURE ART OF MULTI8X8 IS
COMPONENT ARICTL --待调用的乘法控制器端口定义
PORT(CLK:IN STD_LOGIC;START:IN STD_LOGIC;
CLKOUT:OUT STD_LOGIC;RSTALL:OUT STD_LOGIC;
ARIEND:OUT STD_LOGIC);
END COMPONENT;
COMPONENT ANDARITH --待调用的控制与门端口定义
PORT(ABIN:IN STD_LOGIC;
DIN:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
DOUT:OUT_STD_LOGIC_VECTOR( 7 DOWNTO 0) );
END COMPONENT;
COMPONENT ADDER8B --待调用的8位加法器端口定义COMPONENT SREG8B --待调用的8位右移寄存器端口定义...
COMPONENT REG16B --待调用的16右移寄存器端口定义
...
SIGNAL GNDINT:STD_LOGIC;
SIGNAL INTCLK:STD_LOGIC;
SIGNAL RSTALL:STD_LOGIC;
SIGNAL QB:STD_LOGIC;
SIGNAL ANDSD:STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL DTBIN:STD_LOGIC_VECTOR(8 DOWNTO 0);
SIGNAL DTBOUT:STD_LOGIC_VECTOR(15 DOWNTO 0);
BEGIN
DOUT<=DTBOUT;GNDINT<= '0';
U1:ARICTL PORT MAP(CLK=>CLK, START=>START,
CLKOUT=>INTCLK, RSTALL=>RSTALL, ARIEND=>ARIEND);
U2:SREG8B PORT MAP(CLK=>INTCLK, LOAD=>RSTALL.
DIN=>B, QB=>QB);
U3:ANDARITH PORT MAP(ABIN=>QB,DIN=>A,DOUT=>ANDSD);
U4:ADDER8B PORT
MAP(CIN=>GNDINT,A=>DTBOUT(15 DOWNTO 8),
B=>ANDSD, S=>DTBIN(7 DOWNTO 0),COUT =>DTBIN(8));
U5:REG16B PORT MAP(CLK =>INTCLK,CLR=>RSTALL,
D=>DTBIN, Q=>DTBOUT);
END ART;
7@有时钟使能的十进制计数器的源程序LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;--有时钟使能的十进制计数器ENTITY CNT10 IS
PORT (CLK:IN STD_LOGIC;--计数时钟信号
CLR:IN STD_LOGIC;--清零信号
END:IN STD_LOGIC;--计数使能信号
CQ:OUT INTEGER RANGE 0 TO 15; --4位计数结果输出
CARRY_OUT:OUT STD_LOGIC); --计数进位
END CNT10;
ARCHITECTURE ART OF CNT10 IS