VHDL语言学习笔记(二):数据类型

VHDL语言是一种强数据类型语言,它对运算关系和赋值关系中各种操作数据类型有严格要求:
VHDL要求设计实体中的每一个常量、信号、变量、函数以及设定的各种参量都必须具有确定的数据类型,只有相同数据类型的量才能相互传递和作用。



1、标准的数据类型

在VHDL语言中,不需要定义就可以直接在程序中引用的数据类型称为标准的数据类型。


VHDL的数据类型(学习笔记2)-LMLPHP

提示:VHDL预定义的数据类型均包含在VHDL标准程序包STANDARD中。

1.1,实数(REAL)

在VHDL语言中,实数类型类似于数学上的实数,也可以称之为浮点数类型。
实数类型通常只在VHDL程序仿真过程中使用。

1.2,整数(INTEGER)

整数类型的数包括正整数、负整数和零。在VHDL语言中整数类型和数学中的整数类型的定义类似。
整数在硬件电路设计中通常是用一系列二进制位值来表示的,但是整数不能看做位矢量,也不能按位进行访问,也就是说整数不能用进行逻辑操作。
当需要对整数进行位操作时,可以用转换函数,将整数转换为位矢量。

1.3,位(BIT)

在数字系统中,一个信号的值通常用一个位来表示。位与整数中的1和0不同,‘1’和‘0’仅仅表示一个位的两个取值。由于位不能表示高阻、不定态,因此在可综合的程序中很少使用。
位数据不同于布尔数据,但是可以通过转换函数进行转换。

1.4,位矢量(BIT_VECTOR)

位矢量是基于BIT数据类型的数组,是93版拓展的数据类型,它是用双引号括起来的拓展数字序列。示例如下,

B"101011001011"  --12位二进制位串
X"CDBF06"        --24位十六进制位串
O"47631"         --15位八进制位串
X""              --空位串

位矢量最前面的B、X、O分别表示二进制、十六进制和八进制,通常二进制位串前的B可以不写。用位矢量数据表示总线状态最方便、也最容易理解,因此在VHDL程序中经常使用。

1.5,布尔量(BOOLEAN)

布尔量是一个二值枚举数据类型。一个布尔量具有两种状态 – “TRUE”或“FALSE”,数据的初始值总为FALSE。
虽然布尔量跟位一样都是二值枚举量,但是它没有数值的含义,可以进行关系运算,不能进行算术运算。布尔量只用来比较或判断,不能用作运算操作数。

1.6,字符(CHARACTER)

在VHDL语言中,字符也是一种数据类型,所定义的字符量通常用单引号括起来,如’E’。一般情况下,VHDL编译器对大小写不敏感,但是对于字符量中的大、小写字符则认为其不一样。
与布尔量一样,字符也没有具体的数值含义,也不能进行算术运算。

1.7,字符串(STRING)

字符串使用双括号括起来的一个字符序列,也可以称为字符矢量或字符串数组。例如:“HELLO”。
字符串通常用于程序的提示和说明。

1.8,时间(TIME)

在VHDL中,时间是一个物理量数据,它的约束范围可以是整个整数范围。
完整的时间量数据应包含整数和单位两部分,而且整数和单位之间至少应保留一个空格的位置。
在程序包STANDARD中给出的时间的预定义,共有fs、ps、ns、μs、ms、sec、min、hr等7种。
时间类型一般常常用于仿真,而不用于逻辑综合。

1.9,错误等级(SEVERITY LEVEL)

在VHDL语言中,错误等级也被认为是一种数据类型,它可以用来表征系统的状态。错误等级各类型的具体定义为,
NOTE:当前设计中出现了一些应该给予注意的事件信息;
WARNING:设计暂时不会完全失败时让设计人员做些修改;
ERROR:需要修改引起错误工作情况的模块或者整个都不工作的设计;
FAILURE:在设计中可能发生破坏性影响的情况下,允许设计人员修改设计。

1.10,大于等于零的整数(NATURAL,自然数)、正整数(POSITIVE)

在VHDL语言中,自然数和正整数都是整数的子集,NATURAL类数据只能取值0和0以上的正整数,POSITIVE只能为大于0的正整数。

关于标准的数据类型说明

以上10中数据类型是VHDL语言中的标准的数据类型,在编程时可以直接引用。
由于VHDL语言术语强类型语言,在仿真过程中,首先要检查赋值语句中的类型和区间,任何一个信号和变量的赋值均须在给定的约束区间中,也就是必须在有效的数值的范围内。


2、标准逻辑位数据类型

在IEEE库的程序包STD_LOGIC_1164中,定义了两种非常重要的数据类型:标准逻辑位(STD_LOGIC)和标准逻辑矢量(STD_LOGIC_VECTOR)数据类型。


2.1 标准逻辑位数据类型(STD_LOGIC)

标准逻辑位数据类型是BIT数据类型的拓展,其定义了9中逻辑值:“U”表示未初始化的,“X”表示强未知的,“0”表示强逻辑0,“1”表示强逻辑1,“Z”表示高阻态,“W”表示弱未知的,“L”表示弱逻辑0,“H”表示弱逻辑1,“-”表示忽略态,完整地概括了数字系统中所有可能的数据表现形式。其在IEEE库程序包STD_LOGIC_1164中的STD_LOGIC数据类别的定义语句结构如下,

TYPE STD_LOGIC IS ('U', 'X', '0', '1', 'Z', 'W', 'L', 'H', '-') ;

注意:STD_LOGIC数据类型中的数据是用大写字母定义的,使用中不能用小写字母代替。

在程序使用该数据类型前,要添加一下语句:

LIBRARY IEEE:
USE IEEE STD_LOGIC_1164.ALL ;

程序包STD_LOGIC_1164中还定义了关于STD_LOGIC数据类型的逻辑运算符AND、NAND、OR、NOR、XOR和NOT的重载函数及多个转换函数,以用于不同数据类型间的相互转换。
对于综合器,高阻态和忽略态可用于三态的描述。但是对于综合而言,STD_LOGIC型数据能够在数字器件中实现的只有其中的4种逻辑值:X、0、1和Z。其他的5种逻辑状态不可综合只能用于VHDL仿真。

2.2 标准逻辑矢量数据类型

标准逻辑矢量数据类型的定义语句结构如下,

TYPE STD_LOGIC_VECTOR IS ARRAY (NATURAL RANGE<>) OF STD_LOGIC ;

其中,符号“<>”是下标范围待定符号。STD_LOGIC_VECTOR是定义了一个标准一维数组,数组中的每一个元素的数据类型都是以上定义的标准逻辑位数据类型。
标准逻辑矢量数据类型的数据对象赋值原则是:同位宽、同数据类型的矢量件才能进行赋值。


3、用户自定义数据类型

在VHDL语言中,用户可以根据自己需求来定义数据类型,具体定义语法结构为

TYPE 数据类型名 {,数据类型名} IS 数据类型定义 ;
TYPE 数据类型名 {,数据类型名} ;  --不完整用户定义数据类型书写方式

用户自定义数据类型的使用原则是,先定义,后使用。
用户可定义的数据类型种类有,
(1)枚举(Enumeration)类型;
(2)整数(Integer)类型;
(3)实数(Real)、浮点数(Floating)类型;
(4)数组(Array)类型;
(5)物理类型;
(6)记录(Recode)类型;
(7)文件(File)类型;
(8)存取(Access)类型;


3.1 枚举类型

枚举类型是一种可以用文字符号表示的用于特定操作所需要的值。
枚举类型数据的语法结构如下,

TYPE 数据类型名 IS (元素, 元素, ......) ;

定义语法结构示例,

TYPE week IS (MON, TUE, WED, THU, FRI, SAT, SUN ) ;

枚举类型如果需要用数值来定义,则必须使用单引号。
用户自定义的数据类型也是用顺序的,在枚举顺序列表中,最左边的值低于所有其他的值,右边的值大于其他所有的值,每一个值均大于其左边数值而低于其右边数据值。例如,

TYPE status IS (s0Wait, s1Run, s2Pause, s3Stop) ;

SIGNAL s1, s2 : status
    s0Wait = '00' ;
    s1Run  = '01' ;
    s2Pause = '10' ;
    s3Stop  = '11' ;

3.2 整数类型和实数类型

如果用户需要使用的整数或实数取值范围要在一定的范围内,那么用户可以自定义整数/实数类型,其书写方式如下,

TYPE 数据类型名 IS 数据类型定义约束范围 ;  --定义格式

TYPE number IS integer range 0 to 9 ;  --自定义了一个范围从0到9的整数类型
TYPE fNum  IS range -1E4 to 1E4 ; --自定义了一个实数类型

3.3 数组类型

数组类型属于复合类型,是将相同类型的数据集合在一起所形成的一个新的数据类型。它可以是含有一个下标的一维数组,也可以是含有多个下标的二维或多维数组。

数组的定义语法结构如下

TYPE 数据类型名 IS ARRAY 数组范围 OF 原数据类型名。

根据语法结构中数组范围的不同,数组类型可以分为限定性数组类型和非限定性数组类型。限定性数组下标的取值范围(数组的上下界)在数组类型定义时就被确定了,非限定性数组不指明数组的上下界,而在定义对象的过程中进行指定。

  • 限定性数组的语法结构
TYPE 数据类型名 IS ARRAY (数组范围) OF 原数据类型名
--示例
TYPE word IS ARRAY (1 TO 8) OF BIT ;

数据类型名是新定义的限定性数组类型的名称,可以是任何标识符。
数组范围明确指出了数组元素的定义数量和排序方式,以整数来表示数组的下标。
数组类型指明了数组各元素的数据类型。

  • 非限定性数组的语法结构
TYPE 数据类型名 IS ARRAY (数组下标名 RANGE<>) OF 原数据类型名 ;
--示例
TYPE doubleword IS ARRAY (NATURAL RANGE<>) OF BIT ;

数据类型名是定义的非限定性数组类型的名称。
数组下标名是以整数类型设定的一个数组下标名称。
符号’<>'是下标范围待定符号,用到该数据类型时,再填入具体的数组范围。
数据类型指明了数组各元素的数据类型。

08-23 22:22