硬件描述语言VHDL_第1页
硬件描述语言VHDL_第2页
硬件描述语言VHDL_第3页
硬件描述语言VHDL_第4页
硬件描述语言VHDL_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

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

文档简介

原理图设计方法:设计人员普遍熟悉并使用直观的原理图描述方法进行系统设计,随着数字系统设计规模日益增大、复杂程度日益提高,如果仍然采用图形方式描述电路,设计工作的周期长、成本高,无法满足快速高效的设计要求。硬件描述语言设计方法:为了满足设计人员对抽象层次更高的电路描述需求,硬件描述语言(HDL:HardwareDescriptionLanguage)应运而生。HDL优势:具有对系统的高层次描述功能,为数字系统设计提供了强大的灵活性和通用性,有效地缩短了设计周期,降低了设计成本。HDL标准化:20年代80年代后期,硬件描述语言向着标准化、集成化的方向发展,其中VHDL和VerilogHDL先后成为IEEE标准。超高速集成电路硬件描述语言VHDL:VeryHighSpeedIntegratedCircuitHardwareDescriptionLanguage简称VHDL,是最早被接纳为IEEE标准的硬件描述语言。VHDL由美国国防部组织开发,1987年被IEEE确认为IEEE1076标准,1993年升级为IEEE1164标准。本章介绍VHDL:介绍VHDL程序结构、语法规则、常用语句。相信通过硬件描述语言的学习,你会发现硬件电路的设计,原来也可以如同软件设计一样,方便修改和完善。通过本章的学习,将为顺利完成FPGA设计应用打下良好的设计基础。5.1VHDL程序结构5.2VHDL语法规则5.3VHDL并行语句5.4VHDL顺序语句第5章硬件描述语言VHDL★

硬件描述语言

ABEL◆

AHDL

VerilogHDL◆

VHDL美国国防部在80年代初提出了VHSIC(VeryHighSpeedIntegratedCircuit)计划,其目标之一是为下一代集成电路的生产,实现阶段性的工艺极限以及完成10万门级以上的设计,建立一项新的描述方法。1981年提出了一种新的HDL,称之为VHSICHardwareDescriptionLanguage,简称为VHDL。IEEE标准★

VHDL语言的主要优点

◆是一种多层次的硬件描述语言,覆盖面广,描述能力强。即设计的原始描述可以是非常简练的描述,经过层层细化求精,最终成为可直接付诸生产的电路级或版图参数描述,整个过程都可以在VHDL的环境下进行。

VHDL有良好的可读性,即可以被计算机接受,也容易被理解用VHDL书写的原文件,即是程序,又是文挡,即是技术人员之间交换信息的文件,又可作为合同签约者之间的文件。

◆VHDL本身的生命期长。因为VHDL的硬件描述与工艺技术无关,不会因工艺变化而使描述过时。与工艺技术有关的参数可通过VHDL提供的属性加以描述,工艺改变时,只需修改相应程序中的属性参数即可。◆

支持大规模设计的分解和已有设计的再利用。一个大规模设计不可能一个人独立完成,它将由多人,多项目组来共同完成。VHDL为设计的分解和设计的再利用提供了有力的支持。

VHDL已成为IEEE承认的一个工业标准,事实上已成为通用硬件描述语言。

VHDL语言的主要优点5.1VHDL程序结构VHDL可以描述什么:一个系统、一个单元模块或一个门电路都可以。VHDL程序结构:无论VHDL描述的电路复杂还是简单,一段VHDL程序包含五个部分:实体entity、结构体architecture、库library、配置configuration和包package。实体entity:描述电路和系统的输入、输出端口等外部信息。结构体architecture:描述电路和系统的功能信息,对系统的结构或行为的具体描述。库library:库中存放的是已经编译过的实体、结构体、配置和包,库可以由设计者自己生成,也可以由ASIC制造商或其他公司提供。放在VHDL程序段的最前面。配置configuration:完成对库的使用,从库中选择需要的单元完成自己的设计方案。包package:存放共享数据、常数和子程序等。VHDL程序结构必须有的两个部分:在五个组成部分中,实体和结构体是必不可少的,其余的部分可以根据需要选用。VHDL的基本组成VHDL语言参数部分——library库

