爱我鄂尔多斯资料:vhdl数据类型定义
1)布尔量(boolean)
布尔量具有两种状态:false 和 true
常用于逻辑函数,如相等(=)、比较(<)
等中作逻辑比较。
如,bit 值转化成boolean 值:
boolean_var := (bit_var = ‘1’);
2)位(bit)
bit 表示一位的信号值。
放在单引号中,如 ‘0’ 或 ‘1’。
3)位矢量 (bit_vector)
bit_vector 是用双引号括起来的一组位数据。
如: “001100” X“00B10B”
4)字符(character)
用单引号将字符括起来。
variable character_var : character;
Character_var : = ‘A’;
5)整数(integer)
integer 表示所有正的和负的整数。硬件实现时,
利用32位的位矢量来表示。可实现的整数范围为:
-(231-1) to (231-1)
VHDL综合器要求对具体的整数作出范围限定,
否则无法综合成硬件电路。
如:signal s : integer range 0 to 15;
信号 s 的取值范围是0-15,可用4位二进制数表
示,因此 s 将被综合成由四条信号线构成的信号。
6)自然数(natural)和正整数(positive)
natural是integer的子类型,表示非负整数。
positive是integer的子类型,表示正整数。
定义如下:
subtype natural is integer range 0 to
integer’high;
subtype positive is integer range 1 to
integer’high;
7)实数(REAL)
或称浮点数
取值范围:-1.0E38 - +1.0E38
实数类型仅能用于VHDL仿真器,一般综合器
不支持。
8)字符串(string)
string 是 character 类型的一个非限定
数组。用双引号将一串字符括起来。如:
variable string_var : string(1 to 7);
……
string_var := “Rosebud”;
use IEEE.Numeric_std.all; --RTL库这个库是RTL库
3)数组类型
数组:同类型元素的集合。VHDL支持多维数组。
多维数组的声明:
type byte is array(7 downto 0) of bit;
type vector is array(3 downto 0) of byte;
限定数组、非限定数组、属性:type 类型名称 is range 整数范围;
限定数组:
其索引范围有一定的限制。
格式:
非限定数组:数组索引范围被定义成一个类型范围。
格式:
例:type bit_vector is array(integer range <>)
of bit;
variable my_vector:bit_vector (5 downto -5);
type 数组名 is array(数组范围) of 数据类型;
type 数组名 is array(类型名称 range <>) of 数据类型;
属性:
VHDL为多种类型定义了属性。
语法如下:
对象’属性
VHDL为数组预先定义的属性:
left right
high low
length range
reverse_range
对应变量:
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)
4)记录类型
记录是不同类型的名称域的集合。
格式如下:
访问记录体元素的方式:记录体名.元素名
type 记录类型名 is record
元素名:数据类型名;
元素名:数据类型名;
┇
end record;
例:
constant len:integer:= 8 ;
subtype byte_vec is bit_vector(len-1 downto 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 ;
5)子类型
子类型是已定义的类型或子类型的一个子集。
格式:
例:
bit_vector 类型定义如下:
type bit_vector is array (natural range <>)
of bit;
如设计中只用16bit;可定义子类型如下:
subtype my_vector is bit_vector(0 to 15);
注:子类型与基(父)类型具有相同的操作符和子程序。可以直接进行赋值操作。
subtype 子类型名 is 数据类型名[范围];
4、数据类型转换
VHDL是一种强类型语言,不同类型的数据对象必须经过类型转换,才能相互操作。
1)类型转换函数方式
通过调用类型转换函数,使相互操作的数据对象的类型一致,从而完成相互操作。
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’event and clk=‘1’ then
p<=to_vector(2, to_integer(p)+1);
end if;
end process;
end behv;
2)直接类型转换方式
对相互间非常关联的数据类型(如整型、浮点型),可进行直接类型转换。格式:
数据类型标识符(表达式)
如:variable a, b : real;
variable c, d : integer;
……
a:= real(c);
d:= integer(b);
4)VHDL的数据类型转换
数据类型的转换
在VHDL程序中,不同类型的对象不能代入,因此要进行类型转换.类型转换的方法有:
(1)类型标记法.用类型名称来实现关系密切的标量类型之间的
转换.
例如: VARIABLE x:INTEGER;
VARIABLE y:REAL;
使用类型标记(即类型名)实现类型转换时,可采用赋值语句:
x :=INTEGER(y); y :=REAL(x).
(2)类型函数法.
VHDL程序包中提供了多种转换函数,使得某些类型的数据之间可以相互转换,以实现正确的赋值操作.常用的类型转换函数有:
★CONV_INTEGER ( ):将STD_LOGIC_VECTOR类型转换成
INTEGER类型.
★CONV_STD_LOGIC_VECTOR( ):将INTEGER类型,UNSIGNED
类型或 SIGNED类型转换成STD_LOGIC_VECTOR类型.
★TO_BIT ( ): 将STD_LOGIC类型转换成BIT类型.
★TO_BIT_VECTOR( ):将STD_LOGIC_VECTOR类型转换
BIT_VECTOR 类型.
★TO_STD_LOGIC( ): 将BIT类型转换成STD_LOGIC类型.
★TO_STD_LOGIC_VECTOR( ): 将BIT_VECTOR类型转换成
STD_LOGIC_VECTOR类型.
注意 :引用时必须首先 打开库和相应的程序包.
该函数由STD_LOGIC_UNSIGNED
程序包定义
该函数由STD_LOGIC_ARITH
程序包定义
以下函数由STD_LOGIC_1164
-0-----------------------------------------------
类型转换
类 型 变 换 函 数
由STD_LOGIC_VECTOR转换成INTEGER
STD_LOGIC_UNSIGNED包含集
CONV_INTEGER(A)
由INTEGER,UNSDGNED,SIGNED转换成STD_LOGIC_VECTOR
由UNSIGNED,SIGNED转换成INTEGER
STD_LOGIC_ARITH包集合
CONV_STD_LOGIC_VECTOR(A,位长)
CONV_INTEGER(A)
由BIT_VECTOR转换为STD_LOGIC_VECTOR
由STD_LOGIC_VECTO转换为BIT_VECTOR
由BIT转换成STD_LOGIC
由STD_LOGIC转换成BIT
STD_LOGIC_1164包集合
TO_STDLOGICVECTOR(A)
TO_BITVECTOR(A)
TO_STDLOGIC(A)
TO_BIT(A)
功 能
函 数 名
由"STD_LOGIC_VECTOR"变换成"INTEGER"的实例
LIBRARY IEEE;
USE IEEE STD_LOGIC_1164.ALL;
USE IEEE STD_LOGIC_UNSIGNED.ALL;
ENTITY add5 IS
PORT (num:IN STD_LOGIC_VECTOR (2 DOWNTO 0);
┇
);
END add5;
ARCHITECTURE rtl OF add5 IS
SIGNAL in_num:INTEGER RANGE 0 TO 5;
┇
BEGIN
in_num<=CONV_INTEGER (num); 位矢量转换成整数变换式
┇
END rtl;
^0^
------------------------
函 数 名 功 能
STD_LOGIC_1164包集合
TO_STDLOGICVECTOR(A) 由BIT_VECTOR转换为STD_LOGIC_VECTOR
TO_BITVECTOR(A) 由STD_LOGIC_VECTO转换为BIT_VECTOR
TO_STDLOGIC(A) 由BIT转换成STD_LOGIC
TO_BIT(A) 由STD_LOGIC转换成BIT
STD_LOGIC_ARITH包集合
CONV_STD_LOGIC_VECTOR(A, 由INTEGER,UNSDGNED,SIGNED转换
位长) STD_LOGIC_VECTOR
CONV_INTEGER(A) 由UNSIGNED,SIGNED转换成INTEGER
STD_LOGIC_UNSIGNED包含集
CONV_INTEGER(A) 由STD_LOGIC_VECTOR转换成INTEGER
LIBRARY IEEE;
USE IEEE STD_LOGIC_1164.ALL;
USE IEEE STD_LOGIC_UNSIGNED.ALL;
ENTITY add5 IS
PORT(
num:IN STD_LOGIC_VECTOR (2 DOWNTO 0);
┇
);
END add5;
ARCHITECTURE rtl OF add5 IS
SIGNAL in_num:INTEGER RANGE 0 TO 5;
┇
BEGIN
in_num<=CONV_INTEGER (num); --位矢量转换成整数变换式
┇
END rtl;