《EDA技术实用教程(第四版)》习题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;mux21in0outputin1selbuf3sinput outputenableENTITY mux41 ISPORT (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 ISSIGNAL s0s1 : STD_LOGIC_VECTOR(1 DOWNTO 0);--定义标准逻辑位矢量数据BEGINs0s1<=s1&s0; --s1相并s0,即s1与s0并置操作PROCESS(s0s1,a,b,c,d)BEGINIF 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 ISPORT (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 ISSIGNAL s0s1 : STD_LOGIC_VECTOR(1 DOWNTO 0);--定义标准逻辑位矢量数据类型BEGINs0s1<=s1&s0; --s1相并s0,即s1与s0并置操作PROCESS(s0s1,a,b,c,d)BEGINCASE 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 ISPORT(a1,a2,a3,s0,s1: IN STD_LOGIC;outy:OUT STD_LOGIC);END ENTITY mux31;ARCHITECTURE case_mux31 OF mux31 ISSIGNAL y : STD_LOGIC;BEGINu1: PROCESS(s0,a1,a2,a3)BEGINCASE 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)BEGINCASE 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 ISPORT(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 ISSIGNAL Q : STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINREG: PROCESS(CLK,RST,EN,LOAD,Q)BEGINIF LOAD='0' THEN Q<=DATA; --允许加载ELSIF CLK'EVENT AND CLK='1' THEN --检测时钟上升沿IF RST='0' THEN Q<=(OTHERS =>'0'); --计数器异步复位ELSEIF EN='1' THEN --检测是否允许计数或加载(同步使能)IF LOAD='0' THEN Q<=DATA; --允许加载ELSEIF Q<12 THEN Q<=Q+1; --允许计数,检测是否小于9ELSE Q<=(OTHERS=>'0'); --大于等于9时,计数值清零END IF;END IF;END IF;END IF;END IF;END PROCESS;COM: PROCESS(Q)BEGINIF 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 ISPORT (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 ISBEGINPROCESS(CLK,RST,ADD_EN,SUB_EN)V ARIABLE CQI: STD_LOGIC_VECTOR(15 DOWNTO 0);BEGINIF 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; --允许计数,检测是否小于65535ELSE 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; --允许计数,检测是否小于65535ELSE 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 设计文件。