接口部分—设计实体描述部分—结构体1.库的用途:库是一个集合,专门用来存放已经编译过的实体、结构体,库可以由设计者自己生成,也可以由其他公司提供。2.库的种类:VHDL中有五类库:IEEE库、STD库、ASIC库、WORK库和用户自定义库。IEEE库:存放IEEE标准1076中的标准包集合,如std_logic_1164,std_logic_arith和std_logic_unsigned等。STD库:存放VHDL的标准数据类型,如Boolean等数据类型的定义等,包括输入/输出两个标准程序包,由于STD库是VHDL的标准配置,可以不用进行库的说明,STD库对VHDL程序均是可见的。WORK库:用于存放用户设计和定义的设计单元和程序包,保存当前进行的设计.只要在VHDL的应用环境中,都可以随时调用STD库和WORK库,所以不需专门的调用语句。ASIC库:存放与逻辑门对应的实体,目的是为了进行门级仿真。在FPGA/CPLD的设计中一般都不需要VITAL库的程序包。用户自定义库:存放用户自己定义的实体集合,使用前必须首先进行库的说明。5.1.1library库

3.库的说明库说明语句如下:LIBRARYieee;USE

ieee.std_logic_1164.all;在VHDL语言中,库的说明通常放在实体描述的最前面。注意:多数情况下,只有对库进行说明,设计者才能使用库集合中已经定义的数据。USE库名.程序包名.项目名USE库名.程序包名.ALL调用程序包语句标准程序包定义程序包4.库的使用五类库中除了WORK和STD库,其它三类库在使用之前需要进行库的说明,还要说明使用库中的哪个包集合。库使用举例:为了使用IEEE库中的std_logic_1164、std_logic_arith和std_logic_unsigned程序包,应使用下列语句:libraryIEEE; --使用IEEE库useIEEE.std_logic_1164.all;--使用IEEE库std_logic_1164程序包所有设计单元useIEEE.std_logic_arith.all;--使用IEEE库std_logic_arith程序包所有设计单元useIEEE.std_logic_unsigned.all;--使用IEEE库std_logic_unsigned程序包所有设计单元注意:如果使用std_logic和std_logic_vector,必须在实体描述前写出下面的库说明和使用包集合的说明语句:entity实体:用来描述设计的对外端口信息,如输入和输出端口的描述,也可以描述参数化的数值。提供设计模块的公共信息,是VHDL设计电路的最基本部分。1.entity实体描述格式entity实体名is [generic(类属表);] [port(端口表);] [declarations说明语句;] [begin 实体语句部分];end[实体名];[]表示其中的部分是可选项。5.1.2entity实体kxora1b1c11.entity实体描述格式VHDL实体的描述方法:ENTITYkxorISPORT(a1,b1:INstd_logic;c1:OUTstd_logic);ENDkxor;调用程序包语句标准程序包定义程序包实体及实体声明语句实体语句的一般格式ENTITY实体名IS[PORT(端口名)]ENDENTITY实体名ENTITYkxorISPORT(a1,b1:INstd_logic;ENDkxor;c1:OUTstd_logic);ENTITY、IS、PORT、IN、OUT和END为关键字;ENTITY...END之间表示实体内容;kxor表示实体的名称,即电路的符号名;PORT——端口(引脚)信息关键字,描述了信号的流向;std_logic表示信号取值的类型为标准逻辑。设计实体说明2.端口表端口表:用来说明设计实体对象的对外信息。端口表书写格式: port(端口名{,端口名}:[方向]子类型[bus][:=初始值] {;端口名{,端口名}:[方向]子类型[bus][:=初始值]});端口名是端口的标识符,端口方向表明数据通过该端口的流动方向,端口子类型说明端口的数据类型。端口很重要:端口是实体和外界通信的动态信息通道,每个端口都有端口名、端口方向以及端口子类型。例如:2选1数据选择器端口的VHDL描述如下:entitymux21is --实体名:mux21port(d0,d1,sel:inbit; --输入信号:d0,d1,sel,均为bit数据类型y:outbit); --输出信号:y,为bit数据类型endmux21; --实体描述结束3.类属表类属表:描述的是实体与外界通信的静态信息通道。类属表主要用来规定端口的大小,实体中元件的数目,实体的定时特性等。通常放在端口语句之前。类属表的书写格式:generic([常量]名字表:[in]类属标识[:=初始值];…);例如:generic(wide:integer:=32);--说明wide为常数,其数值为整数323.端口方向端口方向的四种模式:输入in、输出out、双向inout和缓冲buffer。缺省值是输入。输入in:输入仅允许数据由外部流向实体输入端口。主要用于时钟输入、复位、使能,单向数据输入等输入信号的描述。输出out:输出仅允许数据从实体内部流向实体输出端口,输出模式不能用于反馈,因为输出端口在实体内部不可读。通常用于电路的各种输出,如计数器、移位寄存器等输出信号描述。双向inout:双向模式允许数据流入或流出实体,双向模式允许用于内部反馈。双向模式可以替代其它任一模式,适合描述双向数据总线等。缓冲buffer:缓冲模式通常用于内部有反馈需求的信号描述。buffer与out类似,只是buffer允许用于内部反馈,而out不能用于内部反馈。Out与Buffer的区别Entitytest1isport(a:instd_logic;

b,c:outstd_logic);endtest1;architectureaoftest1isbeginb<=not(a);

