第1章 硬件描述语言VHDL8739811.docx

上传人:b****5 文档编号:3374088 上传时间:2022-11-22 格式:DOCX 页数:71 大小:39.40KB
下载 相关 举报
第1章 硬件描述语言VHDL8739811.docx_第1页
第1页 / 共71页
第1章 硬件描述语言VHDL8739811.docx_第2页
第2页 / 共71页
第1章 硬件描述语言VHDL8739811.docx_第3页
第3页 / 共71页
第1章 硬件描述语言VHDL8739811.docx_第4页
第4页 / 共71页
第1章 硬件描述语言VHDL8739811.docx_第5页
第5页 / 共71页
点击查看更多>>
下载资源
资源描述

第1章 硬件描述语言VHDL8739811.docx

《第1章 硬件描述语言VHDL8739811.docx》由会员分享,可在线阅读,更多相关《第1章 硬件描述语言VHDL8739811.docx(71页珍藏版)》请在冰豆网上搜索。

第1章 硬件描述语言VHDL8739811.docx

第1章硬件描述语言VHDL8739811

第1章硬件描述语言VHDL

数字系统设计分为硬件设计和软件设计,但是随着计算机技术、超大规模集成电路(CPLD、FPGA)的发展和硬件描述语言(HDL,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.STD_1076标准,并在全世界得到了承认。

该语言集成了各种HDL语言的优点,使数字系统设计更加简单和容易。

VHDL语言是一个规模庞大的语言,在使用它之前完全学会它是很难的,本书介绍的只是VHDL语言的一部分。

1.4VHDL语言的基本结构

VHDL语言通常包含实体(Entity),构造体(Architecture),配置(Configuration),包集合(Package),和库(Library)五部分.其中实体用于描述所设计的系统的外部接口信号;构造体用于描述系统内部的结构和行为;建立输入和输出之间的关系;配置语句安装具体元件到实体—结构体对,可以被看作是设计的零件清单;包集合存放各个设计模块共享的数据类型、常数和子程序等;库是专门存放预编译程序包的地方。

如下详细介绍。

1.4.1基本设计单元

VHDL的基本设计单元就是实体,无论数字电路复杂还是简单,都是由实体和构造体组成。

(1)实体说明

实体说明有如下结构:

ENTITY实体名IS

[端口说明]

END实体名;

(VHDL语言中不分大小写字母)

其中:

端口说明是对设计实体中输入和输出借口进行描述,格式如下:

PORT(端口名(,端口名):

方向数据类型名;

端口名(,端口名):

方向数据类型名);

端口名是赋予每个系统引脚的名称,一般用几个英文字母组成。

端口方向是定义引脚是输入还是输出,见下表:

方向

说明

IN

输入到实体

OUT

从实体输出输出

INOUT

双向

BUFFER

输出(但可以反馈到实体内部)

LINKAGE

不指定方向

常用的端口数据类型有两种:

BIT和BIT_VECTOR,当端口被说明为BIT时,只能取值“1”或“0”,

当端口被说明为BIT_VECTOR时,它可能是一组二进制数。

例:

PORT(n0,n1,select:

INBIT;

q:

OUTBIT;

bus:

OUTBIT_VECTOR(7DOWNTO0));

本例中,n0,n1,select是输入引脚,属于BIT型,q是输出引脚,BIT型,bus是一组8位二进制总线,属于BIT_VECTOR,

例:

LIBRARYIEEE;

USEIEEE.STD_LOGIC.1164.ALL;

ENTITYmmIS

PORT(n0,n1,select:

INSTD_LOGIC;

Q:

OUTSTD_LOGIC;

Bus:

OUTSTD_LOGIC_VECTOR(7DOWNTO0));

ENDmm;

在此例中端口数据类型取自IEEE标准库(该库中有数据类型和函数的说明),其中STD_LOGIC取值为“0”,“1”,“X”和“Z”。

因为使用了库所以在实体说明前要增加库说明语句。

(2)构造体

构造体是实体的一个重要部分,每一个实体都有一个或一个以上的构造体。

1)一般说明

构造体格式如下:

ARCHITECTURE构造体名OF实体名IS

[定义语句]内部信号,常数,数据类型,函数等的定义

BEGIN

[并行处理语句]

END构造体名;

例:

ENTITYnaxIS

PORT(a0,a1:

INBIT;

Sel:

INBIT;

Sh:

OUTBIT);

ENDnax;

