VHDL设计进阶.ppt_第1页
VHDL设计进阶.ppt_第2页
VHDL设计进阶.ppt_第3页
VHDL设计进阶.ppt_第4页
VHDL设计进阶.ppt_第5页
已阅读5页,还剩279页未读 继续免费阅读

下载本文档

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

文档简介

1、第5章,VHDL设计进阶,第5章VHDL设计进阶,5.1VHDL语言要素,5.2VHDL顺序语句,5.3VHDL并行语句,5.4子程序,5.5库、程序包及其配置,5.6VHDL描述风格,5.7常用单元的设计举例,5.8VHDL与原理图混合设计方式,5.1VHDL语言要素,5.1.1VHDL文字规则,5.1.2VHDL数据对象,5.1.3VHDL数据类型,5.1.4VHDL操作符,1.数字数字型文字可以有多种表达方式:可以是十进制数,也可以表示为二进制、八进制或十六进制等为基的数,可以是整数,也可以是含有小数点的浮点数。现举例如下。,5.1.1VHDL文字规则,(1)十进制整数表示法:如,在相邻

2、数字之间插入下划线,对十进制数值不产生影响,仅仅是为了提高文字的可读性。允许在数字之前冠以若干个0,但不允许在数字之间存在空格。,012578_456(=78456)2E6,(2)实数:实数必须带有小数点。如,12.00.03.146_741_113.66652.6E2,(3)以基表示的数:用这种方式表示的数由五个部分组成。,(a)用十进制数标明数制进位的基数;,(b)数制隔离符号“#”;,(c)表达的数,可以是整数,也可以是实数;,(d)指数隔离符号“#”;,(e)用字符加十进制表示的指数部分,这一部分的数如果为0可以省去不写。,对以基表示的数而言,相邻数字间插入下划线不影响数值。基的最小数

3、为2,最大数为16,以基表示的数中允许出现A至F的字母,大小写字母意义无区别。,2#1111_1110#8#376#16#FE#(等于254),016#F.01#E+2(等于3841.00)(15+16-2)*162,(4)物理量文字:VHDL综合器不接受此类文字。如,60s(秒)100m(米)177A(安培),2.字符和字符串,(1)字符是用单引号引起来的ASC字符,可以是数值,也可以是符号或字母,如,E,e,$,2,A,(2)字符串是一维的字符数组,需放在双引号中。有两种类型的字符串:文字字符串和数位字符串。,文字字符串是用双引号引起来的一串文字。如,“FALSE”,“X2”,“THISI

4、SEND”,数位字符串是被双引号引起来的数字序列,数字序列前冠以基数说明符。基数说明符有B、O、X,他们的含义如下。,B:二进制基数符号,表示二进制位0或1,在字符串中每一个位表示一个BIT。,O:八进制基数符号,在字符串中每一个数代表一个八进制数,即代表一个3位(BIT)的二进制数。,X:十六进制基数符号,代表一个十六进制数,即代表一个4位二进制数。,例如:B“1011_1111”位矢量长度为8O“152”位矢量长度为9X“F821”位矢量长度为16,3.标识符,标识符是最常用的操作符,可以是常数、变量、信号、端口、子程序或参数的名字。,VHDL标识符需遵守以下规则:,(1)必须以英文字母开

5、头,长度不能超过32个字符;,(2)英文字母、数字(09)和下划线都是有效的字符;,(3)标识符不区分大小写;,(4)必须是单一下划线“_”,且其前后都必须有英文字母或数字。,(5)允许包含图形符号(如回车键、换行符等),也允许包含空格符。,(6)VHDL的关键字不能用作标识符。,例:一些合法的标识符:,S_MACHINE,present_state,sig3,不合法的标识符:,present-state,3states,cons_,_now,VHDL的关键字:,afterallandarchitecturearrayassertthen,beginblockbodybufferbuscase