c<=b;--Errorenda;Entitytest2isport(a:instd_logic;

b:bufferstd_logic;

c:outstd_logic

);endtest2;architectureaoftest2isbeginb<=not(a);

c<=b;enda;4.常用端口类型常用端口类型:布尔boolean、位bit、位矢量bit_vector、整数integer、标准逻辑std_logic和标准逻辑矢量std_logic_vector等。布尔boolean:布尔类型的取值为“true”或“false”。位bit:位类型的取值只有“0”或“1”。位矢量bit_vector:位矢量是位类型的集合,基本元素是bit类型。整数integer:整数常用来说明常数,不用来说明输入输出信号。标准逻辑std_logic:标准逻辑由IEEE_std_logic_1164程序包支持,其取值有9种:0(信号0)、1(信号1)、H(弱信号1)、L(弱信号0)、Z(高阻)、X(不定)、W(弱信号不定)、U(初始值)和—(不可能情况)等。标准逻辑矢量std_logic_vector:标准逻辑矢量是标准逻辑的集合,基本元素是std_logic类型。使用时注意:如果使用std_logic或std_logic_vector,需要在实体前使用下述语句进行说明:libraryIEEE; useIEEE_std_logic_1164.all;ENTITYselIS

PORT(d0,d1,d2,d3:INBIT;s:ININTEGERRANGE0TO3;out1:OUTBIT);ENDsel;d0d1d2d3sout1sel设计实体举例再例:结构体:是电路和系统的逻辑功能描述部分。所有的结构体均附属于该实体,是实体的说明。描述实体硬件的互连关系、数据的传输和变换以及动态行为。即描述设计实体的内部结构和对外部设计实体端口间的逻辑关系。5.1.3architecture结构体

一个实体可以对应多个结构体,每个结构体可以代表该硬件的某一方面特性,例如行为特性,结构特性。调用程序包语句标准程序包定义程序包实体及实体声明语句结构体1结构体2结构体n1.结构体描述格式

architecture结构体名of实体名is

[说明语句]; begin

[并行语句]; end[结构体名];结构体由两部分组成:begin前的说明语句部分和begin后的并行语句部分。结构体名:是该结构体的唯一名称,of后面跟随的实体名表明该结构体对应的是哪个实体,is表明结构体的命名结束。说明语句:用于对结构体内部所用到的信号、常数和函数等的定义,其定义只对结构体内部可见,即结构体内部可以使用。并行语句:描述电路和系统并行发生的行为。有关结构体的说明语句和并行语句在后面有详细的介绍。ARCHITECTUREkxor_arcOFkxorISBEGINc1<=(NOTa1ANDb1)OR(a1AND

NOTb1);ENDkxor_arc;当异或门的符号和外部端口a1、b1和c1确定之后,就要确定实体的内部电路,使之与实体相对应。kxora1b1c1a1b1c1结构体举例LIBRARYieee;USEieee.std_logic_1164.all;ENTITYkxorISPORT(a1,b1:INstd_logic;c1:OUTstd_logic);ENDkxor;ARCHITECTUREkxor_arcOFkxorISBEGINc1<=(NOTa1ANDb1)OR(a1AND

NOTb1);ENDkxor_arc;该例的完整程序kxora1b1c1a1b1c1kxora1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1a1b1c1结构体举例2(自学)举例:二选一数据选择器的结构体描述。architectureconofmux21is --实体mux21的结构体con的描述 signaltmp:bit; --说明语句:内部信号tmp的定义begin tmp<=(d0andsel)or(d1and(notsel)); --并行语句:关于数据选择器的功能描述 y<=tmp; --并行语句:内部信号的输出endcon;在前面实体部分曾经定义了二选一数据选择器的端口,在结构体部分给出了该数据选择器信号之间逻辑关系的描述。举例:将实体和结构体举例的两部分程序联在一起,则实现二选一数据选择器完整的设计描述。完整程序如下:entitymux21is --实体名:mux21port(d0,d1,sel:inbit; --输入信号:d0,d1,sely:outbit); --输出信号:yendmux21;architectureconofmux21is --实体mux21的结构体con的描述signaltmp:bit; --说明语句:关于内部信号tmp的定义begintmp<=(d0andsel)or(d1and(notsel)); --并行语句:关于数据选择器的功能描述y<=tmp; --并行语句:内部信号的输出endcon;子程序:是在主程序调用它以后能将处理结果返回主程序的程序模块。子程序可以反复调用,使用方便。调用子程序时首先需要对其初始化,再次调用时要再次初始化,子程序内部的值不能保持。子程序有两种:过程(procedure)和函数(function)。procedure和function有所不同,前者的参数可以是输入in、输出out或双向inout属性的参数,其返回值可以是多个,其返回值在声明语句中说明。后者的所有参数都是in属性,返回值只有一个,在声明语句之外说明。子程序内部语句:是顺序语句,有关顺序语句的介绍请参考5.4节。5.1.4子程序