ARCHITECTUREdataflowOFnaxIS

BEGIN

sh<=(a0ANDsel)OR(NOTselANDa1);

ENDdataflow;

构造体描述设计实体的具体行为,它包含两类语句:

●并行语句并行语句总是在进程语句(PROCESS)的外部,该语句的执行与书写顺序无关,总是同时被执行

●顺序语句顺序语句总是在进程语句(PROCESS)的内部,从仿真的角度,该语句是顺序执行的

一个构造体包含几个类型的子结构描述,这些描述是:

*BLOCK描述(块描述)

*PROCESS描述(进程描述)

*SUNPROGRAMS描述(子程序描述)

2)BLOCK语句描述

使用BLOCK语句描述的格式如下:

块标号:

BLOCK

BEGIN

ENDBLOCK块标号:

例:

二选一电路

ENTITYmuxIS

PORT(d0,d1,sel:

INBIT;

q:

OUTBIT);

ENDmux;

ARCHITECTUREconnectOFmuxIS

SIGNALtmp1,tmp2,tmp3:

BIT;

BEGIN

cale:

BLOCK

BEGIN

tmp1<=d0ANDsel;

tmp2<=d1AND(NOTsel);

tmp3<=tmp1ORtmp2;

q<=tmp3;

ENDBLOCKcale;

ENDconnect;

在对程序进行仿真时,BLOCK中的语句是并行执行的,与书写顺序无关,这一点和构造体中直接写的语句是一样的。

3)进程(PROCESS)描述

进程描述的格式如下:

[进程名]:

PROCESS(信号1,信号2,。

BEGIN

ENDPROCESS进程名;

*一般用于组合电路进程模式:

__进程标记:

PROCESS(__信号名,__信号名,__信号名)

VARIABLE__变量名:

STD_LOGIC;

VARIABLE__变量名:

STD_LOGIC;

BEGIN

--指定信号

--指定变量

--过程调用

--如果语句

--CASE语句

--循环语句

ENDPROCESS__进程标记;

*用于时序电路进程模式:

__进程标记:

PROCESS(__信号名,__信号名,__信号名)

VARIABLE__变量名:

STD_LOGIC;

VARIABLE__变量名:

STD_LOGIC;

BEGIN

WAITUNTIL__时钟信号='1';

--指定信号

--指定变量

--过程调用

--如果语句

--CASE语句

--循环语句

ENDPROCESS__进程标记;

例:

ENTITYmux1IS

PORT(d0,d1,sel:

INBIT;

q:

OUTBIT);

ENDmux1;

ARCHITECTUREconnectOFmux1IS

BEGIN

cale:

PROCESS(d0,d1,sel)

VARIABLEtmp1,tmp2,tmp3:

BIT;--在进程中定义的变量

BEGIN

tmp1:

=d0ANDsel;--输入端口向变量赋值

tmp2:

=d1AND(NOTsel);

tmp3:

=tmp1ORtmp2;

q<=tmp3;

ENDPROCESScale;

ENDconnect;

在PROCESS中的语句是顺序执行的,这一点和BLOCK中的语句是不一样的。

当PROCESS所带的信号量发生变化时,PROCESS中的语句就会执行一遍。

4)子程序描述

子程序的概念和其它高级程序中子程序的概念相同,在VHDL中有两种类型:

●过程(Procedure)

●函数(Function)

1.过程的格式:

PROCEDURE过程名(参数1,参数2。

)IS

[定义变量语句]

BEGIN

[顺序处理语句]

END过程名;

例:

PROCEDUREvector_to_int

(z:

INSTD_LOGIC_VECTOR;

x_flag:

OUTBOOLEAN;

q:

ININTEGER)IS

BEGIN

q:

=0;

x_flag:

=FALSE;

FORiINzRANGELOOP

q:

=q*2;

IF(z(i)=1)THEN

q:

=q+1;

ELSEIF(z(i)/=10)THEN

x_flag:

=TRUE;

ENDIF;

ENDLOOP;

ENDvector_to_int;

在过程中,语句是顺序执行的。

2.函数

函数的格式:

FUNCTION函数名(参数1,参数2。

)RETURN数据类型名IS

[定义变量语句]

BEGIN

[顺序处理语句]

RETURN[返回变量名];

END函数名;

在VHDL语言中函数的参数都是输入信号,

例:

FUNCTIONmin(x,y:

INTEGER)RETURNINTEGERIS

BEGIN

IFX

RETURN(x);