6、subtypeunits,componentconfigurationconstantdowntouseuntil,elseelsifendentitygenericifintotype,inoutisLibraryloopmapnandvariablewhen,nextnororothersoutpackageslasllwhile,portprocedureprocessrangerecordwaitwith,registerreportreturnselectseveritysignalxorxnor,4.下标名及下标段名,下标名用于指示数组型变量或信号的某一元素。格式为:标识符(表达式

7、),下标段名用于指示数组型变量或信号的某一段元素。格式为:标识符(表达式1to(downto)表达式2),例:a(7),a(6)a(0),例:a(7downto0),a(7downto4),a(3to5),注意:(1)表达式所代表的值必须是数组下标范围中的一个值;,(2)如果表达式是一个可计算的值,则此操作数可很容易进行综合.如果是不可计算的,则只能在特定的情况下综合,且耗费资源较大.,5.1.2VHDL数据对象,VHDL语言中,数据对象主要包括以下三种:变量(VARIABLE)、常量(CONSTANT)、信号(SIGNAL)。,三种对象的物理含义:信号代表物理设计中的某一条硬件连接线;变量代

8、表暂存某些值的载体;常量代表数字电路中的电源、地等常数。,三种对象的特点及说明场合:信号:全局量,用于architecture、package、entity。变量:局部量,用于process、function、procedure。常量:全局量,可用于上面两种场合。,1.常量(CONSTANT)(常数),常量说明语句格式为:,例如:CONSTANTVcc:REAL:=5.0;,CONSTANTFbus:BIT_VECTOR:=“1011”;,CONSTANTwidth:integer:=8;,CONSTANT常数名:数据类型:=表达式;,CONSTANTDelay:TIME:=10ns;,注意:

9、,(1)只能在常量声明中修改常量。,(2)常量必须在程序包、实体、结构体、块、子程序或进程的说明部分进行声明。,(3)在程序包中声明的常量可由调用此程序包的任何实体和结构体使用。,(4)在实体中声明的常量只能在本实体(包括其结构体)内使用。,(5)在进程中声明的常量只能在进程中使用。,(6)在某一结构体中定义的常量只能用于该结构体中。,2.变量(VARIABLE),变量只能在进程和子程序中使用,是一个局部量,不能将信息带出对它做出定义的当前设计单元。与信号不同,变量的赋值是理想化数据传输,其赋值是立即生效的,不存在任何的延时行为。,变量定义语句的格式为:,例如:VARIABLEn:INTEGE

10、RRANGE0TO15:=2;,VARIABLEa:INTEGER;,VARIABLE变量名:数据类型约束条件:=初始值;,变量赋值语句的格式为:,赋值语句“:=”右边的表达式必须与目标变量具有相同的数据类型,这个表达式可以是一个运算表达式也可以是一个数值。,变量赋值语句左边的目标变量可以是单值变量,也可以是变量的集合。,例如:VARIABLEx,y:REAL;VARIABLEa,b:BIT_VECTOR(0TO7);x:=100.0;y:=x+1.5;a:=“10111011”;a(0TO5):=b(2TO7);,目标变量名:=表达式;,注意:a.变量的初值可用于仿真,但综合时被忽略。b.在

11、进程、子程序中只能声明和使用变量,不能声明信号,但可使用外部信号。,3.信号(SIGNAL)信号是电子电路内部硬件连线的抽象。除没有方向外,与“端口”概念相似。,信号定义语句的格式为:,SIGNAL信号名:数据类型约束条件:=初始值;,信号赋值语句格式为:,符号“=”表示赋值操作,即将数据信息传入。数据信息传入时可以设置延时过程,这与器件的实际传播延时十分接近。但信号定义时初始赋值符号“:=”,即仿真的时间坐标是从赋初始值开始的。,目标信号名=表达式after时间量;,注:赋初始值可以保证在仿真时信号有设定的初值,而在硬件电路实现时,信号赋初值是无效的。,在实体中定义的端口,在其结构体中都可以

12、看成一个信号,并加以使用而不必另作定义.,注意:变量和信号都必须先定义,后赋值。注意赋值符“=”和“:”的差别。,信号赋值语句举例:x=y;ab,则结果是布尔量TURE,反之为FALSE.逻辑综合器将布尔量转换为1或0的信号值.,2)位(bit)放在单引号中,如0或1。,如:constantc:bit:=1;,3)位矢量(bit_vector)bit_vector是用双引号括起来的一组位数据。如:,“001100”X“00B10B”,使用位矢量必须注明位宽(即数组中的元素个数和排列)。如:Signala:bit_vector(3downto0);,4)字符(character),字符用单引号括

13、起来。字符区分大小写。,variablecharacter_var:character;Character_var:=A;,5)整数(integer),integer表示所有的整数。硬件实现时,利用32位的位矢量(有符号数)来表示。可实现的整数范围为:-(231-1)to(231-1),VHDL综合器要求对具体的整数做出范围限定,否则无法综合成硬件电路,例如,6)自然数(natural)natural是integer类型的子类型,表示非负整数。,7)正整数(positive)positive是integer类型的子类型,表示正整数。,8)实数:或称为浮点数取值:1.0E381.0E38仅能用于

