⑤类型转换
VHDL是一种强类型语言,意谓着既使非常接近的数据类型的数据对象,在相互操作时也需要进行数据类型的转换,或者使用重载运算符函数。数据类型转换有两种方式:类型转换函数和直接类型转换。
⑴类型转换函数
类型转换函数可将一种类型的数据对象转换成另一种类型的数据对象。先要定义一个类型转换函数,使其参数类型被变换为被转换的类型,返回值为转换后的类型。有2种:预定义的类型转换函数和自定义的类型转换函数。 VHDL的标准程序包中提供一些常用的预定义类型转换函数见表:
程序包
函数
函数说明
STD_LOGIC_1164
TO_STDLOGICVECTOR(A)
由BIT_VECTOR转换成STD_LOGIC_VECTOR
TO_BITVECTOR(A)
由STD_LOGIC_VECTOR转换成BIT_VECTOR
TO_STDULOGIC(A)
由BIT转换成STD_LOGIC
TO_BIT(A)
由STD_LOGIC转换成BIT
STD_LOGIC_ARITH
CONV_STD_LOGIC_VECTOR(A,位长)
由INTEGER,UNSIGNED和SIGNED转换成 STD_LOGIC_VECTOR
CONV_INTEGER(A)
由UNSIGNED和SIGNED转换成INTEGER
STD_LOGIC_UNSIGNED
CONV_INTEGER (A)
STD_LOGIC_VECTOR转换成INTEGER
例如:
LIBRARY IEEE;
USE ;
USE
ENTITY add5 IS
PORT (snum: IN STD_LOGIC_VECTOR(2
DOWNTO 0));
END add5;
ARCHITECTURE rtl OF add5 IS
SIGNAL inum: INTEGER RANGE 0 TO 5;
BEGIN
inum <= CONV_INTEGER (snum);
END rtl;
例如:
Signal a: bit_vector(11 downto 0);
Signal b: std_logic_vector(11 downto 0);
a<=x”0A8”; --十六进制可以赋予位矢量
b<=x”0A8”; --错误,十六进制不可以赋予逻辑矢量,逻辑量中只能赋予二进制,Synplify其实也可以
加入语句use ;下面语句可用:
b<=TO_STDLOGICVECTOR(X”AF7”); --十六进制变换
b<=TO_STDLOGICVECTOR(O”5177”); --八进制变换 b<=TO_STDLOGICVECTOR(B”1010_1111_0111”); --三位二进制变换
自定义转换函数:自定义一个函数,使输入参数转变为另一种数据类型,返回值为转换后的数据类型。就可以自由地进行类型转换。
直接类型转换:可以直接利用VHDL的类型转换语句进行数据类型的转换。类型转换语句的格式是:
数据类型标识符(表达式)
例如: variable v: integer;
v:=integer();
直接类型转换仅限于非常关联的数据类型之间转换,必须遵循以下规则:
⑴所有抽象数字类型是非常关联的类型(如整型、浮点型)如浮点数转换为整数,转换结果是最接近的一个整数
⑵如果两个数组有相同维数,两个数组的元素是同一类型,并在各自的下标范围内索引是同一类型和非常接近的类型(如整型、浮点型) ,那么这两个数组是非常关联的。
如果类型标识符指的是非限定性数组,将被转换数组的下标范围去掉,转换后的数组成为非限定性数组;如果类型标识符指的是限定性数组,转换后的数组下标范围与类型标识符所指的数组下标范围相同。转换后数组中的元素值等价原数组的元素值。
⑶枚举类型不能被转换
运算符
VHDL为构造计算表达式提供了许多预定义运算符,可分为四种类型:算术运算符,关系运算符,逻辑运算符与连接运算符。
⑴算术运算符:+、-、*、/、**、MOD、REM、ABS 、SLL 、SRL 、SLA 、SRA 、ROL 、ROR和符号运算符:+正,-负。
⑵关系运算符:=、/=、<、<=、>、>=。
⑶逻辑运算符:AND、OR、NOT、NAND、NOR、XOR、XNOR。
⑷连接运算符:&,将多个对象或矢量连接成维数更大的矢量。
VHDL运算符优先级别说明:
运算符
运算符符号
优级
操作数的数据类型
高级算术运算符
NOT取反
高
Boolean、BIT、STD
VHDL实用教程第2章_2.ppt 来自淘豆网www.taodocs.com转载请标明出处.