1.过程过程语句的书写格式: procedure过程名(参数1,参数2,…)is [定义语句]; begin [顺序语句]; end过程名;举例:实现输入数据din的循环左移,根据输入s值确定循环左移的位数。procedureshift(din,s:instd_logic_vector; --输入信号s、din signaldout:outstd_logic_vector)is --输出信号dout variablesc:integer; --整数变量scbeginsc:=conv_integer(s); --左移位数s的数据格式转换foriindin’rangeloop if(sc+i<=din’left)then dout(sc+i)<=din(i); --实现循环左移 else dout(sc+i-din’left)<=din(i); endif;endshift;使用过程之前,需要将初始值传递给过程的输入参数,启动过程的执行。执行结束后,应当将输出值拷贝到过程调用者定义的变量或信号中。2.函数函数的书写格式: function函数名(参数1,参数2,…) return数据类型名is

[定义语句]; begin

[顺序语句]; return[返回变量名]; end[函数名];由于函数中所有的参数都是输入信号,因此端口方向in可以省略。函数的输入值由调用者拷贝到输入参数中,如果没有特别指定,在function语句中按常数处理。举例:返回两数中的较小数值的函数描述。functionmin(x,y:integer) --函数min,有两个参数x和yreturnintegeris --返回整数类型的数据begin ifx<ythen --两数中较小的数返回 returnx; else returny; endif;endmin;使用函数的方法:首先需要将函数集合到包(package)中,再利用use语句使包对设计成为可见、可使用的,然后,在设计结构体中就可以直接使用函数了。rerurn语句:既可以用于函数function内部,也可以用于过程procedure内部,用来结束当前函数或过程体的执行。关于函数的使用:读者可参考书中第7章7.4节RC6算法设计实现,使用了大量的function,极大地方便了复杂程序的设计描述。5.2VHDL语法规则VHDL语言与其它高级语言一样,编写程序时也要遵循一定的语法规则。介绍的VHDL语言规则有:数据对象、数据类型、属性、基本运算符5.2.1数据对象

数据对象有四种类型:常数constant、信号signal、变量variable和文件files类型。数据对象的使用:常数constant、信号signal、变量variable属于可综合的数据对象,文件files类型仅在行为仿真时使用。1.对象说明常数说明格式: constant常数名表:数据类型[:=表达式];信号说明格式: signal信号名表:数据类型[:=表达式];变量说明格式: variable变量名表:数据类型[:=表达式];注意:常数名表、信号名表和变量名表,用“,”隔开多个标识符。举例:constanta1,a2:bit; --常数a1和a2均为bit类型signalout1,out2:std_logic_vector(3downto0);--信号out1,out2均为std_logic_vector类型variablea,b,c:std_logic; --变量a,b,c均为std_logic类型2.信号与变量使用时应当特别注意:信号与变量都与一定的物理对象相对应,但是它们有许多不同之处。物理意义不同:信号对应电路设计中一条硬件连接线;变量与硬件没有直接对应关系,变量通常用来暂存某些值。信号是全局量,可以用于进程之间的联系,变量是局部量,只能在进程语句、函数语句和过程中使用。赋值符号不同:信号赋值用“<=”符号;变量赋值用“:=”符号。定义位置不同:信号应当在结构体(architecture)、包(package)、实体(entity)的说明语句定义。变量则在进程(process)、函数(function)和过程(procedure)的说明部分定义。附加延时不同:信号赋值语句执行时有可能附加延时。变量赋值语句执行时,没有延时立刻执行。下面有两个进程描述语句举例,进一步说明了信号与变量的不同之处。例如:process(a,b,c,d) --a,b,c,d均定义为信号begin d<=a; x<=b+d; d<=c; y<=b+d;endprocess;程序执行的结果是:x=b+c;y=b+c。程序分析:信号d先代入a,接着再代入c,但是并未进行处理,当进程中的所有语句执行完毕,信号d最后代入的值c作为最终的数值,所以d中的数值是c。程序执行的结果是:x=b+d=b+c;y=b+d=b+c。例如:process(a,b,c) --a,b,c是信号 variabled:std_logic; --d是变量begin d:=a; x<=b+d; d:=c; y<=b+d;endprocess;程序执行的结果是:x=b+a;y=b+c。程序分析:由于d是变量,没有延时立即执行,因此执行语句d:=a后,a的值赋给d,所以在执行语句x<=b+d后,x=b+a;接着又执行语句d:=c,c的值又赋给d,所以执行语句y<=b+d之后,y=b+c。程序执行的结果是:x=b+d=b+a;y=b+d=b+c。5.2.2数据类型

