VHDL的数据类型

1、预定义的数据类型

std库的standard包集:定义了位(BIT)、布尔(Boolean)、整数(integer)和实数(real)数据类型。

ieee库的std_logic_1164包集:定义了std_logic和std_ulogic数据类型。

ieee库的std_logic_arith包集:定义了signed和unsigned数据类型。还定义了conv_integer(p),conv_unsigned(p,b)和conv_signed(p,b)

和conv_std_logic_vector(p,b)等数据类型转换函数。

ieee库的std_logic_signed和std_logic_unsigned包集:包含一些函数,这些函数可以使std_logic_vecture类型的数据进行

像signed和unsigned类型数据一样的运算。

位(bit)和位矢量(bit_vector):位值用'0'或'1'表示。

例:

signal x:bit;

将x声明为一个位宽为1的bit类型的信号。

signal y:bit_vector(3 downto 0);

将y声明为一个位宽为4的位矢量,其中最左边的一位是最高位(MSB:most significant bit)。

signal w:bit_vector(0 downto 7);

--将w声明为一个位宽为8的位矢量,它的最右边的一位是MSB。

在定义了上述信号以后,可以采用下面的方式对信号赋值(必须使用"<="操作符给信号赋值)。

x<='1';

--x是位宽为1,值为'1'的信号。注意,当位宽为1时,位值放在单引号中。

y<="0111";

y是位宽为4,值为"0111"(MSB='0')的信号。注意,当位宽大于1时,位矢量值放在双引号中。

w<="01111001"

w的位宽为8,值为"01111001"(MSB='1')的信号。

std_logic和std_logic_vector:它们是ieee 1164标准中引入的8逻辑值系统。不同于bit 数据类型,它可以取'0','1',不定态和

高阻态等8种不同的值。

'X' “强” 不确定值(综合后为不确定值)

'0' “强” 0(综合后为0)

'1' “强” 1(综合后为1)

'Z' 高阻态(综合后为三态缓冲器)

'w' “弱” 不确定值

'L' “弱” 0

'H' “弱” 1

'-' 不可能出现的情况

例:

signal x:std_logic;

--声明x是位宽为1的std_logic类型的信号。

signal y:std_logic_vector(3 downto 0) :="0001";

声明y是一个位宽为4的矢量,其中最左边的一位是MSB。

对信号y赋初始值"0001"(可选)。

 

 

 

 std_ulogic和std_ulogic_vector:是ieee 1164标准中定义的具有9种逻辑值数据类型。std_logic类型是std_ulogic类型的一个子集。后者

引入了一个新的逻辑值'U',它代表初始不定值。与std_logic不同的是,std_ulogic中没有指定两个std_ulogic信号连接到同一个节点上发生冲突后的逻辑值,因此要避免两个输入信号进行直接连接。在确保两根输出线不会连接到一起的条件下,这种9个逻辑值系统可以用来检测设计时可能发生的错误。

布尔类型(boolean):只有两种取值,"真"或“假”。

整数(integer):32位的整数(取值范围从-2147483647到2147483647)

自然数(natural):非负的整数(从0到2147483647)

实数(real):实数的取值范围从-1x10^38到1x10^38,它是不可综合的。

物理量字符(physical literal)型:用来表示诸如时间和电压等物理量。在仿真时可以使用,但不可综合。

字符(character)型:可以是单个或者一串ASCII字符。

signed(有符号数)和unsigned(无符号数):它们是在ieee库std_logic_arith包集中定义的数据类型。

例:

x0<='0';--可以是bit,std_logic或者std_ulogic类型的值'0'

x1<='00011111'--可以是bit_vector,std_logic_vector,std_ulogic_vector,signed或unsigned类型的值。

x2<="0001_1111"--数字之间加下划线可以增加二进制的可读性

x3<="101111"--二进制数"101111",表示十进制47

x4<=B"101111";--二进制数"101111",表示十进制47

x5<=O"57"

y<=1.2E-5; --实数,不可以综合

q<=d after 10 ns;--物理量,不可综合

例:

不同类型数据之间的合法与非法操作:

signal a:bit;

signal b:bit_vector(7 downto 0);

signal c:std_logic;

signal d:std_logic_vector(7 downto 0);

signal e: integer range 0 to 255;

……

a<=b(5);--合法(标量类型:bit)

b(0)<=a;--合法(标量类型:bit)

c<=d(5);--合法(标量类型:std_logic)

d(0)<=c;--合法(标量类型:std_logic)

a<=c;--非法(bit和std_logic数据类型不匹配)

b<=d;--非法(bit_vector和std_logic_vector数据类型不匹配)

e<=b;--非法(integer和bit_vector数据类型不匹配)

e<=d;--非法(integer和std_logic_vector数据类型不匹配)

 

posted on 2019-11-12 20:59  李好123  阅读(7007)  评论(0编辑  收藏  举报