EDA复习文档格式.docx
《EDA复习文档格式.docx》由会员分享,可在线阅读,更多相关《EDA复习文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
ENDPROCESS;
4.2.1D触发器的VHDL描述
【例4-6】
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYDFF1IS
PORT(CLK:
INSTD_LOGIC;
D:
Q:
OUTSTD_LOGIC);
END;
ARCHITECTUREbhvOFDFF1IS
SIGNALQ1:
STD_LOGIC;
--类似于在芯片内部定义一个数据的暂存节点
PROCESS(CLK,Q1)
IFCLK'
EVENTANDCLK='
1'
THENQ1<
=D;
ENDPROCESS;
Q<
=Q1;
--将内部的暂存数据向端口输出(双横线--是注释符号)
ENDbhv;
4.3.1半加器描述
【例4-16】
LIBRARYIEEE;
--半加器描述
(1):
布尔方程描述方法
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYh_adderIS
PORT(a,b:
INSTD_LOGIC;
co,so:
OUTSTD_LOGIC);
ENDENTITYh_adder;
ARCHITECTUREfh1OFh_adderis
BEGIN
so<
=NOT(aXOR(NOTb));
co<
=aANDb;
ENDARCHITECTUREfh1;
【例4-17】
--半加器描述
(2):
真值表描述方法
PORT(a,b:
SIGNALabc:
STD_LOGIC_VECTOR(1DOWNTO0);
--定义标准逻辑位矢量数据类型
abc<
=a&
b;
--a相并b,即a与b并置操作
PROCESS(abc)
CASEabcIS--类似于真值表的CASE语句
WHEN"
00"
=>
so<
='
;
co<
;
01"
10"
11"
WHENOTHERS=>
NULL;
ENDCASE;
ENDARCHITECTUREfh1;
【例4-18】
LIBRARYIEEE;
--或门逻辑描述
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYor2aIS
INSTD_LOGIC;
c:
ENDENTITYor2a;
ARCHITECTUREoneOFor2aIS
c<
=aORb;
【例4-19】
LIBRARYIEEE;
--1位二进制全加器顶层设计描述
ENTITYf_adderIS
PORT(ain,bin,cin:
cout,sum:
ENDENTITYf_adder;
ARCHITECTUREfd1OFf_adderIS
COMPONENTh_adder--调用半加器声明语句
PORT(a,b:
co,so:
ENDCOMPONENT;
COMPONENTor2a
PORT(a,b:
ENDCOMPONENT;
SIGNALd,e,f:
STD_LOGIC;
--定义3个信号作为内部的连接线。
u1:
h_adderPORTMAP(a=>
ain,b=>
bin,co=>
d,so=>
e);
--例化语句
u2:
e,b=>
cin,co=>
f,so=>
sum);
u3:
or2aPORTMAP(a=>
d,b=>
f,c=>
cout);
ENDARCHITECTUREfd1;
4.4四进制计数器设计
【例4-20】
ENTITYCNT4IS
PORT(CLK:
INBIT;
BUFFERINTEGERRANGE15DOWNTO0);
END;
ARCHITECTUREbhvOFCNT4IS
BEGIN
PROCESS(CLK)
THEN
Q<
=Q+1;
ENDbhv;
4.5一般加法计数器设计
【例4-22】
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCNT10IS
PORT(CLK,RST,EN:
CQ:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
COUT:
ENDCNT10;
ARCHITECTUREbehavOFCNT10IS
PROCESS(CLK,RST,EN)
VARIABLECQI:
STD_LOGIC_VECTOR(3DOWNTO0);
IFRST=‘1’THENCQI:
=(OTHERS=>
’0’);
--计数器异步复位
ELSIFCLK’EVENTANDCLK=‘1’THEN--检测时钟上升沿
IFEN=‘1’THEN--检测是否允许计数(同步使能)
IFCQI<
9THENCQI:
=CQI+1;
--允许计数,检测是否小于9
ELSECQI:
‘0’);
--大于9,计数值清零
IFCQI=9THENCOUT<
=‘1’;
--计数大于9,输出进位信号
ELSECOUT<
=‘0’;
CQ<
=CQI;
--将计数值向端口输出
ENDbehav;
4.5.3含并行置位的移位寄存器设计
【例4-23】
ENTITYSHFRTIS--8位右移寄存器
PORT(CLK,LOAD:
DIN:
INSTD_LOGIC_VECTOR(7DOWNTO0);
QB:
ENDSHFRT;
ARCHITECTUREbehavOFSHFRTIS
PROCESS(CLK,LOAD)
VARIABLEREG8:
STD_LOGIC_VECTOR(7DOWNTO0);
IFCLK'
IFLOAD='
THENREG8:
=DIN;
--由(LOAD='
)装载新数据
ELSEREG8(6DOWNTO0):
=REG8(7DOWNTO1);
ENDIF;
QB<
=REG8(0);
--输出最低位
ENDPROCESS;
6.1.4进程中的信号与变量赋值
【例6-1】
USEIEEE.STD_LOGIC_1164.all;
ENTITYDFF3IS
PORT(CLK,D1:
Q1:
ARCHITECTUREbhvOFDFF3IS
PROCESS(CLK)
VARIABLEQQ:
THENQQ:
=D1;
Q1<
=QQ;
【例6-2】
ARCHITECTUREbhvOFDFF3IS
SIGNALQQ:
THENQQ<
【例6-3】
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYDFF3IS
PORT(CLK,D1:
OUTSTD_LOGIC);
SIGNALA,B:
PROCESS(CLK)BEGIN
A<
B<
=A;
Q1<
=B;
【例6-4】
VARIABLEA,B:
A:
B:
【例6-7】
ENTITYmux4IS
PORT(i0,i1,i2,i3,a,b:
q:
ENDmux4;
ARCHITECTUREbody_mux4OFmux4IS
process(i0,i1,i2,i3,a,b)
variablemuxval:
integerrange7downto0;
begin
muxval:
=0;
if(a='
)thenmuxval:
=muxval+1;
endif;
if(b='
=muxval+2;
casemuxvalis
when0=>
q<
=i0;
when1=>
=i1;
when2=>
=i2;
when3=>
=i3;
whenothers=>
null;
endcase;
endprocess;
ENDbody_mux4;
【例6-8】
LibraryIEEE;
ENTITYSHIFTIS
PORT(CLK,C0:
--时钟和进位输入
MD:
INSTD_LOGIC_VECTOR(2DOWNTO0);
--移位模式控制字
--待加载移位的数据
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
--移位数据输出
CN:
--进位输出
ENDENTITY;
ARCHITECTUREBEHAVOFSHIFTIS
SIGNALREG:
SIGNALCY:
BEGIN
PROCESS(CLK,MD,C0)
CASEMDIS
001"
REG(0)<
=C0;
REG(7DOWNTO1)<
=REG(6DOWNTO0);
CY<
=REG(7);
--带进位循环左移
WHEN“010”=>
--自循环左移
011"
REG(7)<
=REG(0);
REG(6DOWNTO0)<
=REG(7DOWNTO1);
--自循环右移
100"
REG(7)<
--带进位循环右移
101"
REG(7DOWNTO0)<
=D(7DOWNTO0);
--加载待移数
REG<
=REG;
=CY;
--保持
QB(7DOWNTO0)<
=REG(7DOWNTO0);
CN<
=CY;
--移位后输出
ENDBEHAV;
6.2.1三态门设计
【例6-9】
ENTITYtri_sIS
port(enable:
datain:
dataout:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDtri_s;
ARCHITECTUREbhvOFtri_sIS
PROCESS(enable,datain)
IFenable='
THENdataout<
=datain;
ELSEdataout<
="
ZZZZZZZZ"
ENDIF;
6.2.2双向端口设计
【例6-10】
libraryieee;
useieee.std_logic_1164.all;
entitytri_stateis
port(control:
instd_logic;
in1:
instd_logic_vector(7downto0);
inoutstd_logic_vector(7downto0);
x:
outstd_logic_vector(7downto0));
endtri_state;
architecturebody_trioftri_stateis
process(control,q,in1)
if(control='
)thenx<
=q;
="
elseq<
=in1;
x<
ZZZZZZZZ“;
endif;
endbody_tri;
6.2.3三态总线电路设计
【例6-12】
ENTITYtristate2IS
port(input3,input2,input1,input0:
INSTD_LOGIC_VECTOR(7DOWNTO0);
enable:
INSTD_LOGIC_VECTOR(1DOWNTO0);
output:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDtristate2;
ARCHITECTUREmultiple_driversOFtristate2IS
PROCESS(enable,input3,input2,input1,input0)
IFenable="
THENoutput<
=input3;
ELSEoutput<
=(OTHERS=>
'
Z'
);
=input2;
IFenable="
=input1;
=input0;
ENDmultiple_drivers;
数据溢出及其处理
解决方法—用并置符扩展位,但不能解决减法溢出的问题
useieee.std_logic_unsigned.all;
entityarith_unsignedis
Port(a,b:
instd_logic_vector(3downto0);
s1,s2:
outstd_logic_vector(4downto0));
endarith_unsigned;
architectureoneofarith_unsignedis
s1<
=('
&
a)+('
b);
s2<
a)-('
end;
减法溢出的解决方法—用并置符在数据前补符号位:
数据前用并置符补符号位后,既解决了加法溢出的问题,也解决了减法溢出的问题!
entityarith_signedis
endarith_signed;
architectureoneofarith_signedis
=(a(3)&
a)+(b(3)&
a)-(b(3)&
8.1.3一般有限状态机的设计
【例8-1】
ENTITYs_machineIS
PORT(clk,reset:
state_inputs:
INSTD_LOGIC_VECTOR(0TO1);
comb_outputs:
OUTINTEGERRANGE0TO15);
ENDs_machine;
ARCHITECTUREbehvOF