VHDL的数据类型:VHDL中的每个数据对象都具有特定的数据类型,数据对象进行的操作类型必须与其数据类型相匹配,不匹配时必须使用转换函数。VHDL提供的数据类型:多种标准数据类型以及用户自定义的数据类型。介绍的内容:标准数据类型、用户自定义数据类型、数据类型之间的转换。1.标准数据类型标准数据类型有10种:这些数据类型及其含义如表所示。使用时应当注意:不是所有的综合工具都支持上述10种标准数据类型。QuartusII综合工具不支持实数、时间、错误等级和字符串等数据类型。标准数据类型含义整数(integer)整数32位,-2147483647~+2147483647(-(231-1)~+(231-1))实数(real)浮点数,-1.0E+38~+1.0E+38位(bit)逻辑“0”或“1”位矢量(bit_vector)位矢量,元素为bit布尔量(boolean)逻辑“true”或逻辑“false”字符(character)ASCII字符时间(time)时间单位fs,ps,ns,μs,ms,sec,min,hr错误等级(severitylevel)NOTE(注意),MARNING(警告),ERROR(出错),FAILURE(失败)自然数(natural)正整数(positive)整数的子集。自然数是大于等于0的整数正整数是大于0的正整数字符串(string)字符矢量2.用户定义的数据类型在VHDL语言的使用过程中,可以由用户自己定义数据类型。用户定义的数据类型书写格式: type数据类型名{,数据类型名}is数据类型定义;可以由用户定义的数据类型有:枚举类型、整数类型、实数和浮点数类型、数组类型、存取类型、文件类型、记录类型和物理类型等。这里介绍:QuartusII综合工具支持的常用用户定义数据类型。(1)整数类型VHDL已经预定义的整数:从-(231-1)到+(231-1),即从-2147483647到+2147483647。整数和适用于整数的运算符VHDL已经预先定义,编写VHDL程序时可以直接使用。用户定义的整数类型:自定义的整数类型可以认为是VHDL预定义整数的一个子类。书写格式:

type数据类型名is数据类型定义约束范围;例如:

typeaisintegerrange-63to63;(2)枚举类型枚举类型:是一种非常重要的数据类型,用于建立抽象的模型。设计者用枚举类型严格地表达一个特定操作所需的值,枚举类型的所有值都由设计者自己定义。枚举类型使用:枚举类型常用来定义状态机中的状态。枚举类型格式:type数据类型名is(元素,元素,…)例如:typestatesis(idle,decision,read,write);--数据states枚举类型定义,有4种取值。枚举类型可以用于信号和变量的定义,例如:signalpresent_state,next_steate:states;--状态信号present_state,next_steate定义variablepresent_state,next_steate:states;--状态变量present_state,next_steate定义(3)数组类型数组类型:相同类型的数据集合形成的数据类型就是数组类型。数组类型格式: type数组类型名isarray(范围)of原数据类型名;例如:typebig_wordisarray(0to63)ofstd_logic;--一维数组的定义除定义一维数组外,还可以定义两维数组。例如:typematrix_typeisarray(0to15)ofstd_logic_vector(0to31);推荐使用:数组元素的排列即可以用升序(to),也可以用降序(downto)。推荐使用后者。(4)记录类型记录类型:数组类型是同一类型数据集合形成的,而记录类型是将不同类型数据和数据名组织在一起形成的新类型。记录类型格式: type数据类型名isrecord 元素名:数据类型名; 元素名:数据类型名; … endrecord;例如:typeopcodeis(add,sub,mul,div); --枚举类型定义typeinstructionisrecord --记录类型定义operator:opcode; --枚举类型元素op1:integer; --整数类型元素op2:integer; --整数类型元素endrecord; --结束记录类型定义3.数据类型的转换在VHDL语言中,数据类型的定义是非常严格的,不同数据类型的数据不能进行运算和直接代入。为了进行运算和代入操作,必要时需要进行数据类型之间的转换。数据类型的转换函数如表所示,转换函数通常由VHDL包集合提供,因此在使用转换函数之前,使用library和use语句,使包集合可以使用。包集合函数名功能std_logic_1164to_stdlogicvector(a)由bit_vector转换为std_logic_vectorto_bitvector(a)由std_logic_vector转换为bit_vectorto_stdlogic(a)由bit转换为std_logicto_bit(a)由std_logic转换为bitstd_logic_arithconv_std_logic_vector(a,位长)由integer,unsigned,signed转换为std_logic_vectorconv_integer(a)由unsigned,signed转换为integerstd_logic_unsignedconv_integer由std_logic_vector转换为integer例如:由std_logic_vector转换为integer的VHDL程序。libraryIEEE;useIEEE.Std_logic_1164.all; --使用std_logic_1164包集合useIEEE.Std_logic_unsigned.all; --使用std_logic_unsigned包集合Entityadd3is port(data:instd_logic_vector(2downto0); …);endadd3;architecturever1ofadd3issignalin_data:integerrange0to5;…begin