14、仿真器,一般综合器不支持。,signals:integerrange0to15;信号s的取值是015,可用4位二进制数表示,因此s被综合成由四条信号线构成的信号。,10)时间(time)(VHDL综合器不支持),由整数和物理单位构成。,整数和单位之间至少要留一个空格,例如:55ms,20ns,9)字符串(string)string是character类型的一个非限定数组.,用双引号将一串字符括起来。如:variablestring_var:string(1to7);string_var:=“Rosebud”;,12)综合器不支持的数据类型,物理类型(只能用于仿真过程),浮点型(如实数),Acc

15、ess型,File型,11)错误等级(severityLevel),note(注意),warning(警告),error(出错),failure(失败),仿真中用来指示系统的工作状态,共有四种:,2、IEEE预定义标准逻辑位与矢量,1)std_logic类型,由ieee库中的std_logic_1164程序包定义,为九值逻辑系统,如下:(U,X,0,1,Z,W,L,H,-),由std_logic类型代替bit类型可以完成电子系统的精确模拟,并可以实现常见的三态总线电路。,在程序中使用该数据类型前,必须插入下面的语句:,libraryieee;useieee.std_logic_1164.all

16、;,2)std_logic_vector类型由std_logic构成的数组。,3、其它预定义标准数据类型,Synopsys公司程序包STD_LOGIC_ARITH中定义了无符号、有符号和小整型三种数据类型。如果将信号或变量定义为这几个数据类型,就可以使用本程序包中定义的运算符.,在使用之前,必须加入下面的语句:,libraryieee;useieee.std_logic_arith.all;,1)无符号型(UNSIGNED),代表一个无符号的数值,在综合器中,这个数值被解释成为一个二进制数,最左边为最高位.,如:UNSIGNED(“10000”)=16,如果要定义一个变量或信号的数据类型为UN

17、SIGNED,则其位矢量越长,所能代表的数值就越大.不能用UNSIGNED定义负数.,例:variablevar:unsigned(0to10);,signalsig:unsigned(5downto0);,2)有符号型(SIGNED),最高位为符号位,综合器认作补码,用0表示正数,1表示负数。,SIGNED(“0101”)=5,,SIGNED(“1011”)=-5,4、用户自定义类型,可以由用户定义的数据类型有:枚举(ENUMERATED)类型;整数(INTEGER)类型;数组(ARRAY)类型;实数(REAL)类型;记录(RECORDE)类型;时间(TIME)类型。,用户自定义的数据类型格

18、式如下:,TYPE数据类型名IS数据类型定义OF基本数据类型;,或写成下面的格式:,TYPE数据类型名IS数据类型定义;,例:typebyteisarray(7downto0)ofbit;,typeweekis(sun,mon,tue,wed,thu,fri,sat);,1)枚举类型,列出该类型的所有可能的值。格式:,type类型名称is(枚举文字,枚举文字);,如:typecoloris(blue,green,yellow,red);,typemy_logicis(0,1,U,Z);,variablehue:color;signalsig:my_logic;hue:=blue;sig=Z;,

19、枚举类型元素的编码:,综合器自动实现枚举类型元素的编码,一般将第一个枚举量(最左边)编码为0,以后依次加1。编码用位矢量表示,位矢量的长度将取所需表达的所有枚举元素的最小值。,为了某些特殊的需要,编码也可以人为设置.,如:typestate1is(st0,st1,st2,st3);,则默认编码值为:,st0=“00”,st1=“01”,st2=“10”,st3=“11”,2)整数与实数类型,用户定义的整数与实数类型是标准包中整数和实数类型的子类型。,格式:,type数据类型名isinteger(real)约束范围;,例:typedigitisintegerrange0to9;,3)数组类型,数

20、组:同类型元素的集合。VHDL综合器只支持一维数组。,数组分为限定性数组和非限定性数组.,(a)限定性数组:其下标取值范围在定义时就被确定了.,定义格式:,type数组名isarray(下标范围)of元素数据类型;,如:typestbisarray(7downto0)ofstd_logic;,typedata_busisarray(0to7)ofstd_logic;,定义格式:,(b)非限定性数组:定义时不说明数组下标的取值范围,而是定义某一数据对象为此数组类型时,再确定该数组下标范围取值.,type数组名isarray(数组下标名range)of元素数据类型;,例:typeworyisarr

