您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 59VHDL数字电路设计教程第3讲 数据类型
1第三章数据类型预定义的数据类型用户定义的数据类型子类型数组端口数组记录类型有符号数和无符号数数据类型转换要求设计实体中的每一个常数、信号、变量、函数以及设定的各种参量都必须具有确定的数据类型,并且相同数据类型的量才能互相传递和作用。2指在IEEE1076和IEEE1164标准中预先定义的一系列数据类型,可以在包集/库中找到。std库的standard包集:BIT、BOOLEAN、INTEGER、REAL数据类型;ieee库的std_logic_1164包集:STD_LOGIC、STD_ULOGIC数据类型;ieee库的std_logic_arith包集:SIGNED、UNSIGNED数据类型;数据类型转换函数conv_integer(p),conv_unsigned(p,b)等;ieee库的std_logic_signed和std_logic_unsigned包集:一些函数,将STD_LOGIC_VECTOR类型数据进行类似SIGNED、UNSIGNED类型数据的运算;3.1预定义的数据类型31)BIT(位,表示一位的信号值,位值为‘0’或‘1’)和BIT_VECTOR(位矢量,表示一组位数据)。声明:SIGNALX:BIT;SIGNALY:BIT_VECTOR(3DOWNTO0);SIGNALW:BIT_VECTOR(0DOWNTO3);注意:最高位MSB(MostSignificantBit)的顺序!赋值:X=‘1’;----单引号!Y=“1001”;----双引号!42)STD_LOGIC和STD_LOGIC_VECTOR:这两者是IEEE1164标准中引入的8逻辑值系统。std_logic_vector类型是由std_logic构成的数组。定义如下:typestd_logic_vectorisarray(naturalrange)ofstd_logic;赋值的原则:相同位宽,相同数据类型。定义8种数字逻辑值的原因:由std_logic类型代替bit类型可以完成电子系统的精确模拟,并可实现常见的三态总线电路。5两个或以上数字逻辑电路的输出端连接到同一个节点时(称为“线与”现象!),节点的电平该如何取值?典型案例:总线!1EN1ENAY11EN2ENBY21EN3ENCY3总线驱动能力强的电路可以将节点电平强行拉高或拉低,因此需建立多值逻辑系统加以细分。节点的电平取值取决于:•两者或多者当前的输出电平值;•两者的驱动能力强弱。X:‘强’不确定值;W:‘弱’不确定值;0:‘强’0;L:‘弱’0;1:‘强’1;H:‘弱’1;Z:高阻态(三态缓冲器,常用于总线设计)-:不可能出现的情况68逻辑值系统数值关系表数值关系归纳:•X或-与其它数值连接时,最终电平取值均为X;•Z与其它数值连接时,最终电平取值均为其它数值;•与X类似,W与L/H数值连接时,最终电平取值均为W;•0与1、L与H连接时,最终电平取值分别为X、W;多个输出连接到同一个节点上时,节点的电平取值:7STD_LOGIC_VECTOR类型数据的算术运算操作STD_LOGIC_VECTOR类型数据不能直接进行算术运算。通过声明ieee库中的std_signed和std_logic_unsigned这两个包集,该类型数据即可进行算术运算。例:LIBRARYieee;USEieee.std_logic_1164.all;USEieee.std_logic_unsigned.all;signala,b:INSTD_LOGIC_VECTOR(7DOWNTO0);signalc:OUTSTD_LOGIC_VECTOR(7DOWNTO0);c=a+b;83)STD_ULOGIC和STD_ULOGIC_VECTOR:比STD_LOGIC类型多引入了一个逻辑值‘U’,代表初始不定值。但没有指定两个STD_ULOGIC信号连接到同一个节点上发生冲突后的逻辑值,因此要避免两个输出信号直接进行连接的情况。94)布尔类型(boolean)布尔量具有两种状态:false和true常用于逻辑函数,如相等(=)、比较()等中作逻辑比较。如,bit值转化成boolean值:boolean_var:=(bit_var=‘1’);5)字符(CHARACTER):用单引号将字符括起来。variablecharacter_var:character;......Character_var:=‘A’;106)整数(integer)integer表示所有正的和负的整数。硬件实现时,利用32位的位矢量来表示。可实现的整数范围为:-(231-1)to(231-1)VHDL综合器要求对具体的整数作出范围限定,否则无法综合成硬件电路。如:signals:integerrange0to15;信号s的取值范围是0-15,可用4位二进制数表示,因此s将被综合成由四条信号线构成的信号。117)自然数(natural)和正整数(positive)natural是integer的子类型,表示非负整数。positive是integer的子类型,表示正整数。定义如下:subtypenaturalisintegerrange0tointeger’high;subtypepositiveisintegerrange1tointeger’high;128)实数(REAL)或称浮点数取值范围:-1.0E38-+1.0E38实数类型仅能用于VHDL仿真器,一般综合器不支持。9)物理量字符(Physicalliteral):时间、电压等,可以仿真,但不可综合(即综合库中没有直接可以调用的器件)。由整数和物理单位组成如:55ms,20ns1310)SIGNED(有符号数)和UNSIGNED(无符号数):ieee库std_logic_arith包集中定义的数据类型,只能表示大于等于0的数,能够支持算术运算、比较运算,但不支持逻辑运算。只有在代码开始部分声明ieee库中的包集std_logic_arith,才能使用有符号数和无符号数。有符号数和无符号数的语法结构与STD_LOGIC_VECTOR相似,与整数不同,例如:SIGNALX:SIGNED(7DOWNTO0);SIGNALY:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALZ:INTEGERRANGE0TO255;14例:signed和unsigned数的合法与非法操作:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;--必须声明该包集才能使用signed和unsigned数。signala,b:INSIGNED(7DOWNTO0);signalx:OUTSIGNED(7DOWNTO0);x=a+b;--合法(支持算术运算)x=aANDb;--非法(不支持逻辑运算)15例:STD_LOGIC_VECTOR的合法与非法操作:libraryieee;useieee.std_logic_1164.all;--不必声明其它包集。signala,b:INstd_logic_vector(7DOWNTO0);signalx:OUTstd_logic_vector(7DOWNTO0);x=a+b;--非法(不支持算术运算)x=aANDb;--合法(支持逻辑运算)----------------------------------------注意:如果声明std_logic_signed和std_logic_unsigned两个包集,则STD_LOGIC_VECTOR类型的数据也可以进行算术运算。16例:STD_LOGIC_VECTOR的合法与非法操作:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;signala,b:INstd_logic_vector(7DOWNTO0);signalx:OUTstd_logic_vector(7DOWNTO0);x=a+b;--合法(支持算术运算)x=aANDb;--合法(支持逻辑运算)173.2用户定义的数据类型用类型定义语句TYPE实现用户自定义数据类型。TYPE语句格式:例:typebyteisarray(7downto0)ofbit;variableaddend:byte;typeweekis(sun,mon,tue,wed,thu,fri,sat);type数据类型名is数据类型定义[of基本数据类型];可选181)用户定义的整数类型用户定义的整数类型是标准包中整数类型的子范围。格式:例:typemy_naturalisrange0to9;---用户定义的自然数类型;typemy_integerisrange-3to3;---用户定义的整数类型;type类型名称isrange整数范围;192)枚举(enumerated)类型枚举该类型的所有可能的值。格式:如:typemy_logicis(‘0’,‘1’,‘Z’);typestateis(idle,forward,backward,stop);--常用于有限状态机的定义。typecoloris(blue,green,yellow,red);variablehue:color;hue:=blue;typebit_vectorisarray(naturalrange)ofBIT;---range表示数据取值范围没有约束,naturalrange表示数据值约束在自然数范围内。type类型名称is(枚举文字{,枚举文字});20枚举类型的编码:综合器自动实现枚举类型元素的编码,一般将第一个枚举量(最左边)编码为0,以后的依次加1。编码用位矢量表示,位矢量的长度将取所需表达的所有枚举元素的最小值。如:typecoloris(blue,green,yellow,red);编码为:blue=“00”;green=“01”;yellow=“10”;red=“11”;213.3子类型子类型是已定义的类型或子类型的一个子集。格式:例:bit_vector类型定义如下:typebit_vectorisarray(naturalrange)ofbit;如设计中只用16bit;可定义子类型如下:subtypemy_vectorisbit_vector(0to15);注:子类型与基(父)类型具有相同的操作符和子程序。可以直接进行赋值操作。subtype子类型名is数据类型名[范围];22SUBTYPE语句格式:例:subtypedigitsisintegerrange0to9;由subtype语句定义的数据类型称为子类型。subtype子类型名is基本数据类型约束范围;233.4数组(ARRAY)数组是将相同数据类型的数据集合在一起形成的一种新的数据类型。可以是1D、2D或1D*1D,更高维数的数组往往是不可综合(即综合库中没有直接可以调用的器件)的。数组的结构:001000010001101001100010001101001100a.标量b.1D数组矢量c.1D*1D矢量数组d.2D二维标量数组24typetype_nameisarray(specification)ofdata_type;VHDL中预定义的数据类型仅包括标量类型(单个位)和矢量类型(一维数组)两类,并没有预定义2D和1D*1D数组,用户可以自定义。定义的语法如下:数组类型对signal/variable/constant的声明的语法如下:signal(constant/variable)signal_name:type_name[:=initial_value];可选25例子:•一种定义1D*1D数组的方法:TYPErowISARRAY(7DOWNTO0)OFSTD_LOGIC;--1D数组;TYPEmatrixISARRAY(0TO3)OFrow;--1D*1D数组,矢量数组;S
本文标题:59VHDL数字电路设计教程第3讲 数据类型
链接地址:https://www.777doc.com/doc-4505635 .html