原创 VHDL数据类型

2009-1-16 16:37 7670 7 7 分类: FPGA/CPLD

VHDL数据类型 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


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


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


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


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


     VHDL数据类型分为四大类:


        ? 标量类型(SCALAR TYPE);


        ? 复合类型(COMPOSITE TYPE);


        ? 存取类型(ACCESS TYPE);


        ? 文件类型(FILES TYPE


 


76  


又分为:


   ? 预定义数据类型、


   ? 用户自定义数据类型 


1VHDL的预定义数据类型


   1)布尔量(boolean


      布尔量具有两种状态:false true


   常用于逻辑函数,如相等(=)、比较(<


   作逻辑比较。


   如,bit 值转化成boolean 值:


       boolean_var := (bit_var = ‘<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />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 integer range 0 to 


      integer’high;


   subtype positive is integer range 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 ms20 ns


10)错误等级(SEVERITY_LEVEL


    仿真用来指示系统的工作状态,共有四种:


        NOTE(注意)、


        WARNING(警告)、


        ERROR(出错)、


        FAILURE(失败)


 


82  


2IEEE预定义标准逻辑位与矢量


   1std_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 类型可以完成电


子系统的精确模拟,并可实现常见的三态总线电路。


2std_logic_vector 类型


   std_logic 构成的数组。定义如下:


      type std_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 is integer 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 downto 0) of  byte


   限定数组、非限定数组、属性: 


type  类型名称  is  range  整数范围;


 


90  


限定数组


    其索引范围有一定的限制。


格式:


    


非限定数组:数组索引范围被定义成一个类型范围。


格式: 
 


例: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  数据类型;


 


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  


例:


    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 ;


 


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’event and 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:= realc;


    d:= integerb;


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
7
关闭 站长推荐上一条 /3 下一条