21、ay(integerrange)ofbit;variablevi:wory(5downto0);,数组下标名:以整数类型设定的一个数组下标名称如natural,positive,integer等,:下标范围待定.用到该数组类型时,再填入具体的数值范围注意:符号”间不能有空格.,对数组赋值可以按照下标对每一个元素进行赋值,也可以对整个数组作一次性赋值。,如:typeexampleisarray(0to7)ofbit;signala:example;a=“01000111”,或a(7)=0;a(6)=1;,引用数组有两组方法:引用数组元素和引用整个数组。,signalc,d:bit;signalb

22、:example;,如:typeexampleisarray(0to7)ofbit;signala:example;,b=a;,c=a(0);d=a(7);,4)记录类型,记录是不同类型的元素的集合。定义格式如下:,type记录类型名isrecord元素名:数据类型名;元素名:数据类型名;endrecord;,访问记录中元素的方式:记录名.元素名,例:定义记录类型:,typeexampleisrecordyear:integerrange0to3000;month:integerrange1to12;day:integerrange1to31;addr:std_logic_vector(7do

23、wnto0);data:std_logic_vector(15downto0);endrecord;,访问记录中的元素:,signalpm:exmaple;signalkl:std_logic_vector(15downto0);kl=pm.data;,5)用户定义的子类型,子类型是已定义的数据类型的一个子集。定义格式:,subtype子类型名is原数据类型名range约束范围;,例:subtypedigitsisintegerrange0to9;,注意:子类型与原数据类型属同一数据类型,两者之间可以直接进行赋值,不必进行数据类型的转换.,定义子类型的好处在于有利于提高综合的优化效率.,6.数

24、据类型转换,在VHDL程序设计中不同的数据类型的对象之间不能代入和运算。实现他们之间数据类型的转换有3种方法:函数转换法,类型标记法,常数转换法.,函数转换法,VHDL语言中,程序包中提供了转换函数,这些程序包有3种,每个程序包中的转换函数不一样。,STD_LOGIC_1164程序包数据类型转换函数,函数TO_STDLOGICVECTOR(A)由BIT_VECTOR转换为STD_LOGIC_VECTOR,函数TO_BITVECTOR(A)由STD_LOGIC_VECTOR转换为BIT_VECTOR,函数TO_STDLOGIC(A)由BIT转换为STD_LOGIC,函数TO_BIT(A)由STD

25、_LOGIC转换为BIT,.STD_LOGIC_ARITH程序包数据类型转换函数,函数:CONV_STD_LOGIC_VECTOR(A,位长)由UNSIGNED,SIGNED、INTEGER转换为STD_LOGIC_VECTOR,函数:CONV_INTEGER(A)由UNSIGNED,SIGNED转换为INTEGER,.STD_LOGIC_UNSIGNED程序包数据类型转换函数,函数:CONV_INTEGER(A)由STD_LOGIC_VECTOR转换为INTEGER,例5-1-数据类型转换libraryieee;useieee.std_logic_1164.all;useieee.std_l

26、ogic_unsigned.all;entityzhhisport(num:instd_logic_vector(2downto0););endzhh;architecturebehaveofzhhissignalin_num:integerrange0to5;beginin_num=conv_integer(num);-数据类型转换endbehave;,bit_vector和std_logic_vector的区别:,(1)代入bit_vector的值可以是二、八,十六进制数,而代入std_logic_vector的只能是二进制数。,(2)bit_vector可以用“_”来分隔数值位。,sig

27、nala:bit_vector(7downto0);signalb:std_logic_vector(7downto0);a=x”b4”;-正确b=x”b4”;-错误b=to_stdlogicvector(x”b4”);,5.1.4VHDL操作符,与其他程序设计语言相似,VHDL中的表达式也是由操作数和操作符组成,VHDL操作符的分类:逻辑操作符、关系操作符算术操作符、符号操作符重载操作符,表5-2VHDL操作符列表,接上页,表5-3VHDL操作符优先级,同一行的运算符有相同的优先级,当一个表达式出现多个同级别的运算符时,需要通过加括号来决定运算顺序.,1)逻辑运算符在VHDL语言中,共有7种

