VHDL与计算机硬件模块设计北京理工大学计算机学院王娟14:4623、VHDL程序的基本元素主要内容数据对象数据类型运算符号14:4633.1VHDL语言的对象1、对象的概念:用来保存数据值的单元。2、对象的种类:常量、信号、变量和文件。3、对象的两种要素:类和类型类:用来指明对象属于常量、信号变量和文件中的哪一类。类型:用来指明该对象属于那种数据类型。14:464VHDL常见的对象进程、函数和过程变量说明局部量,程序中临时使用的对象。变量(variable)结构、包和实体信号说明全局量,控制模块或进程间通信的机制,定义两个模块或进程间的数据通路。信号(signal)结构、包、实体、进程、函数和过程常数说明全局量,程序中不变的量。常量(constant)说明场合含义对象名14:465常量(CONSTANT)(常数)将数据对象定义为常数主要是希望该常数代表的数据部分不被改变,提高程序的易读性和可维护性。常数说明语句格式为:CONSTANT常数名:数据类型:=表达式;14:466常数应用注意事项常量值不可修改。程序中不同部分定义的常量值具有不同的作用范围。常量所赋的值必须与其定义的数据类型保持一致。常数名称不可以是VHDL语法保留字。14:467常数举例CONSTANTVcc:REAL:=5.0;CONSTANTFbus:BIT_VECTOR:=“1011”;CONSTANTDelay:TIME:=10ns;注:常量是一个恒定不变的值,一旦做了数据类型和赋值定义,它在程序中就不能再改变。14:468变量(VARIABLE)变量只能在进程和子程序中用,是一局部量,不能将信息带出对它做出定义的当前设计单元。变量赋值立即生效,不存在任何的延时行为。变量定义语句的格式为:VARIABLE变量名:数据类型:约束条件:=初始值;14:469变量赋值语句的格式为:目标变量名:=表达式;赋值语句“:=”右边的表达式必须与目标变量具有相同的数据类型,这个表达式可以是一个运算表达式也可以是一个数值。变量赋值语句左边的目标变量可以是单值变量,也可以是变量的集合。注意14:4610变量举例VARIABLEn:INTEGER:RANGE0TO15:=2;VARIABLEa:INTEGER;VARIABLEa,b:REAL;VARIABLEx,y:BIT_VECTOR(0TO7);14:4611信号(SIGNAL)信号是电子电路内部硬件连接的抽象。它可以作为设计实体中的并行语句模块间交流信息的通道。信号代表电路的寄存器效果,相关的延时明显地体现了硬件系统的特征。14:4612信号定义语句的格式为:SIGNAL信号名:数据类型:约束条件:=表达式;信号赋值语句表达式为:目标信号名=表达式;变量和信号都必须先定义,后赋值。注意赋值符“=”和“:=”的差别。14:4613信号举例SIGNALgnd:BIT:=‘0’;SIGNALdata:STD_LOGIC_VECTOR(7DOWNTO0);赋值语句举例:x=y;a=‘1’;s1=s2AFTER10ns;14:4614信号与变量的区别信号变量应用目的表示电路的连接保存值应用范围全局范围(任何地方)局部范围(在进程内部)何时取得新值?在进程执行到被挂起之后(赋值语句执行之时不进行值的更新)才进行值的更新赋值语句执行之时立即进行值的更新14:4615信号与变量的区别信号赋值至少要有δ延时;而变量赋值没有。信号是硬件中连线的抽象描述,功能是保存变化的数据值和连接子元件。变量在硬件中没有类似的对应关系,用于硬件特性的高层次建模所需要的计算中。信号除当前值外有许多相关的信息,如历史信息和投影波形;而变量只有当前值。进程(PROCESS)对信号敏感而不对变量敏感。信号可以是多个进程的全局信号;而变量只在定义它们的顺序域可见(共享变量除外)。信号量的值将进程语句最后所带入的值作为最终值。信号值不能传递给变量,但是变量值可以传递给信号。14:4616ENTITYmux_goodISPORT(i0,i1,i2,i3,a,b:INbit;q:OUTbit);ENDmux_good;ARCHITECTUREcorrectOFmux_goodISBEGINPROCESS(i0,i1,i2,i3,a,b)VARIABLEmuxval:INTEGERRANGE0TO3;BEGINmuxval:=0;IF(a='1')THENmuxval:=muxval+1;ENDIF;IF(b='1')THENmuxval:=muxval+2;ENDIF;CASEmuxvalISWHEN0=q=I0;WHEN1=q=I1;WHEN2=q=I2;WHEN3=q=I3;ENDCASE;ENDPROCESS;ENDcorrect;ENTITYmux_badISPORT(i0,i1,i2,i3,a,b:INbit;q:OUTbit);ENDmux_bad;ARCHITECTUREincorrectOFmux_badISSIGNALmuxval:INTEGERRANGE0TO3;BEGINPROCESS(i0,i1,i2,i3,a,b)BEGINmuxval=0;IF(a='1')THENmuxval=muxval+1;ENDIF;IF(b='1')THENmuxval=muxval+2;ENDIF;CASEmuxvalISWHEN0=q=I0;WHEN1=q=I1;WHEN2=q=I2;WHEN3=q=I3;ENDCASE;ENDPROCESS;ENDincorrect;正确方案(VARIABLE)不正确方案变量muxval新值已经得到信号muxval新值还未得到14:4617举例说明变量与信号的区别:例1:SignalD:integer:=10;PROCESSBEGIND=20;X=20+D;D=30;Y=20+D;ENDPROCESS;14:4618例2:PROCESSVARIABLED:integer;BEGIND:=10;X=20+D;D:=30;Y=20+D;ENDPROCESS;14:4619例1结果:X=50;Y=50;例2结果:X=30;Y=50;信号量将进程语句最后所代入的值作为最终值。14:4620例3:PROCESSVARIABLEA,B:integer;BEGINWAITUNTILclk=‘1’;A:=10;B:=20;A:=B;B:=A;ENDPROCESS;14:4621例4:PROCESSSIGNALA,B:integer;BEGINA=10;B=20;WAITFOR10ns;A=B;B=A;WAITFOR10ns;ENDPROCESS;14:4622例3结果:A=20;B=20;例4结果:A=20;B=10相当于A、B值互换。14:4623进程语句进程(process)语句;进程和进程之间并行执行。进程内部的语句顺序执行。简单的进程语句可以简化为并行信号赋值语句。14:4624进程是一个无限循环;进程中的语句顺序执行;进程中允许有多个wait语句;遇到wait语句进程即被挂起,直到条件满足,进程被激活,接着向下执行;进程间通过信号而相互激励/通信;注意延迟时间的处理进程内部执行过程p1:processbegin……waitons1;……waitons2;……waitons1;……endprocessp1;无限循环14:4625结构体(Architecture)中的进程(进程之间并行执行)entitysubtracterisport(in1,in2,in3:ininteger;out1,out2:outinteger);endsubtracter;architecturesimplestofsubtracterisbeginprocess(in1,in2)--进程语句之一beginout1=in2-in1after5ns;endprocess;process(in2,in3)--进程语句之二beginout2=in2+in3after4ns;endprocess;endsimplest;进程之间并行执行进程内部顺序执行简单的进程语句可以简化为并行信号赋值语句。14:4626简单进程化简为单个并行语句进程语句若满足以下2个特点:进程语句中只有一个信号赋值语句。该赋值语句右边的所有信号都是敏感信号。则可以简化为并行信号赋值语句⇒architecturesimplestofsubtracterisbeginout1=in2-in1after5ns;--并行信号赋值语句之一out2=in2+in3after4ns;--并行信号赋值语句之二endsimplest;14:46273.2VHDL的数据类型1、VHDL语言为一种强类型语言VHDL中数据对象都要指定数据类型。每一个对象有且只能具有一个类型。操作类型必须要与对象类型匹配。不同数据类型的数据之间不能直接进行赋值运算。按数据类型来源分为:标准数据类型和用户定义数据类型。14:4628标准定义的数据类型逻辑‘0’和逻辑‘1’位串(位的一维数组)bit和bit_vector位和位矢量逻辑‘假’和逻辑‘真’boolean布尔量浮点数Real实数常用32位Integer整数含义关键词数据类型14:4629含义关键词数据类型唯一预定义的物理类型,常用于仿真,不用于逻辑综合time时间大于或者等于0的整数大于0的整数natural和positive自然数正整数四类:note,warning,error和failureseverity_level警告级别ASCII字符字符矢量(字符的一维数组)character和string字符字符串14:4630整数不能被看作位矢量,即不能直接使用逻辑操作符,必须先转换。整数长度与具体的EDA工具相关,一般为32位。实数进行书写时一定要带小数点。一般综合工具都不支持实数。VHDL语言不区分大小写,但区分字符的大小写,‘A’和‘a’不同。布尔量没有具体数值含义,不能进行算术运算,只能进行关系运算。14:4631用户定义的数据类型必须遵循的原则:先定义后使用!1、可枚举类型语法格式TYPE枚举数据类型名IS(枚举元素,枚举元素,…);作用:状态机应用和微处理器指令应用。可枚举类型有顺序,其顺序关系为:左边中间右边14:4632举例:表示一周状态TYPEweekIS(Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday);优点:方便数字逻辑的表示,便于编写和阅读程序。14:46332、物理类型语法格式TYPE物理数据类型名IS约束范围UNITS基本单位;单位条目;ENDUNITS;作用:用于测试单元,表示时间、电压等类型的物理量。14:4634举例:电流物理类型的说明TYPEcurrentISRANGE0TO1000000000UNITSna;ua=1000na;ma=1000ua;a=1000ma;ENDUNITS;14:4635注意事项1、物理类型的范围约束了按基本单位能够表示的物理类型的最大和最小值。2、单位表示符必须唯一。3、数值与物理量之间至少有一个空格。14:46363、数组类型语法格式TYPE数组类型名ISARRAY约束范围OF数组元素类型;数组的分类:一维和多维。限定性的和非限定性的。限定性的:定义时指定数组的上下界非限定性的:定义时不指定数组的上下界14:4637数组举例TYPEwordISARRAY(15DOWNTO0)OFBIT;TYPEdata_busISARRAY(31DOWNTO0)OFstd_logic;TYPEdoublewordISARRAY(naturalRANGE)OFbit;SIGNALa:doubleword(31DO