第1章 硬件描述措辞vhdl_第1页
第1章 硬件描述措辞vhdl_第2页
第1章 硬件描述措辞vhdl_第3页
第1章 硬件描述措辞vhdl_第4页
第1章 硬件描述措辞vhdl_第5页
已阅读5页,还剩58页未读, 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论