28、逻辑运算符,他们分别是:NOT取反;AND与;OR或;NAND与非;NOR或非;XNOR异或非(同或);XOR异或。,这7种逻辑运算符可以对“STD_LOGIC”、“Boolean”和“BIT”等逻辑型数据、“STD_LOGIC_VECTOR”、“bit_vector”逻辑型数组进行逻辑运算。运算符的左边和右边,以及代入的信号的数据类型必须是相同的。,注意:,(1)通常在一个表达式中有两个以上的逻辑运算符时,需要使用括号将这些运算分组.,(2)如果一串运算中的运算符相同,且是AND、OR、XOR这三个运算符中的一种,则不需使用括号。,(3)如果一串运算中的运算符不同或有除上述三种运算符之外的运

29、算符,则必须使用括号。,例:a=bandc;d=eorforg;h=(inandj)nandk;-必须加括号l=(mxorn)and(oxorp);h“VHDL”,0signalc:integerrange0to15;signald:integerrange0to3;a=abs(b);c”01”的结果为true.“1011”101011”的结果为true.,4)重载操作符,对已存在的操作符重新定义,使其能进行不同类型操作数之间的运算,称为操作符重载。重载操作符由原操作符加双引号表示。如“+”;,操作符重载的定义见IEEE库的程序包:std_logic_arith、std_logic_unsig

30、ned、std_logic_signed,只要引用这些程序包,signed,unsigned,std_logic和integer之间即可混合运算,integer,std_logic,std_logic_vector之间也可混合运算。,重载操作符的使用:,5.2VHDL顺序语句,5.2.1赋值语句,5.2.2转向控制语句,5.2.3WAIT语句,5.2.4子程序调用语句,5.2.5返回语句,5.2.6NULL语句,5.2.7其他语句,5.2.1赋值语句,1、变量赋值与信号赋值,信号对象=表达式;-信号赋值,变量对象:=表达式;-变量赋值,要求:表达式的值必须与对象的类型、宽度一致.,变量与信号的

31、差异:,1)赋值方式的不同:变量:=表达式;信号=表达式;,2)硬件实现的功能不同:信号代表电路单元、功能模块间的互联,代表实际的硬件连线;变量代表电路单元内部的操作,代表暂存的临时数据。,3)有效范围的不同:信号:程序包、实体、结构体;全局量。变量:进程、子程序;局部量。,ARCHITECTURESIGNALDeclarationslabel1:PROCESSVARIABLEDeclarationslabel2:PROCESSVARIABLEDeclarations,例:architecturertlofexissignala:std_logic;beginprocess()begina=b

32、;a=c;endprocess;endrtl;,4)一个进程信号的多次赋值最后一次赋值有效,5)赋值行为的不同:信号赋值延迟更新数值。变量赋值立即更新数值。,Libraryieee;Useieee.std_logic_1164.all;Entityabcisport(a,b,c:instd_logic;x,y:outstd_logic);Endabc;architecturertlofabcissignald:std_logic;beginprocess(a,b,c)begind=a;x=cxord;d=b;y=cxord;endprocess;endrtl;,程序运行的结果:x=cxorb;

33、y=cxorb;,Libraryieee;Useieee.std_logic_1164.all;entityabcisport(a,b,c:instd_logic;x,y:outstd_logic);endabc;architecturertlofabcisbeginprocess(a,b,c)variabled:std_logic;begind:=a;x=cxord;d:=b;y=cxord;endprocess;endrtl;,程序运行的结果:x=cxora;y=cxorb;,5.2.2转向控制语句,转向控制语句通过条件控制开关决定是否执行一条或几条语句,或重新执行一条或几条语句,或跳过一

34、条或几条语句。,分为五种:if语句、case语句、loop语句、next语句、exit语句,1.if语句,if语句执行一系列的语句,其次序依赖于一个或多个条件的值。,1)if语句的门闩控制,if条件then顺序处理语句endif;,例:if(ena=1)thenq=d;endif;综合后生成锁存器(latch),格式:,2)if语句的二选择控制,格式:,if条件then顺序语句序列1else顺序语句序列2endif;,用条件来选择两条不同程序执行的路径。,architecturertlofmux21isbeginprocess(a,b,sel)beginif(sel=1)theny=a;els

