1、EDA技术实用教程课后答案潘松黄继业S0、S1、S2、S3。当且3-3 给出一个4选1多路选择器的 VHDL描述。选通控制端有四个输入:仅当 S0=0 时:丫=A ; S仁0 时:丫=B ; S2=0 时:丫=C ; S3=0 时:Y=D。-解:4选1多路选择器 VHDL程序设计。LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux41a ISPORT( A,B,C,D : IN STD_LOGIC;S0,S1,S2,S3 : IN STD_LOGIC;Y : OUT STD_LOGIC);END ENTITY mux41a;ARCHITECT
2、URE one OF mux41a ISSIGNAL S0_3 : STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINS0_3=S0&S1&S2&S3;y=A WHEN S0_3=0111 ELSEB WHEN S0_3=1011 ELSEC WHEN S0_3=1101 ELSED WHEN S0_3=1110 ELSE Z;3-4给出1)首先设计xinEND ARCHITECTURE one;1位全减器的VHDL描述;最终实现8位全减器。要求:1位半减器,然后用例化语句将它们连接起来 ,图4-20中h suber是半减器,diff是输出差a -(diff=x-y),s_o
3、ut 是借位输出(s_out=1,xy),sub_in 是借位输入f_ out c yinysuO图3-19 1位全加器-解(1.1):实现 1 位半减器 h_suber(diff=x-y ; s_out=1,xy) LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY h_suber ISPORT( x,y: IN STD_LOGIC;diff,s_out: OUT STD_LOGIC);END ENTITY h_suber;ARCHITECTURE hs1 OF h_suber ISBEGINDiff = x XOR (NOT y);s_out x
4、i n,y=yi n, diff=a, s_out=b);u2: h_suber PORT MAP(x=a, y=sub_i n, diff=diff_out,s_out=c);sub_out 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
5、 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(xi
6、n=x7,yin=y7,diff_out=diff7,sub_in=a6,sub_out=sout);END ARCHITECTURE s8;3-8 设计一个求补码的程序,输入数据是一个有符号的 8 位二进制 (原码)数。-解: 5-9 设计一个求补码的程序,输入数据是一个有符号的 8 位二进制数。LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY org_patch ISPORT( org_data : IN STD_LOGIC_VECTOR(7 DOWNTO 0);- 原码输入 pa
7、tch_data : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);- 补码输出 END org_patch;ARCHITECTURE BHV OF org_patch ISBEGIN PROCESS(org_data)BEGINIF(org_data(7)=0) THEN patch_data=0 ,补码 = 原码。else patch_data=org_data(7)&(not org_data(6 DOWNTO 0)+1;-org_data0 ,补码 =|原码 |取反 +1 。END IF;END PROCESS;END BHV;310library ieee;use
8、 ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity add isport(a:in std_logic_vector(7 downto 0); b:in std_logic_vector(7 downto 0); ci:in std_logic;co:out std_logic;count:out std_logic_vector(7 downto 0); end add;architecture bhv of add is beginprocess(a,b,ci)variable data:std_logic_vec
9、tor(1 downto 0); variable c:std_logic;beginc:=ci;for n in 0 to 7 loop data:=(0&a(n)+(0&b(n)+(0&c); count(n)=data(0);c:=data(1);end loop;co=c;end process; end bhv;3-14 用循环语句设计一个 7 人投票表决器,及一个 4 位 4 输入最大数值检测电路。 -解: 5-7 用循环语句设计一个 7 人投票表决器,及一个 4 位 4 输出最大数值检测电路。LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE
10、 IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY vote_7 IS0:不同意 )PORT( DIN: IN STD_LOGIC_VECTOR(6 DOWNTO 0);-7 位表决输入 (1:同意, G_4: OUT STD_LOGIC; - 超过半数指示CNTH: OUT STD_LOGIC_VECTOR(2 DOWNTO 0);- 表决结果统计数END vote_7;ARCHITECTURE BHV OF vote_7 ISBEGINPROCESS(DIN)VARIABLE Q: STD_LOGIC_VECTOR(2 DOWNTO 0); BEGINQ:=000;FO
11、R n IN 0 TO 6 LOOP - n 是 LOOP 的循环变量 IF(DIN(n)=1) THEN Q:=Q+1; END IF;END LOOP;CNTH=4 THEN G_4=1; ELSE G_40);ELSIF CLKEVENT AND CLK=1 THENIF EN=1 THEN-检测是否允许计数或加载同步使能)IF LOAD=0 THEN Q:=DA TA; -允许加载ELSEIF Q0); - 大于等于 9 时,计数值清零 END IF;END IF;END IF;END IF;IF Q=9 THEN COUT=1; - 计数大于 9,输出进位信号ELSE COUT=0;
12、-将计数值向端口输出END IF;DOUT 0); -计数器异步复位-检测时钟上升沿- 检测是否允许计数 ( 同步他能 ) - 允许计数 ,检测是否小于 65535-大于 65535,计数值清零-计数大于 9,输出进位信号- 检测是否允许计数 (同步他能 )- 允许计数 ,检测是否小于 65535-大于 65535, 计数值清零ELSIF LOAD = 1 THEN CQI:=DATA; -LS_LOAD:=0; - 计数器异步复位ELSIF CLKEVENT AND CLK=1 THENIF ADD_EN=1THENIF CQI 0);END IF;IF CQI=16#FFFF# THEN
13、COUT=1;ELSE COUT 0 THEN CQI:=CQI-1;ELSE CQI:=(OTHERS = 1);END IF;IF CQI=0 THEN COUT=1;ELSE COUT = 0;END IF;END IF;END IF;CQ=CQI;END PROCESS;END ARCHITECTURE A_S_16;-计数大于 9,输出进位信号-将计数值向端口输出5-9 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity m6 isport(clk,rst:in std_log
14、ic;q: out std_logic_vector(2 downto 0); end m6;architecture bhv of m6 istype states is(st0,st1,st2,st3,st4,st5); signal stx:states;begin process(clk)beginif rst=1 then stx=st0;qq=000;stxq=001;stxq=011;stxq=111;stxq=101;stxq=100;stx stx=st0; end case;end if;end process;end bhv;5 位输入,输出一个结果。当 5 位5 位输入
15、,输出一个结果。1。5-12 用同步时序电路对串行二进制输入进行奇偶校验,每检测输入中 1 的数目为奇数时,在最后一位的时刻输出 1。- 解: 4-12 用同步时序电路对串行二进制输入进行奇偶校验,每检测- 当 5 位输入中 1 的数目为奇数时,在最后一位的时刻输出LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY odd_even_p_RXD_5 ISPORT(CLK,RST,S_in: IN STD_LOGIC;-CLK 、 RST、S_in: 时钟、复位、串行输入数据P_out:
16、OUT STD_LOGIC_VECTOR(4 DOWNTO 0);-P_out: 并行输出数据o_e_out: OUT STD_LOGIC); -o_e_out: 奇校验输出位END ENTITY odd_even_p_RXD_5;ARCHITECTURE one OF odd_even_p_RXD_5 IS BEGINPROCESS(CLK,RST)VARIABLE shift_Q : STD_LOGIC_VECTOR(4 DOWNTO 0);-shift_Q: 移位寄存器VARIABLE shift_cnt : STD_LOGIC_VECTOR(2 DOWNTO 0);-shift_cnt
17、: 移位计数器BEGINIF CLKEVENT AND CLK=1 THEN - 检测时钟上升沿IF RST = 1 THEN shift_cnt:=100; -ELSEELSE采样移位串行输入shift_cnt:=shift_cnt+1;- 移位计数shift_Q:=S_in & shift_Q(4 DOWNTO 1);-END IF;END IF;END IF;END PROCESS;END ARCHITECTURE one;5-5 分频方法有多种, 最简单的是二分频和偶数分频甚至奇数分频,这用触发器或指定计数模的计 数器即可办到。但对于现场实现指定分频比或小数分频率的分频电路的设计就不是
18、很简单了。试对例 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 ISPORT(CLK : IN ST
19、D_LOGIC;D : IN STD_LOGIC_VECTOR(15 DOWNTO 0);FOUT : OUT STD_LOGIC);END ENTITY DVF16;ARCHITECTURE one OF DVF16 ISSIGNAL FULL : STD_LOGIC;BEGINP_REG: PROCESS(CLK)VARIABLE CNT8 : STD_LOGIC_VECTOR(15 DOWNTO 0);BEGINIF CLKEVENT AND CLK = 1 THENIF CNT8 = 0000000000000000 THENCNT8 := D-1;- 当 CNT8 计数归 0 时,预
20、置 CNT8=D-1;-计数范围(D=n): n-1n/2取整(n=10:98765计数,前后半周期相同)FULL = 1;- 同时使溢出标志信号 FULL 输出为高电平-(n=11:1098765 计数,前比后半周期多一个时钟 )ELSIF CNT8 = (0 & D(15 DOWNTO 1) THENCNT8 :=(0 & D(15 DOWNTO 1)-1;- 当 CNT8=n/2 取整时,预置 CNT8=D/2 取整-1;-计数范围(D=n) : n/2 取整 0(n=10:43210 计数)FULL = 1; - 同时使溢出标志信号 FULL 输出为高电平 (n=11:43210 计数
21、)ELSE CNT8 := CNT8 - 1; -否则继续作加 1 计数FULL = 0; -且输出溢出标志信号 FULL 为低电平END IF;END IF;END PROCESS P_REG ;P_DIV: PROCESS(FULL)VARIABLE CNT2 : STD_LOGIC;BEGINIF FULLEVENT AND FULL = 1 THENCNT2 := NOT CNT2;-如果溢出标志信号 FULL为高电平,D触发器输出取反IF CNT2 = 1 THEN FOUT = 1;ELSE FOUT = 0;END IF;END IF;END PROCESS P_DIV;END ARCHITECTURE one;5-6(a) (b)图 3-20 RTL 图(a)-解:实现图 3-20(a)RTL 图的 VHDL 程序 t3_12_a.vhdLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY t3_12_a ISPORT (CL,CLK0: IN STD_LOGIC;OUT1: OUT STD_LOGIC);END ENTITY t3_12_a;ARCHITECTURE sxdl OF t3_12_a IS -时