EDA技术实用教程课后答案潘松黄继业.docx
- 文档编号:11473600
- 上传时间:2023-03-01
- 格式:DOCX
- 页数:33
- 大小:70.88KB
EDA技术实用教程课后答案潘松黄继业.docx
《EDA技术实用教程课后答案潘松黄继业.docx》由会员分享,可在线阅读,更多相关《EDA技术实用教程课后答案潘松黄继业.docx(33页珍藏版)》请在冰豆网上搜索。
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。
ENTITYmux41aIS
PORT(A,B,C,D:
INSTD_LOGIC。
S0,S1,S2,S3:
INSTD_LOGIC。
Y:
OUTSTD_LOGIC)。
ENDENTITYmux41a。
ARCHITECTUREoneOFmux41aIS
SIGNALS0_3:
STD_LOGIC_VECTOR(3DOWNTO0)。
BEGIN
S0_3<=S0&S1&S2&S3。
y<=AWHENS0_3="0111"ELSE
BWHENS0_3="1011"ELSE
CWHENS0_3="1101"ELSE
DWHENS0_3="1110"ELSE
'Z'。
ENDARCHITECTUREone。
3-4给出1位全减器的VHDL描述;最终实现8位全减器。
要求:
1)首先设计1位半减器,然后用例化语句将它们连接起来,图4-20中h_suber是半减器,diff是输出差(diff=x-y),s_out是借位输出(s_out=1,x c yin xin diff_out b a 图3-191位全加器 --解(1.1): 实现1位半减器h_suber(diff=x-y;s_out=1,x LIBRARYIEEE。 USEIEEE.STD_LOGIC_1164.ALL。 ENTITYh_suberIS PORT(x,y: INSTD_LOGIC。 diff,s_out: OUTSTD_LOGIC)。 ENDENTITYh_suber。 ARCHITECTUREhs1OFh_suberIS BEGIN Diff<=xXOR(NOTy)。 s_out<=(NOTx)ANDy。 ENDARCHITECTUREhs1。 --解(1.2): 采用例化实现图4-20的1位全减器 LIBRARYIEEE。 --1位二进制全减器顺层设计描述 USEIEEE.STD_LOGIC_1164.ALL。 ENTITYf_suberIS PORT(xin,yin,sub_in: INSTD_LOGIC。 sub_out,diff_out: OUTSTD_LOGIC)。 ENDENTITYf_suber。 ARCHITECTUREfs1OFf_suberIS COMPONENTh_suber--调用半减器声明语句 PORT(x,y: INSTD_LOGIC。 diff,s_out: OUTSTD_LOGIC)。 ENDCOMPONENT。 SIGNALa,b,c: STD_LOGIC。 --定义1个信号作为内部的连接线。 BEGIN u1: 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)。 xinsub_out yinu0 sub_indiff_out x0 y0 sin diff0 xinsub_out yinu1 sub_indiff_out x1 y1 diff1 xinsub_out yinu7 sub_indiff_out x7 y7 sout diff7 ………………. ………………. 串行借位的8位减法器 a0 a1 a6 --解 (2): 采用例化方法,以1位全减器为基本硬件;实现串行借位的8位减法器(上图所示)。 LIBRARYIEEE。 USEIEEE.STD_LOGIC_1164.ALL。 ENTITYsuber_8IS PORT(x0,x1,x2,x3,x4,x5,x6,x7: INSTD_LOGIC。 y0,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_8IS COMPONENTf_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个信号作为内部的连接线。 BEGIN u0: 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_patchIS PORT(org_data: INSTD_LOGIC_VECTOR(7DOWNTO0)。 --原码输入 patch_data: OUTSTD_LOGIC_VECTOR(7DOWNTO0))。 --补码输出 ENDorg_patch。 ARCHITECTUREBHVOForg_patchIS BEGIN PROCESS(org_data) BEGIN IF(org_data(7)='0')THEN patch_data<=org_data。 --org_data>=0,补码=原码。 else patch_data<=org_data(7)&(notorg_data(6DOWNTO0))+1。 --org_data<0,补码=|原码|取反+1。 ENDIF。 ENDPROCESS。 ENDBHV。 3—10 libraryieee。 useieee.std_logic_1164.all。 useieee.std_logic_unsigned.all。 entityaddis port(a: instd_logic_vector(7downto0)。 b: instd_logic_vector(7downto0)。 ci: instd_logic。 co: outstd_logic。 count: outstd_logic_vector(7downto0))。 endadd。 architecturebhvofaddis begin process(a,b,ci) variabledata: std_logic_vector(1downto0)。 variablec: std_logic。 begin c: =ci。 fornin0to7loop data: =('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_7IS PORT(DIN: INSTD_LOGIC_VECTOR(6DOWNTO0)。 --7位表决输入(1: 同意,0: 不同意) G_4: OUTSTD_LOGIC。 --超过半数指示 CNTH: OUTSTD_LOGIC_VECTOR(2DOWNTO0))。 --表决结果统计数 ENDvote_7。 ARCHITECTUREBHVOFvote_7IS BEGIN PROCESS(DIN) VARIABLEQ: STD_LOGIC_VECTOR(2DOWNTO0)。 BEGIN Q: ="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。 ENTITYCNT10IS PORT(CLK,RST,EN,LOAD: INSTD_LOGIC。 DATA: INSTD_LOGIC_VECTOR(3DOWNTO0)。 --4位预置数 DOUT: OUTSTD_LOGIC_VECTOR(3DOWNTO0)。 --计数值输出 COUT: OUTSTD_LOGIC)。 --计数进位输出 ENDCNT10。 ARCHITECTUREbehavOFCNT10IS BEGIN PROCESS(CLK,RST,EN,LOAD) VARIABLEQ: STD_LOGIC_VECTOR(3DOWNTO0)。 BEGIN IFRST='0'THENQ: =(OTHERS=>'0')。 --计数器异步复位 ELSIFCLK'EVENTANDCLK='1'THEN--检测时钟上升沿 IFEN='1'THEN--检测是否允许计数或加载(同步使能) IFLOAD='0'THENQ: =DATA。 --允许加载 ELSE IFQ<9THENQ: =Q+1。 --允许计数,检测是否小于9 ELSEQ: =(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_SUB_LOAD_16IS PORT(CLK,RST,ADD_EN,SUB_EN,LOAD: INSTD_LOGIC。 DATA: INSTD_LOGIC_VECTOR(15DOWNTO0)。 CQ: OUTSTD_LOGIC_VECTOR(15DOWNTO0)。 COUT: OUTSTD_LOGIC)。 ENDENTITYADD_SUB_LOAD_16。 ARCHITECTUREA_S_16OFADD_SUB_LOAD_16IS BEGIN PROCESS(CLK,RST,ADD_EN,SUB_EN,LOAD) VARIABLECQI: STD_LOGIC_VECTOR(15DOWNTO0)。 --VARIABLELS_LOAD: STD_LOGIC。 BEGIN --LS_LOAD: =LOAD。 IFRST='1'THENCQI: =(OTHERS=>'0')。 --计数器异步复位 ELSIFLOAD='1'THENCQI: =DATA。 --LS_LOAD: ='0'。 --计数器异步复位 ELSIFCLK'EVENTANDCLK='1'THEN--检测时钟上升沿 IFADD_EN='1'THEN--检测是否允许计数(同步他能) IFCQI<16#FFFF#THENCQI: =CQI+1。 --允许计数,检测是否小于65535 ELSECQI: =(OTHERS=>'0')。 --大于65535,计数值清零 ENDIF。 IFCQI=16#FFFF#THENCOUT<='1'。 --计数大于9,输出进位信号 ELSECOUT<='0'。 ENDIF。 ENDIF。 IFSUB_EN='1'THEN--检测是否允许计数(同步他能) IFCQI>0THENCQI: =CQI-1。 --允许计数,检测是否小于65535 ELSECQI: =(OTHERS=>'1')。 --大于65535,计数值清零 ENDIF。 IFCQI=0THENCOUT<='1'。 --计数大于9,输出进位信号 ELSECOUT<='0'。 ENDIF。 ENDIF。 ENDIF。 CQ<=CQI。 --将计数值向端口输出 ENDPROCESS。 ENDARCHITECTUREA_S_16。 5-9 libraryieee。 useieee.std_logic_1164.all。 useieee.std_logic_unsigned.all。 entitym6is port(clk,rst: instd_logic。 q: outstd_logic_vector(2downto0))。 endm6。 architecturebhvofm6is typestatesis(st0,st1,st2,st3,st4,st5)。 signalstx: states。 begin process(clk) begin ifrst='1'thenstx<=st0。 q<="000"。 elsifclk'eventandclk='1'then case(stx)is whenst0=>q<="000"。 stx<=st1。 whenst1=>q<="001"。 stx<=st2。 whenst2=>q<="011"。 stx<=st3。 whenst3=>q<="111"。 stx<=st4。 whenst4=>q<="101"。 stx<=st5。 whenst5=>q<="100"。 stx<=st0。 whenothers=>stx<=st0。 endcase。 endif。 endprocess。 endbhv。 5-12用同步时序电路对串行二进制输入进行奇偶校验,每检测5位输入,输出一个结果。 当5位输入中1的数目为奇数时,在最后一位的时刻输出1。 --解: 4-12用同步时序电路对串行二进制输入进行奇偶校验,每检测5位输入,输出一个结果。 --当5位输入中1的数目为奇数时,在最后一位的时刻输出1。 LIBRARYIEEE。 USEIEEE.STD_LOGIC_1164.ALL。 USEIEEE.STD_LOGIC_UNSIGNED.ALL。 ENTITYodd_even_p_RXD_5IS PORT(CLK,RST,S_in: INSTD_LOGIC。 --CLK、RST、S_in: 时钟、复位、串行输入数据 P_out: OUTSTD_LOGIC_VECTOR(4DOWNTO0)。 --P_out: 并行输出数据 o_e_out: OUTSTD_LOGIC)。 --o_e_out: 奇校验输出位 ENDENTITYodd_even_p_RXD_5。 ARCHITECTUREoneOFodd_even_p_RXD_5IS BEGIN PROCESS(CLK,RST) VARIABLEshift_Q: STD_LOGIC_VECTOR(4DOWNTO0)。 --shift_Q: 移位寄存器 VARIABLEshift_cnt: STD_LOGIC_VECTOR(2DOWNTO0)。 --shift_cnt: 移位计数器 BEGIN IFCLK'EVENTANDCLK='1'THEN--检测时钟上升沿 IFRST='1'THENshift_cnt: ="100"。 --移位寄存器和计数器复位 ELSE IFshift_cnt=4THEN--检测到接收5位串行输入数据 shift_cnt: ="000"。 --移位计数器清零,为接收下一组数据做准备。 P_out<=shift_Q。 --接收数据并行输出 o_e_out<=shift_Q(4)XORshift_Q(3)XORshift_Q (2)XORshift_Q (1)XORshift_Q(0)。 --奇校验输出 shift_Q: =S_in&shift_Q(4DOWNTO1)。 --采样移位串行输入 ELSE shift_cnt: =shift_cnt+1。 --移位计数 shift_Q: =S_in&shift_Q(4DOWNTO1)。 --采样移位串行输入 ENDIF。 ENDIF。 ENDIF。 ENDPROCESS。 ENDARCHITECTUREone。 5-5分频方法有多种,最简单的是二分频和偶数分频甚至奇数分频,这用触发器或指定计数模的计数器即可办到。 但对于现场实现指定分频比或小数分频率的分频电路的设计就不是很简单了。 试对例3-20的设计稍作修改,将其进位输出COUT与异步加载控制LOAD连在一起,构成一个自动加载型16位二进制数计数器,也即一个16位可控的分频器,给出其VHDL表述,并说明工作原理。 设输入频率fi=4MHz,输出频率fo=516.5±1Hz(允许误差±0.1Hz),16位加载数值是多少? --解: 3-916位数控分频器(可进行奇偶数分频) LIBRARYIEEE。 USEIEEE.STD_LOGIC_1164.ALL。 USEIEEE.STD_LOGIC_UNSIGNED.ALL。 ENTITYDVF16IS PORT(CLK: INSTD_LOGIC。 D: INSTD_LOGIC_VECTOR(15DOWNTO0)。 FOUT: OUTSTD_LOGIC)。 ENDENTITYDVF16。 ARCHITECTUREoneOFDVF16IS SIGNALFULL: STD_LOGIC。 BEGIN P_REG: PROCESS(CLK) VARIABLECNT8: STD_LOGIC_VECTOR(15DOWNTO0)。 BEGIN IFCLK'EVENTANDCLK='1'THEN IFCNT8="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计数,前比后半周期多一个时钟) ELSIFCNT8=('0'&D(15DOWNTO1))THEN CNT8: =('0'&D(15DOWNTO1))-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计数) ELSECNT8: =CNT8-1。 --否则继续作加1计数 FULL<=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 技术 实用教程 课后 答案 潘松黄 继业