35、ey=b;endif;endprocess;endrtl;,此描述的典型电路是二选一电路:,3)if语句的多选择控制,格式:,if语句的多选择控制又称为if语句的嵌套.,if条件1then顺序语句序列1elsif条件2then顺序语句序列2elsif条件nthen顺序语句序列nelse顺序语句序列n+1endif;,典型电路是多选一(四选一)电路。,ARCHITECTURErtlOFmux4ISBEGINPROCESS(input,sel)BEGINIF(sel=“00”)THENy=input(0);ELSIF(sel=“01”)THENy=input(1);ELSIF(sel=“10”)T

36、HENy顺序处理语句2;when值n=顺序处理语句n;whenothers=顺序处理语句n+1;endcase;,相当于then,其中WHEN条件值可有以下的形式:,1)when值=顺序处理语句;,2)when值1to值2=顺序处理语句;,3)when值1|值2|值3|值n=顺序处理语句;,4)以上三种方式的混合;如:when值1,值2to值3,值4|值5=顺序处理语句;,5)whenothers=顺序处理语句;,注意:,1)选择值必须在表达式的取值范围内。,2)多个选择值不能重叠。,3)CASE语句执行时必须选中,且只能选中一个值。,4)如果没有others值存在,则选择值必须覆盖表达式所有

37、可能的值。且whenothers条件句只能作为最后一个条件句。,对std_logic,std_logic_vector数据类型要特别注意使用others值。,例:case语句的误用signalvalue:integerrange0to15;signalout_1:bit;,casevalueisendcase;,casevalueiswhen0=out_1out_1out_1out_110;endloopL2;,重复执行顺序语句序列,直至条件表达式值为真时退出循环。,2)forloop语句,循环标号:for循环变量in离散范围loop顺序语句序列endloop循环标号;,特点:,循环变量是lo

38、op内部自动声明的局部量,仅在loop内可见,默认的循环变量为i;不需要指定其变化方式。,离散范围必须是可计算的整数范围:,整数表达式1to整数表达式2,整数表达式1downto整数表达式2,例:用forloop语句描述的8位奇偶校验电路,-奇校验,8位奇校验电路仿真结果:,输入有奇数个1时,输出为0,输入有偶数个1时,输出为1.,将变量tmp的初值改为0,则为偶校验电路:,输入有偶数个1时,输出为0,输入有奇数个1时,输出为1.,3)whileloop语句,循环标号:while循环条件loop顺序语句序列endloop循环标号;,例:sum:=0;i:=0;abcd:while(i10)lo

39、opsum:=sum+i;i:=i+1;endloopabcd;,注:循环变量i需事先定义、赋初值,并指定其变化方式。,一般综合工具不支持whileloop语句。,例:用whileloop语句描述的8位奇偶校验电路.(偶校验),4.next语句,在loop语句中用next语句来跳出本次循环。,格式:,next循环标号when条件表达式;,分三种情况:,1),next;,无条件终止当前的循环,跳回到本次循环LOOP语句开始处,开始下次循环。,2),next循环标号;,无条件终止当前的循环,跳转到指定循环标号处,重新开始执行循环操作。,next循环标号when条件表达式;,3),当条件表达式的值为

40、true,则执行next语句,进入跳转操作,否则继续向下执行。,例:process(table)beginlp1:foriin10downto2looplp2:forjin0toiloopnextlp2wheni=j;table(i,j)f);S3:b(k+8):=0;k:=k+1;nextloopL_Y;nextloopL_X;,5.exit语句,exit语句将结束整个循环。,格式:,exit循环标号when条件表达式;,next语句与exit语句的格式与操作功能非常相似.,区别是:next语句是跳向loop语句的起始点,而exit语句则是跳向loop语句的终点。,例:process(a)v

41、ariableint_a:integer;beginint_a:=a;L1:foriin0tomax_limitloopif(int_a=0)thenexit;elseint_a:=int_a-1;endif;endloop;endprocess;,例5-15:比较两个二位二进制数的大小signala,b:std_logic_vector(1downto0);signala_less_than_b:boolean;a_less_than_b=false;foriin1downto0loopifa(i)=1andb(i)=0thena_less_than_b=false;exit;elsifa(

42、i)=0andb(i)=1thena_less_than_b=true;exit;elsenull;endif;endloop;,5.2.3wait语句,进程在仿真时的两个状态:执行或挂起。,进程状态的变化受wait语句或敏感信号量变化的控制。,可设置4种不同的条件:,wait-无限等待,永远挂起,waiton-敏感信号量变化,waituntil-条件满足,waitfor-时间到,只有waituntil可以被综合器接受,其它的语句格式只能在VHDL仿真器中使用.,1.waiton语句,格式:,waiton信号,信号;,例:以下两种描述是完全等价的,process(a,b)beginy=aand