ELSE

RETURN(y);

ENDIF;

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_LOGIC_1164.ALL

该例说明要使用IEEE库中的1164包中所有项目

库的作用范围:

库的作用范围从一个实体说明开始到它所属的结构体、配置为止,当有两个实体时,第二个实体前要另加库和包的说明。

(2)包

通常在一个实体中对数据类型、常量等进行的说明只可以在一个实体中使用,为使这些说明可以在其它实体中使用,VHDL提供了程序包结构,包中罗列VHDL中用到的信号定义、常数定义、数据类型、元件语句、函数定义和过程定义,它是一个可编译的设计单元,也是库结构中的一个层次,使用包时可以用USE语句说明,例如:

USEIEEE.STD_LOGIC_1164.ALL

程序包分为包头和包体,包结构的格式如下:

1)包头格式:

PACKAGE包名IS

[说明语句]

END包名

包头中列出所有项的名称。

2)包体格式:

PACKAGEBODY包名IS

[说明语句]

END包名;

包体给出各项的具体细节。

例:

包头

USESTD.STD.LOGIC.ALL

PACKAGElogicIS

TYPEthree_level_logicIS(‘0’,’1’,’z’);//数据类型项目

CONSTANTunknown_value:

three_level_logic:

=’0’;//常数项目

FUNCTIONinvert(input:

three_level_logic)//函数项目

RETURNthree_level_logic;

ENDlogic;

例:

包体

PACKAGEBODYlogicIS

FUNCTIONinvert(input:

three_level_logic)//函数项目描述

BEGIN

CASEinputIS

WHEN‘0’=>RETURN‘1’;

WHEN‘1’=>RETURN‘0’;

WHEN‘Z’=>RETURN‘Z’;

ENDCASE;

ENDinvert;

ENDlogic

该包使用例:

USElogic.three_level_logic,logic.invert;//使用数据类型和函数两个项目

ENTITYinverterIS

PORT(x:

INthree_level_logic;

y:

OUTthree_level_logic);

ENDinverter;

ARCHITECTUREinverter_bodyOFinverterIS

BEGIN

kk:

PROCESS

BEGIN

Y<=invert(x)AFTER10ns;

WAITONx;

ENDPROCESS;

ENDinverter_body;

(2)配置

用于在多构造体中的实体中选择构造体,例如,在做RS触发器的实体中使用了两个构造体,目的是研究各个构造体描述的RS触发器的行为性能如何,但是究竟在仿真中使用哪一个构造体的问题就是配置问题。

配置语句格式:

CONFIGURATION配置名OF实体名IS

[说明语句]

END 配置名;

例:

最简单的配置

CONFIGURATION配置名OF实体名IS

 FOR被选构造体名

ENDFOR;

END 配置名;  

例:

ENTITYrsIS

PORT(set,reset:

INBIT;

q,qb:

BUFFERBIT);

ENDrs;

ARCHITECTURErsff1OFrsIS

COMPONENTnand2

PORT(a,b:

INBIT;

c:

OUTBIT);

ENDCOMPONENT;

BEGIN

U1:

nand2PORTMAP(a=>set,b=>qb,c=>q)

U2:

nand2PORTMAP(a=>reset,b=>q,c=>qb)

ENDrsff1;

ARCHITECTURErsff2OFrsIS

BEGIN

q<=NOT(qbANDset);

qb<=NOT(qANDreset);

ENDrsff2

两个构造体,可以用配置语句进行设置:

CONFIGRATIONrsconOFrsIS//选择构造体rsff1

FORrsff1

ENDFOR;

ENDrscon;

1.4.3VHDL中使用的数据类型和运算操作

VHDL可以象其它高级语言一样定义数据类型,但还可以用户自己定义数据类型。

(1)信号、常量和变量

信号:

通常认为信号是电路中的一根线

常数:

可以在数字电路中代表电源、地线等等

变量:

可以代表某些数值

1.常数

常数的描述格式:

CONSTANT常数名:

数据类型:

=表达式

例:

CONSTANTVcc:

REAL:

=5.0;

CONSTANTDALY:

TIME:

=100ns;

CONSTANTFBUS:

BIT_VECTOR:

=”0101”;

2.变量

变量只能在进程、函数和过程中使用,一旦赋值立即生效。

变量的描述格式:

VARIABLE变量名:

数据类型约束条件:

=表达式

例:

VARIABLEx,y:

INTEGER;

VARIABLEcount:

