《数字电子技术基础 第10章.ppt》由会员分享,可在线阅读,更多相关《数字电子技术基础 第10章.ppt(189页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第10章VHDL硬件描述语言简介 第10章VHDL硬件描述语言简介 10.1概述概述 10.2VHDL程序的基本结构程序的基本结构 10.3VHDL的基本语法的基本语法 10.4VHDL的主要描述语句的主要描述语句 10.5有限状态机的设计有限状态机的设计 10.6VHDL语言描述实例语言描述实例 第10章VHDL硬件描述语言简介 10.1概述概述VHDL的全称是VHSICHDL(VeryHighSpeedIntegratedCircuitsHardwareDescriptionLanguage),即超高速集成电路硬件描述语言,它是美国国防部在20世纪80年代初期提出的超高速集成电路研究计划的
2、产物。当时为了降低电子新产品的开发费用,需要一种功能强大、定义严格、可读性好的硬件描述语言作为描述手段,而且希望将所有电子电路的设计意义甚至政府的订货合同都用它来描述,以避免对其做出二义性的解释,因此将这种硬件描述语言称为VHDL。第10章VHDL硬件描述语言简介 1983年7月,Intermetrics公司、IBM公司、TexasInstruments公司联合组成开发小组,开始提出VHDL,并提出软件环境。1987年,VHDL被IEEE和美国国防部确认为标准硬件描述语言,即IEEE-1076,一般称为VHDL87版本。1993年进一步修订后,形成了IEEE标准的1076-1993版本。目前,
3、VHDL语言还被确认为美国国防部MIL-STD-454L标准,为美国国防部的工程计划进行的ASIC设计都必须用VHDL来制作文档。第10章VHDL硬件描述语言简介 VHDL是一种强类型语言,具有丰富的表达能力,能够在各种抽象级别上描述各种复杂的网络,如系统级、印制板级、芯片级、门电路级。VHDL的主要优点如下:(1)覆盖面广,描述能力强,是一种多层次的硬件描述语言。设计者的原始描述可以是非常简练的行为描述,经过层层细化求精,最终成为电路级描述或版图参数描述,整个过程都可以在VHDL的环境下进行。第10章VHDL硬件描述语言简介(2)设计方法灵活。VHDL支持各种模式的设计方法,如自顶向下和自底
4、向上或层次化的设计。VHDL语言具有很强的电路描述和建模功能,它可以采用多种不同的方式和从多个层次对电路进行描述,因而简化了硬件设计工作,提高了设计效率。(3)模型可共享。VHDL语言已经成为一种通用的工业标准,可以在不同的设计环境和系统平台中使用,设计结果便于共享和复用。(4)设计生命周期长。VHDL的硬件描述与工艺无关,因此可以脱离工艺与器件结构进行设计,同时也不会因为工艺的改变而使描述过时。第10章VHDL硬件描述语言简介 10.2VHDL程序的基本结构程序的基本结构一个完整的VHDL语言程序通常包含设计实体(entity)、结构体(architecture)、配置(configurat
5、ion)、库(library)和程序包(package)五个部分。VHDL把一个电路模块看做一个单元,对任何一个单元的描述包括接口描述和内部特性描述两个部分。接口描述称为设计实体,它提供该单元的公共信息,例如名称、端口等;内部特性描述称为结构体,它定义单元的内部操作特性。例如,一个半加器可以描述如下:第10章VHDL硬件描述语言简介 第10章VHDL硬件描述语言简介 上面这段描述中(黑体字为关键字),前面三行是库和程序包的调用。实体包含在entityhalfadder和endhalfadder之间,halfadder是实体名。实体描述的是端口信号,即输入输出引脚,其中a、b是输入端口,sum、
6、carry是输出端口。结构体包含在architecturebehavior和endbehavior之间,它描述了该单元的操作行为。behavior是结构体名,该结构体描述中“=”是信号赋值。在VHDL中,一个单元只有一个设计实体,而结构体的个数可以不限,一个设计实体和某一特定的结构体合起来共同定义一个单元。第10章VHDL硬件描述语言简介 10.2.1实体实体实体(entity)用来描述设计单元的名称和端口信息,其一般语句格式如下:entity实体名is类属参数说明端口说明end实体名;第10章VHDL硬件描述语言简介 1实体名实体名实体名称的命名由设计者自定,一般根据相应电路的功能来确定。但
7、是应注意,实体名不能以数字开头,也不能用EDA工具库中已定义好的元件名作为实体名。第10章VHDL硬件描述语言简介 2类属参数类属参数类属参数(generic)说明必须放在端口说明之前,用于指定参数的大小、实体中子元件的数目及实体的定时特性等。例如,一个2选1数据选择器的端口描述如下:entitymuxisgeneric(m:time:=1ns);port(d0,d1,sel:instd-logic;q:outstdlogic);endmux;其中,generic引导的是类属参数说明语句,它定义了延时时间为1ns。第10章VHDL硬件描述语言简介 3端口端口端口(port)说明是对设计实体与外
8、部接口的描述,即说明外部引脚信号的名称,数据类型和输入、输出方向,一般格式如下:port(端口名:方向数据类型名;端口名:方向数据类型名);(1)端口名是赋予每个外部引脚的名称,通常用一个或几个英文字母或英文字母加数字命名。(2)端口方向用来定义外部引脚的信号方向是输入还是输出。端口模式共有4种:in(输入模式)、out(输出模式,不能用于内部反馈)、inout(双向模式,输入、输出)、buffer(缓冲模式,允许用于内部反馈)。第10章VHDL硬件描述语言简介 10.2.2结构体结构体结构体(architecture)用于描述实体的具体行为与功能,一定要跟在设计实体的后面。结构体的一般语句格
9、式如下:architecture结构体名of实体名is定义语句begin并行处理语句end结构体名;第10章VHDL硬件描述语言简介 1结构体名结构体名结构体名是对本结构体的命名,它是该结构体的唯一名称。of后面紧跟的实体,表明该结构体所对应的是哪一个设计实体。第10章VHDL硬件描述语言简介 2结构体说明结构体说明结构体的定义语句位于architecture和begin之间,用于对结构体内部所使用的信号、常数、数据类型、函数等进行定义。信号定义和端口说明一样,应有信号名和数据类型,因为它是内部使用,所以不需要有方向的说明。并行处理语句位于begin和end之间,具体描述了结构体的行为及其连接
10、关系。在结构体中的语句都是可以并行执行的,语句不以书写的语句顺序为执行顺序。第10章VHDL硬件描述语言简介 3.结构体的描述方法结构体的描述方法VHDL的结构体用于描述设计实体的行为与功能,它可以用不同的描述方法和语句类型来表达。描述方法也称为描述风格,通常有以下三种:1)行为描述行为描述主要使用函数、过程和进程语句,以算法形式描述数据的变换和传送,它反映一个设计的功能行为与算法。第10章VHDL硬件描述语言简介 2)数据流描述数据流描述主要使用并行的信号赋值语句,既显式地表达了该设计单元的行为,也隐式地表达了该设计单元的结构,它反映了设计中数据从输入到输出的流向。3)结构描述结构描述主要使
11、用元件例化语句和配置指定语句描述元件的类型和元件互连关系,它反映了一个设计方案的硬件结构特征。第10章VHDL硬件描述语言简介 10.2.3库和程序包库和程序包库(library)主要用来存放已经编译的实体、结构体、程序包和配置。1库的种类VHDL常用的库有IEEE库、STD库、WORK库和用户自定义的库。这几类库中除了WORK库和STD库外,其他两类库在使用时都需要进行库的说明。1)IEEE库IEEE库是目前使用最为广泛的资源库,它主要包含IEEE标准的程序包和其他一些支持工业标准的程序包。程序包std-logic-1164是设计人员最常使用和最重要的程序包,它主要定义了一些常用的数据类型和
12、函数。第10章VHDL硬件描述语言简介 2)STD库在VHDL的设计库中,STD库包含程序包stand ard和程序包textio。程序包stand ard中定义了位、位矢量、字符和时间等数据类型,程序包textio主要包含了对文本文件进行读/写操作的过程和函数。STD库中,由于程序包stand ard符合VHDL的标准,因此使用这个程序包时不需要在程序的开始部分进行说明,而使用程序包textio时必须在程序的开始部分进行程序包的说明。通常使用程序包textio的说明语句如下:LIBRARYSTD;USESTD.textio.ALL;第10章VHDL硬件描述语言简介 3)WORK库EDA工具在
13、编译一个VHDL程序时,默认保存在WORK库中。WORK库可以用来临时保存以前编译过的元件和模块。这样,如果需要引用以前编译过的元件和模块,则设计人员只需要引用该库。虽然WORK库是一种设计库,但是如果需要引用该库中用户自己定义的例化元件和模块,那么这时就需要对WORK库进行说明。第10章VHDL硬件描述语言简介 4)用户自定义的库VHDL具有很高的灵活性,设计人员可以自己定义一些单元。对于库也不例外,设计人员可以将设计开发所需要的公用程序包、设计实体等汇集在一起定义成一个库,这就是用户自定义的库。由于用户自定义的库是一种资源库,因此使用时需要在程序开始部分对库进行说明。第10章VHDL硬件描
14、述语言简介 2程序包程序包程序包(package)是多个设计体可共享的设计单元,包内主要用来存放信号说明、常量定义、数据类型、子程序说明、属性说明和元件说明等。程序包由程序包说明和程序包体组成。程序包说明的一般形式如下:package程序包名is说明部分;end程序包名;包体的一般形式如下:packagebody程序包名is说明部分;end程序包名;第10章VHDL硬件描述语言简介 常用的预定义程序包有以下3种:(1)std-logic-1164程序包。它是IEEE库中最常用的程序包,是IEEE的标准程序包。该程序包中用得最多的是定义了满足工业标准的两个数据类型std-logic和std-lo
15、gic-vector。(2)std-logic-arith程序包。(3)std-logic-unsigned和std-logic-signed程序包。它们都是synopsys公司的程序包,都预先编译在IEEE库中。第10章VHDL硬件描述语言简介 3库和程序包的调用库和程序包的调用库的说明语句应放在实体单元前面,库语言一般必须与use语句同用。库语言的关键词library指明所使用的库名,use语句指明库中的程序包。例如,常见的库的说明语句格式如下:libraryieee;useieee.std-logic-1164.alluseieee.std-logic-unsigned.all以上三条语
16、句中,第一条表示打开IEEE库,第二条表示允许使用std-logic-1164程序包中的所有内容,第三条表示允许使用std-logic-unsigned程序包中的所有内容。第10章VHDL硬件描述语言简介 10.2.4配置配置一个实体可以对应多个结构体,每个结构体代表硬件的某一方面特性,如行为特性或结构特性。当一个实体具有多个结构体时,可以使用配置(configuration)语句为实体选定某个结构体,以得到性能最佳的设计。需要说明的是,配置语句主要用于为顶层设计实体指定结构体。当实体只有一个结构体时,程序中不需要配置语句。第10章VHDL硬件描述语言简介 配置语句的一般格式如下:config
17、urationconf1offulladderisforbehaviorendfor;endconf1;它选择设计实体fulladder的结构体behavior与其相对应。第10章VHDL硬件描述语言简介 10.3VHDL的基本语法的基本语法10.3.1数据对象数据对象VHDL的数据对象主要有信号、变量和常量三种类型。1信号(信号(signal)信号代表电路内部各元件间的连接线,可以在程序包、实体和结构体中说明。信号说明语句的格式如下:signal信号名:信号类型:=初始值;第10章VHDL硬件描述语言简介 例如:signala:std-logic:=0;定义标准逻辑信号a,初始值为低电平si
18、gnalb:std-logic-vector(3downto0);定义标准逻辑矢量信号b,共有4位signalq:integerrange0to10;定义整型信号q,变化范围是010信号赋值语句的格式如下:信号名=表达式;第10章VHDL硬件描述语言简介 2变量(变量(variable)变量是局部量,通常用来暂存某些数据,变量只能在进程语句和子程序中使用,其说明语句的格式为:variable变量名:数据类型:=初始值;例如:variablea,b:bit;定义变量a、b是位型变量variabley:integerrange0to3;定义y是整型变量,变化范围是03variablec:std-l
19、ogic-vector(3downto0);定义c是标准逻辑矢量,共有4位(习惯上高位在左边,低位在右边)变量赋值语句的格式如下:变量名:=表达式;第10章VHDL硬件描述语言简介 变量赋值符号为“:=”。使用变量赋值语句时,要保证赋值符号两边的数据类型一致。此外,还应注意变量与信号在定义和使用上的区别,即(1)定义的位置不同。(2)赋值的符号不同。(3)附加延时不同,变量赋值是立即生效的,没有延时。信号相当于元件间的连线,因此仿真时其赋值必须经一段时间的延迟后才能生效。第10章VHDL硬件描述语言简介 3常量(常量(constant)常量是固定不变的值,可以在程序包、实体、结构体和进程中定义
20、。其语句的说明格式如下:constant常量名:类型名:=取值;例如:constantcount-model:integer:=8;定义count-model是整型常量,值为8constantdelay:time:=25ns;定义delay是时间型常量,延迟时间为25ns 第10章VHDL硬件描述语言简介 10.3.2数据类型数据类型1标准的数据类型标准的数据类型表表10.3.1标准的数据类型标准的数据类型 第10章VHDL硬件描述语言简介 IEEE库的std-logic-1164程序包中还定义了两种应用十分广泛的数据类型:(1)std-logic:工业标准逻辑型,有0、1、X(未知)、Z(高
21、阻)等9种取值。(2)std-logic-vector:标准逻辑矢量型,是多个std-logic型数据的组合。VHDL的STD库中定义的数据类型可以直接使用,不需要事先说明,而IEEE库中定义的数据类型在使用前必须在程序开始处用库调用语句加以说明。第10章VHDL硬件描述语言简介 2用户自定义的数据类型用户自定义的数据类型除了使用标准数据类型外,用户可自己建立新的数据类型及子类型。新构造的数据类型通常在程序包中说明,其一般形式如下:type数据类型名is数据类型定义;例如:typedigitisintegerrange0to7;定义digit的数据类型是07的整数常用的几种用户自定义的数据类型
22、有:枚举(enumerated)类型、整数(integer)类型、实数(real)类型、数组(array)类型、物理类型、记录(record)类型等。第10章VHDL硬件描述语言简介 1)枚举类型枚举类型的定义格式如下:type数据类型名is(元素1,元素2,元素n);例如:type WEEK is(SUN,MON,TUE,WED,THU,FRI,SAT);这类用户定义的数据类型应用相当广泛。例如,在IEEE库的包集合std-logic和std-logic-1164中都有此数据类型的定义,如:typestd-logicis(U,X,1,0,Z,W,L,H,-);std-logic数据类型具有9
23、种不同的值:“U”(初始值)、“X”(不定值)、“1”(逻辑1)、“0”(逻辑0)、“Z”(高阻)、“W”(弱信号不定)、“L”(弱信号0)、“H”(弱信号1)、“-”(不可能情况)。第10章VHDL硬件描述语言简介 2)整数类型、实数类型整数类型和实数类型在VHDL标准数据类型中已经存在,所谓的用户自定义整数、实数数据类型实际上是整数或者实数的一个子集。例如:type digit is integer range 0 to 9;type current is real range1E4 to 1E4;第10章VHDL硬件描述语言简介 3)数组类型数组是将相同类型的数据集合在一起形成的一个新的
24、复合数据类型。它可以是一维的,也可以是二维或多维的。数组定义的格式如下:type数据类型名isarray范围of原数据类型名;例如:type word is array(1 to 8)of std-logic;第10章VHDL硬件描述语言简介 数组常在总线定义以及ROM、RAM等的系统模型中使用。包集合std-logic和std-logic-1164中的std-logic-vector类型也属于数组数据类型,定义如下:type std-logic-vector is array(natural range)of std-logic;这里范围由range指定,表示一个没有范围限制的数组。在这种情
25、况下,范围由信号说明语句等确定。例如:signal a:std-logic-vector(3downto0);在函数和过程语句中,若使用无限制范围的数组,则其范围一般由调用者所传递的参数来确定。多维数组需要用两个以上的范围来描述,而且多维数组不能生成逻辑电路,因此只能用于生成仿真图形及硬件的抽象模型。第10章VHDL硬件描述语言简介 4)物理类型物理类型的格式如下:type数据类型名is范围units基本单位;单位条目;endunits;物理类型可以对时间、容量、阻抗等进行定义。第10章VHDL硬件描述语言简介 5)记录类型数组是同一类型数据集合起来形成的,而记录则是将不同类型的数据和数据名组
26、织在一起而形成的新类型,定义格式如下:type数据类型名isrecord元素名:数据类型名;元素名:数据类型名;endrecord;在从记录数据类型中提取元素数据类型时应用“”。记录数据类型比较适合于系统仿真,在生成逻辑电路时应将它分解开来。第10章VHDL硬件描述语言简介 10.3.3运算操作符运算操作符VHDL语言为构造计算数值的表达式提供了许多预定义运算符,共有4种类型:逻辑运算符、关系运算符、算术运算符和并置(连接)运算符。操作数的类型应与运算符所要求的类型相一致。另外,运算符是有优先级的。各种运算操作符如表10.3.2所示,其运算优先级由上至下变低。第10章VHDL硬件描述语言简介
27、表表10.3.2VHDL运算操作符运算操作符 第10章VHDL硬件描述语言简介(1)逻辑运算符可以对std-logic、bit、std-logic-vector、bit-vector、boolean等类型的数据进行运算,运算符两边的数据类型必须相同。当一个语句中存在两个以上的逻辑表达式时,VHDL规定左右没有优先级差别。因此需要借助括号规定运算的顺序,当一个逻辑表达式中只有and、or或xor运算符时,括号可以省略。在所有逻辑运算符中,not的优先级最高。(2)并置运算符“&”用于将位或一维数组组合起来形成新的位矢量或数组。例如,“1101”&“0011”的结果是“11010011”。第10章
28、VHDL硬件描述语言简介(3)算术运算符中只有加、减、乘运算符在VHDL综合时才生成逻辑电路,对于数据位较长的数据应慎重使用乘法运算,以免综合时电路规模过于庞大。(4)关系运算符的作用是将相同数据类型的数据对象进行比较或关系排序判断,并将结果以布尔类型的数据表示出来。在进行关系运算时,左右两边的操作数的数据类型必须相同,但是位长不一定相同。在利用关系运算符对位矢量数据进行比较时,比较过程从最左边的位开始,自左向右按位进行。应注意,在关系运算符中,“=”运算符除了表示小于等于外,也用于表示赋值操作。第10章VHDL硬件描述语言简介 10.4VHDL的主要描述语句的主要描述语句10.4.1顺序描述
29、语句顺序描述语句顺序描述语句只能出现在进程或子程序中,它定义进程或子程序所执行的算法。顺序描述语句按这些语句在进程或子程序中出现的顺序执行,这一点与高级语言类似。基本操作可以是信号和变量的赋值、算术运算、逻辑运算、子程序的调用等。VHDL中常用的顺序描述语句包括:信号和变量赋值、if、case、wait、loop、next、exit、断言语句、过程调用语句、空语句等。下面介绍主要的几种顺序描述语句。第10章VHDL硬件描述语言简介 1信号和变量的赋值信号和变量的赋值1)信号的赋值信号赋值语句的格式如下:目的信号量=表达式;上述语句将右边表达式的值赋予左边的信号量。表达式可以使用VHDL预定义运
30、算符,也可以使用VHDL标准库提供的函数,或自定义的函数。例如:f=1;q=010010;a=b;s=axorb;x=y+z;i=to-integer(v);第10章VHDL硬件描述语言简介 2)变量的赋值变量赋值语句的格式如下:目的变量:=表达式;变量赋值的符号与信号赋值的符号不同,表达式与信号赋值的表达式写法是完全一样的。变量与信号有明显的区别:变量只在定义它的进程和子程序内有效,无法传递到进程之外,而信号在定义它的结构体内有效;赋给变量的值立即成为当前值,而赋给信号的值必须在进程结束后才能成为当前值。第10章VHDL硬件描述语言简介 2if语句语句if语句用来判定所给定的条件是否满足,并
31、根据判定的结果(真或假)决定执行的操作。if语句的条件是一个条件表达式,只能使用关系运算符及逻辑运算符组成的表达式。1)门闩控制语句当if语句在条件为假时并不需要执行任何操作,那么,if语句可以简化成门闩控制语句,格式如下:if 条件then顺序描述语句;end if;第10章VHDL硬件描述语言简介 2)二选一控制语句二选一控制语句的基本格式如下:if条件then顺序描述语句;else顺序描述语句;end if;第10章VHDL硬件描述语言简介 当if语句的条件为“真”时,执行then和else之间的顺序描述语句;当if语句的条件为“假”时,执行else和endif之间的顺序描述语句。例如:
32、entitymux2isport(a,b:instd-logic;s:instd-logic;f:outstd-logic);endmux2;architecturebehaviorofmux2isbegin 第10章VHDL硬件描述语言简介 process(a,b,s)beginif(s=0)thenf=a;else f顺序描述语句;when条件表达式2=顺序描述语句;whenendcase;第10章VHDL硬件描述语言简介 上述case语句中的条件表达式可以是如下的四种格式之一:when值=when值1|值2|值3|值n=when值1to值2=whenothers=第10章VHDL硬件描述
33、语言简介 上述语句分别表示条件表达式的值是某个确定的值,多个值中的一个,一个取值范围中的一个,其他所有的缺省值。当case和is之间的表达式取值满足某一个条件表达式的值时,程序将执行后面的由符号=所指的顺序描述语句。case语句的各个条件表达式之间没有优先级,所以,给定的条件表达式不能有重叠,否则将无法确定执行哪一个分支。如果没有列举出case和is之间的表达式的全部取值,则whenothers=必不可少。第10章VHDL硬件描述语言简介 4wait语句语句进程的状态还可以通过wait语句来控制。当进程执行到wait语句时,将被挂起,并设置好再次执行的条件,可以是无限等待(wait)或有限等待
34、。有限等待的条件可以是:等待某些信号发生变化(waiton),等待某个条件满足(waituntil),等待一段时间(waitfor)。这几个条件还可以组合成一个复合条件。第10章VHDL硬件描述语言简介 1)waiton语句waiton语句的格式如下:waiton信号列表;信号列表可以包括一个或多个信号。信号列表中的任何一个信号的值发生变化,进程将结束挂起状态,进入执行状态,执行waiton语句后面的语句。例如:waitona,b,s;上述语句等待信号a、b、s中的任何一个发生变化。第10章VHDL硬件描述语言简介 waiton语句可以使进程挂起,然后又使它重新执行,其条件是信号列表中任何一个
35、信号的值发生变化。该语句的作用与进程的敏感信号列表非常类似。例如:mux2:process()beginif(s=0)then f=a;elsef=b;end if;wait ona,b,s;end process;mux2:process(a,b,s)begin if(s=0)thenf=a;elsef=b;endif;endprocess;第10章VHDL硬件描述语言简介 上面两个例子是完全等价的。由此可以看出,控制进程执行还是挂起的敏感信号列表,可以写在进程开始的process语句中,也可以写在进程结尾的waiton语句中,两种描述是等价的。必须注意的是,如果process语句已经有敏感
36、信号列表,那么在进程中不能再使用waiton语句。虽然,waiton语句可以出现在进程中的任何位置,但在不同位置它的作用略有不同。waiton语句只有出现在进程结束时,才是与进程敏感信号列表等价的。若出现在进程中间,则相当于改变了进程中语句的顺序。第10章VHDL硬件描述语言简介 2)waituntil语句waituntil语句的格式如下:waituntil布尔表达式;当wait等待的布尔表达式为“真”时,进程将结束挂起状态,进入执行状态,执行waituntil语句的后继语句。例如:waituntila=1;第10章VHDL硬件描述语言简介 3)wait for语句wait for语句的格式如
37、下:wait for时间表达式;时间表达式可以是一个具体时间(如30ns)或一个时间量的算术表达式(如t1+t2,2*t1+t2等)。当进程执行到waitfor语句时,进程将进入挂起状态,直到时间表达式指定的时间到,进程将结束挂起状态,进入执行状态,执行waitfor语句的后继语句。例如:wait for 30 ns;wait for a*t1+t2;第10章VHDL硬件描述语言简介 上面的第一个wait for语句中,30ns是一个时间常量。第二个wait for语句中,a*t1+t2是一个时间表达式,wait for语句在等待时要对该时间表达式进行一次计算。当a=3,t1=20ns,t2=
38、50ns时,它相当于wait for 110 ns。必须注意:waitfor语句不是可综合语句,它只能在仿真时使用。第10章VHDL硬件描述语言简介 4)复合wait语句wait语句可以同时使用多个等待条件,构成一条复合wait语句。例如:waitonclkuntilclk=1;该语句等待clk信号的值发生变化,而且clk的值为1(即clk从0变到1)时,进程将结束挂起状态,进入执行状态,执行该语句的后继语句。第10章VHDL硬件描述语言简介 5loop语句语句循环控制语句loop可以用来描述process的循环结构,对应于电路的位片逻辑、迭代电路等,可以是for循环或while循环。1)fo
39、r循环语句for循环结构的loop语句的描述格式如下:标号:for循环变量in离散范围loop顺序描述语句endloop标号;第10章VHDL硬件描述语言简介 这里,标号是可以省略的;循环变量是整数型变量,它不需要在结构体或进程中定义,在循环体(由顺序描述语句构成)中不能通过信号或变量给循环变量赋值;离散范围是循环变量的取值范围,它决定了循环的次数;loop语句针对循环变量的每一个取值,执行一遍循环体的所有顺序描述语句。例如:entityparitychecker isport(data:instdlogicvector(7downto 0);p:outstdlogic);endparityc
40、hecker;architecturebehavior ofparitychecker isbegin第10章VHDL硬件描述语言简介 paritychecker:process(data)variabletmp:stdlogic;begintmp:=0;for I in 7 downto 0 looptmp:=tmp xor data(i);end loop;p=tmp;endprocess;endbehavior;第10章VHDL硬件描述语言简介 上面的例子描述了一个偶校验的电路(只要把tmp的初值改成“1”,就可以实现奇校验)。在这个例子中,大家要特别注意变量tmp的作用。这里只能用变量
41、,不能用信号。因为信号的赋值要到process结束才能生效,不能实现校验的功能。变量只能在本进程内有效,要实现输出还必须将它赋值给一个信号(本例中是p=tmp)。第10章VHDL硬件描述语言简介 2)while循环语句while循环的loop语句的格式如下:标号:while条件loop顺序描述语句;end标号;这里,当条件为“真”时,执行循环体中的语句;当条件为“假”时,结束循环。第10章VHDL硬件描述语言简介 6next语句和语句和exit语句语句1)next语句next语句用于从循环体跳出本次循环,格式如下:next标号when条件;执行到该语句时,如果条件为“真”,则结束本次循环,跳到
42、“标号”规定的语句,开始下一次循环。如果标号省略,则表示跳到loop循环的起始位置,开始下一次循环。如果“when条件”省略,则执行到next语句时无条件结束本次循环。从功能上来看,next语句用于loop循环内的执行控制。第10章VHDL硬件描述语言简介 2)exit语句exit语句用于结束本循环loop语句,格式如下:exit标号when条件;执行到该语句时,如果条件为“真”,则结束本循环语句,跳到“标号”规定的语句,继续向下执行。如果标号省略,则表示跳到loop循环的后继语句,即endloop下面的语句。如果“when条件”省略,则执行到exit语句时无条件结束循环。要注意exit语句与
43、next语句的区别:next只结束本次循环,开始下一次循环,而exit语句结束整个循环,跳出循环状态。第10章VHDL硬件描述语言简介 10.4.2并行描述语句并行描述语句1.进程进程process语句语句所有的顺序描述语句都只能在进程中使用。进程内是顺序执行,进程与进程之间是并发的,有点类似于计算机操作系统中“进程”的概念。1)process语句的格式process语句的格式如下:进程名:process(进程敏感信号列表)begin顺序描述语句;end process 第10章VHDL硬件描述语言简介 process语句从process开始,到endprocess结束,进程名可以省略。例如:
44、entitymux2is port(a,b:instdlogic;s:instdlogic;f:outstdlogic);endmux2;architecturebehaviorofmux2isbegin mux2:process(a,b,s)beginif(s=0)thenf=a;elsef=b;endif;endprocess;endbehavior;第10章VHDL硬件描述语言简介 上例中,mux2是进程名,(a,b,s)是敏感信号列表,它的作用将在后面说明。在VHDL中,任何功能相对独立的电路模块都可以用一个process描述(如上例中的进程描述了一个二选一模块),若干个process
45、构成一个更复杂的模块。进程内的顺序描述语句可以是顺序结构、选择结构(分支结构)、循环结构。第10章VHDL硬件描述语言简介 2)process的启动和敏感信号列表进程在仿真运行中总是处于两个状态之一:执行或挂起。初始启动时,进程处于执行状态,进程中的语句从前向后逐句执行一遍。在最后一条语句执行完后,返回到进程开始的process语句,进程处于挂起状态。此时,只要该进程的敏感信号列表中任何一个信号发生变化,进程就再次处于执行状态。然后,再挂起,再执行,一直循环下去,直到仿真结束。第10章VHDL硬件描述语言简介 敏感信号列表对于进程至关重要。一般来说,如果描述的是组合电路模块,那么敏感信号列表必
46、须包括所有的输入信号,否则在综合时会出错,在仿真时将导致一个错误的结果。如果描述的是时序电路模块,那么敏感信号列表只需要包括时钟信号和异步清零/置位信号。因为触发器的输出只在时钟上升/下降沿改变。在一个结构体(architecture)里可以有多个process语句,这些process之间可以通过一些信号相互联系。在一个process的执行中,某个信号的值发生改变会导致另一个(或几个)进程重新执行,如此构成所有进程反复执行。第10章VHDL硬件描述语言简介 2并行信号赋值语句并行信号赋值语句1)简单信号赋值语句格式如下:赋值目标=表达式;例如:q=borc;第10章VHDL硬件描述语言简介 2
47、)条件信号赋值语句格式如下:赋值目标=表达式when赋值条件else 表达式;例如,条件信号赋值语句的用法如下:architectureoneofmax41aisbegin y=awhenq=00elsebwhenq=01elsecwhenq=10elsed;endone;第10章VHDL硬件描述语言简介 3)选择信号赋值语句格式如下:with选择表达式select赋值目标=表达式when选择值,表达式when选择值;第10章VHDL硬件描述语言简介 例如,选择信号赋值语句的用法如下:architectureoneofmax41aisbeginwithqselect y连接实体端口 第10章V
48、HDL硬件描述语言简介 接口格式有如下三种:(1)名字关联方式:保留关联符号=。这是例化元件端口名与连接实体端口名的关联方式,其在PORTMAP中的位置是任意的。(2)位置关联方式:省去例化元件端口=部分,在PORTMAP中只列出当前系统中的连接实体端口名即可,但要求连接实体端口名与例化元件端口定义中的端口名一一对应。(3)混合关联方式:上述两种关联方式同时并存。第10章VHDL硬件描述语言简介 10.5有限状态机的设计有限状态机的设计1有限状态机的分类有限状态机的分类根据输出与输入之间的关系,有限状态机可以分为两种类型:Moore型和Mealy型。这两种状态机的主要区别在于:Mealy型状态
49、机的输出由状态机的输入和状态机的状态共同决定;Moore型状态机的输出仅与状态机的状态有关,而与状态机的输入无关。第10章VHDL硬件描述语言简介 2有限状态机的描述方法有限状态机的描述方法有限状态机的描述由下面几部分组成。1)状态机的状态定义有限状态机通常用枚举类型数据进行状态定义。2)状态机的次态逻辑、输出逻辑和状态寄存器描述状态机的次态逻辑、输出逻辑和状态寄存器一般用并行信号赋值语句、if语句和case语句进行描述。第10章VHDL硬件描述语言简介 表表10.5.1有限状态机的描述风格有限状态机的描述风格 第10章VHDL硬件描述语言简介 3.有限状态机的描述举例有限状态机的描述举例1)
50、Moore型状态机本例将介绍一个基本的Moore型有限状态机。以下是状态表(见表10.5.2)和状态图(见图10.5.1)以及实现此有限状态机的VHDL代码。注意,本例中状态机的描述主要由两个进程(process)组成:其中一个描述状态转移,另一个说明处于每一状态下电路表现的功能(此部分为组合逻辑电路)。第10章VHDL硬件描述语言简介 表表10.5.2Moore型状态机的状态表型状态机的状态表 第10章VHDL硬件描述语言简介 图10.5.1 Moore型状态机的状态图第10章VHDL硬件描述语言简介 第10章VHDL硬件描述语言简介 第10章VHDL硬件描述语言简介 else next_s