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

上传人:b****5 文档编号:29171401 上传时间:2023-07-21 格式:DOCX 页数:31 大小:49.10KB
下载 相关 举报
EDA技术实用教程课后答案潘松黄继业.docx_第1页
第1页 / 共31页
EDA技术实用教程课后答案潘松黄继业.docx_第2页
第2页 / 共31页
EDA技术实用教程课后答案潘松黄继业.docx_第3页
第3页 / 共31页
EDA技术实用教程课后答案潘松黄继业.docx_第4页
第4页 / 共31页
EDA技术实用教程课后答案潘松黄继业.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

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

《EDA技术实用教程课后答案潘松黄继业.docx》由会员分享,可在线阅读,更多相关《EDA技术实用教程课后答案潘松黄继业.docx(31页珍藏版)》请在冰豆网上搜索。

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

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)。

--解

(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<='0';--且输出溢出标志信号FULL为低电平

ENDIF;

ENDIF;

ENDPROCESSP_REG;

P_DIV:

PROCESS(FULL)

VARIABLECNT2:

STD_LOGIC;

BEGIN

IFFULL'EVENTANDFULL='1'THEN

CNT2:

=NOTCNT2;--如果溢出标志信号FULL为高电平,D触发器

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 财务管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1