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矢量运算:

 


在后续章节中会详细介绍这些函数的使用。

4. 字符(CHARACTER)类型

为了处理文字信息,以及编解码的格式统一,计算机语言往往提供标准ASCII表,由于数字与字符的转换。VHDL语言提供字符类型,其含义及用法与ASCII表一致,只是这里叫法不同。字符类型通常用单引号引起来 ,如’A’ 、’a’、’B’、’b’、’0’等。字符类型区分大小写 ,如’B’不同于’b’,也就是单引号内的字符是区分大小写的。

 


在standard库中对字符有如下预定义函数:

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

  • 整数类型运算

正数类型有如下运算:

  • 整数类型矢量

整数类型也可以组合形成矢量,在STD库中定义的格式如下:

type  integer_vector  is  array  (natural range <>)  of  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 教材教案, VHDL, VHDL, 开发语言, 教材与教案, 文章, 编程语言, 集成电路