in_data<=con_integer(data); --数据类型的转换…endver1;5.2.3属性

属性问题:属性提供的是关于信号、类型等的指定特性。这里介绍常用的属性:值类属性、函数类属性、范围属性1.值类属性值类属性:用于返回数据类型或数组类型的特定值,还可返回数组的长度或者类型的最底边界。值类属性表示:常用单引号’指定属性,单引号后面跟属性名,单引号前面是所附属性的对象。常用的值类属性:’left、’right、’high、’low、’length等。例如:属性’left生成一个类型最左边的值;属性’right是生成一个类型最右边的值;例如:属性’high生成一个类型的最大值;属性’low生成类型的最小值;例如:属性’length生成限制性数组中的元素数。需要注意的是:EDA综合软件不同对预定义属性的支持程度也各不相同,使用时应参考特定的综合工具说明。返回值属性描述Count’left=0’left生成的是类型最左边的值States’left=idleWord’left=15Count’right=127’right生成的是类型最右边的值States’right=writeWord’right=0Count’high=127’high生成的是类型最大值States’high=writeWord’high=15Count’low=0’low生成的是类型最小值States’low=idleWord’low=0Count’length=128’length生成的是限制性数组中元件数States’length=4Word’length=16举例: typecountisintegerrange0to127; typestatesis(idle,decision,read,write); typewordisarray(15downto0)ofstd_logic;对上述数据类型求其属性及其返回值如表所示。2.函数类属性最常用的函数类属性:’event。’event函数类属性:表明若属性对象有事件发生,则’event属性生成布尔值“true”。’event使用:常用来检查时钟边沿是否有效。例如:ifclk’eventandclk=’1’then--判断是否发生clk信号变化且变化为1,即clk的上升沿ifclk’eventandclk=’0’then--判断是否发生clk信号变化且变化为0,即clk的下降沿3.范围属性最常用的范围属性:’range’range范围属性:生成一个限制性数组对象的范围。例如:signalword:bit_vector(10downto0);word’range=10downto0;5.2.4基本运算符

VHDL定义的运算符主要有:算术运算符、关系运算符、逻辑运算符、赋值运算符、关联运算符和其它运算符。运算符的优先级别:优先级最高的是乘方(**)、取绝对值(abs)和非(not);其次是乘、除、取模、求余;然后依次是正负号、连接符、移位运算符、关系运算符、逻辑运算符。需要注意的是:操作数的数据类型应当与操作符所要求的数据类型一致。EDA综合软件对运算符支持程度各不相同,使用时应参考综合工具的说明。类别运算符功能数据类型算术运算符+加整数、实数、物理量_减*乘/除MOD取模REM取余**乘方ABS取绝对值+正_负类别运算符功能数据类型逻辑运算符AND与逻辑型数据,如:bit、std_logicOR或NAND与非NOR或非XNOR同或NOT非XOR异或SLL逻辑左移SRL逻辑右移SLA算术左移SRA算术右移ROL逻辑循环左移ROR逻辑循环右移类别运算符功能数据类型关系运算符=相等整数、实数;std_logic等枚举类型/=不等<小于>大于<=小于等于>=大于等于赋值运算符<=信号赋值:=变量赋值关联运算符=>例化元件时用于形参到实参的映射并置运算符&连接bit、std_logic5.3VHDL并行语句并行语句:VHDL描述的实际系统中许多操作都是并行发生的,VHDL中的并行语句就是用来描述这种并行发生的行为。已经见过的并行语句:结构体就是由一至多个并行语句构成的,这些语句相互之间是并行运行的,并行语句的书写顺序不代表其执行的顺序。介绍常用的并行语句:信号赋值语句、process进程语句、black块语句、component元件例化语句、generate生成语句。5.3.1信号赋值语句

