第5章VHDL设计入门5.3VHDL语言要素VHDL的语言要素,作为硬件描述语言的基本结构元素,主要有数据对象(DataObject,简称Object)数据类型(DataType,简称Type)各类操作数(Operands)运算操作符(Oprator)第5章VHDL设计入门一、VHDL文字规则1)数字型文字1)整数文字:整数文字都是十进制的数,如:4,578,0,156E2(=15600),45_234_287(=45234287)。数字间的下划线仅仅是为了提高文字的可读性,相当于一个空的间隔符。(2)实数文字:实数文字也都是一种十进制的数,但必须带有小数点,如:18.993,1.0,0.0,88_670_551.453_909(=88670551.453909)。第5章VHDL设计入门一、VHDL文字规则(3)以数制基数表示的文字:用这种方法表示的数由五个部分组成。第一部分,用十进制数标明数制进位的基数;第二部分,数制隔离符号“#”;第三部分,数值部分;第四部分,指数隔离符号“#”;第五部分,用十进制表示的指数部分,这一部分的数如果是0可以省去不写。10#170#--(十进制数表示,等于170);2#1111_1110#--(二进制数表示,等于是254);16#F.01#E+2--(十六进制数表示,等于3841.00)。第5章VHDL设计入门一、VHDL文字规则(4)物理量文字(VHDL综合器不接受此类文字)如:50s(50秒),200m(200米),177A(177安培)。注:只有整数可综合实现:实数一般不可综合实现,主要是硬件实现实数运算比较复杂,一般综合工具不支持物理量不可综合实现,主要用于仿真中第5章VHDL设计入门一、VHDL文字规则2)字符及字符串型文字(1)字符是用单引号引起来的ASCII字符,可以是数值,也可以是符号或字母,如:‘R’,‘A’,‘*’,‘Z’。字符串则是一维的字符数组,须放在双引号中。VHDL中有两种类型的字符串:文字字符串和数位字符串。(2)文字字符串:它是用双引号引起来的一串文字,如:“BB$CC”,“ERROR”,“BOTHSANDQEQUALTOL”,“X”。第5章VHDL设计入门一、VHDL文字规则(2)数位字符串:数位字符串也称位矢量,是预定义的数据类型BIT的一位数组,它们所代表的是二进制、八进制或十六进制的数组,其位矢量的长度即为等值的二进制数的位数。数位字符串的表示首先要有计算基数,然后将该基数表示的值得放在双引号中,基数符以“B”、“O”、和“X”表示,并放在字符串的前面。它们的含义分别是:B:二进制基数符号,表示二进制数位0或1,在字符串中每一个位表示一个BIT。第5章VHDL设计入门一、VHDL文字规则O:八进制基数符号,在字符串中的第一个数代表一个八进制数,即代表一个3位(BIT)的二进制数。X:十六进制基数符号(0~1),代表一个十六进制数,即代表一个4位的二进制数。例如:B“1_1101_1110”二进制数数组,位矢数组长度是9;X“AD0”--十六进制数数组,位矢数组长度是12。第5章VHDL设计入门一、VHDL文字规则3)标识符标识符用来定义常数、变量、信号、端口、子程序或参数的名字。VHDL的基本标识符是(87标准)以英文字母开头,不连续使用下划线“_”,不以下划线“_”结尾的,由26个大小写英文字母、数字0~9以及下划线“_”组成VHDL’93标准还支持扩展标识符,但是目前仍有许多VHDL工具不支持扩展标识符。标识符中的英语字母不分大小写。VHDL的保留字不能用于作为标识符使用。第5章VHDL设计入门一、VHDL文字规则如:DECODER_1,FFT,Sig_NNOT_ACK,State0,Idle是合法的标识符。而_DECOER_1,2FFT,SIG_#N,NOT—ACK,RYY_RST_,data__BUS,则是非法的标识符。4)下标名下标名则用于指示数组型变量或信号的某一元素,其语句格式如下:数组类型符号名或变量名(表达式);表达式的数值必须在数组元素下标号范围以内,并且是可计算的。y=b(4)x=a(n)n如果预先没有赋值,那就属于不可计算的第5章VHDL设计入门一、VHDL文字规则5)段名段名对应数组中某一段的元素,是多个下标名的组合。其表达式数组类型符号名或变量名(表达式方向表达式)方向:TO表示是数组下标序列由低到高,如“3TO8”DOWNTO表示数组下标序列由高到低,如“9DOWNTO2”(注意与“2TO9”的区别)如:SIGNALA,B,C:BIT_VECTOR(0TO5);SIGNALM:INTEGERRANGE4TO0;第5章VHDL设计入门二、数据对象在VHDL中,数据对象(DataObjects)类似于一种容器,它接受不同数据类型的赋值。数据对象有三种,即常量(CONSTANT)、变量(VARIABLE)和信号(SIGNAL)。前二种可以从传统的计算机高级语言中找到对应的数据类型,其语言行为与高级语言中的变量和常量十分相似。但信号是具有更多的硬件特征的特殊数据对象,是VHDL中最有特色的语言要素之一。第5章VHDL设计入门二、数据对象三种对象的物理含义:常量代表数字电路中的电源、地、恒定逻辑等常数;变量代表暂存某些值的载体,常用于描述算法;信号代表物理设计中的某一条硬件连接线,包括输入、输出端口。第5章VHDL设计入门二、数据对象1)变量(VARIABLE)在VHDL语法规则中,变量是一个局部量,只能在进程和子程序中使用。变量不能将信息带出对它作出定义的当前设计单元。变量的赋值是一种理想化的数据传输,是立即发生,不存在任何延时的行为。变量常用在进程中作临时数据存贮单元。定义变量的语法格式如下:VARIABLE变量名:数据类型[:=初始值];例如:VARABLEA:INTEGER;--定义A为整数型变量VARIABLEB,C:INTEGER:=3;--定义B和C为整型变量,初始值为3第5章VHDL设计入门二、数据对象2)信号(SIGNAL)信号是全局量。信号的使用和定义范围是实体、结构体和程序包。在进程和子程序中不允许定义信号,只能使用信号。可以作为设计实体中并行语句模块间的信息交流通道。信号是描述硬件系统的基本数据对象,它类似于连接线。信号是电子系统内部硬件连接和硬件特性的抽象表示。信号可以作为设计实体中并行语句模块间的信息交流通道。其实端口就是一种隐形的信号。一般信号不定义方向,而端口需要定义数据流动的方向。第5章VHDL设计入门二、数据对象信号与端口的区别:除没有方向外,信号与实体的“端口(port)”概念相似,端口就是一种隐形的信号。entityexamisport([signal]a,b:instd_logic;([singal]c:outstd_logic);endexam;端口是一种有方向的信号。即输出端口不能读出数据,只能写入数据;输入端口不能写入。信号本身无方向,可写可读。信号定义:SIGNAL信号名:数据类型[:=初始值];第5章VHDL设计入门二、数据对象3)常量(CONSTANT)常量(CONSTANT)用来存储某种指定类型的特定数值。常用于使程序更容易阅读和修改。例如,将位矢的宽度定义为一个常量,只要修改这个常量就能很容易地改变宽度,从而改变硬件结构。定义方式:CONSTANT常量名:数据类型:=表达式;常量的使用范围取决于它被定义的位置。定义在设计实体中的常量,其有效范围为这个实体定义的所有的结构体;定义在设计实体的某一结构体中的常量,则只能用于此结构体;定义在结构体的某一单元的常量,如一个进程中,则这个常量只能用在这一进程中。第5章VHDL设计入门二、数据对象4)信号和变量的区别归纳起来,信号与变量的区别主要有以下几点:(1)值的代入形式不同,信号值的代入采用符号“=”,而变量的赋值语句为“:=”。(2)信号是全局量,是一个实体内部各部分之间以及实体之间(实际上端口PORT被默认为信号)进行通信的手段;而变量是局部量,只允许定义并作用于进程和子程序中。变量须首先赋值给信号,然后由信号将其值带出进程或子程序。第5章VHDL设计入门二、数据对象(3)操作过程不相同。在变量的赋值语句中,该语句一旦执行,其值立刻被赋予新值。在执行下一条语句时,该变量的值就用新赋的值参与运算;而在信号赋值语句中,该语句虽然已被执行,但新的信号值并没有被立即代入,需要有一定的延时。因而下一条语句执行时,仍可能使用原来的信号值。在结构体的并行部分,若信号被赋值一次以上,则编译器将给出错误报告,指出同一信号出现了两个驱动源。进程中,若对同一信号赋值超过两次,则编译器将给出警告,指出只有最后一次赋值有效。第5章VHDL设计入门二、数据对象注意:在信号赋值中,若在同一进程中,同一信号赋值目标有多个赋值源时,信号赋值目标获得的是最后一个赋值源的赋值,其前面相同的赋值目标不作任何变化。SIGNALS1,S2:STD_LOGIC;SIGNALSVEC:STD_LOGIC_VECTOR(0TO7);```PROCESS(S1,S2)VARIABLEV1,V2:STD_LOGIC;BEGINV1:=”1”;--立即将V1置位为1V2:=”1”;--立即将V2置位为1S1=”1”;--S1被赋值为1第5章VHDL设计入门二、数据对象S2=”1”;--因S2不是最后一个赋值语句,故不作任何赋值操作SVEC(0)=V1;--将V1在上面的赋值1,赋给SVEC(0)SVEC(1)=V2;--将V2在上面的赋值1,赋给SVEC(1)SveC(2)=S1;--将S1在上面的赋值1,赋给SVEC(2)SVEC(3)=S2;--将最下面的赋于S2的值”0”,赋给SVEC(3)V1:=”0”;--将V1置入新值0V2:=”0”;--将V2置入新值0S2=”0”;--S2最后一次将赋值的”0”将上面准备赋入的”1”覆盖掉SVEC(4)=V1:--将V1在上面的赋值0,赋给SVEC(4)SVEC(5)=V2;--将V2在上面的赋值0,赋给SVEC(5)SVEC(6)=S1;--将S1在上面的赋值1,赋给SVEC(6)SVEC(7)=S2;--将S2在上面的赋值0,赋给SVEC(7)ENDPROCESS;第5章VHDL设计入门三、数据类型VHDL是一种强类型语言,要求设计实体中的每一个常数、信号、变量、函数及设定的各种参量都必须具有确定的数据类型,相同数据类型的量才能互相传递和作用。VHDL作为强类型语言的好处是使VHDL编译或综合工具很容易地找出设计中的各种常见错误。。第5章VHDL设计入门三、数据类型标量型(SCALARTYPE):属单元素的最基本的数据类型,通常用于描述一个单值数据对象,它包括实数类型、整数类型、枚举类型和时间类型。复合类型(COMPOSITETYPE):可以由细小的数据类型复合而成,如可由标量复合而成。复合类型主要有数组型(ARRAY)和记录型(RECORD)。存取类型(ACCESSTYPE):存取类型实质上是指针类型为给定的数据类型的数据对象提供存取方式。文件类型(FILESTYPE):用于提供多值存取类型。这四大数据类型又可分成在已有程序包中可以随时获得的预定义数据类型和用户自定义数据类型两个类别。预定义的VHDL数据类型是VHDL最常用的、最基本的数据类型。这些数据类型都已在VHDL的标准程序包STANDARD和STD_LOGIC_1164及其他的标准程序包作了定义,可在设计中随时调用。第5章VHDL设计入门三、数据类型1)VHDL的预定义数据类型(1)布尔(BOOLEAN)数据类型布尔数据类型实际上是一个二值枚举型数据类型,它的取值有FALSE和TRUE两种。(2)位(BIT)数据类型位数据类型也属于枚举型,取值只能是1或0。(3)位矢量(BIT_VECTOR)数据类型。位矢量只是基于BIT数据类型的数组,使用位矢量必须注明位宽,即数组中的元素个数和排列,例如:SIGNALA:BIT_VECTO