--解:
采用例化实现图4-20的1位全减器
LIBRARYIEEE;--1位二进制全减器顺层设计描述
USEENTITYf_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)
。
x7
xin
sub_out
sout
y7
yin
u7
sub_in
diff
a6
.
.a1
x1
xin
sub_out
y1
yin
u1
sub_in
diff
a0
x0
xin
sub_out
y0
yin
u0
sin
sub_in
diff
串行借位的8位减法器
--解
(2)
:
采用例化方法,以1位全减器为基本硬件;实现串行借位的
8位减法器(上图所示)。
LIBRARYIEEE;
USE
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;
USEUSEENTITYorg_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;
useaddis
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;
USEUSEENTITYvote_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;
USE
CNT10IS
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给出含有异步清零和计数使能的
--用VHDL实现含有异步清零和计数使能的
16位二进制加减可控计数器的
16位二进制加减可控计数器。
VHDL描述。
LIBRARYIEEE;
USEUSEENTITYADD_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;--
ELSECQI:
=(OTHERS=>'0');--
ENDIF;
IFCQI=16#FFFF#THENCOUT<='1';--
ELSECOUT<='0';
ENDIF;
ENDIF;
IFSUB_EN='1'THEN--
IFCQI>0THENCQI:
=CQI-1;--
ELSECQI:
=(OTHERS=>'1');--
ENDIF;
IFCQI=0THENCOUT<='1';--
ELSECOUT<='0';
ENDIF;
ENDIF;
ENDIF;
CQ<=CQI;--
ENDPROCESS;
ENDARCHITECTUREA_S_16;
计数器异步复位
计数器异步复位
检测时钟上升沿
检测是否允许计数(同步他能)
允许计数,检测是否小于65535
大于65535,计数值清零
计数大于9,输出进位信号
检测是否允许计数(同步他能)
允许计数,检测是否小于65535
大于65535,计数值清零
计数大于9,输出进位信号
将计数值向端口输出
5-9
libraryieee;
useentitym6is
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位输入中1的数目为奇数时,在最后一位的时刻输出
5位输入,输出一个结果。
1。
LIBRARYIEEE;
USEUSEENTITYodd_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)
shift_Q(0);--奇校验输出
shift_Q:
=S_in&shift_Q(4DOWNTO1);--采样移位串行输入
ELSE
shift_cnt:
=shift_cnt+1;--移位计数
shift_Q:
=S_in&shift_Q(4DOWNTO1);--采样移位串行输入
ENDIF;
XOR
ENDIF;
ENDIF;
ENDPROCESS;
ENDARCHITECTUREone;
5-5分频方法有多种,最简单的是二分频和偶数分频甚至奇数分频,这用触发器或指定计数模的计数器即可办到。
但对于现场实现指定分频比或小数分频率的分频电路的设计就不是很简单了。
试对例3-20的设计稍作修改,将其进位输出COUT与异步加载控制LOAD连在一起,构成一个自动
加载型16位二进制数计数器,也即一个16位可控的分频器,给出其VHDL表述,并说明工作原理。
设输入频率fi=4MHz,输出频率fo=±1Hz(允许误差±,16位加载数值是多少?
--解:
3-916位数控分频器(可进行奇偶数分频)
LIBRARYIEEE;USEDVF16IS
PORT(CLK:
INSTD_LOGIC;
D:
INSTD_LOGIC_VECTOR(15DOWNTO0);FOUT:
OUTSTD_LOGIC);
ENDENTITYDVF16;ARCHITECTUREoneOFDVF16ISSIGNALFULL:
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取整(