Menu Close

VHDL语言预定义数据类型

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。

Posted in FPGA, FPGA 教材教案, IC, VHDL, VHDL, 开发语言, 教材与教案, 文章, 编程语言

2 Comments

发表回复

相关链接