EDA技术实用教程课后答案潘松黄继业Word格式文档下载.docx
《EDA技术实用教程课后答案潘松黄继业Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《EDA技术实用教程课后答案潘松黄继业Word格式文档下载.docx(27页珍藏版)》请在冰豆网上搜索。
=S0&
S1&
S2&
S3;
y<
=AWHENS0_3="
0111"
ELSE
BWHENS0_3="
1011"
CWHENS0_3="
1101"
DWHENS0_3="
1110"
'
Z'
;
ENDARCHITECTUREone;
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-191位全加器
--解(1.1):
实现1位半减器h_suber(diff=x-y;
s_out=1,x<
y)
ENTITYh_suberIS
PORT(x,y:
diff,s_out:
ENDENTITYh_suber;
ARCHITECTUREhs1OFh_suberIS
Diff<
=xXOR(NOTy);
s_out<
=(NOTx)ANDy;
ENDARCHITECTUREhs1;
--解(1.2):
采用例化实现图4-20的1位全减器
--1位二进制全减器顺层设计描述
ENTITYf_suberIS
PORT(xin,yin,sub_in:
sub_out,diff_out:
ENDENTITYf_suber;
ARCHITECTUREfs1OFf_suberIS
COMPONENTh_suber--调用半减器声明语句
PORT(x,y:
ENDCOMPONENT;
SIGNALa,b,c:
STD_LOGIC;
--定义1个信号作为内部的连接线。
u1:
h_suberPORTMAP(x=>
xin,y=>
yin,diff=>
a,s_out=>
b);
u2:
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
yinu1
x1
y1
diff1
yinu7
x7
y7
sout
diff7
……………….
串行借位的8位减法器
a0
a1
a6
--解
(2):
采用例化方法,以1位全减器为基本硬件;
实现串行借位的8位减法器(上图所示)。
ENTITYsuber_8IS
PORT(x0,x1,x2,x3,x4,x5,x6,x7:
INSTD_LOGIC;
y0,y1,y2,y3,y4,y5,y6,y7,sin:
diff0,diff1,diff2,diff3:
OUTSTD_LOGIC;
diff4,diff5,diff6,diff7,sout:
ENDENTITYsuber_8;
ARCHITECTUREs8OFsuber_8IS
COMPONENTf_suber--调用全减器声明语句
SIGNALa0,a1,a2,a3,a4,a5,a6:
u0:
f_suberPORTMAP(xin=>
x0,yin=>
y0,diff_out=>
diff0,sub_in=>
sin,sub_out=>
a0);
u1:
x1,yin=>
y1,diff_out=>
diff1,sub_in=>
a0,sub_out=>
a1);
u2:
x2,yin=>
y2,diff_out=>
diff2,sub_in=>
a1,sub_out=>
a2);
u3:
x3,yin=>
y3,diff_out=>
diff3,sub_in=>
a2,sub_out=>
a3);
u4:
x4,yin=>
y4,diff_out=>
diff4,sub_in=>
a3,sub_out=>
a4);
u5:
x5,yin=>
y5,diff_out=>
diff5,sub_in=>
a4,sub_out=>
a5);
u6:
x6,yin=>
y6,diff_out=>
diff6,sub_in=>
a5,sub_out=>
a6);
u7:
x7,yin=>
y7,diff_out=>
diff7,sub_in=>
a6,sub_out=>
sout);
ENDARCHITECTUREs8;
3-8设计一个求补码的程序,输入数据是一个有符号的8位二进制(原码)数。
5-9设计一个求补码的程序,输入数据是一个有符号的8位二进制数。
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYorg_patchIS
PORT(org_data:
INSTD_LOGIC_VECTOR(7DOWNTO0);
--原码输入
patch_data:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
--补码输出
ENDorg_patch;
ARCHITECTUREBHVOForg_patchIS
PROCESS(org_data)
IF(org_data(7)='
0'
)THEN
patch_data<
=org_data;
--org_data>
=0,补码=原码。
else
=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:
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;
c:
=ci;
fornin0to7loop
data:
=('
&
a(n))+('
b(n))+('
count(n)<
=data(0);
=data
(1);
endloop;
co<
=c;
endprocess;
endbhv;
3-14用循环语句设计一个7人投票表决器,及一个4位4输入最大数值检测电路。
5-7用循环语句设计一个7人投票表决器,及一个4位4输出最大数值检测电路。
ENTITYvote_7IS
PORT(DIN:
INSTD_LOGIC_VECTOR(6DOWNTO0);
--7位表决输入(1:
同意,0:
不同意)
G_4:
--超过半数指示
CNTH:
OUTSTD_LOGIC_VECTOR(2DOWNTO0));
--表决结果统计数
ENDvote_7;
ARCHITECTUREBHVOFvote_7IS
PROCESS(DIN)
VARIABLEQ:
STD_LOGIC_VECTOR(2DOWNTO0);
Q:
="
000"
FORnIN0TO6LOOP--n是LOOP的循环变量
IF(DIN(n)='
1'
)THENQ:
=Q+1;
ENDLOOP;
CNTH<
=Q;
IFQ>
=4THENG_4<
='
ELSEG_4<
5-7用VHDL设计一个功能类似74LS160的计数器。
3-10用VHDL设计一个功能类似74LS160(异步复位和同步使能加载、计数的十进制加法计数器)的计数器。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEE