VHDL数据类型
VHDL是一种强数据类型语言。
要求设计实体中的每一个常数、信号、变量、
函数以及设定的各种参量都必须具有确定的数据类
型,并且相同数据类型的量才能互相传递和作用。
VHDL数据类型分为四大类:
? 标量类型(SCALAR TYPE);
? 复合类型(COMPOSITE TYPE);
? 存取类型(ACCESS TYPE);
? 文件类型(FILES TYPE)
76
又分为:
? 预定义数据类型、
? 用户自定义数据类型
1、VHDL的预定义数据类型
1)布尔量(boolean)
布尔量具有两种状态:false 和 true
常用于逻辑函数,如相等(=)、比较(<)
等中作逻辑比较。
如,bit 值转化成boolean 值:
boolean_var := (bit_var = ‘1’);
77
2)位(bit)
bit 表示一位的信号值。
放在单引号中,如 ‘0’ 或 ‘1’。
3)位矢量 (bit_vector)
bit_vector 是用双引号括起来的一组位数据。
如: “001100” X“00B10B”
4)字符(character)
用单引号将字符括起来。
variable character_var : character;
... ...
Character_var : = ‘A’;
78
5)整数(integer)
integer 表示所有正的和负的整数。硬件实现时,
利用32位的位矢量来表示。可实现的整数范围为:
-(231-1) to (231-1)
VHDL综合器要求对具体的整数作出范围限定,
否则无法综合成硬件电路。
如:signal s :integer range 0 to 15;
信号 s 的取值范围是0-15,可用4位二进制数表
示,因此 s 将被综合成由四条信号线构成的信号。
79
6)自然数(natural)和正整数(positive)
natural是integer的子类型,表示非负整数。
positive是integer的子类型,表示正整数。
定义如下:
subtype natural is integerrange 0 to
integer’high;
subtype positive is integerrange 1 to
integer’high;
80
7)实数(REAL)
或称浮点数
取值范围:-1.0E38 - +1.0E38
实数类型仅能用于VHDL仿真器,一般综合器
不支持。
8)字符串(string)
string是 character 类型的一个非限定
数组。用双引号将一串字符括起来。如:
variable string_var : string(1 to 7);
……
string_var :=“Rosebud”;
81
9)时间(TIME)
由整数和物理单位组成
如:55 ms,20 ns
10)错误等级(SEVERITY_LEVEL)
仿真中用来指示系统的工作状态,共有四种:
NOTE(注意)、
WARNING(警告)、
ERROR(出错)、
FAILURE(失败)
82
2、IEEE预定义标准逻辑位与矢量
1)std_logic 类型
由 ieee 库中的std_logic_1164 程序
包定义,为九值逻辑系统,如下:
(‘U’,‘X’,‘0’,‘1’,‘Z’,‘W’,‘L’,‘H’,‘-’)
‘U’:未初始化的, ‘X’:强未知的,
‘0’:强0, ‘1’:强1,
‘Z’:高阻态, ‘W’:弱未知的,
‘L’:弱0, ‘H’:弱1,
‘-’:忽略
83
由 std_logic 类型代替 bit 类型可以完成电
子系统的精确模拟,并可实现常见的三态总线电路。
2)std_logic_vector 类型
由 std_logic 构成的数组。定义如下:
typestd_logic_vector is array(natural
range<>) of std_logic;
赋值的原则:相同位宽,相同数据类型。
84
3、用户自定义类型
用户自定义类型是VHDL语言的一大特色。
可由用户定义的数据类型有:
? 枚举类型、
? 整数和实数类型、
? 数组类型、
? 记录类型、
? 子类型
85
用类型定义语句TYPE和子类型定义语句
SUBTYPE实现用户自定义数据类型。
TYPE语句格式:
例:type byte is array(7 downto 0) of bit;
variable addend :byte;
type week is (sun, mon,tue, wed, thu,
fri, sat);
type 数据类型名 is 数据类型定义 [of 基本数据类型];
86
SUBTYPE语句格式:
例:
subtype digits isinteger range 0 to 9;
由subtype 语句定义的数据类型称为子类型。
subtype 子类型名 is 基本数据类型 约束范围;
87
1)枚举类型
枚举该类型的所有可能的值。格式:
如:type std_logic is(‘U’,‘X’,‘0’,‘1’,
‘Z’,‘W’,‘L’,‘H’,‘-’)
如:type color is(blue,green,yellow, red);
type my_logic is (‘0’, ‘1’, ‘U’, ‘Z’);
variable hue :color;
signal sig :my_logic;
hue := blue; sig <= ‘Z’;
type 类型名称 is (枚举文字{,枚举文字});
88
枚举类型的编码:
综合器自动实现枚举类型元素的编码,一
般将第一个枚举量(最左边)编码为0,以后的
依次加1。编码用位矢量表示 ,位矢量的长度
将取所需表达的所有枚举元素的最小值。
如:type color is(blue,green,yellow,red);
编码为:blue=“00”;
green=“01”;
yellow=“10”;
red=“11”;
89
2)整数类型
用户定义的整数类型是标准包中整数类型的子范围。格式:
例:type my_integer is integer range 0 to 9;
3)数组类型
数组:同类型元素的集合。VHDL支持多维数组。
多维数组的声明:
type byte is array(7 downto 0)of bit;
type vector is array(3 downto0) of byte;
限定数组、非限定数组、属性:
type 类型名称 is range 整数范围;
90
限定数组:
其索引范围有一定的限制。
格式:
非限定数组:数组索引范围被定义成一个类型范围。
格式:
例:type bit_vector is array(integer range <>)
of bit;
variablemy_vector:bit_vector (5 downto -5);
type 数组名 is array(数组范围) of 数据类型;
type 数组名 is array(类型名称range <>) of 数据类型;
91
属性:
VHDL为多种类型定义了属性。
语法如下:
对象’属性
VHDL为数组预先定义的属性:
left right
high low
length range
reverse_range
92
对应变量:
variable my_vector : bit_vector (5 downto -5);
各属性如下:
my_vector’left 5
my_vector’right -5
my_vector’high 5
my_vector’low -5
my_vector’length 11
my_vector’range (5 downto -5)
my_vector’reverse_range (-5 to 5)
93
4)记录类型
记录是不同类型的名称域的集合。
格式如下:
访问记录体元素的方式:记录体名.元素名
type 记录类型名 is record
元素名:数据类型名;
元素名:数据类型名;
┇
end record;
94
例:
constantlen:integer:= 8 ;
subtype byte_vec is bit_vector(len-1downto 0);
type byte_and_ix is record
byte :byte_vec;
ix : integer range 0 to len;
end record ;
signal x, y, z : byte_and_ix ;
signal data : byte_vec ;
signal num : integer ;
…….
x.byte <= “11110000” ;
x.ix <= 2 ;
data <= y.byte ;
num <= y.ix ;
z <= x ;
95
5)子类型
子类型是已定义的类型或子类型的一个子集。
格式:
例:
bit_vector 类型定义如下:
type bit_vector is array(natural range <>)
of bit;
如设计中只用16bit;可定义子类型如下:
subtype my_vector is bit_vector(0 to 15);
注:子类型与基(父)类型具有相同的操作符和子
程序。可以直接进行赋值操作。
subtype 子类型名 is 数据类型名[范围];
96
4、数据类型转换
VHDL是一种强类型语言,不同类型的数据
对象必须经过类型转换,才能相互操作。
1)类型转换函数方式
通过调用类型转换函数,使相互操作的数据对
象的类型一致,从而完成相互操作。
97
library ieee;
library dataio;
use ieee.std_logic_1164.all;
use dataio.std_logic_ops.all;
entity cnt4 is
port(clk: in std_logic;
p: inout std_logic_vector(3 downto 0);
end cnt4;
architecture behv of cnt4 is
begin
process(clk)
begin
if clk’eventand clk=‘1’ then
p<=to_vector(2, to_integer(p)+1);
end if;
end process;
end behv;
99
2)直接类型转换方式
对相互间非常关联的数据类型(如整型、浮
点型),可进行直接类型转换。格式:
数据类型标识符(表达式)
如:variable a, b : real;
variable c, d : integer;
……
a:= real(c);
d:= integer(b);