您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 其它办公文档 > EDA技术实用教程课后答案---潘松,黄继业
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程序设计。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux41aISPORT(A,B,C,D:INSTD_LOGIC;S0,S1,S2,S3:INSTD_LOGIC;Y:OUTSTD_LOGIC);ENDENTITYmux41a;ARCHITECTUREoneOFmux41aISSIGNALS0_3:STD_LOGIC_VECTOR(3DOWNTO0);BEGINS0_3=S0&S1&S2&S3;y=AWHENS0_3=0111ELSEBWHENS0_3=1011ELSECWHENS0_3=1101ELSEDWHENS0_3=1110ELSE'Z';ENDARCHITECTUREone;3-4给出1位全减器的VHDL描述;最终实现8位全减器。要求:1)首先设计1位半减器,然后用例化语句将它们连接起来,图4-20中h_suber是半减器,diff是输出差(diff=x-y),s_out是借位输出(s_out=1,xy),sub_in是借位输入。图3-191位全加器--解(1.1):实现1位半减器h_suber(diff=x-y;s_out=1,xy)LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYh_suberISPORT(x,y:INSTD_LOGIC;diff,s_out:OUTSTD_LOGIC);ENDENTITYh_suber;ARCHITECTUREhs1OFh_suberISBEGINDiff=xXOR(NOTy);xinyinabdiff_outcs_out=(NOTx)ANDy;ENDARCHITECTUREhs1;--解(1.2):采用例化实现图4-20的1位全减器LIBRARYIEEE;--1位二进制全减器顺层设计描述USEIEEE.STD_LOGIC_1164.ALL;ENTITYf_suberISPORT(xin,yin,sub_in:INSTD_LOGIC;sub_out,diff_out:OUTSTD_LOGIC);ENDENTITYf_suber;ARCHITECTUREfs1OFf_suberISCOMPONENTh_suber--调用半减器声明语句PORT(x,y:INSTD_LOGIC;diff,s_out:OUTSTD_LOGIC);ENDCOMPONENT;SIGNALa,b,c:STD_LOGIC;--定义1个信号作为内部的连接线。BEGINu1:h_suberPORTMAP(x=xin,y=yin,diff=a,s_out=b);u2:h_suberPORTMAP(x=a,y=sub_in,diff=diff_out,s_out=c);sub_out=cORb;ENDARCHITECTUREfs1;(2)以1位全减器为基本硬件,构成串行借位的8位减法器,要求用例化语句来完成此项设计(减法运算是x-y-sun_in=difft)。--解(2):采用例化方法,以1位全减器为基本硬件;实现串行借位的8位减法器(上图所示)。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYsuber_8ISPORT(x0,x1,x2,x3,x4,x5,x6,x7:INSTD_LOGIC;xinsub_outyinu0sub_indiff_outx0y0sindiff0xinsub_outyinu1sub_indiff_outx1y1diff1xinsub_outyinu7sub_indiff_outx7y7soutdiff7……………….……………….串行借位的8位减法器a0a1a6y0,y1,y2,y3,y4,y5,y6,y7,sin:INSTD_LOGIC;diff0,diff1,diff2,diff3:OUTSTD_LOGIC;diff4,diff5,diff6,diff7,sout:OUTSTD_LOGIC);ENDENTITYsuber_8;ARCHITECTUREs8OFsuber_8ISCOMPONENTf_suber--调用全减器声明语句PORT(xin,yin,sub_in:INSTD_LOGIC;sub_out,diff_out:OUTSTD_LOGIC);ENDCOMPONENT;SIGNALa0,a1,a2,a3,a4,a5,a6:STD_LOGIC;--定义1个信号作为内部的连接线。BEGINu0:f_suberPORTMAP(xin=x0,yin=y0,diff_out=diff0,sub_in=sin,sub_out=a0);u1:f_suberPORTMAP(xin=x1,yin=y1,diff_out=diff1,sub_in=a0,sub_out=a1);u2:f_suberPORTMAP(xin=x2,yin=y2,diff_out=diff2,sub_in=a1,sub_out=a2);u3:f_suberPORTMAP(xin=x3,yin=y3,diff_out=diff3,sub_in=a2,sub_out=a3);u4:f_suberPORTMAP(xin=x4,yin=y4,diff_out=diff4,sub_in=a3,sub_out=a4);u5:f_suberPORTMAP(xin=x5,yin=y5,diff_out=diff5,sub_in=a4,sub_out=a5);u6:f_suberPORTMAP(xin=x6,yin=y6,diff_out=diff6,sub_in=a5,sub_out=a6);u7:f_suberPORTMAP(xin=x7,yin=y7,diff_out=diff7,sub_in=a6,sub_out=sout);ENDARCHITECTUREs8;3-8设计一个求补码的程序,输入数据是一个有符号的8位二进制(原码)数。--解:5-9设计一个求补码的程序,输入数据是一个有符号的8位二进制数。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYorg_patchISPORT(org_data:INSTD_LOGIC_VECTOR(7DOWNTO0);--原码输入patch_data:OUTSTD_LOGIC_VECTOR(7DOWNTO0));--补码输出ENDorg_patch;ARCHITECTUREBHVOForg_patchISBEGINPROCESS(org_data)BEGINIF(org_data(7)='0')THENpatch_data=org_data;--org_data=0,补码=原码。elsepatch_data=org_data(7)&(notorg_data(6DOWNTO0))+1;--org_data0,补码=|原码|取反+1。ENDIF;ENDPROCESS;ENDBHV;3—10libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityaddisport(a:instd_logic_vector(7downto0);b:instd_logic_vector(7downto0);ci:instd_logic;co:outstd_logic;count:outstd_logic_vector(7downto0));endadd;architecturebhvofaddisbeginprocess(a,b,ci)variabledata:std_logic_vector(1downto0);variablec:std_logic;beginc:=ci;fornin0to7loopdata:=('0'&a(n))+('0'&b(n))+('0'&c);count(n)=data(0);c:=data(1);endloop;co=c;endprocess;endbhv;3-14用循环语句设计一个7人投票表决器,及一个4位4输入最大数值检测电路。--解:5-7用循环语句设计一个7人投票表决器,及一个4位4输出最大数值检测电路。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYvote_7ISPORT(DIN:INSTD_LOGIC_VECTOR(6DOWNTO0);--7位表决输入(1:同意,0:不同意)G_4:OUTSTD_LOGIC;--超过半数指示CNTH:OUTSTD_LOGIC_VECTOR(2DOWNTO0));--表决结果统计数ENDvote_7;ARCHITECTUREBHVOFvote_7ISBEGINPROCESS(DIN)VARIABLEQ:STD_LOGIC_VECTOR(2DOWNTO0);BEGINQ:=000;FORnIN0TO6LOOP--n是LOOP的循环变量IF(DIN(n)='1')THENQ:=Q+1;ENDIF;ENDLOOP;CNTH=Q;IFQ=4THENG_4='1';ELSEG_4='0';ENDIF;ENDPROCESS;ENDBHV;5-7用VHDL设计一个功能类似74LS160的计数器。--解:3-10用VHDL设计一个功能类似74LS160(异步复位和同步使能加载、计数的十进制加法计数器)的计数器。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCNT10ISPORT(CLK,RST,EN,LOAD:INSTD_LOGIC;DATA:INSTD_LOGIC_VECTOR(3DOWNTO0);--4位预置数DOUT:OUTSTD_LOGIC_VECTOR(3DOWNTO0);--计数值输出COUT:OUTSTD_LOGIC);--计数进位输出ENDCNT10;ARCHITECTUREbehavOFCNT10ISBEGINPROCESS(CLK,RST,EN,LOAD)VARIABLEQ:STD_LOGIC_VECTOR(3DOWNTO0);BEGINIFRST='0'THENQ:=(OTHERS='0');--计数器异步复位ELSIFCLK'EVENTANDCLK='1'THEN--检测时钟上升沿IFEN='1'THEN--检测是否允许计数或加载(同步使能)IFLOAD='0'THENQ:=DATA;--允许加载ELSEIFQ9THENQ:=Q+1;--允许计数,检测是否小于9ELSEQ:=(OTHERS='0');--大于等于9时,计数值清零ENDIF;ENDIF;ENDIF;ENDIF;IFQ=9THENCOUT='1';--计数大于9,输出进位信号ELSECOUT='0';ENDIF;DOUT=Q;--将计数值向端口输出ENDPROCESS;ENDbehav;5-8给出含有异步清零和计数使能的16位二进制加减可控计数器的VHDL描述。--解:3-11给出含有异步清零和计数使能的16位二进制加减可控计数器的VHDL描述。--用VHDL实现含有异步清零和计数使能的16位二进制加减可控计数器。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYADD_S
本文标题:EDA技术实用教程课后答案---潘松,黄继业
链接地址:https://www.777doc.com/doc-2913130 .html