INTEGERRANGE0TO255:

=10;

3.信号

信号除了没有方向的概念以外几乎和端口概念一致。

信号的描述格式:

SIGNAL信号名:

数据类型约束条件:

=表达式

例:

SIGNALsys_clk:

BIT:

=’0’;

SIGNALground:

BIT:

=’0’

在程序中,信号值输入信号时采用代入符”<=”,而不是赋值符“:

=”,同时信号可以附加延时。

信号传送语句:

s1<=s2AFTER10ns

信号是一个全局量,可以用来进行进程之间的通信

4.信号与变量的区别

信号赋值可以有延迟时间,变量赋值无时间延迟

信号除当前值外还有许多相关值,如历史信息等,变量只有当前值

进程对信号敏感,对变量不敏感

信号可以是多个进程的全局信号,但变量只在定义它之后的顺序域可见

信号可以看作硬件的一根连线,但变量无此对应关系

1.4.4VHDL中的数据类型

(1)标准数据类型

1.整数(INTEGER)

范围:

-2147483547---2147483646

2.实数(REAL)

范围:

-1.0E38---1.0E38

书写时一定要有小数。

3.位(BIT)

在数字系统中,信号经常用位的值表示,位的值用带单引号的‘1’和‘0’来表示

明确说明位数值时:

BIT‘(‘1’)

4.位矢量(BIT_VECTOR)

位矢量是用双引号括起来的一组位数据

“010101”

5.布尔量(BOOLEAN)

只有“真”和“假”两个状态,可以进行关系运算

6.字符(CHARACTER)

字符量通常用单引号括起来,对大小写敏感

明确说明1是字符时:

CHARACTER‘(‘1’)

7.字符串(STRING)

字符串是双引号括起来的一串字符:

“laksdklakld”

8.时间(TIME)

时间的单位:

fs,ps,ns,ms,sec,min,hr

例:

10ns

整数数值和单位之间应有空格

9.错误等级(SEVERITYLEVEL)

用来表示系统的状态,它共有4种:

NOTE(注意)

WARNING(警告)

ERROR(错误)

FAILURE(失败)

10.大于等于零的整数(NATURAL)、正整数(POSITIVE)

只能是正整数

数据除定义类型外,有时还需要定义约束范围。

例:

INTEGERRANGE 100DOWNTO0

BIT_VECTOR(3DOWNTO0)

REALRANGE2.0TO30.0

(2)用户定义的数据类型

用户定义的数据类型的一般格式:

TYPE数据类型名{,数据类型名}数据类型定义

不完整的数据类型格式:

TYPE数据类型名{,数据类型名};

可由用户定义的数据类型为:

*枚举(ENUMERATED)

格式:

TYPE数据类型名IS(元素、元素、…);

例1:

TYPEweekIS(Sun,Mon,Tue,wed,Thu,Fri,Sat);

例2:

TYPESTD_LOGICIS

(‘U’,’X’,’0’,’1’,’Z’,’W’,’L’,’H’,’-‘);

*整数(INTEGER)

格式:

TYPE数据类型名IS数据类型定义约束范围

例:

TYPEdigitISINTEGERRANGE0TO9

*实数(REAL)

格式:

TYPE数据类型名IS数据类型定义约束范围

例:

TYPEcurrentISREALRANGE-1E4TO1E4

*数组(ARRAY)

格式:

TYPE数据类型名IS ARRAY范围OF原数据类型名;

例:

TYPEwordISARRAY(1TO8)OFSTD_LOGIC;

TYPEwordISARRAY(INTEGER1TO8)OFSTD_LOGIC;

TYPEinstructionIS(ADD,SUB,INC,SRL,SRF,LDA,LDB);

SUBTYPEdigitISINTEGER0TO9;

TYPEindflagISARRAY(instructionADDTOSRF)OFdigit;

数组常在总线、ROM和RAM中使用。

*时间(TIME)

格式:

TYPE 数据模型名不副实IS范围

UNITS基本单位

单位;

ENDUNITS;

TYPE timeRANGE–1E18TO1E18

UNITS

fs;

ps=1000fs;

ns=1000ps;

us=1000ns;

ms=1000us;

sec=1000ms;

min=60sec;

hr=60min;

ENDUNITS;

*记录(RECODE)

将不同的数据类型放在一块,就是记录类型数据

格式:

TYPE数组类型名ISRECORD

元素名:

数据类型名;

元素名:

数据类型名;

ENDR

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1