x战警1影评:vhdl数据类型定义

来源:百度文库 编辑:中财网 时间:2024/04/30 04:18:55
1、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;