信号赋值语句主要有:一般信号赋值、条件信号赋值和选择信号赋值三种形式。一般信号赋值语句格式:目的信号<=敏感信号表达式;应当注意:信号赋值语句在结构体中,即在进程外部使用时,是并行信号赋值语句,但是,如果在进程内部使用则是顺序信号赋值语句。例如:architecturebehaofaisbegin out<=a(i); --结构体中,在进程外部,为并行信号赋值endbeha;上述程序的描述与下面程序的描述相互等价。architecturebehaofaisbeginprocess(a,i)begin out<=a(i); --在进程内部,为顺序信号赋值endprocess;endbeha;条件信号赋值语句格式:[标号]目的信号名<=表达式1when条件1else 表达式2when条件2else … 表达式n;当when后面的条件成立时,则对应表达式的值代入目的信号。例5.1:使用when_else语句设计二选一数据选择器。libraryIEEE;useIEEE.Std_logic_1164.all;entitymux21_2is port(i0,i1,sel:instd_logic;

y:outstd_logic);endmux21_2;architecturever1ofmux21_2isbegin

y<=i0whensel='0'else

i1whensel='1';endver1;选择信号赋值语句格式:[标号]with表达式select目的信号名<=表达式1when条件1,

表达式2when条件2,

表达式nwhen条件n;当when后面的条件成立时,则对应表达式的值代入目的信号。例5.2:使用with_select语句设计二选一数据选择器。libraryIEEE;useIEEE.Std_logic_1164.all;entitymux21_3is port(i0,i1,sel:instd_logic;

y:outstd_logic);endmux21_3;Architecturever1ofmux21_3isbeginwithselselect

