《自定义数据类型及转换.ppt》由会员分享,可在线阅读,更多相关《自定义数据类型及转换.ppt(20页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第九讲第九讲 VHDL VHDL自定义数据类型及类自定义数据类型及类型转换型转换 本讲知识点:本讲知识点:自定义数据类型自定义数据类型 数据类型转换数据类型转换 (1 1)TYPETYPE语句用法:语句用法:TYPE TYPE 数数据据类类型型名名 IS IS 数数据据类类型型定定义义 OF OF 基基本本数据类型数据类型 ;用户自定义数据类型用户自定义数据类型用户定义的数据类型可以有多种,如枚举类型、整用户定义的数据类型可以有多种,如枚举类型、整数类型、实数类型、数组类型、记录类型和时间类数类型、实数类型、数组类型、记录类型和时间类型等。型等。上述格式中的数据类型名由设计者自定;数据类上述格
2、式中的数据类型名由设计者自定;数据类型定义部分用来描述所定义元素的表达方式和表型定义部分用来描述所定义元素的表达方式和表达内容;基本数据类型是指数据类型定义中所定达内容;基本数据类型是指数据类型定义中所定义的基本数据类型,一般都是取已有的预定义数义的基本数据类型,一般都是取已有的预定义数据类型。据类型。例:例:typetype st1 st1 isis array(0 to 15)array(0 to 15)ofof std_logic;std_logic;typetype week week isis(sun,mon,tue,wed,thu,fri,sat);(sun,mon,tue,wed
3、,thu,fri,sat);常用的自定义数据类型常用的自定义数据类型 枚举数据类型枚举数据类型:type week is(sun,mon,tue,wed,thu,fri,sat);在逻辑电路中,所有的数据都是用在逻辑电路中,所有的数据都是用“1”“1”或或“0”“0”来表来表示的,但是人们在考虑逻辑关系时,只有数字往往是示的,但是人们在考虑逻辑关系时,只有数字往往是不方便的。在不方便的。在VHDLVHDL语言中,可以用文字符号来表示一语言中,可以用文字符号来表示一组实际的二进制数。组实际的二进制数。“000”“001”“010”“011”“100”“101”“110”例如:例如:type m_
4、state is(state1,state2,state3,state4,state5);signal p_state,n_state:m_state;在综合过程中,枚举类型文字元素的编码通常是在综合过程中,枚举类型文字元素的编码通常是自动的,编码顺序是默认的,一般将第一个枚举量自动的,编码顺序是默认的,一般将第一个枚举量(最左边的量)编码为(最左边的量)编码为0 0,以后的依次加,以后的依次加1 1。默认编。默认编码值如下:码值如下:state1 state1 000000;state2 state2 001 001;state3 state3 010 010;state4 state4 0
5、11 011;state5 state5 100 100;思考:如何表示STD_LOGIC类型?数组类型:数组类型:语句格式如下:语句格式如下:(1 1)TYPETYPE 数组名数组名 ISIS ARRAY(ARRAY(数组范围数组范围)OFOF 数据类数据类型型 ;(2 2)TYPETYPE 数组名数组名 ISIS ARRAY ARRAY(数组下标名(数组下标名 RANGERANGE)OFOF 数据类型数据类型 数组类型属复合类型,是将一组具有数组类型属复合类型,是将一组具有相同数据类相同数据类型型的元素集合在一起,作为一个数据对象来处理的数的元素集合在一起,作为一个数据对象来处理的数据类型
6、。数组可以是一维数组或多维数组。据类型。数组可以是一维数组或多维数组。例:例:typetype stb stb isis array(7 downto 0)array(7 downto 0)ofof std_logic;std_logic;该数组有该数组有8 8个元素,其下标排列是个元素,其下标排列是7 7、6 6、11、0 0。typetype data_bus data_bus isis array(0 to 7)array(0 to 7)ofof bit;bit;该数组有该数组有8个元素,其下标排列是个元素,其下标排列是0、1、6、7。TYPE bit_number IS ARRAY(n
7、atural RANGE)OF BIT;VARIABLE bb:bit_number(1 to 6);对数组赋值有两种方法:一是对对数组赋值有两种方法:一是对整个整个数组进行一次数组进行一次赋值;二是按下标对赋值;二是按下标对每一个每一个数组元素进行赋值。例:数组元素进行赋值。例:typetype data_bus data_bus is arrayis array(0 to 7)of bit;(0 to 7)of bit;signalsignal a:data_bus;a:data_bus;整体赋值:整体赋值:a=“01000111”;a=“01000111”;分别赋值分别赋值:a(0)=0
8、;a(0)=0;a(1)=1;a(1)=1;a(2)=0;a(2)=0;a(3)=0;a(3)=0;a(4)=0;a(4)=0;a(5)=1;a(5)=1;a(6)=1;a(6)=1;a(7)=1;a(7)=1;物理类型:物理类型:语句格式如下:语句格式如下:(1 1)TYPETYPE 数据类型名数据类型名 IS IS 范围;范围;UNITS UNITS 基本单位基本单位 ;单位;单位;END UNITSEND UNITS例:例:P89 P89 例例4-84-8 用来表示时间、电压、容量和阻抗等物理量。用来表示时间、电压、容量和阻抗等物理量。记录类型:记录类型:将不同类型的数据和数据名组织在一
9、起,而形将不同类型的数据和数据名组织在一起,而形成新的对象。成新的对象。语句格式如下:语句格式如下:TYPETYPE 记录类型名记录类型名 IS RECORDIS RECORD 记录元素名记录元素名1 1:数据类型名;:数据类型名;记录元素名记录元素名2 2:数据类型名;:数据类型名;END RECORD;END RECORD;下面是记录类型定义的一个例子:下面是记录类型定义的一个例子:type type c_time c_time isis recordrecord year:integer year:integer rangerange 0 0 toto 3000;3000;month:i
10、nteger month:integer rangerange 1 1 toto 12;12;date:integer date:integer rangerange 1 1 toto 31;31;enable:bit;enable:bit;data:std_logic_vector(15 data:std_logic_vector(15 downtodownto 0);0);endend recordrecord;记录类型的对象的说明:记录类型的对象的说明:signalsignal number:c_time;number:c_time;一个记录的每一个元素要由它的记录元素名来一个记录的每一
11、个元素要由它的记录元素名来进行进行访问访问。对于记录类型的对象的。对于记录类型的对象的赋值赋值和数组类似,和数组类似,可以对其进行整体赋值,也可分别赋值,可以对其进行整体赋值,也可分别赋值,从记录类从记录类型的对象中提取记录元素时应使用型的对象中提取记录元素时应使用“.”“.”。对记录元素分别赋值:对记录元素分别赋值:number.year=2005;number.year=2005;number.mouth=9;number.mouth=9;number.date=22;number.date=22;number.enable=1;number.enable=1;number.data=da
12、ta_in;number.data=data_in;对记录元素整体赋值:对记录元素整体赋值:number=(2005 number=(2005,9 9,2222,11,data_in)data_in);例例2 2:P90 P90 例例4-9 4-9 用户定义的子类型用户定义的子类型 SUBTYPE SUBTYPE是是TYPETYPE所定义的数据类型的一个子所定义的数据类型的一个子集,它满足原数据类型的所有约束条件,原数据集,它满足原数据类型的所有约束条件,原数据类型称为基本数据类型,类型称为基本数据类型,SUBTYPE SUBTYPE 格式如下:格式如下:SUBTYPE SUBTYPE 子类型
13、名子类型名 IS IS 基本数据类型基本数据类型 约束约束范围;范围;上述格式中的上述格式中的子类型子类型名由设计者自定;名由设计者自定;基本数据类基本数据类型型必须是前面已有过必须是前面已有过typetype定义的类型。定义的类型。例:例:subtype dig is integer range 0 to 9;subtype dig is integer range 0 to 9;其中,其中,integerinteger是标准程序包中已定义过的数是标准程序包中已定义过的数据类型,子类型只是把据类型,子类型只是把integerinteger约束到只含约束到只含1010个值个值的数据类型。的数据
14、类型。P90 P90 例例4-104-105 5、数据类型的转换、数据类型的转换 在在VHDLVHDL语言中,数据类型的定义是相当严格的,语言中,数据类型的定义是相当严格的,不同的数据类型之间不能进行运算和直接代入。为了不同的数据类型之间不能进行运算和直接代入。为了实现正确的赋值操作,必须要将带入的数据进行类型实现正确的赋值操作,必须要将带入的数据进行类型转换。转换。转换的方式:转换的方式:(1 1)转换函数转换函数 数据类型转换函数通常有程序包来提供。(数据类型转换函数通常有程序包来提供。(P91P91)(2 2)数据类型限定)数据类型限定函函 数数 名名功功 能能.std_logic_11
15、64.std_logic_1164包集合包集合to_std_logic_vectorto_std_logic_vector(A A)to_bit_vectorto_bit_vector(A A)to_std_logicto_std_logic(A A)to_bitto_bit(A A)由由bit_vectorbit_vector转换为转换为std_logic_vectorstd_logic_vector;由由std_logic_vectorstd_logic_vector转换为转换为bit_vectorbit_vector;由由bitbit转换成转换成std_logicstd_logic;由由
16、std_logicstd_logic转换成转换成bitbit。.std_logic_arith.std_logic_arith包集合包集合CONV_std_logic_vectorCONV_std_logic_vector(A A,位长)位长)CONV_INTEGERCONV_INTEGER(A A)由由 integerinteger,UNSDGNEDUNSDGNED,SIGNEDSIGNED转转换成换成std_logic_vectorstd_logic_vector;由由 UNSIGNEDUNSIGNED,SIGNEDSIGNED转转 换换 成成integerinteger。.std_log
17、ic_UNSIGNED.std_logic_UNSIGNED包集合包集合.std_logic_SIGNED.std_logic_SIGNED包集合包集合CONV_INTEGERCONV_INTEGER(A A)由由std_logic_vectorstd_logic_vector转转换换成成integerinteger。【程序】【程序】LIBRARYLIBRARY IEEE IEEE;USEUSE IEEE std_logic_1164.IEEE std_logic_1164.ALLALL;USEUSE IEEE std_logic_UNSIGNED.IEEE std_logic_UNSIGNE
18、D.ALLALL;ENTITYENTITY add5 add5 ISIS PORT PORT(numnum:IN IN std_logic_vectorstd_logic_vector(2 DOWNto 02 DOWNto 0););.););ENDEND add5 add5;ARCHITECTUREARCHITECTURE rt1 rt1 ofof add5 add5 isissignalsignal in_num in_num:integerinteger rangerange 0 0 toto 5 5;.BEGINBEGIN in_numin_num=CONV_INTEGER=CONV_
19、INTEGER(numnum););变换式变换式.ENDEND rtl rtl;例例2:Signal b:std_logic;Signal u1:unsigned(3 downto 0);Signal s1:signed(3 downto 0);Signal i1,i2:integer;U1=“1001”;S1=“1001”;B=x;Wait for 10 ns;I1=conv_integer(u1);I2=conv_integer(s1);(2 2)数据类型限定的方式)数据类型限定的方式 在数据之前加上类型名完成转换功能。在数据之前加上类型名完成转换功能。例:例:设有整型变量设有整型变量I,jI,j和实型变量和实型变量r,sr,s,则,则S:=REAL(I);S:=REAL(I);J:=INTEGER(r);J:=INTEGER(r);能正常执行能正常执行