VHDL数据类型 &自定义数据类型

VHDL数据类型

      VHDL是一种强数据类型语言。

     要求设计实体的每一个常数、信号、变量、

函数以及设定的各种参量都必须具有确定的数据类

型,并且相同数据类型的量才能互相传递和作用。

     VHDL数据类型分为四大类:

        ? 标量类型(SCALAR TYPE);

        ? 复合类型(COMPOSITE TYPE);

        ? 存取类型(ACCESS TYPE);

        ? 文件类型(FILES TYPE

 

76  

又分为:

   ? 预定义数据类型、

   ? 用户自定义数据类型 

1VHDL的预定义数据类型

   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) 

   naturalinteger的子类型,表示非负整数。

   positiveinteger的子类型,表示正整数。 

   定义如下:

   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);

 

你可能感兴趣的:(VHDL数据类型 &自定义数据类型)