您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 第9讲 自定义数据类型及转换
第九讲VHDL自定义数据类型及类型转换本讲知识点:自定义数据类型数据类型转换(1)TYPE语句用法:TYPE数据类型名IS数据类型定义[OF基本数据类型];用户自定义数据类型用户定义的数据类型可以有多种,如枚举类型、整数类型、实数类型、数组类型、记录类型和时间类型等。上述格式中的数据类型名由设计者自定;数据类型定义部分用来描述所定义元素的表达方式和表达内容;基本数据类型是指数据类型定义中所定义的基本数据类型,一般都是取已有的预定义数据类型。例:typest1isarray(0to15)ofstd_logic;typeweekis(sun,mon,tue,wed,thu,fri,sat);常用的自定义数据类型※枚举数据类型:typeweekis(sun,mon,tue,wed,thu,fri,sat);在逻辑电路中,所有的数据都是用“1”或“0”来表示的,但是人们在考虑逻辑关系时,只有数字往往是不方便的。在VHDL语言中,可以用文字符号来表示一组实际的二进制数。“000”“001”“010”“011”“100”“101”“110”例如:typem_stateis(state1,state2,state3,state4,state5);signalp_state,n_state:m_state;在综合过程中,枚举类型文字元素的编码通常是自动的,编码顺序是默认的,一般将第一个枚举量(最左边的量)编码为0,以后的依次加1。默认编码值如下:state1=’000’;state2=’001’;state3=’010’;state4=’011’;state5=’100’;思考:如何表示STD_LOGIC类型?※数组类型:语句格式如下:(1)TYPE数组名ISARRAY(数组范围)OF数据类型;(2)TYPE数组名ISARRAY(数组下标名RANGE)OF数据类型数组类型属复合类型,是将一组具有相同数据类型的元素集合在一起,作为一个数据对象来处理的数据类型。数组可以是一维数组或多维数组。例:typestbisarray(7downto0)ofstd_logic;该数组有8个元素,其下标排列是7、6、…1、0。typedata_busisarray(0to7)ofbit;该数组有8个元素,其下标排列是0、1、…6、7。TYPEbit_numberISARRAY(naturalRANGE)OFBIT;VARIABLEbb:bit_number(1to6);对数组赋值有两种方法:一是对整个数组进行一次赋值;二是按下标对每一个数组元素进行赋值。例:typedata_busisarray(0to7)ofbit;signala:data_bus;整体赋值:a=“01000111”;分别赋值:a(0)=‘0’;a(1)=‘1’;a(2)=‘0’;a(3)=‘0’;a(4)=‘0’;a(5)=‘1’;a(6)=‘1’;a(7)=‘1’;※物理类型:语句格式如下:(1)TYPE数据类型名IS范围;UNITS基本单位;单位;ENDUNITS例:P89例4-8用来表示时间、电压、容量和阻抗等物理量。※记录类型:将不同类型的数据和数据名组织在一起,而形成新的对象。语句格式如下:TYPE记录类型名ISRECORD记录元素名1:数据类型名;记录元素名2:数据类型名;……ENDRECORD;下面是记录类型定义的一个例子:typec_timeisrecordyear:integerrange0to3000;month:integerrange1to12;date:integerrange1to31;enable:bit;data:std_logic_vector(15downto0);endrecord;记录类型的对象的说明:signalnumber:c_time;一个记录的每一个元素要由它的记录元素名来进行访问。对于记录类型的对象的赋值和数组类似,可以对其进行整体赋值,也可分别赋值,从记录类型的对象中提取记录元素时应使用“.”。对记录元素分别赋值:number.year=2005;number.mouth=9;number.date=22;number.enable=‘1’;number.data=data_in;对记录元素整体赋值:number=(2005,9,22,‘1’,data_in);例2:P90例4-9用户定义的子类型SUBTYPE是TYPE所定义的数据类型的一个子集,它满足原数据类型的所有约束条件,原数据类型称为基本数据类型,SUBTYPE格式如下:SUBTYPE子类型名IS基本数据类型[约束范围];上述格式中的子类型名由设计者自定;基本数据类型必须是前面已有过type定义的类型。例:subtypedigisintegerrange0to9;其中,integer是标准程序包中已定义过的数据类型,子类型只是把integer约束到只含10个值的数据类型。P90例4-105、数据类型的转换在VHDL语言中,数据类型的定义是相当严格的,不同的数据类型之间不能进行运算和直接代入。为了实现正确的赋值操作,必须要将带入的数据进行类型转换。转换的方式:(1)转换函数数据类型转换函数通常有程序包来提供。(P91)(2)数据类型限定函数名功能.std_logic_1164包集合to_std_logic_vector(A)to_bit_vector(A)to_std_logic(A)to_bit(A)由bit_vector转换为std_logic_vector;由std_logic_vector转换为bit_vector;由bit转换成std_logic;由std_logic转换成bit。.std_logic_arith包集合CONV_std_logic_vector(A,位长)CONV_INTEGER(A)由integer,UNSDGNED,SIGNED转换成std_logic_vector;由UNSIGNED,SIGNED转换成integer。.std_logic_UNSIGNED包集合.std_logic_SIGNED包集合CONV_INTEGER(A)由std_logic_vector转换成integer。【程序】LIBRARYIEEE;USEIEEEstd_logic_1164.ALL;USEIEEEstd_logic_UNSIGNED.ALL;ENTITYadd5ISPORT(num:INstd_logic_vector(2DOWNto0);………………..);ENDadd5;ARCHITECTURErt1ofadd5issignalin_num:integerrange0to5;…………………….BEGINin_num〈=CONV_INTEGER(num);--变换式…………………….ENDrtl;例2:Signalb:std_logic;Signalu1:unsigned(3downto0);Signals1:signed(3downto0);Signali1,i2:integer;U1=“1001”;S1=“1001”;B=‘x’;Waitfor10ns;I1=conv_integer(u1);I2=conv_integer(s1);(2)数据类型限定的方式在数据之前加上类型名完成转换功能。例:设有整型变量I,j和实型变量r,s,则S:=REAL(I);J:=INTEGER(r);能正常执行
本文标题:第9讲 自定义数据类型及转换
链接地址:https://www.777doc.com/doc-4050721 .html