《(1.4.9)--3.2.4VHDL语言要素(4)20190809.ppt》由会员分享,可在线阅读,更多相关《(1.4.9)--3.2.4VHDL语言要素(4)20190809.ppt(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第3章 EDA技术设计与应用精讲3.2.4 VHDL语言要素(4)内容提要内容提要VHDL数据类型(续):用户自定义数据类型方式;各种自定义数据类型;数据类型的转换。一、用户自定义数据类型方式用户自定义数据类型是用类型定义语句TYPE和子类型定义语句SUBTYPE实现的。1TYPE语句用法TYPE语句语法结构如下:TYPE 数据类型名 IS 数据类型定义 OF 基本数据类型;由设计者自定用来描述所定义的数据类型的表达方式和表达内容指数据类型定义中所定义的元素的基本数据类型,一般都是取已有的预定义数据类型2SUBTYPE语句用法子类型SUBTYPE只是由TYPE所定义的原数据类型的一个子集,它满
2、足原数据类型的所有约束条件。利用子类型定义数据对象,除了使程序提高可读性和易处理外,还有利于提高综合的优化效率。子类型SUBTYPE的语句格式如下:SUBTYPE 子类型名 IS 基本数据 RANGE 约束范围;例如:SUBTYPE DIGITS INTEGER RANGE 0 TO 9;标准程序包中已定义过的数据类型把INTEGER约束到只含10个值的数据类型二、各种自定义数据类型VHDL自定义数据类型有多种,如枚举类型、整数类型、数组类型、记录类型、时间类型、实数类型等。1枚举类型(1)VHDL中的枚举数据类型是用文字符号来表示一组实际的二进制数的类型。其目的是为了更便于阅读和编译。(2)
3、枚举数据类型定义示例TYPE M_STATE IS(STATE1,STATE2,STATE3,STATE4,STATE5);SIGNAL CURRENT_STATE,NEXT_STATE:M_STATE;这些状态代表五组惟一的二进制数值(3)在综合过程中,枚举类型文字元素的编码通常是自动的,编码顺序是默认的,一般将第一个枚举量编码为0,以后依次加1。一般而言,编码方法因综合器不同而不同。为了某些特殊的需要,编码顺序也可以人为设置。2整数类型和实数类型整数和实数的数据类型,因其取值定义范围太大,综合器无法进行综合。因此在具体使用时,必须根据实际的需要重新定义,并限定其取值范围,以便能为综合器所接
4、受,从而提高芯片资源的利用率。实际应用中,VHDL仿真器通常将整数或实数类型作为有符号数处理,VHDL综合器对整数或实数的编码方法是:负数二进制补码编码正数二进制原码编码编码的位数,即综合后信号线的数目只取决于用户定义的数值的最大值。例如:TYPE INT3 IS RANGE 100 TO 100;SUBTYPE INT4 IS INT3 RANGE 0 TO 6;-8位二进制补码-3位二进制原码3数组类型(1)数组类型是将一组具有相同数据类型的元素集合在一起,作为一个数据对象来处理的数据类型。数组可以是一维数组或多维数组。VHDL仿真器支持多维数组,但VHDL综合器只支持一维数组。(2)VH
5、DL允许定义两种不同类型的数组,即限定性数组和非限定性数组。它们的区别是:限定性数组下标的取值范围在数组定义时就被确定了,而非限定性数组下标的取值范围需留待随后根据具体数据对象再确定。(3)限定性数组定义语句格式:TYPE 数组名 IS ARRAY(数组范围)OF 数据类型;明确指出数组元素的定义数量和排序方式,以整数来表示其数组的下标即指数组各元素的数据类型(4)非限制性数组的定义语句格式:TYPE 数组名 IS ARRAY(数组下标名 RANGE)OF 数据类型;以整数类型设定的一个数组下标名称数组中每一元素的数据类型下标范围待定符号,用到该数组类型时,再填入具体的数值范围比如:TYPE
6、BIT_VECTOR IS ARRAY(NATURAL RANE)OF BIT;VARABLE VA:BIT_VECTOR(1 TO 6);-将数组取值范围定在16(1)由已定义的、数据类型不同的对象元素构成的数组称为记录类型的对象。(2)定义记录类型的语句格式:TYPE 记录类型名 IS RECORD 元素名 :元素数据类型;元素名 :元素数据类型;4记录类型END RECORD 记录类型名;(3)记录类型的数据对象赋值的方式,可以是整体赋值也可以是对单个元素进行赋值。使用整体赋值方式时位置关联方式名字关联方式如果使用了OTHERS选项,则至少应有一个元素被赋值。如果有两个或更多的元素由OT
7、HERS选项来赋值,则这些元素必须具有相同的类型。(4)记录类型中的每一个元素仅为标量型数据类型构成,称为线性记录类型。只有线性记录类型的数据对象才是可综合的。TYPE REGNAME IS(AX,BX,CX,DX);TYPE OPERATION IS RECORD OPSTRSTRING(1 TO 10);OPCODEBIT_VECTOR(3 DOWNTO 0);OP1,OP2,RES:REGNAME;END RECORD OPERATION;VARIABLE INSTR1,INSTR2:OPERATION;【例题】利用记录类型定义的一个微处理器命令信息表。INSTR1:=(ADD AX,B
8、X,0001,AX,BX,AX);INSTR2:=(ADD AX,BX,0010,AX,OTHERS=BX);VARIABLE INSTR3OPERATION;INSTR3.OPSTR:=MUL AX,BX;INSTR3.OP1:=AX;操作数目标码一般地,对于记录类型的数据对象进行单元素赋值时,就在记录类型对象名后加点(“.”),再加赋值元素的元素名。三、数据类型转换1数据类型转换的作用:由于VHDL是一种强类型语言,要求各种数据类型相同的参量,才能相互作用和传递。因此对于数据类型不同的参量需要进行相互作用和传递时,首先必须进行数据类型的转换。2数据类型转换的方式(1)类型转换函数方式类型转
9、换函数方式,就是通过定义一个数据类型转换函数,将属于某种数据类型的数据对象转换成属于另一种数据类型的数据对象。(2)直接类型转换方式直接类型转换方式,就是将一个需要转换数据类型的表达式,通过指定一种特定的数据类型的方式,即数据类型标识符(表达式),将表达式的值转换成指定的数据类型。当然这种转换,仅限于非常关联的数据类型之间。3应用举例【例题1】类型转换函数的使用LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;LIBRARY DATAIO;USE DATAIO.STD_LOGIC_OPS.ALL;TO_VECTORTO_INTEGER将INTEGER 转换成ST
10、D_LOGIC_VECTOR将STD_LOGIC_VECTOR转换成INTEGER通过这两个转换函数,就可以使用“+”运算符进行直接加1操作,同时又能保证最后的加法结果是STD_LOGIC_VECTOR数据类型。ENTITY CNT4 IS PORT(CLK:IN STD_LOGIC;P:INOUT STD_LOGIC_VECTOR(3 DOWNTO 0);END ENTITY CNT4;ARCHITECTURE ART OF CNT4 IS BEGIN PROCESS(CLK)IS BEGIN IF CLK=1AND CLKEVENT THEN P=TO_VECTOR(TO_INTEGER(
11、P)+1,4);END IF;END PROCESS;END ARCHITECTURE ART;4位的矢量(1)先将矢量P通过调用TO_INTEGER函数,转换成整数,再将其中间结果与整数1相加,结果为整数;(2)将P加1后的中间结果整数,通过调用TO_VECTOR函数,转换成4位的矢量;(3)将表达式的最后结果,赋值给输出P。【例题2】直接类型转换的使用。VARIABLE DATAC,PARAMC:INTEGER;DATAC:=INTEGER(74.94*REAL(PARAMC);DATAC:=INTEGER(74.94*REAL(PARAMC);(1)通过直接类型转换函数REAL(PARAMC),将PARAMC转换成实数;(2)将实数74.94与实数REAL(PARAMC)进行乘法运算,结果为实数;(3)将74.94*REAL(PARAMC)的运算结果实数,再转换成整数,亦即INTEGER(74.94*REAL(PARAMC);(4)将最后的整数结果,进行赋值操作,传递给整数变量DATAC。