43、b;endprocess;,processbeginy实参表达式);,过程的调用一般经过3个步骤:,(1)将IN和INOUT模式的实参值传递给与之相对应的形参;,(2)执行这个过程;,(3)将OUT和INOUT模式的形参值分配给与之相对应的实参;,2.函数调用,调用函数的语句格式如下:,函数名(形参名=实参表达式,形参名=实参表达式);,函数的调用与过程十分相似,区别在于:调用函数将返回一个指定数据类型的值,函数的参量只能是输入量.,5.2.5return语句,return语句只能用于子程序中,并用来终止一个子程序的执行。,格式:,return表达式;,1)return;,用于过程,只是结束过

44、程,不返回任何值。,2)return表达式;,用于函数,并且必须返回一个值。,procedurers(signals,r:instd_logic;signalq,nq:bufferstd_logic)is-过程体beginifs=1andr=1thenreport“forbiddenstate:sandrareequalto1”;return;elseq=sandnqafter5ns;nq=randqafter5ns;endif;endprocedurers;,例5-19:用于过程的return语句,例:用于函数的return语句,functionopt(a,b,sel:std_logic)r

45、eturnstd_logicis-函数体beginifsel=1thenreturn(aandb);elsereturn(aorb);endif;endfunctionopt;,5.2.6null语句,null为空语句,不作任何操作。,格式:,null;,5.2.7其它语句,1.属性描述与定义语句,属性指的是关于实体、结构体、类型及信号的一些特征。,格式:,对象名属性标识符,VHDL语言的预定义的属性有:,数值类,函数类,信号类,数据类型类,数据范围类,(1)属性event,对在当前的一个极小的时间段内发生的事件的情况进行检测。如发生事件,则返回true,否则返回false。,发生事件:信号电

46、平发生变化。,clockevent,信号类属性,时钟信号clock的上升沿描述:,clockeventandclock=1,时钟信号的下降沿描述:,clockeventandclock=0,上升沿触发器描述:,process(clock)beginifclockeventandclock=1thenq=data;endif;endprocess;,(2)属性stable,属性stable的测试功能与event刚好相反,信号在时间段内无事件发生,则返回true,否则返回false。,以下表示方法等价:,clockeventandclock=1,not(clockstable)andclock=1

47、(此表达方式不可综合),2.断言语句(Assert)(不可综合),断言语句分为顺序断言语句和并行断言语句,顺序断言语句主要用于进程、函数和过程仿真、调试中的人机对话,它可以给出一个文字串作为警告和错误信息。,格式:,ASSERT条件REPORT报告信息SEVERITY出错级别;,在执行过程中,断言语句对条件(布尔表达式)的真假进行判断,如果条件为“TURE”,则向下执行另外一条语句;如果条件为“FALSE”,则输出错误信息和错误严重程度的级别。,在REPORT后面跟着的是设计者写的字符串,通常是说明错误的原因,字符串要用双引号括起来。,SEVERITY后面跟着的是错误严重程度的级别,他们分别是

48、:,NOTE(注意)WARNING(警告)ERROR(错误)FAILURE(失败),例:,process(reset,preset)beginassertnot(reset=0andpreset=0)report“controlerror”severityerror;,3.report语句(93版本,不可综合),VHDL仿真中,report语句用来报告有关信息,主要用以提高人机对话的可读性,监视某些电路的状态。,格式:,REPORT报告信息SEVERITY出错级别;,process(reset,preset)beginif(reset=0andpreset=0)thenreport“contr

49、olerror”severityerror;,例:,如果此项省略,则默认值为note.,5.3VHDL并行语句,Architecture,信号,信号,信号,5.3VHDL并行语句,5.3.1进程语句,5.3.2并行信号赋值语句,5.3.3块语句,5.3.4并行过程调用语句,5.3.5元件例化语句,5.3.6生成语句,5.3.1进程(process)语句,进程(process)语句最具VHDL语言特色。提供了一种用算法(顺序语句)描述硬件行为的方法。,特点:,1、进程与进程,或其它并发语句之间的并发性;,2、进程内部的顺序性;,3、进程的启动与挂起;,4、进程与进程,或其它并发语句之间的通信通过

