《EDA技术实用教程(第四版)》习题
1 习题
1-1EDA技术与ASIC设计和FPGA开发有什么关系?FPGA在ASIC设计中有什么用途?P3~4
1-2 与软件描述语言相比,VHDL有什么特点? P6
l-3什么是综合?有哪些类型?综合在电子设计自动化中的地位是什么?P5
1-4 在EDA技术中,自顶向下的设计方法的重要意义是什么? P7~10
1-5 IP在EDA技术的应用和发展中的意义是什么? P22~14
1-6叙述EDA的FPGA/CPLD设计流程,以及涉及的EDA工具及其在整个流程中的作用。(P11~13)
2 习题
2-1OLMC(输出逻辑宏单元)有何功能?说明GAL是怎样实现可编程组合电路与时序电路的。P34~36
2-2什么是基于乘积项的可编程逻辑结构?P33~34,40什么是基于查找表的可编程逻辑结构?P40~41
2-3FPGA系列器件中的LAB有何作用? P43~45
2-5 解释编程与配置这两个概念。P58
2-6 请参阅相关资料,并回答问题:按本章给出的归类方式,将基于乘积项的可编程逻辑结构的PLD器件归类为CPLD;将基于查找表的可编程逻辑结构的PLD器什归类为FPGA,那么,APEX系列属于什么类型PLD器件? MAX II系列又属于什么类型的PLD器件?为什么? P54~56
3 习题
3-1 画出与以下实体描述对应的原理图符号元件:
ENTITY buf3s IS --实体1:三态缓冲器
PORT(input:IN STD_LOGIC; --输入端
enable:IN STD_LOGIC; --使能端
output:OUT STD_LOGIC); --输出端
END buf3s ;
ENTITY mux21 IS --实体2: 2选1多路选择器
PORT(in0, in1,sel: IN STD_LOGIC;
output:OUT STD_LOGIC);
3-2 图3-16所示的是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-16 4选1多路选择器
--解1:用IF_THEN 语句实现4选1多路选择器 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux41 IS
PORT (a,b,c,d: IN STD_LOGIC; s0: IN STD_LOGIC; s1: IN STD_LOGIC; y: OUT STD_LOGIC); END ENTITY mux41;
ARCHITECTURE if_mux41 OF mux41 IS
SIGNAL s0s1 : STD_LOGIC_VECTOR(1 DOWNTO 0);--定义标准逻辑位矢量数据 BEGIN
s0s1<=s1&s0; --s1相并s0,即s1与s0并置操作 PROCESS(s0s1,a,b,c,d) BEGIN
IF s0s1 = "00" THEN y <= a; ELSIF s0s1 = "01" THEN y <= b; ELSIF s0s1 = "10" THEN y <= c; ELSE y <= d; END IF;
END PROCESS;
END ARCHITECTURE if_mux41;
--解2:用CASE 语句实现4选1多路选择器
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY mux41 IS
PORT (a,b,c,d: IN STD_LOGIC;
s0: IN STD_LOGIC;
s1: IN STD_LOGIC;
y: OUT STD_LOGIC);
END ENTITY mux41;
ARCHITECTURE case_mux41 OF mux41 IS
SIGNAL s0s1 : STD_LOGIC_VECTOR(1 DOWNTO 0);--定义标准逻辑位矢量数据类型BEGIN
s0s1<=s1&s0; --s1相并s0,即s1与s0并置操作
PROCESS(s0s1,a,b,c,d)
BEGIN
CASE s0s1 IS --类似于真值表的case语句
WHEN "00" => y <= a;
WHEN "01" => y <= b;
WHEN "10" => y <= c;
WHEN "11" => y <= d;
WHEN OTHERS =>NULL ;
END CASE;
END PROCESS;
END ARCHITECTURE case_mux41;
3-3 图3-17所示的是双2选1多路选择器构成的电路MUXK,对于其中MUX21A,当s=’0’和s=’1’时,分别有y<=‘a’和y<=’b’。试在一个结构体中用两个进程来表达此电路,每个进程中用CASE语句描述一个2选1多路选择器MUX21A。
图3-17 含2选1多路选择器的模块
--解:用CASE语句实现图4-18所示的是双2选1多路选择器构成的电路LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY mux31 IS
PORT(a1,a2,a3,s0,s1: IN STD_LOGIC;
outy:OUT STD_LOGIC);
END ENTITY mux31;
ARCHITECTURE case_mux31 OF mux31 IS
SIGNAL y : STD_LOGIC;
BEGIN
u1: PROCESS(s0,a1,a2,a3)
BEGIN
CASE s0 IS --类似于真值表的case语句
WHEN '0' => y <= a2;
WHEN '1' => y <= a3;
WHEN OTHERS =>NULL ;
END CASE;
END PROCESS;
u2: PROCESS(s1,a1,a2,a3,y)
BEGIN
CASE s1 IS --类似于真值表的case语句
WHEN '0' => outy <= a1;
WHEN '1' => outy <= y;
WHEN OTHERS =>NULL ;
END CASE;
END PROCESS;
END ARCHITECTURE case_mux31;
3-4将例3-20程序的计数器改为十二进制计数器,程序用例3-21的方式表述,并且将复位RST改为同步清零控制,加载信号LOAD改为异步控制方式。讨论例3-20与例3-21的异同点。
--解:十二进制计数器VHDL程序设计。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT12 IS
PORT(CLK,RST,EN,LOAD : IN STD_LOGIC;
DATA : IN STD_LOGIC_VECTOR(3 DOWNTO 0); --4位预置数
DOUT : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--计数值输出
COUT : OUT STD_LOGIC); --计数进位输出
END CNT12;
ARCHITECTURE behav OF CNT12 IS
SIGNAL Q : STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
REG: PROCESS(CLK,RST,EN,LOAD,Q)
BEGIN
IF LOAD='0' THEN Q<=DATA; --允许加载
ELSIF CLK'EVENT AND CLK='1' THEN --检测时钟上升沿
IF RST='0' THEN Q<=(OTHERS =>'0'); --计数器异步复位
ELSE
IF EN='1' THEN --检测是否允许计数或加载(同步使能)
IF LOAD='0' THEN Q<=DATA; --允许加载
ELSE
IF Q<12 THEN Q<=Q+1; --允许计数,检测是否小于9
ELSE Q<=(OTHERS=>'0'); --大于等于9时,计数值清零
END IF;
END IF;
END IF;
END IF;
END IF;
END PROCESS;
COM: PROCESS(Q)
BEGIN
IF Q=12 THEN COUT<='1'; --计数大于9,输出进位信号
ELSE COUT<='0';
END IF;
DOUT<=Q; --将计数值向端口输出
END PROCESS;
END behav;
3-5设计含有异步清零和计数使能的16位二进制加减可控计数器。
--解:用VHDL实现含有异步清零和计数使能的16位二进制加减可控计数器。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ADD_SUB_16 IS
PORT (CLK,RST,ADD_EN,SUB_EN: IN STD_LOGIC;
CQ : OUT STD_LOGIC_VECTOR(15 DOWNTO 0) ;
COUT: OUT STD_LOGIC);
END ENTITY ADD_SUB_16;
ARCHITECTURE A_S_16 OF ADD_SUB_16 IS
BEGIN
PROCESS(CLK,RST,ADD_EN,SUB_EN)
V ARIABLE CQI: STD_LOGIC_VECTOR(15 DOWNTO 0);
BEGIN
IF RST = '1' THEN CQI:=(OTHERS => '0');--计数器异步复位
ELSIF CLK'EVENT AND CLK='1' THEN --检测时钟上升沿
IF ADD_EN='1'THEN --检测是否允许计数(同步他能)
IF CQI<16#FFFF# THEN CQI:=CQI+1; --允许计数,检测是否小于65535
ELSE CQI:=(OTHERS => '0'); --大于65535,计数值清零
END IF;
IF CQI=16#FFFF# THEN COUT<='1'; --计数大于9,输出进位信号
ELSE COUT <= '0';
END IF;
END IF;
IF SUB_EN='1'THEN --检测是否允许计数(同步他能)
IF CQI>0 THEN CQI:=CQI-1; --允许计数,检测是否小于65535
ELSE CQI:=(OTHERS => '1'); --大于65535,计数值清零
END IF;
IF CQI=0 THEN COUT<='1'; --计数大于9,输出进位信号 ELSE COUT <= '0'; END IF; END IF; END IF;
CQ<=CQI; --将计数值向端口输出 END PROCESS;
END ARCHITECTURE A_S_16;
3-6 图3-18是一个含有上升沿触发的D 触发器的时序电路(sxdl),试写出此电路的VHDL 设计文件。
图3-18 时序电路
--解:实现图4-19电路的VHDL 程序t4_19.vhd LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY t4_19 IS
PORT (CL,CLK0: IN STD_LOGIC; OUT1: OUT STD_LOGIC); END ENTITY t4_19;
ARCHITECTURE sxdl OF t4_19 IS ----时序电路sxdl SIGNAL Q : STD_LOGIC; BEGIN
PROCESS(CLK0) BEGIN
IF CLK0'EVENT AND CLK0='1' THEN --检测时钟上升沿 Q <= NOT(Q OR CL); END IF;
END PROCESS; OUT1 <= NOT Q;
END ARCHITECTURE sxdl;
3-7 给出1位全减器的VHDL 描述;最终实现8位全减器。要求:
1)首先设计1位半减器,然后用例化语句将它们连接起来,图4-20中h_suber 是半减器,diff 是
输出差(diff=x-y),s_out 是借位输出(s_out=1,x 图3-19 1位全加器 xin yin a b diff_out c --解(1.1):实现1位半减器h_suber(diff=x-y;s_out=1,x LIBRARY IEEE; --半减器描述(1):布尔方程描述方法 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 hs1 OF h_suber IS BEGIN Diff <= x XOR (NOT y); s_out <= (NOT x) AND y; END ARCHITECTURE hs1; --解(1.2):采用例化实现图4-20的1位全减器 LIBRARY IEEE; --1位二进制全减器顺层设计描述 USE IEEE.STD_LOGIC_1164.ALL; ENTITY f_suber IS PORT(xin,yin,sub_in: IN STD_LOGIC; sub_out,diff_out: OUT STD_LOGIC); END ENTITY f_suber; ARCHITECTURE fs1 OF f_suber IS COMPONENT h_suber --调用半减器声明语句 PORT(x, y: IN STD_LOGIC; diff,s_out: OUT STD_LOGIC); END COMPONENT; SIGNAL a,b,c: STD_LOGIC; --定义1个信号作为内部的连接线。 BEGIN u1: h_suber PORT MAP(x=>xin,y=>yin, diff=>a, s_out=>b); u2: h_suber PORT MAP(x=>a, y=>sub_in, diff=>diff_out,s_out=>c); sub_out <= c OR b; END ARCHITECTURE fs1; (2)以1位全减器为基本硬件,构成串行借位的8位减法器,要求用例化语句来完成此项设计(减法运算是x-y-sun_in=difft)。 --解(2):采用例化方法,以1位全减器为基本硬件;实现串行借位的8位减法器(上图所示)。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY suber_8 IS PORT(x0,x1,x2,x3,x4,x5,x6,x7: IN STD_LOGIC; y0,y1,y2,y3,y4,y5,y6,y7,sin: IN STD_LOGIC; diff0,diff1,diff2,diff3: OUT STD_LOGIC; diff4,diff5,diff6,diff7,sout: OUT STD_LOGIC); END ENTITY suber_8; ARCHITECTURE s8 OF suber_8 IS COMPONENT f_suber --调用全减器声明语句 PORT(xin,yin,sub_in: IN STD_LOGIC; sub_out,diff_out: OUT STD_LOGIC); END COMPONENT; SIGNAL a0,a1,a2,a3,a4,a5,a6: STD_LOGIC; --定义1个信号作为内部的连接线。 BEGIN u0:f_suber PORT MAP(xin=>x0,yin=>y0,diff_out=>diff0,sub_in=>sin,sub_out=>a0); u1:f_suber PORT MAP(xin=>x1,yin=>y1,diff_out=>diff1,sub_in=>a0,sub_out=>a1); u2:f_suber PORT MAP(xin=>x2,yin=>y2,diff_out=>diff2,sub_in=>a1,sub_out=>a2); u3:f_suber PORT MAP(xin=>x3,yin=>y3,diff_out=>diff3,sub_in=>a2,sub_out=>a3); u4:f_suber PORT MAP(xin=>x4,yin=>y4,diff_out=>diff4,sub_in=>a3,sub_out=>a4); u5:f_suber PORT MAP(xin=>x5,yin=>y5,diff_out=>diff5,sub_in=>a4,sub_out=>a5); u6:f_suber PORT MAP(xin=>x6,yin=>y6,diff_out=>diff6,sub_in=>a5,sub_out=>a6); u7:f_suber PORT MAP(xin=>x7,yin=>y7,diff_out=>diff7,sub_in=>a6,sub_out=>sout); END ARCHITECTURE s8; 3-8 给出一个4选1多路选择器的VHDL 描述。选通控制端有四个输入:S0、S1、S2、S3。当且仅当S0=0时:Y=A ;S1=0时:Y=B ;S2=0时:Y=C ;S3=0时:Y=D 。 --解:4选1多路选择器VHDL 程序设计。 LIBRARY IEEE; --图3-20(c)RTL 图的VHDL 程序顶层设计描述 diff0 diff1 sout diff7 串行借位的8位减法器 USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux41a IS PORT( A,B,C,D : IN STD_LOGIC; S0,S1,S2,S3 : IN STD_LOGIC; Y : OUT STD_LOGIC); END ENTITY mux41a; ARCHITECTURE one OF mux41a IS SIGNAL S0_3 : STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN S0_3<=S0&S1&S2&S3; y<=A WHEN S0_3="0111" ELSE B WHEN S0_3="1011" ELSE C WHEN S0_3="1101" ELSE D WHEN S0_3="1110" ELSE 'Z'; END ARCHITECTURE one; 3-9 分频方法有多种,最简单的是二分频和偶数分频甚至奇数分频,这用触发器或指定计数模的计数器即可办到。但对于现场实现指定分频比或小数分频率的分频电路的设计就不是很简单了。 试对例3-20的设计稍作修改,将其进位输出COUT与异步加载控制LOAD连在一起,构成一个自动加载型16位二进制数计数器,也即一个16位可控的分频器,给出其VHDL 表述,并说明工作原理。设输入频率fi=4MHz,输出频率fo=516.5±1Hz(允许误差±0.1Hz),16位加载数值是多少? --解:3-9 16位数控分频器(可进行奇偶数分频) LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY DVF16 IS PORT(CLK : IN STD_LOGIC; D : IN STD_LOGIC_VECTOR(15 DOWNTO 0); FOUT : OUT STD_LOGIC); END ENTITY DVF16; ARCHITECTURE one OF DVF16 IS SIGNAL FULL : STD_LOGIC; BEGIN P_REG: PROCESS(CLK) VARIABLE CNT8 : STD_LOGIC_VECTOR(15 DOWNTO 0); BEGIN IF CLK'EVENT AND CLK = '1' THEN IF CNT8 = "0000000000000000" THEN CNT8 := D-1;--当CNT8计数归0时,预置CNT8=D-1; --计数范围(D=n):n-1~n/2取整(n=10:9\8\7\6\5计数,前后半周期相同) FULL <= '1';--同时使溢出标志信号FULL输出为高电平 --(n=11:10\9\8\7\6\5计数,前比后半周期多一个时钟) ELSIF CNT8 = ('0' & D(15 DOWNTO 1)) THEN CNT8 :=('0' & D(15 DOWNTO 1))-1;--当CNT8=n/2取整时,预置CNT8=D/2取整-1; --计数范围(D=n):n/2取整~0(n=10:4\3\2\1\0计数) FULL <= '1'; --同时使溢出标志信号FULL输出为高电平(n=11:4\3\2\1\0计数) ELSE CNT8 := CNT8 - 1; --否则继续作加1计数 FULL <= '0'; --且输出溢出标志信号FULL为低电平 END IF; END IF; END PROCESS P_REG ; P_DIV: PROCESS(FULL) VARIABLE CNT2 : STD_LOGIC; BEGIN IF FULL'EVENT AND FULL = '1' THEN CNT2 := NOT CNT2;--如果溢出标志信号FULL为高电平,D触发器输出取反 IF CNT2 = '1' THEN FOUT <= '1'; ELSE FOUT <= '0'; END IF; END IF; END PROCESS P_DIV; END ARCHITECTURE one; 3-10用VHDL设计一个功能类似74LS160的计数器。 --解:3-10 用VHDL设计一个功能类似74LS160(异步复位和同步使能加载、计数的十进制加法计数器)的计数器。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY CNT10 IS PORT(CLK,RST,EN,LOAD : IN STD_LOGIC; DATA : IN STD_LOGIC_VECTOR(3 DOWNTO 0); --4位预置数 DOUT : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--计数值输出 COUT : OUT STD_LOGIC); --计数进位输出 END CNT10; ARCHITECTURE behav OF CNT10 IS BEGIN PROCESS(CLK,RST,EN,LOAD) V ARIABLE Q : STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN IF RST='0' THEN Q:=(OTHERS =>'0'); --计数器异步复位 ELSIF CLK'EVENT AND CLK='1' THEN --检测时钟上升沿 IF EN='1' THEN --检测是否允许计数或加载(同步使能) IF LOAD='0' THEN Q:=DA TA; --允许加载 ELSE IF Q<9 THEN Q:=Q+1; --允许计数,检测是否小于9 ELSE Q:=(OTHERS=>'0'); --大于等于9时,计数值清零 END IF; END IF; END IF; IF Q=9 THEN COUT<='1'; --计数大于9,输出进位信号 ELSE COUT<='0'; END IF; DOUT<=Q; --将计数值向端口输出 END PROCESS; END behav; 3-11 给出含有异步清零和计数使能的16位二进制加减可控计数器的VHDL描述。 --解:3-11 给出含有异步清零和计数使能的16位二进制加减可控计数器的VHDL描述。-- 用VHDL实现含有异步清零和计数使能的16位二进制加减可控计数器。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY ADD_SUB_LOAD_16 IS PORT (CLK,RST,ADD_EN,SUB_EN,LOAD : IN STD_LOGIC; DA TA : IN STD_LOGIC_VECTOR(15 DOWNTO 0); CQ : OUT STD_LOGIC_VECTOR(15 DOWNTO 0); COUT : OUT STD_LOGIC); END ENTITY ADD_SUB_LOAD_16; ARCHITECTURE A_S_16 OF ADD_SUB_LOAD_16 IS BEGIN PROCESS(CLK,RST,ADD_EN,SUB_EN,LOAD) V ARIABLE CQI: STD_LOGIC_VECTOR(15 DOWNTO 0); --V ARIABLE LS_LOAD : STD_LOGIC; BEGIN --LS_LOAD:=LOAD; IF RST = '1' THEN CQI:=(OTHERS => '0');--计数器异步复位 ELSIF LOAD = '1' THEN CQI:=DATA; --LS_LOAD:='0'; --计数器异步复位 ELSIF CLK'EVENT AND CLK='1' THEN --检测时钟上升沿 IF ADD_EN='1'THEN --检测是否允许计数(同步他能) IF CQI<16#FFFF# THEN CQI:=CQI+1; --允许计数,检测是否小于65535 ELSE CQI:=(OTHERS => '0'); --大于65535,计数值清零 END IF; IF CQI=16#FFFF# THEN COUT<='1'; --计数大于9,输出进位信号 ELSE COUT <= '0'; END IF; END IF; IF SUB_EN='1'THEN --检测是否允许计数(同步他能) IF CQI>0 THEN CQI:=CQI-1; --允许计数,检测是否小于65535 ELSE CQI:=(OTHERS => '1'); --大于65535,计数值清零 IF CQI=0 THEN COUT<='1'; --计数大于9,输出进位信号 ELSE COUT <= '0'; END IF; END IF; END IF; CQ<=CQI; --将计数值向端口输出 END PROCESS; END ARCHITECTURE A_S_16; 3-12 分别给出图3-20所示的六个RTL图的VHDL描述,注意其中的D触发器和锁存器的表述。 图3-20 RTL图 图3-20 RTL图(a) --解:实现图3-20(a)RTL图的VHDL程序t3_12_a.vhd LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY t3_12_a IS PORT (CL,CLK0: IN STD_LOGIC; OUT1: OUT STD_LOGIC); END ENTITY t3_12_a; ARCHITECTURE sxdl OF t3_12_a IS ----时序电路sxdl SIGNAL Q : STD_LOGIC; BEGIN PROCESS(CLK0) BEGIN IF CLK0'EVENT AND CLK0='1' THEN --检测时钟上升沿 Q <= NOT(Q OR CL); END IF; END PROCESS; OUT1 <= NOT Q; END ARCHITECTURE sxdl; 图3-20 RTL图(b) --解:实现图3-20(b)RTL图的VHDL程序t3_12_b.vhd LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY t3_12_b IS PORT (A,B,C,D: IN STD_LOGIC; Y: OUT STD_LOGIC); END ENTITY t3_12_b; ARCHITECTURE sxdl OF t3_12_b IS ----时序电路sxdl SIGNAL AB,CD,ABCD : STD_LOGIC; BEGIN PROCESS(A,B,C,D,AB,CD,ABCD) BEGIN AB<=A AND B; CD<=C OR D; ABCD<=AB XOR CD; CASE AB IS --类似于真值表的case语句 WHEN '0' => Y <= A; WHEN '1' => Y <= ABCD; WHEN OTHERS =>NULL ; END CASE; END PROCESS; END ARCHITECTURE sxdl; 图3-20 RTL图(c) --解1:实现图3-20(c) RTL图的VHDL程序mux21a.vhd底层设计描述。-- 用(WHEN_ELSE)实现2选1多路选择器程序(mux21a.vhd)。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux21a IS PORT(a,b : IN STD_LOGIC; s : IN STD_LOGIC; y : OUT STD_LOGIC); END ENTITY mux21a; ARCHITECTURE one OF mux21a IS BEGIN y<=a WHEN s='0' ELSE b; END ARCHITECTURE one; --解2:实现图3-20(c)RTL图的VHDL程序DFF6.vhd底层设计描述。-- 电平触发D型触发器程序(DFF6.vhd) LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY DFF6 IS PORT(CLK: IN STD_LOGIC; D: IN STD_LOGIC; Q:OUT STD_LOGIC); END; ARCHITECTURE bhv OF DFF6 IS BEGIN PROCESS(CLK,D) BEGIN IF CLK='1' THEN Q<=D; END IF; END PROCESS; END bhv; --解3:实现图3-20(c)RTL图的VHDL程序t3_12_c.vhd顶层设计描述。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY t3_12_c IS PORT(D1,D2,CLK : IN STD_LOGIC; Q : OUT STD_LOGIC); END ENTITY t3_12_c; ARCHITECTURE one OF t3_12_c IS COMPONENT mux21a --调用2选1多路选择器声明语句 PORT(a,b : IN STD_LOGIC; s : IN STD_LOGIC; y : OUT STD_LOGIC); END COMPONENT; COMPONENT DFF6 --调用电平型D触发器声明语句 PORT(CLK: IN STD_LOGIC; D: IN STD_LOGIC; Q:OUT STD_LOGIC); END COMPONENT; SIGNAL DD: STD_LOGIC; --定义1个信号作为内部的连接线。 BEGIN u1: mux21a PORT MAP(CLK,D2,D1,DD); u2: DFF6 PORT MAP(CLK,DD,Q); END ARCHITECTURE one; 图3-20 RTL图(d) --解1:实现图3-20(d)RTL图的VHDL程序DFF_PRE.vhd底层设计描述 -- 带预置、清零和输出使能的D触发器程序(DFF_PRE.vhd)。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY DFF_PRE_CLR_ENA IS PORT(CLK : IN STD_LOGIC; D : IN STD_LOGIC; Q :OUT STD_LOGIC; ENA : IN STD_LOGIC; PRE : IN STD_LOGIC; CLR : IN STD_LOGIC); END; ARCHITECTURE bhv OF DFF_PRE_CLR_ENA IS SIGNAL Q1:STD_LOGIC; --类似于在芯片内部定义一个数据的暂存节点BEGIN PROCESS(CLK,D,Q1,ENA,PRE,CLR) BEGIN IF CLR='1' THEN Q1<='0'; ELSIF PRE='1' THEN Q1<='1'; ELSIF CLK'EVENT AND CLK='1' AND ENA='1' THEN Q1<=D; END IF; --IF EN='1' THEN Q<=Q1; --将内部的暂存数据向端口输出 --END IF; Q<=Q1; --将内部的暂存数据向端口输出 END PROCESS; END bhv; --解2:实现图3-20(d)RTL图的VHDL程序t3_12_d.vhd顶层设计描述LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY t3_12_d IS PORT(SET,D,CLK,EN,RESET : IN STD_LOGIC; Q : OUT STD_LOGIC); END ENTITY t3_12_d; ARCHITECTURE one OF t3_12_d IS COMPONENT DFF_PRE_CLR_ENA --调用D触发器声明语句 PORT(CLK : IN STD_LOGIC; D : IN STD_LOGIC; Q :OUT STD_LOGIC; ENA : IN STD_LOGIC; PRE : IN STD_LOGIC; CLR : IN STD_LOGIC); END COMPONENT; SIGNAL SS: STD_LOGIC; --定义1个信号作为内部的连接线。 BEGIN SS<=SET AND (NOT RESET); u1: DFF_PRE_CLR_ENA PORT MAP(CLK,D,Q,EN,SS,RESET); END ARCHITECTURE one; 图3-20 RTL图(e) --解1:实现图3-20(e)RTL图的VHDL程序DFF_PRE_CLR.vhd底层设计描述-- 带预置、清零和输出使能的D触发器程序(DFF_PRE_CLR.vhd) LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY DFF_PRE_CLR_ENA IS PORT(CLK : IN STD_LOGIC; D : IN STD_LOGIC; Q :OUT STD_LOGIC; ENA : IN STD_LOGIC; PRE : IN STD_LOGIC; CLR : IN STD_LOGIC); END; ARCHITECTURE bhv OF DFF_PRE_CLR_ENA IS SIGNAL Q1:STD_LOGIC; --类似于在芯片内部定义一个数据的暂存节点 BEGIN PROCESS(CLK,D,Q1,ENA,PRE,CLR) BEGIN IF CLR='1' THEN Q1<='0'; ELSIF PRE='1' THEN Q1<='1'; ELSIF CLK'EVENT AND CLK='1' AND ENA='1' THEN Q1<=D; END IF; --IF EN='1' THEN Q<=Q1; --将内部的暂存数据向端口输出 --END IF; Q<=Q1; --将内部的暂存数据向端口输出 END PROCESS; END bhv; --解2:实现图3-20(e)RTL图的VHDL程序t3_12_d.vhd顶层设计描述 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY t3_12_e IS PORT(D,EN,CLK,RST : IN STD_LOGIC; Q1,Q : OUT STD_LOGIC); END ENTITY t3_12_e; ARCHITECTURE one OF t3_12_e IS COMPONENT DFF_PRE_CLR_ENA --调用D触发器声明语句 PORT(CLK : IN STD_LOGIC; D : IN STD_LOGIC; Q :OUT STD_LOGIC; ENA : IN STD_LOGIC; PRE : IN STD_LOGIC; CLR : IN STD_LOGIC); END COMPONENT; SIGNAL D_EN: STD_LOGIC; --定义1个信号作为内部的连接线。 BEGIN D_EN<=D AND EN; u1: DFF_PRE_CLR_ENA PORT MAP(CLK=>CLK,D=>D,Q=>Q,ENA=>EN,PRE=>'0',CLR=>RST); Q1<=(NOT D_EN) OR RST; END ARCHITECTURE one; 图3-20 RTL图(f) --解1:实现图3-20(f)RTL图的VHDL程序mux21a.vhd底层设计描述 -- 用WHEN_ELSE实现2选1多路选择器程序(mux21a.vhd) LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux21a IS PORT(a,b : IN STD_LOGIC; s : IN STD_LOGIC; y : OUT STD_LOGIC); END ENTITY mux21a; ARCHITECTURE one OF mux21a IS BEGIN y<=a WHEN s='0' ELSE b; END ARCHITECTURE one; --解2:实现图3-20(f)RTL图的VHDL程序DFF_PRE_CLR.vhd底层设计描述-- 带预置、清零和输出使能的上升沿D触发器程序(DFF_PRE_CLR.vhd) LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY DFF_PRE_CLR_ENA IS PORT(CLK : IN STD_LOGIC; D : IN STD_LOGIC; Q :OUT STD_LOGIC; ENA : IN STD_LOGIC; PRE : IN STD_LOGIC; CLR : IN STD_LOGIC); END; ARCHITECTURE bhv OF DFF_PRE_CLR_ENA IS SIGNAL Q1:STD_LOGIC; --类似于在芯片内部定义一个数据的暂存节点BEGIN PROCESS(CLK,D,Q1,ENA,PRE,CLR) BEGIN IF CLR='1' THEN Q1<='0'; ELSIF PRE='1' THEN Q1<='1'; ELSIF CLK'EVENT AND CLK='1' AND ENA='1' THEN Q1<=D; END IF; --IF EN='1' THEN Q<=Q1; --将内部的暂存数据向端口输出 --END IF; Q<=Q1; --将内部的暂存数据向端口输出 END PROCESS; END bhv; --解3:实现图3-20(f)RTL图的VHDL程序t3_12_d.vhd顶层设计描述 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY t3_12_f IS PORT(RST,D,CLK : IN STD_LOGIC; Q,DOUT : OUT STD_LOGIC); END ENTITY t3_12_f; ARCHITECTURE one OF t3_12_f IS COMPONENT DFF_PRE_CLR_ENA --调用D触发器声明语句 PORT(CLK : IN STD_LOGIC; D : IN STD_LOGIC; Q :OUT STD_LOGIC; ENA : IN STD_LOGIC; PRE : IN STD_LOGIC; CLR : IN STD_LOGIC); END COMPONENT; COMPONENT mux21a --调用D触发器声明语句 PORT(a,b : IN STD_LOGIC; s : IN STD_LOGIC; y : OUT STD_LOGIC); END COMPONENT; SIGNAL DD,DDD: STD_LOGIC; --定义1个信号作为内部的连接线。 BEGIN u1: mux21a PORT MAP(D,'0',RST,DD); DDD<=D XOR DD; u2: DFF_PRE_CLR_ENA PORT MAP(CLK,DDD,DOUT,'1','0','0'); u3: DFF_PRE_CLR_ENA PORT MAP(CLK,DD,Q,'1','0','0'); END ARCHITECTURE one; 4 习题 4-1 归纳利用Quartus II进行VHDL文本输入设计的流程:从文件输入一直到SignalTap II 测试。P95~P115 4-2 由图4-35和图4-36,详细说明工程设计CNT10的硬件工作情况。P114~P115 4-3 如何为设计中的SignalTap II加入独立采样时钟?试给出完整的程序和对它的实测结果。P115 4-4 参考QuartusII的Help,详细说明Assignments菜单中Settings对话框的功能。 (1)说明其中的Timing Requirements&Qptions的功能、他用方法和检测途经。 (2)说明其中的Compilation Process的功能和使用方法。 (3)说明Analysis&Synthesis Setting的功能和使用方法,以及其中的Synthesis Netlist Optimization的功能和使用方法。 (4)说明FitterSettings中的DesignAssistant和Simulator功能,举例说明它们的使用方法。4-6 用74148(8-3线八进位优先编码器)和与非门实现8421BCD优先编码器,用3(5)片74139(2线-4线译码器)组成一个5-24(4-16)线译码器。 4-7 用74283(4位二进制全加器)加法器和逻辑门设计实现一位8421BCD码加法器电路,输入输出均是BCD码,CI为低位的进位信号,CO为高位的进位信号,输入为两个1位十进制数A,输出用S表示。