1、VHDL字符及数据类型,1,VHDL词法规则与标识符VHDL语言的数据类型,VHDL的语言要素,作为硬件描述语言的基本结构元素,主要有:数据对象数据类型各类操作数及运算操作符,VHDL词法规则与标识符,而这些基本元素都是由VHDL文字组成,而VHDL文字主要包括词法构成(注释,数字,字符(串),下标)和标识符。,词法规则 注释 为了提高VHDL源程序的可读性,在VHDL中可以写入注释。 注释以- -开头直到本行末尾的一段文字。在quartus中可以看见,敲入- -之后,后面字体的颜色就发生改变。 注释不是VHDL设计描述的一部分,编译后存入数据库中的信息不包含注释。,注释举例: Q:OUT S
2、TD_LOGIC_VECTOR( 0 TO 11 );-A/D转换数据输出显示(行注释)-SRAM 数据写入控制状态机(段注释) WRIT_STATE:PROCESS(clk,rst)-SRAM写入控制状态机时序电路进程,数字型文字可以有多种表达方式:可以是十进制数,也可以表示为二进制、八进制或十六进制等为基的数,可以是整数,也可以是含有小数点的浮点数。,数字,十进制整数表示法:如: 012 5 78_456 (=78456) 2E6在相邻数字之间插入下划线,对十进制数值不产生影响,仅仅是为了提高文字的可读性。允许在数字之前冠以若干个0,但不允许在数字之间存在空格。,以基表示的数:用这种方式表
3、示的数由五个部分组成。第一部分,用十进制数标明数值进位的基数;第二部分,数值隔离符号“#”;第三部分,表达的文字;第四部分,指数隔离符号“#”; 第五部分,用十进制表示的指数部分,这一部分的数如 果为0可以省去不写。,SIGNAL d1,d2,d3,d4,d5: INTEGER RANGE 0 TO 255; d1 = 10#170# ; - (十进制表示,等于 170) d2 = 16#FE#; - (十六进制表示,等于 254) d3 =2#1111_1110#; -(二进制表示,等于 254) d4 = 8#376#; - (八进制表示,等于 254) d5 = 16#E#E1 ; -
4、(十六进制表示,等于2#1110000#,等于224),实数:实数必须带有小数点。如: 12.0 0.0 3.14 6_741_113.666 52.6 E-2 物理量文字:综合器不支持物理量文字的综合。如: 60 s(秒) 100 m (米) 10 A(安培),字符和字符串字符用单引号引起来的ASC字符,可以是数值,也可以是符号或字母。如: E, e, $, 23, A 字符串一维的字符数组,需放在双引号中。有两种类型的字符串:文字字符串和位矢量字符串。文字字符串是用双引号引起来的一串文字。如: “FALSE”, “X”, “THIS IS END”,位矢量字符串被双引号引起来的扩展的数字序
5、列,数字序列前冠以基数说明符。基数符有“B”、“O”、“X”,他们的含义如下。 B:二进制基数符号,表示二进制位0或1,在字符串中每一个位表示一个BIT。 O:八进制基数符号,在字符串中每一个数代表一个八进制数,即代表一个3位(BIT)的二进制数。 X:十六进制基数符号,代表一个十六进制数,即代表一个4位二进制数。 例如: B“1011_1111”, O“152”, X“F821”,下标名下标名用于指示数组型变量或信号的某一元素。 SIGNAL a,b:BIT _VECTOR(0 TO 3); SIGNAL s:INTEGER RANGE 0 TO 2; SIGNAL x,y:BIT; x =
6、 a (s); y = b (3);上例中,a (s)为一下标语句,s是不可计算的下标名,只能在特定情况下进行综合;b (3)的下标为3,可以进行综合。,s,3 均为下标!,标识符是最常用的操作符,可以是常数、变量、信号、端口、子程序或参数的名字。标识符规则是VHDL语言中符号书写的一般规则,为EDA工具提供了标准的书写规范。VHDL87版本标识符为短标识符VHDL93版标识符为扩展标识符。,标识符,短标识符 VHDL短标识符需遵守以下规则:必须以英文字母开头;英文字母、数字(09)和下划线都是有效的字符;短标识符不区分大小写;下划线(_)的前后都必须有英文字母或数字。,一般的,在书写程序时,
7、应将VHDL的保留字大写或黑体,设计者自己定义的字符小写,以使得程序便于阅读和检查。尽管VHDL仿真综合时不区分大小写,但一个优秀的硬件程序设计师应该养成良好的习惯。,例: 合法的标识符: S_MACHINE,present_state,sig3 不合法的标识符: present-state,3states,cons_,_now , entity , _sig,为什么它们是不合法的?,扩展标识符扩展标识符的识别和书写有下面的规则: 用反斜杠来界定扩展标识符如 control_machine,s_block 等都是合法的扩展标识符 扩展标识符允许包含图形符号和空格如 s&33,legal$sta
8、te 是合法的扩展标识符,两个反斜杠之间的字可以和保留字相同如 SIGNAL,ENTITY 是合法的标识符,与SIGNAL、ENTITY是不同的;,两个反斜杠之间的标识符可以用数字开头如 15BIT,5ns是合法的; 扩展标识符是区分大小写的如 a 与 A 是不同的标识符; 扩展标识符允许多个下划线相邻如 our_ _entity 是合法的扩展标识符(不推荐这种方式); 扩展标识符的名字中如果含有一个反斜杠,则用相邻的两个反斜杠来代表它 如 texe 表示该扩展标识符的名字为 texe (共5个字符);,VHDL语言的数据类型,在对VHDL的客体进行定义时,都要指定其数据类型。VHDL有多种标
9、准的数据类型,并且允许用户自定义数据类型。在VHDL语言语义约束中,对类型的要求赋值语句的目标与源的一致;表达式中操作的一致子类型中约束与类型的一致等许多方面。,数据类型分类,标量型(Scalar Type),复合类型(Composite Type),存取类型(Access Type),文件类型(Files Type),预定义类型在VHDL标准程序包STANDARD中定义,在应用中自动包含进VHDL的源文件,不需要USE语句显示调用。,VHDL中预定义的数据类型,数据类型说明如下,整数与数学中整数的定义相似,可以使用预定义运算操作符,如加“”、减“-”、乘“”、除“”进行算术运算。在VHDL语
10、言中,整数的表示范围为 -21474836472147483647,即从-(231-1)到(231-1)。,在进行算法研究或实验时,作为对硬件方案的抽象手段,常常采用实数四则运算。实数的定义值范围为-1.0E+38+1.0E+38。实数有正负数,书写时一定要有小数点。例如:-1.0,+2.5,-1.0E+38,整数(INTEGER),实数(REAL),位(BIT),用来表示数字系统中的信号值。位值用字符0或者1(将值放在引号中)表示。与整数中的1和0不同,1和0仅仅表示一个位的两种取值。位数据可以用来描述数字系统中总线的值。位数据不同于布尔数据,可以用转换函数进行转换。,位矢量是用双引号括起来
11、的一组数据。例如:“001100”,X“00bb”。在这里位矢量前面的X表示是十六进制。用位矢量数据表示总线状态最形象也最方便,在VHDL程序中将会经常遇到。使用位矢量时必须注明位宽,即数组中元素个数和排列. 例如:SIGNAL s1:BIT_VECTOR(15 DOWNTO 0);,位矢量(BIT_VECTOR),一个布尔量具有两种状态,“真”或者“假”。虽然布尔量也是二值枚举量,但它和位不同没有数值的含义,也不能进行算术运算。它能进行关系运算。例如,它可以在if语句中被测试,测试结果产生一个布尔量TRUE或者FALSE。,字符也是一种数据类型,所定义的字符量通常用单引号括起来,如a。一般情
12、况下VHDL对大小写不敏感,但对字符量中的大小写则认为是不一样的。例如,B不同于b。,布尔量(BOOLEAN),字符(CHARACTER),字符量中的字符可以是从a到z中的任一个字母,从0到9中的任一个数以及空格或者特殊字符,如$,%等等。包集合standard中给出了预定义的128个ASC码字符,不能打印的用标识符给出。字符1与整数1和实数1.0都是不相同的,当要明确指出1的字符数据 时,则可写为:CHARACTER( 1)。,字符串是由双引号括起的一个字符序列,也称字符矢量或字符串组。字符串常用于程序的提示和说明。 字符串举例如下:VATIABLE string_1 : STRING (0
13、TO 3);string_1:= “a b c d”;,时间是一个物理量数据。完整的时间量数据应包含整数和单位两部分,而且整数和单位之间至少应留一个空格的位置。例如55 sec,2 min等。,时间(TIME),字符串(STRING),在包集合STANDARD中给出了时间的预定义,其单位为fs,ps,ns,s,ms,sec,min和hr。例如:20 s,100 ns,3 sec。在系统仿真时,时间数据特别有用,用它可以表示信号延时,从而使模型系统能更逼近实际系统的运行环境。,错误等级类型数据用来表征系统的状态,共有4种:note(注意),warning(警告),error(出错),failur
14、e(失败)。在系统仿真过程中可以用这4种状态来提示系统当前的工作情况,从而使设计人员随时了解当前系统工作的情况,并根据系统的不同状态采取相应的对策。,错误等级(SEVERITY LEVEL),这两种数据是整数的子类,NATURAL类数据为取0和0以上的正整数;而POSITIVE 则只能为正整数。,上述10种数据类型是VHDL语言中标准的数据类型,在编程时可以直接引用。 如果用户需使用这10种以外的数据类型,则必须进行自定义。但大多数的CAD厂商已在包集合中对标准数据类型进行了扩展。 例如,数组型数据等,请同学们注意。,大于等于零的整数NATURAL),正整数(POSITIVE),标准化数据类型
15、IEEE93增加了多值逻辑包STD_LOGIC_1164,使得“STD_LOGIC”数据具有9种不同的值。 其定义如右所示:,IEEE预定义标准,TYPE STD_LOGIC IS (U, - - 初始值X, - - 不定0, - - 01, - - 1Z, - - 高阻W, - - 弱信号不定L, - - 弱信号0H, - - 弱信号1 - - 不可能情况);,有符号数和无符号数,在ieee库中有一个名为std_logic_arith的包集,其中包括有符号数(signed)和无符号数(unsigned )例 SIGNAL x: signed(7 DOWNTO 0);SIGNAL y: sig
16、ned( 0 TO 7 );注意:signed 和unsigned的合法和非法运算,同时和标准逻辑位和逻辑位矢量一样,应用前必须进行包声明。,可以由用户定义的数据类型有: 枚举(ENUMERATED)类型;,用户自定义的数据类型,TYPE bit IS (0,1);,TYPE state IS (idle, forward, backward, stop);,TYPE bit_vector IS ARRAY( NATURAL RANGE) OF BIT;,TYPE my_logic IS (0,1,z);,TYPE color IS (red, green, blue, white);,整数(
17、INTEGER)类型,TYPE integer IS RANGE -2147483647 TO+ 2147483647,TYPE natural IS RANGE 0 TO + 2147483647,TYPE my_integer IS RANGE -32 TO + 32,TYPE student_grade IS RANGE 0 TO 100,子类型,在原有的已定义数据类型基础上加上一些约束条件,可以定义数据类型的子类型。,SUBTYPE natural IS INTEGER RANGE 0 TO INTEGERS HIGH;,SUBTYPE my_color IS color RANGE
18、red TO blue;,SUBTYPE my_logic IS STD_lOGIC RANGE 0 TO z;,数组(ARRAY)类型,数组(array)是将相同数据类型的数据结合在一起形成的一种新的数据类型,它可以是一维的,也可以是二维的。,数组定义语句格式如下: TYPE 数组名 IS ARRAY (数组范围)OF 数据类型 ;,TYPE row IS ARRAY(7 DOWNTO 0 ) OF STD_LOGIC -一维数组,TYPE matrix IS ARRAY(0 TO 2 ) OF row -1*1维数组,TYPE matrix IS ARRAY(0 TO 2 ) OF STD
19、_LOGIC_VECTOR(7 DOWNTO 0) -1*1维数组,TYPE matrix IS ARRAY(0 TO 3,7 DOWNTO 0 ) OF STD_LOGIC -二维数组,0 1 0 0 0 1 1 1,0 1 0 0 0 1 1 1,0 1 0 1 0 1 0 0,1 0 0 1 1 0 1 0,1D*1D数组,1D数组,2D数组,端口数组类型,由于预定义的数据类型都没有超过一维。然而在定义电路的输入输出端口时,又是需要把端口定义为矢量阵列,而在entity中不允许使用TYPE进行类型定义,所以必须在包集合中进行设计。,LIBRARY IEEE; USE IEE.STD_LO
20、GIC_1164.ALL; PACKAGE my_data_types ISTYPE vector_array is ARRAY(NATIRAL) OFSTD_LOGIC_VECTOR(7 DOWNTO 0);END my_data_types,在包集合中定义了端口数组类型,LIBRARY IEEE; USE IEE.STD_LOGIC_1164.ALL; USE IEE.work.my_data_types.ALL; ENTITY mux ISPORT( inp:IN vector_array(0 TO 3); );END mux;,在实体中声明端口数组类型,记录(RECORDE)类型,记录
21、类型和数组类型有些相似,RECORD类型内部可以包含不同类型的数据,而ARRAY只能包含相同类型的数据。,例TYPE birthday IS RECORDday: INTEGER RANGE 1 TO 31month:month_name;END RECORD;,定义记录数据类型,用函数进行类型转换,VHDL语言中,程序包中提供了变换函数,这些程序包有3种,每个程序包中的变换函数不一样。现列表如下。,STD_LOGIC_1164包集合函数函数 TO_ STDLOGICVECTOR(A):-由BIT_VECTOR转换为STD_LOGIC_VECTOR函数 TO_ BITVECTOR(A): -由
22、STD_LOGIC_VECTOR转换为BIT_VECTOR函数 TO_ STDLOGIC(A): -由BIT转换为STD_LOGIC 函数 TO_ BIT(A): -由STD_LOGIC转换为BIT,STD_LOGIC_ARITH包集合函数函数:CONV_STD_LOGIC_VECTOR (A,位长) :-由UNSINGED,SINGED转换为 STD_LOGIC_ UNSINGED包集合函数:CONV_INTEGER (A):-由STD_LOGIC_VECTOR转换为INTEGER STD_LOGIC_ UNSINGED包集合 函数:CONV_INTEGER (A) :-由INTEGER,U
23、NSINGED,SINGED转换为 STD_LOGIC_VECTOR,类型标记就是类型的名称。类型标记法适合那些关系密切的标量类型之间的类型转换,即整数和实数的类型转换。 例如: VARIABLE I:INTEGER; VARIABLE R:REAL;I := INTEGER(R);R := REAL(I);,类型标记法实现类型转换,就模拟效率而言,利用常数实现类型转换比利用类型转换函数的效率更高。下面的例子使用常数把类型为STD_LOGIC的值转换为BIT型的值。,常数实现类型转换,例: LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL; ENTITY typeconv IS END;,ARCHITECTURE arch OF typeconv ISTYPE typeconv_type IS ARRAY(STD_ULOGIC)OF BIT; CONSTANT typecon_con:typeconv_type:=(0/L=0,1/H =1,OTHERS=0);SIGNAL b:BIT; SIGNAL b:BIT; SIGNAL s:STD_ULOGIC; BEGINb= typecon_con (s);,