版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1章硬件描述语言VHDL
数字系统设计分为硬件设计和软件设计,但是随着计算机技术、超大规模集成电路
(CPLD、PGA)的发展和硬件描述语言(1IDL,HardwareDescriptionLanguage)的出现,
软、硬件设计之间的界限被打破,数字系统的硬件设计可以完全用软件来实现,只要掌握
了HDL语言就可以设计出各种各样的数字逻辑电路。
1.1老的硬件设计方法
老的硬件设计方法有如下几个特征:
(1)采用自下而上的设计方法
使用该方法进行硬件设计是从选择具体元器件开始,并用这些元器件进行逻辑电路设
计,从而完成系统的硬件设计,然后再将各功能模块连接起来,完成整个系统的硬件设计,
(2)采用通用逻辑元器件
通常采用74系列和CMOS4000系列的产品进行设计
(3)在系统硬件设计的后期进行调试和仿真
只有在部分或全部硬件电路连接完毕,才可以进行电路调试,一旦考虑不周到,系统
设计存在较大缺陷,则要重新设计,使设计周期延长。
(4)设计结果是一张电路图
当设计调试完毕后,形成电原理图,该图包括元落件型号和信号之间的互连关系等等。
老的硬件设计方法已经使用了几十年,是广大电子工程师熟悉和掌握的一种方法,但
是现在这种方法老了,不仅方法老了,就连使用的元器件也老了。
1.2使用HTL的硬件设计方法
所谓硬件描述语言,就是利用一种人和计算机都能识别的语言来描述硬件电路的功能,
信号连接关系及定时关系,它可以比电原理图更能表示硬件电路的特性。
该方法有如下特征:
(1)支持自顶向下的设计方法
所谓自顶向下的设计方法就是从系统的总体要求出发,自顶向下分三个层次对系统硬
件进行设计。
第一个层次是行为描述,所谓行为描述,实际就足对整个系统的数学模型的描述,在
行为描述阶段,并不真正考虑其实际操作和算法怎么实现,而是考虑系统的结构和工作过
程是否能达到系统设计规格书的要求。
第二个层次是数据流描述,又称为寄存器描述或RTL方式描述,该描述比行为描述更
注重硬件的具体实现,通过该描述可以导出系统的逻辑表达式,为逻辑综合作准备,当然
进行逻辑综合和逻辑综合工具的能力有关,当然设计人员还必须了解逻辑综合二具的说明
和规定,
第三个层次为逻辑综合。该层次把RTL描述的程序转换成基本逻辑元件表示的文件,
该文件就象老的设计方法中的电原理图。
(2)采用大量的ASIC芯片
(3)早期仿真以确定系统的可行性
(4)使设计更容易
只需写出系统的HDL源程序文件,其它由计算机去做
<5)全部设计文件就是HDL源程序文件
1.3VHTL硬件设计语言
当前ASIC制造商都自己开发了HDL语言,但是都不通用,只有美国国防部开发的VHDL
语言成为了IEEE.STDJ076标准,并在全世界得到了承认。
该语言集成了各种HDL语言的优点,使数字系统设计更加简单和容易。VHDL语言是一
个规模庞大的语言,在使用它之前完全学会它是很难的,本书介绍的只是VHDL语言的一部
分。
1.4VHDL语言的基本结构
VHDL语言通常包含实体(Entity),构造体(Architecture),配置(Coniguration),包
集合(Package),和库(Library)五部分.其中实体用于描述所设计的系统的外部接口信号;
构造体用于描述系统内部的结构和行为;建立输入和输出之间的关系;配置语句安装具体
元件到实体一结构体对,不以被看作是设计的零件清单;包集合存放各个设计模块共享的
数据类型、常数和子程序等;库是专门存放预编译程序包的地方。如下详细介绍。
1.4.1基本设计单元
VHDL的基本设计单元就是实体,无论数字电路复杂还是简单,都是由实体和构造体组
成。
⑴实体说明
实体说明有如下结构:
ENTITY实体名IS
[端口说明]
END实体名;
(VHDL语言中不分大小写字母)
其中:
端口说明是对设计实体中输入和输出借口进行描述,格式如下:
PORT(端口名(,端口名):方向数据类型名;
端口名(,端口名):方向数据类型名);
端口名是赋予每个系统引脚的名称,一般用几个英文字母组成。
端口方向是定义引脚是输入还是输出,见下表:
方向说明
IN输入到实体
OUT从实体输山输出
INOL'T双向
BUER输出(但可以反馈到实体内部)
LINKAGE不指定方向
常用的端口数据类型有两种:BIT和BIT_VECTOR,当端口被说明为BIT时,只能取值
“1”或“0”,
当端口被说明为B1T_VECTOR时,它可能是一组二进制数。
例:
PORT(n0,nl,select:INBIT;
q:OUTBIT;
bus:OUTBIT_VECT0R(7DOWNTO0));
本例中,nO,nl,select是输入引脚,属于BIT型,q是输出引脚,BIT型,bus是
一组8位二进制总线,属于BIT_VECTOR,
例:
LIBRARYIEEE;
USEIEEE.STD_LOGIC.1164.ALL;
ENTITYmmIS
PORT(nO,nl,select:TNSTD_LOGIC;
Q:OUTSTD_LOGIC;
Bus:OUTSTDL0GIC_VECT0R(7DOWNTO0));
2)BLOCK语句描述
使用BLOCK语句描述的格式如下:
块标号:BLOCK
BEGIN
ENDBLOCK块标号:
例:二选一电路
ENTITYmuxIS
PORT(dO,dl,sei:INBIT;
q:OUTBIT);
ENDmux;
ARCHITECTUREconnect0muxIS
SIGNALtmpl,tmp2,tmp3:BIT;
BEGIN
cale:
BLOCK
BEGIN
tmpl<=dOANDsei;
tmp2<=dlAND(NOTsei);
tmp3<=tmplCRtmp2;
q<=tmp3;
ENDBLOCKcale;
ENDconnect;
在对程序进行仿真时,BLOCK中的语句是并行执行的,与书写顺序无关,这一点和构造
体中直接写的语句是一样的。
3)进程(PROCESS)描述
进程描述的格式如下:
[进程名]:PROCESS(信号L信号2,。。。)
BEGIN
ENDPROCESS进程名;
*一般用于组合电路进程模式:
—进程标记:
PROCESS(—信号名,—信号名,—信号名)
VARIABLE—变量名:STD_LOGIC;
VARIABLE—变量名:STD_LOGIC;
BEGIN
~指定信号
"指定变量
-过程调用
—如果语句
—CASE语句
"循环语句
ENDPROCESS进程标记;
*用于时序电路进程模式:
—进程标记:
PROCESS(—信号名,—信号名,—信号名)
VARIABLE—变量名:STD_LOGTC;
VARIABLE—变量名:STD_LOGIC;
BEGIN
WAITUNTIL—时钟信号=T';
-指定信号
-指定变量
~过程调用
~如果语句
—CASE语句
-循环语句
ENDPROCESS进程标记;
例:
ENTITYmuxlIS
PORT(dO,dl,sei:INBIT;
q:OUTBIT);
ENDmuxl;
ARCHITECTUREconnect0muxlIS
BEGIN
cale:
PROCESS(dO,dl,sel)
VARIABLEtmpl,tmp2,tmp3:BIT;一在进程中定义的变量
BEGIN
tmpl:=dOANDsei;一输入端口向变量赋值
tmp2:=dlAND(NOTsei);
tmp3:=tmplORtmp2;
q<=tmp3;
ENDPROCESScale;
ENDconnect;
在PROCESS中的语句是顺序执行的,这一点和BLOCK中的语句是不一样的。
当PROCESS所带的信号量发生变化时,PROCESS中的语句就会执行一遍。
4)子程序描述
子程序的概念和其它高级程序中子程序的概念相同,在VHDL中有两种类型:
•过程(Procedure)
•函数(unction)
1.过程的格式:
PROCEDURE过程名(参数1,参数2。。。。)IS
[定义变量语句]
BEGIN
[顺序处理语句]
END过程名;
例:
PROCEDUREvectortoint
(z:INSTD_LOGIC_VECTOR;
x_lag:OUTBOOLEAN;
q:ININTEGER)IS
BEGIN
q:=0;
x_lag:=ALSE;
ORiINzRANGELOOP
q:=q*2;
I(z(i)=l)THEN
q:=q+l;
ELSEI(z(i)/=10)THEN
x_lag:=TRUE;
ENDI;
ENDLOOP;
ENDvectortoint;
在过程中,语句是顺序执行的。
2.函数
函数的格式:
UNCTION函数名(参数1,参数2。。。。)RETURN数据类型名IS
[定义变量语句]
BEGIN
[顺序处理语句]
RETURN[返回变量名];
END函数名;
在VHDL语言中函数的参数都是输入信号,
例:
UNCTIONmin(x,y:INTEGER)RETURNINTEGERIS
BEGIN
IX<YTHEN
RETURN(x);
ELSE
RETURN(y);
ENDI;
ENDmin;
1.4.22包、库和配置
(1)库
库是经编译后的数据的集合,它存放包定义、实体定义、构造定义和配置定义。
在设计单元内的语句可以使用库中的结果,所以,库的好处就是设计者可以共享已经
编译的设计结果,在VHDL中有很多库,但他们相互独立。
IEEE库:在IEEE库中有一个STD_LOGIC的包,它是IEEE正式认可的包。
STD库:STD库是VHDL的标准库,在库中有名为STANDARD的包,还有TEXTIO包。若使用
STANDARD包中的数据可以不按标准格式说明,但是若使用TEXTIO包,则需要按照如下格式
说明:
LIBRARYSTD;
USESTD.TEXTIO.ALL
另外还有ASIC库、WORK库和用户自定义库等。
库的使用:
在使用库之前,一定要进行库说明和包说明,库和包的说明总是放在设计单元的前面:
LIBRARY库名;
USELIBRARYname.package.name.ITEM,name
例:
LIBRARYIEEE;
USEIEEE.STD_L0GIC_1164.ALL
该例说明要使用IEEE库中的1164包中所有项目
库的作用范围:
库的作用范围从一个实体说明开始到它所属的结构体、配置为止,当有两个实体时,
第二个实体前要另加库和包的说明。
⑵包
通常在一个实体中对数据类型、常量等进行的说明只可以在一个实体中使用,为使这
些说明可以在其它实体中使用,VHDL提供了程序包结构,包中罗列VHDL中用到的信号定义、
常数定义、数据类型、元件语句、函数定义和过程定义,它是一个可编译的设计单元,也
是库结构中的一个层次,使用包时可以用USE语句说明,例如:
USEIEEE.STD_L0GIC_1164.ALL
程序包分为包头和包体,包结构的格式如下:
1)包头格式:
PACKAGE包名IS
[说明语句]
END包名
包头中列出所有项的名称。
2)包体格式:
PACKAGEBODY包名IS
[说明语句]
END包名;
包体给出各项的具体细节。
例:包头
USESTD.STD.LOGIC.ALL
PACKAGElogicIS
TYPEthree_level_logicIS('O',T,'z');//数据类型项目
CONSTANTunknown_value:three_level_logic:='O';〃常数项目
UNCTIONinvert(input:three_level_logic)//函数项目
RETURNthreelevellogic;
ENDlogic;
例:包体
PACKAGEBODYlogicIS
UNCTIONinvert(input:threelevellogic)〃函数项目描述
BEGIN
CASEinputIS
WHEN'O'=>RETURN1
WHEN*r=>RETURN*0
WHENZ=>RETURN7
ENDCASE;
ENDinvert;
ENDlogic
该包使用例:
USElogic.three_level_logic,logic.invert;//使用数据类型和函数两个项目
ENTITYinverterIS
PORT(x:INthree_level_logic;
y:OUTthree_level_logic);
ENDinverter;
ARCHITECTUREinverter_body0inverterIS
BEGIN
kk:
PROCESS
BEGIN
Y<=invert(x)ATER10ns;
WAITONx;
ENDPROCESS;
ENDinverter_body;
⑵配置
用于在多构造体中的实体中选择构造体,例如,在做RS触发器的实体中使用了两个构
造体,目的是研究各个构造体描述的RS触发器的行为性能如何,但是究竟在仿真中使用哪
一个构造体的问题就是配置问题。
配置语句格式:
CONIGURATION配置名0实体名TS
[说明语句]
END配置名;
例:最简单的配置
CONIGURATION配置名0实体名TS
0R被选构造体名
ENDOR;
END配置名;
例:
ENTITYrsIS
PORT(set,reset:INBIT;
q,qb:BUERBIT);
ENDrs;
ARCHITECTURErsl0rsIS
COMPONENTnand2
PORT(a,b:INBIT;
c:OUTBIT);
ENDCOMPONENT;
BEGIN
UI:nand2PORTMAP(a=>set,b=>qb,c=>q)
U2:nand2PORTMAP(a二)reset,b=>q,c=>qb)
ENDrsl;
ARCHITECTURErs20rsIS
BEGIN
q<=NOT(qbANDset);
qb<=NOT(qANDreset);
ENDrs2
两个构造体,可以用配置语句进行设置:
CONIGRATIONrscon0rsIS//选择构造体rsl
ORrsl
ENDOR;
ENDrscon;
1.4.3VHDL中使用的数据类型和运算操作
VHDL可以象其它高级语言一样定义数据类型,但还可以用户自己定义数据类型。
(1)信号、常量和变量
信号:通常认为信号是电路中的一根线
常数:可以在数字电路中代表电源、地线等等
变量:可以代表某些数值
1.常数
常数的描述格式:
CONSTANT常数名:数据类型:=表达式
例:
CONSTANTVcc:REAL:=5.0;
CONSTANTDALY:TIME:=100ns;
CONSTANTBUS:BIT_VECT0R:=,,010r,;
2.变量
变量只能在进程、函数和过程中使用,一旦赋值立即生效。
变量的描述格式:
VARIABLE变量名:数据类型约束条件:二表达式
例:
VARIABLEx,y:INTEGER;
VARIABLEcount:INTEGERRANGE0TO255:=10;
3.信号
信号除了没有方向的概念以外几乎和端口概念一致。
信号的描述格式:
SIGNAL信号名:数据类型约束条件:二表达式
例:
SIGNALsys_clk:BIT:='O';
SIGNALground:BIT:='O'
在程序中,信号值输入信号时采用代入符“〈二",而不是赋值符“:二”,同时信号可以附加延
时。
信号传送语句:
sl<=s2ATER10ns
信号是一个全局量,可以用来进行进程之间的通信
4.信号与变量的区别
信号赋值可以有延迟时间,变量赋值无时间延迟
信号除当前值外还有许多相关值,如历史信息等,变量只有当前值
进程对信号敏感,对变量不敏感
信号可以是多个进程的全局信号,但变量只在定义它之后的顺序域可见
信号可以看作硬件的一根连线,但变量无此对应关系
1.4.4VHDL中的数据类型
(1)标准数据类型
1.整数(INTEGER)
范围:-2147483547-—2147483646
2.实数(REAL)
范围:-1.0E38--1.0E38
书写时一定要有小数。
3.位(BIT)
在数字系统中,信号经常用位的值表示,位的值用带单引号的‘1'和'0'来表示
明确说明位数值时:BIT'Ll')
4.位矢量(BIT_VECTOR)
位矢量是用双引号括起来的•组位数据
“010101”
5.布尔量(BOOLEAN)
只有“真”和“假”两个状态,可以进行关系运算
6.字符(CHARACTER)
字符量通常用单引号括起来,对大小写敏感
明确说明1是字符时:
CHARACTER'('1')
7.字符串(STRING)
字符串是双引号括起来的一串字符:
ulaksdklakldM
8.时间(TIME)
时间的单位:s,ps,ns,ms,sec,min,hr
例:10ns
整数数值和单位之间应有空格
9.错误等级(SEVERITYLEVEL)
用来表示系统的状态,它共有4种:
NOTE(注意)
WARNING(警告)
ERROR(错误)
AILURE(失败)
10.大于等于零的整数(NATURAL)、正整数(POSITIVE)
只能是正整数
数据除定义类型外,有时还需要定义约束范围。
例:
INTEGERRANGE100DOWNTO0
BITVECTOR(3DOWNTO0)
REALRANGE2.0TO30.0
⑵用户定义的数据类型
用户定义的数据类型的一般格式:
TYPE数据类型名{,数据类型名}数据类型定义
不完整的数据类型格式:
TYPE数据类型名{,数据类型名};
可由用户定义的数据类型为:
*枚举(ENUMERATED)
格式:TYPE数据类型名IS(元素、元素、…);
例1:TYPEweekIS(Sun,Mon,Tuc,wed,Thu,ri,Sat);
例2:TYPESTD_LOGTCIS
(U,X,O,T,Z,W,H,一);
*整数(INTEGER)
格式:TYPE数据类型名IS数据类型定义约束范围
例:TYPEdigitISINTEGERRANGE0TO9
*实数(REAL)
格式:TYPE数据类型名IS数据类型定义约束范围
例:TYPEcurrentISREALRANGE-1E4TO1E4
*数组(ARRAY)
格式:TYPE数据类型名ISARRAY范围0原数据类型名;
例:TYPEwordISARRAY(1TO8)0STD_LOG1C;
TYPEwordISARRAY(INTEGER1TO8)0STDLOGIC;
TYPEinstructionIS(ADD,SUB,INC,SRL,SR,LDA,LDB);
SUBTYPEdigitISINTEGER0TO9;
TYPEindlagISARRAY(instructionADDTOSR)0digit;
数组常在总线、ROM和RAM中使用。
*时间(TIME)
格式:TYPE数据模型名不副实IS范围
UNITS基本单位
单位;
ENDUNITS;
TYPEtimeRANGE-1E18TO1E18
UNITS
s;
ps=1000s;
ns=1000ps;
us=1000ns;
ms=1000us;
sec=1000ms;
min=60sec;
hr=60min;
ENDUNITS;
*记录(RECODE)
将不同的数据类型放在一块,就是记录类型数据
格式:TYPE数组类型名ISRECORD
元素名:数据类型名;
元素名:数据类型名;
ENDRECORD;
例:TYPEbankISRECORD
addrO:STD_LOG1C_VECTOR(7DOWNTO0);
addrl:STDLOGIC_VECTOR(7DOWNTO0);
rO:INTEGER;
ENDRECORD;
存取(ACCESS)
文件(ILE)
⑶数据类型的转换
数据类型转换函数有VEDL语言的包提供,例如:STD_L0GIC」164,STD_L0GIC_ARITH等
等
转换函数见表:
函数说明
STD_L0GIC_1164包
TOSTDLOGICVECTOR(A)由BIT_VECTOR转换成STD_LOGIC_VECTOR
TO_B1TVECTOR(A)由STD_LOG1C_VECTOR转换成B1T_VECTOR
TO_LOGIC(A)由BIT转换成STDLOGIC
TO_BIT(A)由STD_LOGIC转换成BIT
STD_LOGIC_ARITH包
CONV_STDLOGICVECTOR(A,位长)由INTEGER,UNSIGNED和SIGNED转换成
CONV_INTEGER(A)STD_LOGIC_VECTOR
由UNSIGNED和SIGNED转换成INTEGER
STD_LOGIC_UNSIGNED包
CONV_INTEGERSTD_LOGIC_VECTOR转换成INTEGER
例:由STDBIT„VECTOR转换成INTEGER
LIBRARYIEEE
USEIEEE.STDLOGIC1164.ALL
USEIEEE.STD_LOGIC_UNSIGNED.ALL
ENTITYadd5IS
PORT(num:INSTD_LOG1C_VECTOR(2DOWNTO0);
);
ENDadd5;
ARCHITECTURErtl0addbIS
SIGNALin_num:INTEGERRANGE0TO5;
BEGIN
In_num<=CONV_INTEGER(num);
ENDrtl;
(5)有关BIT_VECTOR和STD_BIT_VECTOR的语句例:
SIGNALa:BIT.VECTOR(11DOWNTO8);
SIGNALb:STD_LOG1C_VECTOR(11DOWNTO0);
a〈二X"A8";十六进制可以赋予位矢量
b<=XMA8M;十六进制不可以赋予逻辑矢量,所以此句错,逻辑量中只能赋予二进制
b<=TO_STDLOGICVECTOR(XWA7");十六进制变换
b<=TOSTDLOGICVECTOR(OW5177M);八进制变换
b<=TO_STDLOGICVECTOR(Bw1010_llll_01ir,);三位二进制变换
(6)IEEE标准“STDJLOGIC”和“STD_LOGIC_VECTOR”
1993年制定的标准IEEESTD1164对STDLOGIC的值做如下规定:
'IT初始值
'X,不定
O0
T1
2高阻
'旷弱信号不定
'L'弱信号0
'H'弱信号1
'不可能情况
1.4.5VHDL语言的运算操作符
优先级别类型操作符说明
高逻辑运算符AND逻辑与
OR逻辑或
NAND逻辑与非
NOR逻辑或非
XOR逻辑异或
关系运算符=等号
/=不等号
<小于
>大于
<=小于等于
>二大于等于
力口、减、并智运+加
算符—减
&并置
正负运算符+正
—负
乘除法运算符*乘
/除
MOD取模
REM取余
**指数
ABS取绝对值
低NOT取反
⑴逻辑运算符
要求运算符左右的数据类型必须相同,
例:x<=(aANDb)OR(NOTcANDd);
x<=bANDaANDdANDe;
x<=bORcORdORe;
x<=aXORdXORe;
a<=(xlANDx2)OR(ylANDy2);
(2)算数运算符
在使用乘法运算符时,应该特别慎重,因为它可以使逻辑门数大大增加。
⑶关系运算符
应该注意小于等于仁和代入运算符的不同(从上下文区别)
⑷并置运算符
并置运算符"&”用于位连接,
例如:y(0)=b(0)&en
y(l)=b(l)&en
y(2)=b(2)&en
y(3)=b(3)&cn
y(4)=a(0)
y⑸二a⑴
y(6)=a(2)
y(7)=a(3)
从上可以看出a,b是四位长度的矢量,而y的位长是7位,上述情况可以表示成:
tmp_b<=bAND(en&en&en&en);
y<=a&tmpb;
若是位连接,可以简单写为:
tmpb<=bAND(en,en,en,en);
1.4.5VHDL语言构造体的描述方式
有三种描述方式:行为描述,RTL描述和ASIC描述,采用后两种描述方式可以进行逻
辑综合。
(1)行为描述
描述数字系统的行为,主要用于仿真和系统工作原理的研究。下面介绍一些专用语句。
1)代入语句
格式:信号量仁敏感信号量表达式;
例如:z<=aNOR(bNANDc);
该例中有三个敏感量,无论哪一个发生变化都可以使z变化。
具有时间延迟的代入语句:
a<=bATER10ns
表示当b发生变化10as后a才变化。
例:与门电路
ENTITYand2IS
PORT(a,b:INBIT;
c:OUTBIT);
ENDand2;
ARCHITECTUREand2behave0and2IS
BEGIN
c<=aANDb;
ENDand2_behave;
2)延时语句
VHDL中有两种延时语句:惯性延时和传输延时。
*惯性延时
VHDL中惯性延时是缺省的,因为逻辑硬件电路总是有时间延迟的,若延迟时间是20ns,
那末输入信号时间若小于20ns,则输出信号将不跟随输入信号的变化。
有时为使延迟时间更逼真实际电路,就专门设置惯性时间:
b<=aATER10ns;
・传输延时
传输延时常代表总线、连接线的延迟时间,该时间必须专门说明。该传输延时只对信号
起纯延时作用。
例:b<=TRANSP0RTaATER20ns;
(2)数据流描述方式
数据流描述方式是一种可以进行逻辑综合的描述方式,由于要进行逻辑综合所以对使
用的语句有一定的限制,VHDL中的每一个命令和语句都对逻辑综合能力进行了定义,要进行
逻辑综合的设计实体就要使用有逻辑综合能力的命令和语句。
例:四选一电路
LIBRARYIEEE;
USEIEEE.STDLOGIC1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYmux42IS
PORT(input:INSTD_LOGIC_VECTOR(3DOWNTO0);
Sei:INSTD_LOGIC_VECTOR(1DOWNTO0);
Y:OUTSTD_LOGIC);
ENDmux42;
ARCHITECTUREapp0mux42IS
BEGIN
y<=input(0)WHENsei二0ELSE
input(1)WHENsel=lELSE
input(2)WHENsel=2ELSE
input(3);
ENDapp;
使用数据流描述方式应该注意的问题:
1.'X'状态的传递问题
有时'X,状态会逐级传递,造成系统的输出为不确定或者错误,所以要在设计中考虑
'X,状态对输出的影响。
2.一些限制
*禁止在一个进程中使用两个寄存器
*在1语句描述寄存器时,禁止ELSE项
*在寄存器描述中,禁止将变量代入信号
*关连性强的信号应该放在一个进程中
⑶结构描述方式
注重调用已有的元件、元件或门级电路之间的连线是结构描述的特点,结构描述可以提
高设计效率.
1)元件声明语句:
元件声明语句用于调用已生成的元件,这些元件可能在库中,也可能是预先编写的元件
实体描述.
元件语句的格式:
COMPONENT元件名
PORT说明;端口说明
ENDCOMPONENT;
元件语句可以在ARCHITECTURE,PACKAGE和BLOCK的说明部分.
2)元件调用:
格式:标号名:元件名PORTMAP(信号,…);
两层信号之间的关系为映射关系,该映射有两种:
位置映射例:
有一元件的端口说明为:
port(a,b:inbit;
c:outbit);
调用该元件时:
u2:元件名portmap(nl,n2,in);
这里nl对应a,n2对应b,m对应c.
名称映射例:
该映射就是将库中已有模块的端口名称,赋予设计中的信号名.
U2:元件名portmap(a=>nl.b=>n2,c=>m);
1.4.6VHDL语言的主要描述语句
(1)顺序描述语句
顺序描述语句只能用在进程和子程序中,它和其他高级语言一样,其语句是按照语句的
出现的顺序加以执行的.如下分别介绍有关的顺序描述语句.
1.WAIT语句
进程在执行过程中总是处于两种状态:执行或挂起,进程的状态变化受等待语句的控制,
当进程执行到等待语句,就被挂起,并等待再次执行进程.
等待语句的格式:
*WAIT无限等待
/WAITON敏感信号变化
格式:WAITON信号[,信号]
例:PROCESS(a,b)
BEGIN
y<=aANDb;
ENDPROCESS;
该例中的进程与下例中进程相同:
例:PROCESS
BEGIN
y<=aANDb;
WAITONa,b;
ENDPROCESS;
*WAITUNTIL直到条件满足
格式:WAITUNTIL布尔表达式
当进程执行到该语句时,被挂起;若布尔表达式为真时,进程将被启动.
例:WAITUNTIL((x*10)<100)
*WAITOR等到时间到
格式:WAITOR时间表达式
当进程执行到该语句时,被挂起;等待•定的时间后,进程将被启动.
例:WAITOR20ns
*多条件WAIT语句
例:WAITONnmi,interruptUNTIL((nmi二TRUE)OR(interrupt=TRUE))OR5us
该等待有三个条件:
第一,信号nmi和interrupt任何一个有一次刷新动作
第二,信号nmi和interrupt任何一个为真
第三,等待5us
只要一个以上的条件被满足,进程就被启动.
*超时等待
若在程序中所设置的等待条件永远不会满足,则进程就永远不能启动,为防止进入无限等待
情况,应做一些处理.
2.断言语句(ASSERT)
格式:ASSERT条件[REPORT输出信息][SEVERITY级别]
执行到断言语句时,判断条件,若条件满足就继续执行,否则输出文字串和错误级别信息.
例:ASSERT(tiaojian=*r)
REPORT"somethingwrong”
SEVERITYERROR;
3.信号代入语句
格式:目的信号量"信号量表达式
例:a<=b;
4.变量赋值语句
格式:目的变量:二表达式
例:c:=a+d
5.I语句
1)I的门闩控制
格式:I条件THEN
顺序执行语句
ENDI;
例:I(a=*r)THEN
c<=b;
ENDI;
2)I语句的选择控制
格式一:I条件THEN
顺序执行语句
ELSE
顺序执行语句
ENDI;
格式二:I条件THEN
顺序执行语句
ELSI条件THEN
顺序执行语句
ELS1条件THEN
顺序执行语句
ELSI条件THEN
顺序执行语句
ENDI;
6.CASE语句
常用来描述总线、编码和译码的行为。
格式:
CASE表达式IS
WHEN条件表达式二>顺序处理语句
ENDCASE;
其中WHEN的条件表达式可以有4种形式:
WHEN值二》顺序处理语句
WHEN值|值|值|…|值二)顺序处理语句
WHEN值TO值=>顺序处理语句
WHENOTHERS'>顺序处理语句
例:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYmux43IS
PORT(a,b,iO,il,i2,i3:INSTD_LOGTC;
q:OUTSTD_LOGIC);
ENDmux43;
ARCHITECTUREmux4_beh£ve0mux43IS
SIGNALsei:INTEGERRANGE0TO3;
BEGIN
nn:PROCESS(a,b,iO,il,i2,i3)
BEGIN
sel<=0;
I(a二T')THEN
sel<=sel+l;
ENDI;
I(b=T)THEN
sel<=sel+2;
ENDI;
CASEseiIS
WHEN0=>q<=iO;
WHEN1=>q<=il;
WHEN2=>q<=i2;
WHEN3=>q<=i3;
ENDCASE;
ENDPROCESSnn;
ENDmux4behave;
7.LOOP语句
格式一:
[标号]:OR循环变量IN离散范围LOOP
顺序处理语句
ENDLOOP[标号];
例:ASUM:ORiIN1TO9LOOP
sum=l+sum;
ENDLOOPASUM;
例:8位奇偶校验电路
LIBRARYIEEE;
USEIEEE.STD_LOGTC_1164.ALL;
ENTITYpcIS
PORT(a:INSTD_LOGIC_VECTOR(7DOWNTO0);
y:OUTSTD_LOGIC);
ENDpc;
ARCHITECTUREbehave0pcIS
BEGIN
cbc:PROCESS(a)
VARIABLEtmp:STD_LOGIC;
BEGIN
tmp:=,0,;
ORiIN0TO7LOOP
tmp:=tmpXORa(i);
ENDLOOP;
y<=tmp;
ENDPROCESScbc;
ENDbehave;
格式二:
[标号]:WHILE条件LOOP
顺序处理语句
ENDLOOP[标号];
在该语句中,如果条件为真,则进行循环,否则结束循环.
例:
sum:二0
abed:WHILE(I<10)LOOP
sum:=I+sum;
I:=I+1;
ENDLOOPabed;
8.NEXT语句
在LOOP语句中用NEXT语句跳出循环.
格式:NEXT[标号][WHEN条件];
NEXT语句用于控制内循环的结束.
例:
PROCESS(a,b)
CONSTANTmax_limit:INTEGER:=255
BEGIN
ORIIN0TOmax_limitLOOP
I(done(I)=TRUE)THEN
NEXT;
ELSEdone(I):=TRUE;
ENDI;
q(I)<=a(I)ANDb(I);
ENDLOOP;
ENDPROCESS;
9.EXIT语句
EXIT语句用于结束LOOP循环状态.
格式:EXIT[标号][WHEN条件]
例:
PROCESS(a)
VARIABLEint_a:INTEGER;
BEGIN
int_a:=a
OR1=0IN0TOmax_limitLOOP
I(int_a<=0)THEN
EXIT;
ELSE
int_a:=int_a-l;
q(I)<=3.1416/REAL(a*I);
ENDI
ENDLOOP;
y〈F;
ENDPROCESS;
(2)并发描述语句
1.进程语句
在--个构造体中多个PROCESS语句可以同时并行的执行,该语句有如下特点:
1)可以和其它进程语句同时执行,并可以存取构造体和实体中所定义的信号
2)进程中的所有语句都按照顺序执行
3)为启动进程,在进程中必须包含一个敏感信号表或WAIT语句
4)进程之间的通信是通过信号量来实现的
2.并发信号代入
代入语句在进程中使用是顺序语句,但是在进程外即在构造体中使用就是并发语句,相当于
一个进程.
例:
ARCHITECTUREbehave0a_varIS
BEGIN
Output<=a(I);
ENDbehave;
可以等效于:
ARCHITECTUREbehave0a_varIS
BEGIN
ssPROCESS(a,I)
BEGIN
Output<=a(I);
ENDPROCESSss;
ENDbehave;
信号代入语句的右边可以是算数表达式,也可以是逻辑表达式,还可以是关系表达式,
所以可以仿真加法器、乘法器、除法器、比较器和各种逻辑电路。
3.条件信号代入
条件代入语句也是并发语句,它可以将符合条件的表达式代入信号量。
格式:目的信号量7表达式1WHEN条件1
ELSE表达式2WHEN条件2
ELSE表达式3WHEN条件3
ELSE表达式1;
例:四选一电路
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYmux44IS
PORT(iO,il,i2,i3,a,b:INSTD_LOGTC;
q:OUTSTD_LOGIC);
ENDmux44;
ARCHITECTUREaa0mu>:44IS
SIGNALsei:STD_LOGIC_VECTOR(1DOWNTO0);
BEGIN
sel<=b&a;
q<=iOWHENsei=〃00〃ELSE
ilWHENsel=〃01"ELSE
i2WHENsel=,z10z/ELSE
i3WHENsei=〃11〃:
ENDaa;
4.选择信号代入
格式:WITH表达式样SELECT
目的信号量<二表达式1WHEN条件1
表达式2WHEN条件2
表达式nWHEN条件n;
该语句很象CASE语句.
例:
LIBRARYIEEE;
LSEIEEE.STD_L0GIC_1164.ALL;
ENTITYmux45IS
PORT(iO,il,i2,i3,a,b:INSTD_LOGIC;
q:OUTSTD_LOGIC);
ENDmux45;
ARCHITECTUREbb0mux45TS
SIGNALsei:INTEGERrange0to3;
BEGIN
WITHseiSELECT
q<=iOWHEN0,
ilWHEN1,
i2WHEN2,
i3WHEN3;
sel<=0WHENa='O'ANDb='O'ELSE
1WHENa=I1ANDb='O'ELSE
2WHENa='O'ANDb=VELSE
3WHENa=TANDb=T
ENDbb;
5.并发过程调用语句
过程调用语句可以并发执行,但要注意如下问题:
•并发过程调用是一个完整的语句,在它之前可以加标号
•并发过程调用语句应带有IN,OUT或INOUT的参数,他们应该列在过程名后的括号内
•并发过程调用可以有多个返回值
例:
ARCHITECTURE....
BEGIN
vector_to_int(z,x_lag,q);
END;
等同于:
ARCHITECTURE....
BEGIN
PROCESS(z,q)
BEGIN
vectortoint(z,xlag,q);
ENDPROCESS;
END;
1.4.7基本逻辑电路设计
(1)组合逻辑电路
例12输入与非门电路
LIBRARYieee;
USEieee.stdlogic1164.all;
entityxxlis
port(a,b:instd_logic;
y:outstd_logic);
endxxl;
architecturenand2pp0xxlis
begin
y<=anandb;
endnand2pp;
例2:2输入或非门
LIBRARYieee;
useieee.std_logic_l164.all;
entitynor2is
port(a,b:instd_logic;
y:outstd_logic);
endnor2;
architecturenorbehaveonor2is
begin
y<=anorb;
endnor_behave;
例32输入异或门电路
1ibraryieee;
useieee.std_logic_l164.all;
entityxor2is
port(a,b:instd_logic;
y:outstd_logic);
endxor2;
architecturexorbehaveoxor2is
begin
y<=axorb;
endxor_behave;
例43-8译码器
LIBRARYieee;
USEieee.std_logic_l164.all;
entitydecoder38is
port(a,b,c,gl,g2a,g2b:instd_logic;
y:outstd_logic_vector(7downto0));
enddccoder38;
architecturebehave380decoder38is
signalindata:std_logic_vector(2downto0);
begin
indata<=c&b&a;
process(indata,gl,g2a,g2b)
begin
i(gl=,Tandg2a='O'andg2b='O')then
caseindatais
when〃OOO〃=>y<=〃l1111110〃;
when〃001〃=>y<=〃l1111101〃;
when"010"=>y<="l1111011〃;
when〃011"=>y〈="l1110111〃;
when,,100'=>y<=/z11101111,z;
when/,10r/=>y<=/zl101111K;
when
when,,lll,/=>y<=/,011111ir,;
whenothers=〉y<=〃XXXXXXXX〃;
endcase;
else
y<=/zllllllll/z;
endi;
endprocess;
endbehave38;
例5优先编码器
LIBRARYieee;
USEieee.std_logic_l164.all;
entityprioris
port(input:instdlogicvector(7downto0);
y:outstdlogic_vector(2downto0));
endprior;
architecturebe_prior0prioris
begin
process(input)
begin
i(input(0)=,01)then
y<=〃lll〃;
elsi(input(1)=,0,)then
y<=〃110〃;
elsi(input⑵='O')then
y<=/ziorz;
elsi(input(3)='O')then
y<=//100,/;
elsi(input(4)='O')then
y〈二〃Oll〃;
elsi(input(5)='O')then
y〈二〃010〃;
elsi(input(6)='O')then
y〈二〃OOl〃;
elsi(input(7)=,0*)then
y<=〃000〃;
endi;
endprocess;
endbe_prior;
例7四选一选择器
LIBRARYieee;
USEieee.std_logic_l164.all;
entitymux4is
port(input:instd_logic_vector(3downto0);
a,b:instdlogic;
y:outstd_logic);
endmux4;
architecturebc_mux40mux4is
signalsei:std_logic_vector(1downto0);
begin
sel<=b&a;
process(input,sei)
begin
i(sei="00〃)then
y〈二input(0);
elsi(sei="01〃)then
y〈二input(1);
elsi(sei=〃10〃)then
input(2);
else
y〈二input(3);
endi;
endprocess;
endbemux4;
例8:加法器
LIBRARYieee;
USEieee.stdlogic_l164.all;
USEieee.std_logic_arith.all;
ENTITYadderIS
PORT(opl,op2:INUNSIGNED(7downto0);
result:OUTINTEGER);
ENDadder;
ARCHITECTUREmaxpld0adderIS
BEGIN
result<=CONV_INTEGER(opl+op2);
ENDmaxpld;
例9半加器
LIBRARYieee;
USEieee.std_logic_l164.all;
ENTITYhalIS
PORT(a,b:INstd_L0GIC;
s,co:OUTstdLOGIC);
ENDhal;
ARCHITECTUREhall0halIS
signalc,d:stdlogic;
BEGIN
c<=aorb;
d<=anandb;
co<=notd;
s<=candd;
endhal1;
例10全加器,由半加器组成,以元件方式调用.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- Photoshop考试试题汇编及详细答案
- 注册环保工程师专业知识考试真题及答案(2026年)
- 酒店中央空调运维操作规程
- 2026年煤矿测量作业人员(初级)职业技能《理论知识》真题卷(附解析)
- 卒中后神经源性膀胱饮水管理标准化方案共识
- 气化器安全操作规程
- PCB基础培训考核试题(含详细答案)
- 吉林省长春朝阳区六校联考2027届八上数学期末监测模拟试题含解析
- 1型糖尿病运动相关低血糖预防共识
- 2026年电力安全生产事故案例知识竞赛考试试题及答案
- 护林员巡护安全知识培训课件
- 《互联网营销师(直播销售员)三级(高级)理论知识考核要素细目表》
- 科学运动与健康老龄化:老年人运动指南
- 呼图壁县锐源通化工有限责任公司3万吨-年乌洛托品技术改造项目环评报告
- 陕西省三级医院评审标准 实施细则 (2023 年版)
- 《SJG29-2023合成材料运动场地面层质量控制标准》
- 我的梦想旅游
- 《红色的天空》话剧剧本
- 《自然教育志愿者规范》(T-CSF 020-2021)
- 单位资产清查报告范文(12篇)
- 道路运输和其他安全安全生产实务注册安全工程师考试(初级)试卷与参考答案(2024年)
评论
0/150
提交评论