VHDL语言与其它计算机高级语言一样,也有自己的文字规则,而且由于VHDL语言在设计和仿真中都是采用源文件方式引用,因此可以更清晰观察其文字规则的使用。如在使用IEEE库中std_ulogic类型时,可以打开std_logic_1164文件观察到 std_ulogic类型定义如下:
type std_ulogic is ( 'U', -- Uninitialized 'X', -- Forcing Unknown '0', -- Forcing 0 '1', -- Forcing 1 'Z', -- High Impedance 'W', -- Weak Unknown 'L', -- Weak 0 'H', -- Weak 1 '-' -- Don't care );
在此基础上又定义了std_logic类型,resolved 函数等,确定了该类型的使用规则。因此学习VHDL语言不仅能学习VHDL语言规则及使用,随着理解的深入还能系统掌握VHDL语言的这些语言规则的构成,正所谓知其然,知其所以然。下面就VHDL语言文字规则详细介绍,在学习和实践中掌握这些规则后并在编程中遵循规则,才能写出优质的代码。VHDL语言具有类似于计算机高级语言编程的一般文字规则外, 还包含特有的文字规则和表达方式 。VHDL 文字(Literal)主要包括数值和标识符。
1. 数值型文字表达方式
数值型文字所描述的值主要有数字型 ,字符串型 ,位适量型。
- 数字型文字
数字型文字的值有多种表达方式 ,现列举如下:- 整数文字
整数文字都是十进制的数, 如 5 ,678 ,0 ,156E2(=15600), 45_234_287 (=45234287)。数字间的下划线仅仅是为了提高文字的可读性 相当于一个空的间隔符,而没有其它的意义,因而不影响文字本身的数值。
-
- 实数文字
实数文字也都是十进制的数 ,但必须带有小数点。 如 188.993 ,88_670_551.453_909(=88670551.453909) ,1.0,44.99E-2(=0.4499) ,1.335, 0.0等。
-
- 以数制基数表示的文字
用数制基数表示的数由五个部分组成:
-
-
- 第一部分用十进制数标明数制进位的基数,
- 第二部分为数制隔离符号 # ,
- 第三部分为表达的文字,
- 第四部分为指数隔离符号 #,
- 第五部分用十进制表示的指数部分,
- 这一部分的数如果为 0 可以省略不写。
-
例:
SIGNAL d1,d2,d3,d4,d5 : INTEGER RANGE 0 TO 255;
d1 <= 110#170# ; — (十进制表示 等于 170)
d2 <= 16#FE# ; — (十六进制表示 等于 254)
d3 <= 2#1111_1110#; — (二进制表示 等于 254)
d4 <= 8#376# ; — (八进制表示 等于 254)
d5 <= 16#E#E1 ; — (十六进制表示 等于 2#1110000# 等于 224)
- 物理量文字
如:60s (60 秒) ,100m (100 米),kohm(千欧姆), 177A (177 安培)等。这些带有单位的物理量都有明确的含义,但在数字逻辑设计时,往往不能实现,除非写支持函数来实现。但在仿真与验证时时可以较好的支持。
2. 字符及字符串型文字
- 字符型
字符是用单引号扩起来的ASCII 字符, 可以是数值也可以是符号或字母 。如’R’, ‘a’ ,’*’,’Z’, ‘U’ ,’0’, ’11’, ‘-‘ ‘,L’等。如可用字符来定义一个新的数据类型 STD_ULOGIC 如下:
TYPE STD_ULOGIC IS ( ‘U’,’X’ ,’0’, ‘1’,’Z’, ‘W’ ,’L’ ,’H’ ,’-‘ ) ; (注: 这种在括号内有顺序的数据类型为枚举型,也就是列举所有可能的类型,索引顺序从左到右)。
entity vhdl_tb is -- Port ( ); end vhdl_tb; architecture test_and_logic of vhdl_tb is signal test_a,test_b,result_c: bit; component top_logic generic ( WIDTH_IN : integer; WIDTH_OUT: integer ); port( a : in bit; b : in bit; c : buffer bit ); end component; begin test_a<='1'; test_b<='0'; top_logic_inst : top_logic generic map ( WIDTH_IN =>4, WIDTH_OUT =>4 ) port map( a =>test_a, b =>test_b, c =>result_c ); end test_and_logic;
- 字符串型
字符串型则是一维的字符数组 ,使用时需放在双引号中 。VHDL语言中有两种类型的字符串分别为 文字字符串和数位字符串。
-
- 文字字符串
文字字符串是用双引号引起来的一串文字, 如:”ERROR”, “Both S and Q equal to 1″, “X” ,”BB$CC”等。文字字符串如果可以正确解释为数字,也可以作为数位字符串使用,如”ab87″,如果在赋值语句中,左边为bit_vector或std_logic_vector,编译器会自动推断为16进制数,但此时不能使用”_”座位数字的分隔符,因为”_”也是文字字符串的一个部分,系统无法正确解释为数字。
-
- 数位字符串
数位字符串也称位矢量字符串, 是预定义的数据类型Bit的一位数组。数位字符串与文字字符串相似, 但所代表的是二进制, 八进制或十六进制的数组。 它们所代表的位矢量的长
度即为等值的二进制数的位数。 字符串数值的数据类型是一维的枚举型数组 。与文字字符串表示不同, 数位字符串的表示首先要有计算基数, 然后将该基数表示的值放在双引号中,基数符以”B” “O”和”X”表示, 并放在字符串的前面, 它们的含义分别是:
B :二进制基数符号。其含义是字符串中每位表示一个 Bit,其含义为二进制 0 或 1 。
O: 八进制基数符号。其含义是字符串中的每一个数代表一个八进制数, 即代表一个 3位(BIT)的二进制数。
X: 十六进制基数符号。其含义是字符串中的每一个字符 代表一个十六进制数, 即一个 4 位的二进制数。
例如:
data1 <= B”1_1101_1110″ ; — 二进制数位矢量,位矢数组长度是 9。
data2 <= O”15″ ; — 八进制数数组 位矢数组长度是 6
data3 <= X”AD0″ ; — 十六进制数数组 位矢数组长度是 12
data4 <= B”101_010_101_010″ ; — 二进制数数组 位矢数组长度是 12