收藏 分销(赏)

EDA技术实用教程课后答案---潘松-黄继业.doc

上传人:xrp****65 文档编号:5916153 上传时间:2024-11-23 格式:DOC 页数:19 大小:273.82KB 下载积分:10 金币
下载 相关 举报
EDA技术实用教程课后答案---潘松-黄继业.doc_第1页
第1页 / 共19页
EDA技术实用教程课后答案---潘松-黄继业.doc_第2页
第2页 / 共19页


点击查看更多>>
资源描述
3-3 给出一个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; 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-4 给出1位全减器的VHDL描述;最终实现8位全减器。要求: 1)首先设计1位半减器,然后用例化语句将它们连接起来,图4-20中h_suber是半减器,diff是输出差(diff=x-y),s_out是借位输出(s_out=1,x<y),sub_in是借位输入。c yin xin diff_out b a 图3-19 1位全加器 --解(1.1):实现1位半减器h_suber(diff=x-y;s_out=1,x<y) 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 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)。 xin sub_out yin u0 sub_in diff_out x0 y0 sin diff0 xin sub_out yin u1 sub_in diff_out x1 y1 diff1 xin sub_out yin u7 sub_in diff_out x7 y7 sout diff7 ………………. ………………. 串行借位的8位减法器 a0 a1 a6 --解(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 设计一个求补码的程序,输入数据是一个有符号的8位二进制(原码)数。 --解:5-9 设计一个求补码的程序,输入数据是一个有符号的8位二进制数。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY org_patch IS PORT( org_data : IN STD_LOGIC_VECTOR(7 DOWNTO 0);--原码输入 patch_data : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));--补码输出 END org_patch; ARCHITECTURE BHV OF org_patch IS BEGIN PROCESS(org_data) BEGIN IF(org_data(7)='0') THEN patch_data<=org_data; --org_data>=0,补码=原码。 else patch_data<=org_data(7)&(not org_data(6 DOWNTO 0))+1;--org_data<0,补码=|原码|取反+1。 END IF; END PROCESS; END BHV; 3—10 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity add is port(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 begin process(a,b,ci) variable data:std_logic_vector(1 downto 0); variable c:std_logic; begin c:=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 IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY vote_7 IS PORT( DIN: IN STD_LOGIC_VECTOR(6 DOWNTO 0);--7位表决输入(1:同意,0:不同意) G_4: OUT STD_LOGIC; --超过半数指示 CNTH: OUT STD_LOGIC_VECTOR(2 DOWNTO 0));--表决结果统计数 END vote_7; ARCHITECTURE BHV OF vote_7 IS BEGIN PROCESS(DIN) VARIABLE Q: STD_LOGIC_VECTOR(2 DOWNTO 0); BEGIN Q:="000"; FOR n IN 0 TO 6 LOOP -- n是LOOP的循环变量 IF(DIN(n)='1') THEN Q:=Q+1; END IF; END LOOP; CNTH<=Q; IF Q>=4 THEN G_4<='1'; ELSE G_4<='0'; END IF; END PROCESS; END BHV; 5-7 用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) VARIABLE 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:=DATA; --允许加载 ELSE IF Q<9 THEN Q:=Q+1; --允许计数,检测是否小于9 ELSE Q:=(OTHERS=>'0'); --大于等于9时,计数值清零 END IF; END IF; END IF; END IF; IF Q=9 THEN COUT<='1'; --计数大于9,输出进位信号 ELSE COUT<='0'; END IF; DOUT<=Q; --将计数值向端口输出 END PROCESS; END behav; 5-8给出含有异步清零和计数使能的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; DATA : 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) VARIABLE CQI: STD_LOGIC_VECTOR(15 DOWNTO 0); --VARIABLE 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,计数值清零 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; 5-9 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity m6 is port(clk,rst:in std_logic; q: out std_logic_vector(2 downto 0)); end m6; architecture bhv of m6 is type states is(st0,st1,st2,st3,st4,st5); signal stx:states; begin process(clk) begin if rst='1' then stx<=st0;q<="000"; elsif clk'event and clk='1' then case(stx) is when st0=>q<="000";stx<=st1; when st1=>q<="001";stx<=st2; when st2=>q<="011";stx<=st3; when st3=>q<="111";stx<=st4; when st4=>q<="101";stx<=st5; when st5=>q<="100";stx<=st0; when others=> stx<=st0; end case; end if; end process; end bhv; 5-12 用同步时序电路对串行二进制输入进行奇偶校验,每检测5位输入,输出一个结果。当5位输入中1的数目为奇数时,在最后一位的时刻输出1。 --解:4-12 用同步时序电路对串行二进制输入进行奇偶校验,每检测5位输入,输出一个结果。 -- 当5位输入中1的数目为奇数时,在最后一位的时刻输出1。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY odd_even_p_RXD_5 IS PORT(CLK,RST,S_in: IN STD_LOGIC;--CLK、RST、S_in:时钟、复位、串行输入数据 P_out: 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 BEGIN PROCESS(CLK,RST) VARIABLE shift_Q : STD_LOGIC_VECTOR(4 DOWNTO 0);--shift_Q:移位寄存器 VARIABLE shift_cnt : STD_LOGIC_VECTOR(2 DOWNTO 0);--shift_cnt:移位计数器 BEGIN IF CLK'EVENT AND CLK='1' THEN --检测时钟上升沿 IF RST = '1' THEN shift_cnt:="100"; --移位寄存器和计数器复位 ELSE IF shift_cnt=4 THEN --检测到接收5位串行输入数据 shift_cnt:="000"; --移位计数器清零,为接收下一组数据做准备。 P_out<=shift_Q;--接收数据并行输出 o_e_out<=shift_Q(4) XOR shift_Q(3) XOR shift_Q(2) XOR shift_Q(1) XOR shift_Q(0);--奇校验输出 shift_Q:=S_in & shift_Q(4 DOWNTO 1);--采样移位串行输入 ELSE 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 分频方法有多种,最简单的是二分频和偶数分频甚至奇数分频,这用触发器或指定计数模的计数器即可办到。但对于现场实现指定分频比或小数分频率的分频电路的设计就不是很简单了。 试对例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; 5-6 分别给出图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 OR B; CD<=C AND 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
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 应用文书 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服