EDA技术实用教程课后答案潘松黄继业文档格式.docx
- 文档编号:5722369
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:29
- 大小:250.27KB
EDA技术实用教程课后答案潘松黄继业文档格式.docx
《EDA技术实用教程课后答案潘松黄继业文档格式.docx》由会员分享,可在线阅读,更多相关《EDA技术实用教程课后答案潘松黄继业文档格式.docx(29页珍藏版)》请在冰点文库上搜索。
1位全减器的VHDL描述;
最终实现8位全减器。
要求:
1位半减器,然后用例化语句将它们连接起来,图4-20中hsuber是半减器,diff是输出差
a-
(diff=x-y),s_out是借位输出(s_out=1,x<
y),sub_in是借位输入f_outc—
yin
y
suO
图3-191位全加器
--解(1.1):
实现1位半减器h_suber(diff=x-y;
s_out=1,x<
y)LIBRARYIEEE;
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;
串行借位的8位减法器
sout
diff7
diff1
diff0
--解
(2):
采用例化方法,以1位全减器为基本硬件;
实现串行借位的8位减法器(上图所示)
ENTITYsuber_8IS
PORT(x0,x1,x2,x3,x4,x5,x6,x7:
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--调用全减器声明语句
PORT(xin,yin,sub_in:
SIGNALa0,a1,a2,a3,a4,a5,a6:
--定义1个信号作为内部的连接线。
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
BEGINPROCESS(org_data)
IF(org_data(7)='
0'
)THENpatch_data<
=org_data;
--org_data>
=0,补码=原码。
elsepatch_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:
ci:
instd_logic;
co:
outstd_logic;
count:
outstd_logic_vector(7downto0));
endadd;
architecturebhvofaddisbegin
process(a,b,ci)
variabledata:
std_logic_vector(1downto0);
variablec:
std_logic;
begin
c:
=ci;
fornin0to7loopdata:
=('
&
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
0:
不同意)
PORT(DIN:
INSTD_LOGIC_VECTOR(6DOWNTO0);
--7位表决输入(1:
同意,G_4:
--超过半数指示
CNTH:
OUTSTD_LOGIC_VECTOR(2DOWNTO0));
--表决结果统计数
ENDvote_7;
ARCHITECTUREBHVOFvote_7IS
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<
='
ELSEG_4<
ENDPROCESS;
5-7用VHDL设计一个功能类似74LS160的计数器。
计数的十进制加法计数器)
3-10用VHDL设计一个功能类似74LS160(异步复位和同步使能加载的计数器。
ENTITYCNT10IS
PORT(CLK,RST,EN,LOAD:
DATA:
INSTD_LOGIC_VECTOR(3DOWNTO0);
--4位预置数DOUT:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
--计数值输出COUT:
--计数进位输出
ENDCNT10;
ARCHITECTUREbehavOFCNT10IS
PROCESS(CLK,RST,EN,LOAD)
--计数器异步复位
--检测时钟上升沿
VARIABLEQ:
IFRST='
THENQ:
=(OTHERS=>
'
);
ELSIFCLK'
EVENTANDCLK='
THEN
IFEN='
--检测是否允许计数或加载
同步使能)
IFLOAD='
=DATA;
--允许加载
ELSE
IFQ<
9THENQ:
--允许计数,检测是否小于9
ELSEQ:
=(OTHERS=>
--大于等于9时,计数值清零ENDIF;
IFQ=9THENCOUT<
--计数大于9,输出进位信号
ELSECOUT<
--将计数值向端口输出
DOUT<
ENDbehav;
5-8给出含有异步清零和计数使能的16位二进制加减可控计数器的VHDL描述。
3-11给出含有异步清零和计数使能的16位二进制加减可控计数器的VHDL描述。
--用VHDL实现含有异步清零和计数使能的16位二进制加减可控计数器。
ENTITYADD_SUB_LOAD_16IS
PORT(CLK,RST,ADD_EN,SUB_EN,LOAD:
INSTD_LOGIC_VECTOR(15DOWNTO0);
CQ:
OUTSTD_LOGIC_VECTOR(15DOWNTO0);
COUT:
ENDENTITYADD_SUB_LOAD_16;
ARCHITECTUREA_S_16OFADD_SUB_LOAD_16ISBEGIN
PROCESS(CLK,RST,ADD_EN,SUB_EN,LOAD)VARIABLECQI:
STD_LOGIC_VECTOR(15DOWNTO0);
--VARIABLELS_LOAD:
--LS_LOAD:
=LOAD;
IFRST='
THENCQI:
'
--计数器异步复位
--检测是否允许计数(同步他能)--允许计数,检测是否小于65535
--大于65535,计数值清零
--计数大于9,输出进位信号
--检测是否允许计数(同步他能)
--允许计数,检测是否小于65535
--大于65535,计数值清零
ELSIFLOAD='
=DATA;
--LS_LOAD:
--计数器异步复位
IFADD_EN='
THEN
IFCQI<
16#FFFF#THENCQI:
=CQI+1;
ELSECQI:
IFCQI=16#FFFF#THENCOUT<
ELSECOUT<
='
IFSUB_EN='
IFCQI>
0THENCQI:
=CQI-1;
IFCQI=0THENCOUT<
CQ<
=CQI;
ENDARCHITECTUREA_S_16;
5-9libraryieee;
entitym6is
port(clk,rst:
q:
outstd_logic_vector(2downto0));
endm6;
architecturebhvofm6is
typestatesis(st0,st1,st2,st3,st4,st5);
signalstx:
states;
beginprocess(clk)
ifrst='
thenstx<
=st0;
q<
elsifclk'
eventandclk='
thencase(stx)iswhenst0=>
stx<
=st1;
whenst1=>
001"
=st2;
whenst2=>
011"
=st3;
whenst3=>
111"
=st4;
whenst4=>
101"
=st5;
whenst5=>
100"
whenothers=>
stx<
endcase;
endif;
endbhv;
5位输入,输出一个结果。
当5位
1。
5-12用同步时序电路对串行二进制输入进行奇偶校验,每检测
输入中1的数目为奇数时,在最后一位的时刻输出1。
--解:
4-12用同步时序电路对串行二进制输入进行奇偶校验,每检测
--当5位输入中1的数目为奇数时,在最后一位的时刻输出
ENTITYodd_even_p_RXD_5IS
PORT(CLK,RST,S_in:
--CLK、RST、S_in:
时钟、复位、串行输入数据
P_out:
OUTSTD_LOGIC_VECTOR(4DOWNTO0);
--P_out:
并行输出数据
o_e_out:
--o_e_out:
奇校验输出位
ENDENTITYodd_even_p_RXD_5;
ARCHITECTUREoneOFodd_even_p_RXD_5ISBEGIN
PROCESS(CLK,RST)
VARIABLEshift_Q:
STD_LOGIC_VECTOR(4DOWNTO0);
--shift_Q:
移位寄存器
VARIABLEshift_cnt:
--shift_cnt:
移位计数器
IFCLK'
THEN--检测时钟上升沿
THENshift_cnt:
-ELSE
采样移位串行输入
shift_cnt:
=shift_cnt+1;
--移位计数
shift_Q:
=S_in&
shift_Q(4DOWNTO1);
--
5-5分频方法有多种,最简单的是二分频和偶数分频甚至奇数分频,这用触发器或指定计数模的计数器即可办到。
但对于现场实现指定分频比或小数分频率的分频电路的设计就不是很简单了。
试对例3-20的设计稍作修改,将其进位输出COUT与异步加载控制LOAD连在一起,构成一个自动加载型16位二进制数计数器,也即一个16位可控的分频器,给出其VHDL表述,并说明工作原理。
设输入频率fi=4MHz,输出频率fo=516.5±
1Hz(允许误差土0.1Hz),16位加载数值是多少?
3-916位数控分频器(可进行奇偶数分频)
ENTITYDVF16IS
PORT(CLK:
D:
FOUT:
ENDENTITYDVF16;
ARCHITECTUREoneOFDVF16IS
SIGNALFULL:
P_REG:
PROCESS(CLK)
VARIABLECNT8:
EVENTANDCLK='
IFCNT8="
0000000000000000"
CNT8:
=D-1;
--当CNT8计数归0时,预置CNT8=D-1;
--计数范围(D=n):
n-1~n/2取整(n=10:
9\8\7\6\5计数,前后半周期相同)
FULL<
--同时使溢出标志信号FULL输出为高电平
--(n=11:
10\9\8\7\6\5计数,前比后半周期多一个时钟)
ELSIFCNT8=('
&
D(15DOWNTO1))THEN
D(15DOWNTO1))-1;
--当CNT8=n/2取整时,预置CNT8=D/2取整-1;
--计数范围(D=n):
n/2取整~0(n=10:
4\3\2\1\0计数)
--同时使溢出标志信号FULL输出为高电平(n=11:
ELSECNT8:
=CNT8-1;
--否则继续作加1计数
--且输出溢出标志信号FULL为低电平
ENDPROCESSP_REG;
P_DIV:
PROCESS(FULL)
VARIABLECNT2:
IFFULL'
EVENTANDFULL='
CNT2:
=NOTCNT2;
--如果溢出标志信号FULL为高电平,D触发器输出取反
IFCNT2='
THENFOUT<
ELSEFOUT<
ENDPROCESSP_DIV;
5-6
(a)(b)
图3-20RTL图(a)
实现图3-20(a)RTL图的VHDL程序t3_12_a.vhd
ENTITYt3_12_aIS
PORT(CL,CLK0:
OUT1:
ENDENTITYt3_12_a;
ARCHITECTUREsxdlOFt3_12_aIS----时
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 技术 实用教程 课后 答案 潘松黄 继业