VHDL 的预定义数据类型都是在 VHDL 标准程序包 STANDARD 中定义的 ,在实际使用中已自动包含进 VHDL 的源文件中, 因而不必通过 USE 语句以显式调用。那么预定义类型有哪些呢?下面以分类的方式介绍这些数据类型,并介绍对应的操作符号或函数。
1. 布尔(BOOLEAN)数据类型
程序包 STANDARD库 中定义的源代码如下:
TYPE BOOLEAN IS (FALSE, TRUE);
- BOOLEAN的值
布尔数据类型实际上是一个二值枚举型数据类型 ,它的取值如以上的定义所示。 即FALSE(假)和 TRUE(真)两种。 综合器将用一个二进制位表示 BOOLEAN 型变量或信号的值,如0表示FALSE,1表示TRUE。根据枚举型定义的特点,如果声明的变量没有初值,默认初值为FALSE。 - BOOLEAN运算
布尔量不属于数值, 因此不能用于算数运算 ,但boolean型变量可以用于逻辑及关系运算。
用于boolean型的变量的逻辑运算有与(and)、或(or) 、非(not)、与非(nand)、或非(nor)、异或(xor)、异或非(xnor),返回值是boolean类型。
用于boolean型的变量的逻辑运算有: =(等于)、/=(不等)、<(小于)、<=(小于等于)、>(大于)、>=(大于等于),返回值是boolean类型。
例如 :当 a 大于 b 时 在 IF 语句中的关系运算表达式 (a>b) 的结果是布尔量 TRUE,反之为 FALSE 。综合器将其变为 1 或 0 信号值 ,对应于硬件系统中的连线值或端口值。布尔数据与位数据类型可以用转换函数相互转换。
2. 位(BIT)数据类型
- BIT 数据类型定义
位数据类型属于枚举型, 取值只能是 ‘1’ 或者 ‘0’ 位数据类型的数据对象, 如变量、信号常量等。 声明为BIT数据类型的数据对象可参与逻辑运算 ,运算结果仍是位的数据类型。 VHDL 综合器用一个二进制位表示。 BIT 在程序包 STANDARD 中定义的源代码是:
TYPE BIT IS ( ‘0’, ‘1’ );
可见BIT数据类型是由字符’0′, ‘1’ 组成的2值枚举类型。因此BIT类型的数据对象,在特定的时刻只能取’0’或’1’中的一个。
- BIT数据类型的运算
用于BIT型的变量的逻辑运算有与(and)、或(or) 、非(not)、与非(nand)、或非(nor)、异或(xor)、异或非(xnor),返回值是bit类型。
用于BIT型的变量的关系运算有: =(等于)、/=(不等)、<(小于)、<=(小于等于)、>(大于)、>=(大于等于),返回值是boolean类型。
- BIT类型矢量(数组)
以BIT类型为基本要素可以定义BIT数组,也即是位矢量类型(BIT_VECTOR)。位矢量类型在程序包 STANDARD 中定义的源代码是:
TYPE BIT_VECTOR IS ARRAY (Natural Range <> ) OF BIT ;
使用位矢量必须注明位宽, 即数组中的元素个数和排列。 例如:
SIGNAL a : BIT_VECTOR(7 DOWNTO 0) ; –信号 a 被定义为一个具有 8 位宽的矢量,它的最左位是 a(7) 最右位是 a(0)。
SIGNAL b : BIT_VECTOR(0 TO 7) ; –信号 b 被定义为一个具有 8 位宽的矢量,它的最左位是 b(0) 最右位是 a(7)。
- BIT_VECTOR的运算
由于BIT_VECTOR是BIT类型的矢量(数组)因此也遵循BIT类型的运算,即:
逻辑运算: 与(and)、或(or) 、非(not)、与非(nand)、或非(nor)、异或(xor)、异或非(xnor),返回值是BIT_VECTOR类型。
关系运算: =(等于)、/=(不等)、<(小于)、<=(小于等于)、>(大于)、>=(大于等于),返回值是boolean类型。
除此之外在VHDL2008 还定义如下的重载函数用于扩展BIT_VECTOR矢量运算:
function "and" (l, r: bit_vector) return bit_vector; --l-> left, r-> right function "or" (l, r: bit_vector) return bit_vector; function "nand" (l, r: bit_vector) return bit_vector; function "nor" (l, r: bit_vector) return bit_vector; function "xor" (l, r: bit_vector) return bit_vector; function "xnor" (l, r: bit_vector) return bit_vector; -- 基本逻辑运算,要求左右变量的位宽相等。不相等位宽的矢量运算可以由并位操作符“&”帮助实现 function "not" (anonymous: bit_vector) return bit_vector; --按位取反 function "and" (l: bit_vector; r: bit) return bit_vector; function "and" (l: bit; r: bit_vector) return bit_vector; function "or" (l: bit_vector; r: bit) return bit_vector; function "or" (l: bit; r: bit_vector) return bit_vector; function "nand" (l: bit_vector; r: bit) return bit_vector; function "nand" (l: bit; r: bit_vector) return bit_vector; function "nor" (l: bit_vector; r: bit) return bit_vector; function "nor" (l: bit; r: bit_vector) return bit_vector; function "xor" (l: bit_vector; r: bit) return bit_vector; function "xor" (l: bit; r: bit_vector) return bit_vector; function "xnor" (l: bit_vector; r: bit) return bit_vector; function "xnor" (l: bit; r: bit_vector) return bit_vector; --重载函数(overloaded function),用于实现BIT与BIT_Vector之间的运算 function "and" (anonymous: bit_vector) return bit; function "or" (anonymous: bit_vector) return bit; function "nand" (anonymous: bit_vector) return bit; function "nor" (anonymous: bit_vector) return bit; function "xor" (anonymous: bit_vector) return bit; function "xnor" (anonymous: bit_vector) return bit; -- 规约运算符,将Bit_Vector中的每位参与逻辑运算,返回bit类型。 function "sll" (l: bit_vector; r: integer) return bit_vector; function "srl" (l: bit_vector; r: integer) return bit_vector; function "sla" (l: bit_vector; r: integer) return bit_vector; function "sra" (l: bit_vector; r: integer) return bit_vector; function "rol" (l: bit_vector; r: integer) return bit_vector; function "ror" (l: bit_vector; r: integer) return bit_vector; -- 移位运算符, -- function "=" (l, r: bit_vector) return boolean; -- function "/=" (l, r: bit_vector) return boolean; -- function "<" (l, r: bit_vector) return boolean; -- function "<=" (l, r: bit_vector) return boolean; -- function ">" (l, r: bit_vector) return boolean; -- function ">=" (l, r: bit_vector) return boolean; -- 关系运算符 function "?=" (l, r: bit_vector) return bit; function "?/=" (l, r: bit_vector) return bit; -- function "&" (l: bit_vector; r: bit_vector) return bit_vector; -- function "&" (l: bit_vector; r: bit) return bit_vector; -- function "&" (l: bit; r: bit_vector) return bit_vector; -- function "&" (l: bit; r: bit) return bit_vector; --并位运算符及重载函数 -- -- function minimum (l, r: bit_vector) return bit_vector; -- function maximum (l, r: bit_vector) return bit_vector; --最大值,最小值,返回bit_Vector类型 -- function minimum (l: bit_vector) return bit; -- function maximum (l: bit_vector) return bit; -- -- function to_string (value: bit_vector) return string; -- 将bit_vector中的位串转换成0,1组合的二进制字符串, alias to_bstring is to_string [bit_vector return string]; alias to_binary_string is to_string [bit_vector return string]; --to_string函数的别名 function to_ostring (value: bit_vector) return string; -- 将bit_vector 转换成8进制字符串 alias to_octal_string is to_ostring [bit_vector return string]; --to_ostring的别名函数 function to_hstring (value: bit_vector) return string; -- 将bit_vector 转换成16进制字符串 alias to_hex_string is to_hstring [bit_vector return string]; -- to_hstring的别名函数
在后续章节中会详细介绍这些函数的使用。
4. 字符(CHARACTER)类型
为了处理文字信息,以及编解码的格式统一,计算机语言往往提供标准ASCII表,由于数字与字符的转换。VHDL语言提供字符类型,其含义及用法与ASCII表一致,只是这里叫法不同。字符类型通常用单引号引起来 ,如’A’ 、’a’、’B’、’b’、’0’等。字符类型区分大小写 ,如’B’不同于’b’,也就是单引号内的字符是区分大小写的。
type character is ( NUL, SOH, STX, ETX, EOT, ENQ, ACK, BEL, BS , HT , LF , VT , FF , CR , SO , SI , DLE, DC1, DC2, DC3, DC4, NAK, SYN, ETB, CAN, EM , SUB, ESC, FSP, GSP, RSP, USP, ' ', '!', '"', '#', '$', '%', '&', ''', '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', DEL, C128, C129, C130, C131, C132, C133, C134, C135, C136, C137, C138, C139, C140, C141, C142, C143, C144, C145, C146, C147, C148, C149, C150, C151, C152, C153, C154, C155, C156, C157, C158, C159, ' ', '¡', '¢', '£', '¤', '¥', '¦', '§', '¨', '©', 'ª', '«', '¬', '' , '®', '¯', '°', '±', '²', '³', '´', 'µ', '¶', '·', '¸', '¹', 'º', '»', '¼', '½', '¾', '¿', 'À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', '×', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'Þ', 'ß', 'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ð', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', '÷', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'þ', 'ÿ' );
在standard库中对字符有如下预定义函数:
-- The predefined operations for this type are as follows: -- function "=" (l, r: character) return boolean; -- function "/=" (l, r: character) return boolean; -- function "<" (l, r: character) return boolean; -- function "<=" (l, r: character) return boolean; -- function ">" (l, r: character) return boolean; -- function ">=" (l, r:character) return boolean; -- -- function minimum (l, r: character) return character; -- function maximum (l, r: character) return character; -- -- function to_string (value: character) return string;
5. 整数(INTEGER)类型
整数代表正整数 、负整数和零组成。 整数类型可以使用预定义的运算操作符 如加 (+)、 减(-)、 乘( *)、 除 (/) 等进行算术运算。在standard库中定义的格式为:
type integer is range -2147483647 to 2147483647;
在 VHDL中整数的取值范围是 -2147483647~ 2147483647 ,即可用32 位有符号的二进制数表示 。在实际应用中VHDL 仿真器通常将 INTEGER 类型作为有符号数处理。 而VHDL综合器则将 Integer作为无符号数处理。 在使用整数时 ,VHDL 综合器要求用 RANGE 子句为所定义的数限定范围, 然后根据所限定的范围来决定表示此信号或变量的二进制数的位数 ,因为VHDL 综合器无法综合未限定范围的整数类型的信号或变量。如下面语句:
SIGNAL i : INTEGER RANGE 0 TO 15 ;
上面的整数i 的取值范围是 0 -15 共 16 个值 ,可用 4 位二进制数来表示 因此 i将被综合成由四条信号线构成的总线式信号,整数常量的书写方式示例如下:
- 无进制指示的数
无进制指示的数表示为十进制数,如:
2 ,0 ,77459102,10E4 等都表示十进制数
- 有明确进制指示符
有明确进制指示符的数按照进制指示符解释数据,如:
16#D2# 十六进制整数 D2
8#720# 八进制整数720,
2#11010010# 二进制整数 11010010
- 整数类型运算
正数类型有如下运算:
-- The predefined operations for this type are as follows: -- function "=" (l, r: integer) return boolean; -- function "/=" (l, r: integer) return boolean; -- function "<" (l, r: integer) return boolean; -- function "<=" (l, r: integer) return boolean; -- function ">" (l, r: integer) return boolean; -- function ">=" (l, r: integer) return boolean; -- -- function "+" (anonymous: integer) return integer; -- function "-" (anonymous: integer) return integer; -- function "abs" (anonymous: integer) return integer; -- -- function "+" (l, r: integer) return integer; -- function "-" (l, r: integer) return integer; -- function "*" (l, r: integer) return integer; -- function "/" (l, r: integer) return integer; -- function "mod" (l, r: integer) return integer; -- function "rem" (l, r: integer) return integer; -- -- function "**" (l: integer; r: integer) return integer; -- -- function minimum (l, r: integer) return integer; -- function maximum (l, r: integer) return integer; -- -- function to_string (value: integer) return string;
- 整数类型矢量
整数类型也可以组合形成矢量,在STD库中定义的格式如下:
type integer_vector is array (natural range <>) of integer;
-
- 整数矢量运算
整数矢量的运算函数如下:
-- The predefined operations for these types are as follows: -- function "=" (l, r: integer_vector) return boolean; -- function "/=" (l, r: integer_vector) return boolean; -- function "<" (l, r: integer_vector) return boolean; -- function "<=" (l, r: integer_vector) return boolean; -- function ">" (l, r: integer_vector) return boolean; -- function ">=" (l, r: integer_vector) return boolean; -- -- function "&" (l: integer_vector; r: integer_vector) return integer_vector; -- function "&" (l: integer_vector; r: integer) return integer_vector; -- function "&" (l: integer; r: integer_vector) return integer_vector; -- function "&" (l: integer; r: integer) return integer_vector; -- -- function minimum (l, r: integer_vector) return integer_vector; -- function maximum (l, r: integer_vector) return integer_vector; -- -- function minimum (l: integer_vector) return integer; -- function maximum (l: integer_vector) return integer;
6. 自然数(NATURAL)和正整数(POSITIVE)数据类型
自然数是整数的一个子类型,是 非负的整数, 即由零和正整数组成。正整数也是整数的一个子类型 ,它包括整数中非零和非负的数值,即整数中正数部分。自然数(NATURAL)和正整数(POSITIVE)在 STANDARD 程序包中定义的源代码如下:
SUBTYPE NATURAL IS INTEGER RANGE 0 TO INTEGER’HIGH ;
SUBTYPE POSITIVE IS INTEGER RANGE 1 TO INTEGER’HIGH ;
可见NATRUAL与POSITIVE并不是一个新的数据类型,它们仅是正数类型的一个约束(范围),因此所有的整数运算符也适合NATRUAL与POSITIVE类型。
注:这里使用了数据类型的属性,INTEGER’HIGH表示integer数据范围中的最大值,即2147483647。
7. 实数(REAL)数据类型
VHDL 的实数类型也类似于数学上的实数或称浮点数。 实数的取值范围为-1.0E38到+1.0E38。 通常情况下, 实数类型仅能在VHDL仿真器中使用。 VHDL 综合
器则不支持实数, 因为直接的实数类型的表达和实现相当复杂。 目前在电路规模上难以承受 实数常量的书写方式举例如下:
1.0 十进制浮点数,
0.0 十进制浮点数,
65971.333333 十进制浮点数,
65_971.333_3333 与上一行等价。 这里短线仅起到分隔符的作用,便于阅读,在系统编译时将会被忽略,这一点与Verilog,System Verilog的数字书写规则相同。
8#43.6#e+4 八进制浮点数,
43.6E 4 十进制浮点数,
8. 字符串(STRING)数据类型
字符串数据类型是字符数据类型的一个非约束型数组, 或称为字符串数组。 字符串必须用双引号标明, 如:
VARIABLE string_var : STRING (1 TO 7 ) ;
string_var := “abcd”;
在STD库中定义如下:
type string is array (positive range <>) of character;
9. 时间(TIME)数据类型
VHDL 中惟一的预定义物理类型是时间, 完整的时间类型包括整数和物理量单位两部分 。整数和单位之间至少留一个空格, 如 :55 ms ;20 ns等
STANDARD 程序包中也定义了时间 定义如下:
TYPE time IS RANGE -2147483647 TO 2147483647
units
fs ; — 飞秒 VHDL 中的最小时间单位
ps = 1000 fs ; — 皮秒
ns = 1000 ps ; — 纳秒
us = 1000 ns ; — 微秒
ms = 1000 us ; — 毫秒
sec = 1000 ms ; — 秒
min = 60 sec ; — 分
hr = 60 min ; — 时
end units ;
10. 错误等级(SEVERITY LEVEL)
在 VHDL 仿真器中, 错误等级用来指示设计系统的工作状态 。共有四种可能的状态值,即 NOTE(注意), WARNING(警告) ,ERROR(出错), FAILURE(失败) 。在仿真过程中
可输出这四种值来提示被仿真系统当前的工作情况 。在standard库中其定义如下:
TYPE severity_level IS (note, warning, error, failure) ;
11. 数据类型的使用
- 仿真
丰富的数据类型,提高了仿真的高效性和仿真效果。standard库中定义的类型,在仿真时一般的EDA工具都支持这些基本的数据类型,因为standard库中的基本类型是VHDL的基本类型,在VHDL中都有对应的函数和操作。
- 综合
但综合时要考虑具体硬件逻辑电路,因此不是所有的数据类型在VHDL中都获得支持。一般不被综合器支持的数据类型如下:
(1) 物理类型 :综合器不支持物理类型的数据 ,如具有量纲型的数据 ,包括时间类型 这些类型只能用于仿真过程
(2) 浮点型 :如 REAL 型
(3) Aceess 型 :综合器不支持存取型结构, 因为不存在这样对应的硬件结构。
(4) File 型: 综合器不支持磁盘文件型, 硬件对应的文件仅为RAM 和ROM。
老师好,在学习vhdl算术运算符时遇到一点困惑,请老师解答:
1.MOD(取模)与REM(取余)有什么区别?
MOD(取模)就是除法的商,REM(取余)就是余数。