资源描述
第5章VHDL语言的对象和数据类型及运算操作符,5.1VHDL文字规则,5.1.1数字,整数:整数都是十进制的数,如:5,678,0,156E2(=15600),45_234_287(=45234287),实数:实数也都是十进制的数,但必须带有小数点,如:1.335,88_670_551.453_909(=88670551.453909),1.0,44.99E-2(=0.4499),以数制基数表示的文字:用这种方式表示的数由五个部分组成。SIGNALd1,d2,d3,d4,d5:INTEGERRANGE0TO255;d1=10#170#;-(十进制表示,等于十进制170)d2=16#FE#;-(十六进制表示,等于十进制254)d3=2#1111_1110#;-(二进制表示,等于十进制254)d4=8#376#;-(八进制表示,等于十进制254)d5=16#E#E1;-(十六进制表示,等于十进制224),物理量文字(VHDL综合器不接受此类文字)。如:60s(60秒),100m(100米),k(千欧姆),177A(177安培),5.1VHDL文字规则,5.1.2字符串,(2)文字字符串,(3)数位字符串,用单引号括起来的ASCII字符,如:R,a,1,-,B:二进制基数符号,表示二进制位0或1,在字符串中的每位表示一个Bit。,O:八进制基数符号,在字符串中的每一个数代表一个八进制数,即代表一个3位(BIT)的二进制数。,X:十六进制基数符号(0F),代表一个十六进制数,即一个4位的二进制数。,data1=B1_1101_1110-二进制数数组,位矢数组长度是9data2=O15-八进制数数组,位矢数组长度是6data3=XAD0-十六进制数数组,位矢数组长度是12data4=B101_010_101_010-二进制数数组,位矢数组长度是12data5=101_010_101_010-表达错误,缺B。data6=0AD0-表达错误,缺X。,(1)字符,ERROR,BothSandQequalto1,X,BB$CC,5.1VHDL文字规则,5.1.3标识符,标识符是最常用的操作符,可以是常数、变量、信号、端口、子程序或参数的名字。VHDL基本标识符的书写需遵循如下规则:l有效的字符:包括26个大小写英文字母,数字包括09以及下划线“_”。l任何标识符必须以英文字母开头。l必须是单一下划线“_”,且其前后都必须有英文字母或数字。l标识符中的英语字母不分大小写。l允许包含图形符号(如回车符、换行符等),也允许包含空格符。,合法的标识符:A,fft,and_4,max2uc,非法的标识符:21A,_fft,and_4,max#2uc,a-b,return,5.1VHDL文字规则,5.1.4下标名,下标名用于指示数组型变量或信号的某一元素。格式:标识符(表达式)标识符必须是数组型的变量或信号的名字,表达式所代表的值必须是数组下标范围中的一个值,这个值将对应数组中的一个元素。如果这个表达式是一个可计算的值,则此操作数可很容易地进行综合。如果是不可计算的,则只能在特定的情况下综合。,下例的两个下标名中一个是m,属不可计算,另一个是3,属可计算的。SIGNALa,b:BIT_VECTOR(0TO3);SIGNALm:INTEGERRANGE0TO3;SIGNALy,z:BIT;y=a(m);-不可计算型下标表示z=b(3);-可计算型下标表示,5.2数据类型,标量型(ScalarType),复合类型(CompositeType),存取类型(AccessType),文件类型(FilesType),5.2.1VHDL的预定义数据类型,1.布尔(BOOLEAN)数据类型,2.位(BIT)数据类型如:constanta:bit:=1;variableq:bit:=0;signala,b:bit;,3.位矢量(BIT_VECTOR)数据类型如:signals:bit_vector(15downto0);constantq:bit_vector(3downto0):=“0110”;,5.2.1VHDL的预定义数据类型,4.字符(CHARACTER)数据类型通常用单引号括起来,区分大小写。,6.实数(REAL)数据类型如:variableq:realrange0.0to255.0;constanta:real:=1.0;,1.0十进制浮点数0.0十进制浮点数65971.333333十进制浮点数65_971.333_3333与上一行等价8#43.6#e+4八进制浮点数43.6E4十进制浮点数,5.字符串(STRING)数据类型,如:VARIABLEstring_var:STRING(0TO3);string_var:=abcd;,8.时间(TIME)数据类型,TYPEtimeISRANGE2147483647TO2147483647unitsfs;-飞秒,VHDL中的最小时间单位ps=1000fs;-皮秒ns=1000ps;-纳秒us=1000ns;-微秒ms=1000us;-毫秒sec=1000ms;-秒min=60sec;-分hr=60min;-时endunits;,5.2.1VHDL的预定义数据类型,7.整数(INTEGER)数据类型如:signalb:integerrange7to7;variablea:integer:=5;,5.2.2IEEE预定义标准逻辑位与矢量,1.标准逻辑位STD_LOGIC数据类型,2.标准逻辑矢量(STD_LOGIC_VECTOR)数据类型,5.2数据类型,5.2.3其他预定义数据类型,1.无符号数据类型(UNSIGNEDTYPE),2.有符号数据类型(SIGNEDTYPE),5.2数据类型,十进制的8可以作如下表示:UNSIGNED(1000),两则无符号数据定义的示例:VARIABLEvar:UNSIGNED(0TO10);SIGNALsig:UNSIGNED(5TO0);,例如:SIGNED(0101)代表+5,5SIGNED(1011)代表5,5.2.4用户自定义数据类型,1.枚举类型,2.物理类型,5.2数据类型,如:Typeyearis(Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec);Signalthismoth:year;result=sepelse0;,如:Typevoltageisrange0to1000000000Unitsuv;(基本单位)mv=1000uv;v=1000mv;Endunits;,5.2.5数组类型,5.2数据类型,限定性数组,限定性数组定义语句格式如下:TYPE数组名ISARRAY(数组范围)OF数据类型;如:typewordisarray(0to7)ofstd_logic;,非限定性数组,非限制性数组的定义语句格式如下:TYPE数组名ISARRAY(数组下标名RANGE)OF数据类型;如:typewordisarray(naturalrange)ofbit;,5.2.5数组类型,5.2数据类型,数组的元素可以是任何一种数据类型,用以定义数组元素的下标范围子句决定了数组中元素的个数,以及元素的排序方向,既下标数是由高到低,或是由低到高。如子句“0TO7”是由低到高排序的8个元素;即:a(0)a(1)a(2)a(7)。“15DOWNTO0”是由高到低排序的16个元素;即:a(15)a(14)a(13)a(0)。,5.3VHDL操作符,5.3.1逻辑操作符,表5-1VHDL操作符列表,表5-1VHDL操作符列表,接上页,表5-2VHDL操作符优先级,5.3.1逻辑操作符,【例5-4】SIGNALa,b,c:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALd,e,f,g:STD_LOGIC_VECTOR(1DOWNTO0);SIGNALh,I,j,k:STD_LOGIC;SIGNALl,m,n,o,p:BOOLEAN;.a=bANDc;-b、c相与后向a赋值,a、b、c的数据类型同属4位长的位矢量d=eORfORg;-两个操作符OR相同,不需括号h=(iNANDj)NANDk;-NAND不属上述三种算符中的一种,必须加括号l=(mXORn)AND(oXORp);-操作符不同,必须加括号h=iANDjANDk;-两个操作符都是AND,不必加括号h=iANDjORk;-两个操作符不同,未加括号,表达错误a=bANDe;-操作数b与e的位矢长度不一致,表达错误h=iORl;-i的数据类型是位STD_LOGIC,而l的数据类型是.-布尔量BOOLEAN,因而不能相互作用,表达错误。,5.3.1逻辑操作符,5.3.2关系操作符,【例5-5】ENTITYrelational_ops_1ISPORT(a,b:INBITVECTOR(0TO3);m:OUTBOOLEAN);ENDrelational_ops_1;ARCHITECTUREexampleOFrelational_ops_1ISBEGINoutput”(大于)、“=”(大于等于)“=”(小于等于),5.3.3算术操作符,表5-3算术操作符分类表,1.求和操作符,【例5-7】VARIABLEa,b,c,d,e,f:INTEGERRANGE0TO255;.a:=b+c;d:=ef;,【例5-8】PROCEDUREadding_e(a:ININTEGER;b:INOUTINTEGER)IS.b:=a+b;,【例5-9】PACKAGEexample_arithmeticISTYPEsmall_INtISRANGE0TO7;ENDexample_arithmetic;USEWORK.example_arithmetic.ALL;ENTITYarithmeticISPORT(a,b:INSMALL_INT;c:OUTSMALL_INT);ENDarithmetic;ARCHITECTUREexampleOFarithmeticISBEGINc=a+b;ENDexample;,2.求积操作符,5.3.3算术操作符,3.符号操作符,求积操作符包括*(乘)、/(除)、MOD(取模)和RED(取余)四种操作符。,符号操作符“+”和“”的操作数只有一个,5.3.3算术操作符,4.混合操作符,【例5-10】SIGNALa,b:INTEGERRANGE8to7;SIGNALc:INTEGERRANGE0to15;SIGNALd:INTEGERRANGE0to3;a=ABS(b);c=2*d;,混合操作符包括乘方“*”操作符和取绝对值“ABS”操作符两种,SLL逻辑左移SRL逻辑右移移空的位补零SLA算术左移SRA算术右移移空的位由最初首位补ROL逻辑循环左移ROR逻辑循环右移移出的位依次填补移空的位,5.3.3算术操作符,5.移位操作符,移位操作符的语句格式是:标识符移位操作符移位位数;,例:“1001001”SLL1=“0010010”“1001001”SRL1=“0100100”“1001001”SLA1=“0010011”“1001001”SRA1=“1100100”“1001001”ROL1=“0010011”“1001001”ROR1=“1100100”,例1:2输入与非门电路LIBRARYieee;USEieee.std_logic_1164.all;entityxx1isport(a,b:instd_logic;y:outstd_logic);endxx1;architecturenand2ppOFxx1isbeginy=anandb;endnand2pp;,VHDL语言应用举例,例2:3-8译码器LIBRARYieee;USEieee.std_logic_1164.all;entitydecoder38isport(a,b,c,g1,g2a,g2b:instd_logic;y:outstd_logic_vector(7downto0);enddecoder38;architecturebehave38OFdecoder38issignalindata:std_logic_vector(2downto0);beginindatayyyyyyyyy=XXXXXXXX“;endcase;elsey=11111111“;endif;endprocess;endbehave38;,例3:D触发器libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;ENTITYDISPORT(D,CLK:INstd_logic;Q:OUTstd_logic);ENDD;ARCHITECTUREbehaveOFDISBEGINPROCESS(CLK)BEGINIF(CLKEVENTANDCLK=1)THENQ=D;ENDIF;ENDPROCESS;ENDbehave;,例4:1位BCD(4位二进制)加法器LIBRARYieee;USEieee.std_logic_1164.all;USEieee.std_logic_unsigned.all;ENTITYbcdadd4ISPORT(op1,op2:instd_logic_vector(3downto0);result:outstd_logic_vector(4downto0);ENDbcdadd4;ARCHITECTUREbehaviorOFbcdadd4ISsignalbinadd:std_logic_vector(4downto0);BEGINbinadd9thenresult=binadd+6;elseresult=binadd;endif;endprocess;ENDbehavior;,
展开阅读全文