50、信号实现。,信号,信号,信号,Process语句格式:,进程标号:process(敏感信号表)进程说明部分begin顺序描述语句endprocess进程标号;,(一)敏感信号表:进程内要读取的所有敏感信号(包括端口)的列表。每一个敏感信号的变化,都将启动进程。,信号名称,信号名称,敏感信号表格式:,注意:如果进程中有wait语句,则不允许有敏感信号表。两者互斥。,例如:,PROCESS(a,b)BEGIN顺序语句;(不允许有wait语句)ENDPROCESS;,PROCESSBEGIN顺序语句;WAITON(a,b);ENDPROCESS;,(二)说明语句,说明语句用来定义一些局部量,包括数据

51、类型,常数,变量,子程序等.,(三)顺序描述语句,但应注意:在进程的说明语句中不允许定义信号和共享变量.信号只能在结构体的说明部分定义.,可以是赋值语句,进程启动语句,子程序调用语句,顺序描述语句和进程跳出语句.,a.赋值语句:信号,变量的赋值语句.,b.进程启动语句,当有敏感信号表时,由敏感信号表来启动进程.,wait语句可以看成一种隐式的敏感信号表.,c.子程序调用语句:函数和过程的调用语句.,d.顺序描述语句:if语句,case语句,loop语句,null语句.,e.进程跳出语句:next语句和exit语句.,例5-22进程的应用,entitymulisPort(a,b,c,selx,s

52、ely:inbit;data_out:outbit);endmul;,architectureexofmulisSignaltemp:bit;Begin,P_a:process(a,b,selx)beginif(selx=0)thentemp=a;elsetemp=b;endif;endprocessp_a;,P_b:process(temp,c,sely)beginif(sely=0)thendata_out=temp;elsedata_out=c;endif;endprocessp_b;endex;,5.3.2并行信号赋值语句,有三种并行信号赋值语句:,简单信号赋值语句,条件信号赋值语句,

53、选择信号赋值语句,共同特点:,1.赋值目标必须是信号,与其它并行语句同时执行,与书写顺序及是否在块语句中无关。,2.每一信号赋值语句等效于一个进程语句。所有输入信号的变化都将启动该语句的执行。,1.简单信号赋值语句,目标信号=表达式;,格式:,例5-23:,architecturecurtofbclissignals,e,f,g,h:std_logic;beginoutput1=aandb;output2=c+d;g=dorf;h=dxorf;endcurt;,信号赋值语句在进程内部使用时,作为顺序语句出现.在结构体的进程之外使用时,作为并行语句.,2.条件信号赋值语句,格式:,赋值目标=表达

54、式1when条件1else表达式2when条件2else表达式3when条件3else表达式n;,注意:,当条件或表达式的值改变时,该语句被激活.,执行条件赋值语句时,对赋值条件的测定是按书写的先后顺序逐项进行的,一旦发现某一赋值条件得到满足,即将相应表达式的值赋给目标信号,并不再测试下面的赋值条件。故第一个条件具有最高赋值优先级。,允许赋值条件有重叠现象.,最后一项表达式可以不跟条件子句,当所有条件都不满足时,将此表达式的值赋给信号.,例5-24:条件信号赋值语句,entitymuxisport(a,b,c:inbit;p1,p2:inbit;z:outbit);endmux;archite

55、cturebehaveofmuxisBeginz=awhenp1=1elsebwhenp2=1elsec;endbehave;,如果p1和p2同时为1,由于条件测试的顺序性,z获得的赋值为a.,3.选择信号赋值语句,with选择表达式select目标信号=表达式1when选择值1,表达式2when选择值2,表达式nwhen选择值n;,格式:,注意:,(1)选择信号赋值语句与进程中的case语句等价,但它不能用于进程中.,(2)不能有重叠的选择值。(因为对各选择值的测试是同时进行的),(3)最后选择值可为others。否则,其它选择值必须能包含表达式的所有可能值。,(4)此语句中敏感量为with后的选择表达式.每当选择表达式的值发生变化时,则启动此语句,对各子句的选择值进行测试对比,当发现有满足条件的子句时,就将该子句表达式的值赋给目标信号.,(5)此语句中除最后一个语句以分号结束外,其余的语句均以”,”隔开.,例5-25:选择信号赋值语句,libraryieee;Useieee.std_logic_1164.all;Useieee.std_logic_unsigned.all;-可去掉entitydecoderisport(a,b,c:instd_log

温馨提示

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

评论

0/150

提交评论