y<=i0when'0',i1when'1','X'whenothers;--当条件不能全部列出时,必须使用该语句。endver1;例5.1和例5.2采用不同的语句描述,描述的是相同功能的电路,其仿真结果也是一样的。5.3.2process进程语句process语句格式: [进程标号:]process[(敏感信号表)] [进程说明部分]; begin [顺序语句]; endprocess[进程标号];敏感信号表:表中只要有一个信号发生变化,进程就会启动。进程说明部分:可以说明数据类型、子程序、枚举、变量等。进程语句使用:放在结构体begin后的并行语句,但是进程begin后的所有语句都是按顺序依次执行的。结构体中可以有多个进程:一个结构体中的多个process语句可以同时并发执行,进程之间的数据通信是通过信号传递实现的。例5.3:8D触发器设计libraryIEEE;useIEEE.std_logic_1164.all;entityd8_logicisport(clk:instd_logic;

d:instd_logic_vector(7downto0);

q:outstd_logic_vector(7downto0));endd8_logic;architecturebehaveofd8_logicis --实体d8_logic的结构体描述beginprocess(clk) --进程的敏感信号是时钟信号clkbeginif(clk'eventandclk='1')then --如果发生时钟的上升沿,执行q<=d操作

q<=d;endif;endprocess; --进程结束endbehave; --结构体结束5.3.3black块语句块语句格式: [块标号:]block [块头] [说明语句]; begin [并行语句]; endblock[块标号];块头:主要用于信号的映射及参数的定义,通常通过generic、generic_map、port和port_map语句实现。说明语句:与结构体的说明语句相同。块语句功能:块可以看作是结构体的子模块,或者看作系统的局部电路。例5.4:使用block语句设计的半加器和半减器。libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;例5.4:使用block语句设计的半加器和半减器。entityblock_exampleis port(a,b:instd_Logic;

carry,sum,borrow,difference:outstd_Logic);Endblock_example;architectureaofblock_exampleisbeginhalf_adder:block --半加器begin

sum<=axorb; carry<=aandb;endblockhalf_adder;half_Subtractor:block --半减器begin

difference<=axorb; borrow<=notaandb;

endblockhalf_subtractor;enda;注意:block_example实体的2输入4输出,对于该实体结构体中所有block块,这些信号都可用。5.3.4component元件例化语句元件语句:分为元件说明语句和元件例化语句,元件说明和元件例化语句的使用是构成层次化设计的重要途径。元件说明语句:将预先设计好的实体定义为一个底层元件。元件例化语句:将元件说明语句定义的元件与另一设计实体中的端口相连接,为该设计实体引入一个底层设计元件,从而形成层次化设计。元件语句格式分为两部分:元件说明语句格式和元件例化语句格式。元件说明语句格式: component元件名 [generic(类属表);] [port(信号表);] endcomponent;元件例化语句格式: [元件标号:]元件名portmap(信号映射);信号映射:分为位置映射和名称映射。位置映射:就是把实际信号与底层元件的信号书写位置一一对应,只写实际信号名称,不用写底层元件的信号名称。名称映射格式:形式参数=>实际参数。其中符号“=>”为关联运算符,形式参数指的是底层元件的信号名称,实际参数指的是调用底层元件的信号名称。例5.5:完成四位加法器的设计。采用方法如下:首先设计一位全加器fulladder,再利用component元件语句,调用全加器fulladder,构造四位加法器。全加器fulladder设计如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;entityfulladderis port(a,b,c:instd_logic;

carry,sum:outstd_logic);

endfulladder;architectureaoffulladderisbegin

sum<=axorbxorc;carry<=(aandb)or(aandc)or(bandc);enda;程序说明:fulladder实体是一位全加器,输入信号a,b和c,进位输出carry以及和输出sum,信号顺序为a,b,c,carry,sum。由全加器构成四位加法器的框图如图所示,四位加法器b4_adder程序如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;entityb4_adderisport(a,b:instd_logic_vector(3downto0);

s:outstd_logic_vector(3downto0));endb4_adder;architectureaofb4_adderissignalc:std_logic_vector(4downto0);componentfullAdder --元件说明语句,形成底层元件port(a,b,c:instd_logic;carry,sum:outstd_logic);endcomponent;beginu0:fulladderportmap(a(0),b(0),c(0),c(1),s(0));--元件例化语句,调用底层元件u1:fulladderportmap(a(1),b(1),c(1),c(2),s(1));--采用位置映射,建立调用关联关系u2:fulladderportmap(a(2),b(2),c(2),c(3),s(2));

u3:fulladderportmap(a(3),b(3),c(3),c(4),s(3));

c(0)<='0';Enda;注意:两段程序fulladder和b4_adder应当放在同一个目录下,进行调用和管理。5.3.5generate生成语句生成语句应用范围:有些实际电路往往会由许多重复的基本结构组成,生成语句可以简化这类电路的VHDL描述。生成语句有两种格式: 标号:for变量in不连续区域generate [并行语句]; endgenerate[标号];或者: 标号:if条件generate [并行语句]; endgenerate[标号];例5.6:利用已有的D触发器构成4位移位寄存器,其组成框图如图所示。利用生成语句,循环调用D触发器构成4位移位寄存器。例5.6:利用生成语句,循环调用已有的D触发器构成4位移位寄存器。entityshiftis port(sin,clk:inbit;sout:outbit);endshift;architecturenetlist1ofshiftiscomponentdff --元件说明,准备调用D触发器 port(d,clk:inbit;q:outbit);endcomponent;signalz:bit_vector(0to4); --中间信号的定义beginz(0)<=sin;gf:foriin0to3generate --生成语句,重复调用4次u1:dffportmap(z(i),clk,z(i+1)); --元件例化,重复调用D触发器endgenerate;sout<=z(4);endnetlist1;注意:移位寄存器的输入信号和输出信号的连接无法用for_generate语句实现,只有用信号赋值语句完成,在程序中用红色标出。5.4VHDL顺序语句顺序语句:按照语句出现的先后顺序执行,顺序语句只能出现在进程或子程序中。常用顺序语句:信号赋值语句、变量赋值语句、if语句、case语句、loop语句、next语句、exit语句、return语句、null语句、wait语句等。信号赋值语句:既可用作并行语句,也可作顺序语句使用。信号赋值语句出现在进程、过程和函数之外时,为并行语句,否则为顺序语句。信号赋值语句的格式及其使用已经在并行语句中介绍,这里不再重复介绍。5.4.1变量赋值语句

变量赋值语句:变量的说明和赋值只能在进程、函数和过程中。变量赋值语句格式: 目的变量:=表达式;变量赋值语句含义:将表达式的值代入目的变量中,两者的类型应保持一致。使用变量赋值语句注意:变量类似于一般高级语言的局部变量,只在局部范围内使用。VHDL中的变量只在进程或子程序内部使用,变量值无法传递到进程和子程序的外部。5.4.2if语句

if语句:根据所指定的条件来确定执行哪些语句,因此if语句可以实现多选择控制。if语句格式: if条件then 顺序语句; {elsif条件then 顺序语句;} [else 顺序语句]; endif;if语句中条件:为布尔表达式,如果满足条件,则执行关键词then后面的顺序语句;如果所有条件都不满足,则执行else后面的顺序语句,endif结束操作。例5.7:用if语句设计四选一数据选择器。libraryieee;useieee.std_logic_1164.all;entitymux41isport(d0,d1,d2,d3:instd_logic;s:instd_logic_vector(1downto0);

x:outstd_logic);endmux41;architecturearchmuxofmux41isbeginprocess(s,d0,d1,d2,d3)begin ifs="00"thenx<=d0; elsifs="01"thenx<=d1; elsifs="10"thenx<=d2; elsex<=d3; end

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论