EDA技术与VHDL 第8章 VHDL结构_第1页
EDA技术与VHDL 第8章 VHDL结构_第2页
EDA技术与VHDL 第8章 VHDL结构_第3页
EDA技术与VHDL 第8章 VHDL结构_第4页
EDA技术与VHDL 第8章 VHDL结构_第5页
已阅读5页,还剩82页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

EDA技术与VHDL第10章VHDL结构8.1VHDL实体VHDL实体作为一个设计实体(独立的电路功能结构)的组成部分,其功能是对这个设计实体与外部电路进行接口描述。实体是设计实体的表层设计单元,实体说明部分规定了设计单元的输入输出接口信号或引脚,它是设计实体对外的一个通信界面。实体的具体表述和用法已在前面有过详细例解,这里不再重复。

KX康芯科技8.2VHDL结构体1.结构体的一般语言格式

ARCHITECTURE结构体名OF实体名IS[说明语句]BEGIN[功能描述语句]ENDARCHITECTURE结构体名;

8.2VHDL结构体2.结构体说明语句

3.功能描述语句结构

进程语句

信号赋值语句

子程序调用语句

元件例化语句

8.3VHDL子程序8.3.1VHDL函数

FUNCTION函数名(参数表)RETURN数据类型--函数首FUNCTION函数名(参数表)RETURN数据类型IS--函数体[说明部分]BEGIN顺序语句;ENDFUNCTION函数名;【例8-1】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;PACKAGEpackexpIS--定义程序包FUNCTIONmax(a,b:INSTD_LOGIC_VECTOR)--定义函数首RETURNSTD_LOGIC_VECTOR;FUNCTIONfunc1(a,b,c:REAL)--定义函数首RETURNREAL;FUNCTION"*"(a,b:INTEGER)--定义函数首RETURNINTEGER;FUNCTIONas2(SIGNALin1,in2:REAL)--定义函数首RETURNREAL;END;PACKAGEBODYpackexpISFUNCTIONmax(a,b:INSTD_LOGIC_VECTOR)--定义函数体RETURNSTD_LOGIC_VECTORISBEGINIFa>bTHENRETURNa;ELSERETURNb;ENDIF;ENDFUNCTIONmax;--结束FUNCTION语句END;--结束PACKAGEBODY语句LIBRARYIEEE;--函数应用实例USEIEEE.STD_LOGIC_1164.ALL;USEWORK.packexp.ALL;ENTITYaxampISPORT(dat1,dat2:INSTD_LOGIC_VECTOR(3DOWNTO0);dat3,dat4:INSTD_LOGIC_VECTOR(3DOWNTO0);out1,out2:OUTSTD_LOGIC_VECTOR(3DOWNTO0));END;ARCHITECTUREbhvOFaxampISBEGINout1<=max(dat1,dat2);--用在赋值语句中的并行函数调用语句PROCESS(dat3,dat4)BEGINout2<=max(dat3,dat4);--顺序函数调用语句ENDPROCESS;

END;KX康芯科技8.3VHDL子程序8.3.1VHDL函数

图8-110-2例8-1的逻辑电路图

8.3VHDL子程序【例8-2】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYfuncISPORT(a:INSTD_LOGIC_VECTOR(0to2);m:OUTSTD_LOGIC_VECTOR(0to2));ENDENTITYfunc;ARCHITECTUREdemoOFfuncISFUNCTIONsam(x,y,z:STD_LOGIC)RETURNSTD_LOGICISBEGINRETURN(xANDy)ORz;ENDFUNCTIONsam;BEGINPROCESS(a)BEGINm(0)=sam(a(0),a(1),a(2));m(1)=sam(a(2),a(0),a(1));m(2)=sam(a(1),a(2),a(0));ENDPROCESS;

ENDARCHITECTUREdemo;8.3VHDL子程序8.3.2VHDL重载函数

【例8-3】(MaxplusII不支持本例)

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;PACKAGEpackexpIS--定义程序包FUNCTIONmax(a,b:INSTD_LOGIC_VECTOR)--定义函数首RETURNSTD_LOGIC_VECTOR;FUNCTIONmax(a,b:INBIT_VECTOR)--定义函数首RETURNBIT_VECTOR;FUNCTIONmax(a,b:ININTEGER)--定义函数首RETURNINTEGER;END;

PACKAGEBODYpackexpISFUNCTIONmax(a,b:INSTD_LOGIC_VECTOR)--定义函数体RETURNSTD_LOGIC_VECTORISBEGINIFa>bTHENRETURNa;ELSERETURNb;ENDIF;ENDFUNCTIONmax;--结束FUNCTION语句

FUNCTIONmax(a,b:ININTEGER)--定义函数体RETURNINTEGERISBEGINIFa>bTHENRETURNa;ELSERETURNb;ENDIF;ENDFUNCTIONmax;--结束FUNCTION语句

接下页FUNCTIONmax(a,b:INBIT_VECTOR)--定义函数体RETURNBIT_VECTORISBEGINIFa>bTHENRETURNa;ELSERETURNb;ENDIF;ENDFUNCTIONmax;--结束FUNCTION语句END;--结束PACKAGEBODY语句.--以下是调用重载函数max的程序:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEWORK.packexp.ALL;ENTITYaxampISPORT(a1,b1:INSTD_LOGIC_VECTOR(3DOWNTO0);a2,b2:INBIT_VECTOR(4DOWNTO0);a3,b3:ININTEGERRANGE0TO15;c1:OUTSTD_LOGIC_VECTOR(3DOWNTO0);c2:OUTBIT_VECTOR(4DOWNTO0);c3:OUTINTEGERRANGE0TO15);END;ARCHITECTUREbhvOFaxampISBEGINc1<=max(a1,b1);--对函数max(a,b:INSTD_LOGIC_VECTOR)的调用

c2<=max(a2,b2);--对函数max(a,b:INBIT_VECTOR)的调用

c3<=max(a3,b3);--对函数max(a,b:ININTEGER)的调用

END;KX康芯科技【例8-4】LIBRARYIEEE;--程序包首USEIEEE.std_logic_1164.all;USEIEEE.std_logic_arith.all;PACKAGESTD_LOGIC_UNSIGNEDisfunction"+"(L:STD_LOGIC_VECTOR;R:INTEGER)returnSTD_LOGIC_VECTOR;function"+"(L:INTEGER;R:STD_LOGIC_VECTOR)returnSTD_LOGIC_VECTOR;function"+"(L:STD_LOGIC_VECTOR;R:STD_LOGIC)returnSTD_LOGIC_VECTOR;functionSHR(ARG:STD_LOGIC_VECTOR;COUNT:STD_LOGIC_VECTOR)returnSTD_LOGIC_VECTOR;...endSTD_LOGIC_UNSIGNED;

LIBRARYIEEE;--程序包体useIEEE.std_logic_1164.all;useIEEE.std_logic_arith.all;packagebodySTD_LOGIC_UNSIGNEDisfunctionmaximum(L,R:INTEGER)returnINTEGERisbeginifLRthenreturnL;elsereturnR;endif;end;function"+"(L:STD_LOGIC_VECTOR;R:INTEGER)returnSTD_LOGIC_VECTORisVariableresult:STD_LOGIC_VECTOR(L’range);Beginresult:=UNSIGNED(L)+R;returnstd_logic_vector(result);end;...endSTD_LOGIC_UNSIGNED;KX康芯科技8.3VHDL子程序8.3.3VHDL转换函数

函数名功能程序包:STD_LOGIC_1164to_stdlogicvector(A)由bit_vector类型的A转换为std_logic_vectorto_bitvector(A)由std_logic_vector转换为bit_vectorto_stdlogic(A)由bit转换成std_logicto_bit(A)由std_logic转换成bit程序包:STD_LOGIC_ARITHconv_std_logic_vector(A,位长)将整数integer转换成std_logic_vector类型,A是整数conv_integer(A)将std_logic_vector转换成整数integer程序包:STD_LOGIC_UNSIGNEDconv_integer(A)由std_logic_vector转换成integer表8-1IEEE库类型转换函数表

8.3VHDL子程序8.3.3VHDL转换函数

【例8-5】LIBRARYIEEE;USEIEEE.std_logic_1164.ALL;ENTITYexgISPORT(a,b:inbit_vector(3downto0);q:outstd_logic_vector(3downto0));end;architecturertlofexgisbeginq<=to_stdlogicvector(aandb);--将位矢量数据类型转换成标准逻辑位矢量数据end;

8.3VHDL子程序8.3.3VHDL转换函数

【例8-6】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;--注意使用了此程序包ENTITYaxampISPORT(a,b,c:INintegerrange0to15;q:OUTstd_logic_vector(3downto0));END;ARCHITECTUREbhvOFaxampISBEGINq<=conv_std_logic_vector(a,4)whenconv_integer(c)=8elseconv_std_logic_vector(b,4);END;

【例8-7】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;PACKAGEn_packISSUBTYPEnatISIntegerrange0to255;--定义一个Integer的子类型TYPEBit8ISarray(7downto0)OFstd_logic;--定义一个数据类型FUNCTIONnat_to_Bit8(s:nat)RETURNBit8;Endn_pack;PACKAGEBODYn_packISFUNCTIONnat_to_Bit8(s:nat)RETURNBit8ISVARIABLEDin:Integerrange255downto0;VARIABLERut:Bit8;VARIABLERig:Integer:=2**7;BEGINDin:=s;FORIin7downto0LOOPIFDin/Rig>1THENRut(i):='1';Din:=Din-Rig;ELSERut(i):='0';ENDIF;Rig:=Rig/2;ENDLOOP;RETURNRut;ENDnat_to_Bit8;ENDn_pack;

LIBRARYIEEE;--用户定义转换函数应用实例USEIEEE.STD_LOGIC_1164.ALL;USEWORK.n_pack.ALL;ENTITYaxampISPORT(dat:INnat;--注意数据类型的定义ou:OUTBit8);--注意数据类型的定义END;ARCHITECTUREbhvOFaxampISBEGINou<=nat_to_Bit8(dat);END;8.3VHDL子程序8.3.4VHDL决断函数

决断函数输入一般是单一变量,多个驱动源的信号值组成非限定数组,如2个信号驱动源,其信号值组成的数组是2个元素长度;3个信号驱动源信号值组成的数组是3个元素长度,多个信号驱动源信号值组成的未限定数组可依次类推。但决断函数调用后返回的是单一信号值,称断信号值。

8.3VHDL子程序8.3.5VHDL过程

PROCEDURE过程名(参数表)--过程首

PROCEDURE过程名(参数表)IS[说明部分]BIGIN--过程体

顺序语句;ENDPROCEDURE过程名

8.3VHDL子程序8.3.5VHDL过程

PROCEDUREpro1(VARIABLEa,b:INOUTREAL);PROCEDUREpro2(CONSTANTa1:ININTEGER;

VARIABLEb1:OUTINTEGER);PROCEDUREpro3(SIGNALsig:INOUTBIT);8.3VHDL子程序8.3.5VHDL过程

【例8-8】PROCEDUREprg1(VARIABLEvalue:INOUTBIT_VECTOR(0TO7))ISBEGINCASEvalueISWHEN"0000"=>value:"0101";WHEN"0101"=>value:"0000";WHENOTHERS=>value:"1111";ENDCASE;ENDPROCEDUREprg1;8.3VHDL子程序8.3.5VHDL过程

【例8-9】

PROCEDUREcomp(a,r:INREAL;m:ININTEGER;v1,v2:OUTREAL)ISVARIABLEcnt:INTEGER;BEGINv1:=1.6*a;--赋初始值v2:=1.0;--赋初始值Q1:FORcntIN1TOmLOOPv2:=v2*v1;EXITQ1WHENv2>v1;--当v2>v1,跳出循环LOOPENDLOOPQ1ASSERT(v2<v1)REPORT"OUTOFRANGE"--输出错误报告SEVERITYERROR;ENDPROCEDUREcomp;【例8-10】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;PACKAGEaxampIS--过程首定义PROCEDUREnand4a(SIGNALa,b,c,d:INSTD_LOGIC;SIGNALy:OUTSTD_LOGIC);ENDaxamp;PACKAGEBODYaxampIS--过程体定义PROCEDUREnand4a(SIGNALa,b,c,d:INSTD_LOGIC;SIGNALy:OUTSTD_LOGIC)ISBEGINy<=NOT(aANDbANDcANDd);RETURN;ENDnand4a;ENDaxamp;LIBRARYIEEE;--主程序USEIEEE.STD_LOGIC_1164.ALL;USEWORK.axamp.ALL;ENTITYEXISPORT(e,f,g,h:INSTD_LOGIC;x:OUTSTD_LOGIC);END;ARCHITECTUREbhvOFEXISBEGINnand4a(e,f,g,h,x);并行调用过程END;8.3VHDL子程序8.3.6VHDL重载过程

【例8-11】

PROCEDUREcalcu(v1,v2:INREAL;SIGNALout1:INOUTINTEGER);PROCEDUREcalcu(v1,v2:ININTEGER;SIGNALout1:INOUTREAL);...calcu(20.15,1.42,signl);--调用第一个重载过程calcucalcu(23,320,sign2);--调用第二个重载过程calcu

...8.3VHDL子程序8.3.7子程序调用语句

1.过程调用

过程名[([形参名=>]实参表达式{,[形参名=>]实参表达式})];

(1)将IN和INOUT模式的实参值赋给欲调用的过程中与它们对应的形参;(2)执行这个过程;(3)将过程中IN和INOUT模式的形参值返回给对应的实参。

8.3VHDL子程序8.3.7子程序调用语句

1.过程调用

【例8-12】PACKAGEdata_typesIS--定义程序包SUBTYPEdata_elementISINTEGERRANGE0TO3;--定义数据类型TYPEdata_arrayISARRAY(1TO3)OFdata_element;ENDdata_types;USEWORK.data_types.ALL;--打开以上建立在当前工作库的程序包data_typesENTITYsortISPORT(in_array:INdata_array;out_array:OUTdata_array);ENDsort;ARCHITECTUREexmpOFsortISBEGINPROCESS(in_array)--进程开始,设data_types为敏感信号PROCEDUREswap(data:INOUTdata_array;--swap的形参名为data、low、highlow,high:ININTEGER)ISVARIABLEtemp:data_element;BEGIN--开始描述本过程的逻辑功能

IF(data(low)>data(high))THEN--检测数据temp:=data(low);data(low):=data(high);data(high):=temp;ENDIF;ENDswap;--过程swap定义结束VARIABLEmy_array:data_array;--在本进程中定义变量my_arrayBEGIN--进程开始

my_array:=in_array;--将输入值读入变量swap(my_array,1,2);--my_array、1、2是对应于data、low、high的实参

swap(my_array,2,3);--位置关联法调用,

第2、第3元素交换swap(my_array,1,2);--位置关联法调用,

第1、第2元素再次交换out_array<=my_array;ENDProcess;ENDexmp;

8.3VHDL子程序8.3.7子程序调用语句

1.过程调用

【例8-13】ENTITYsort4isGENERIC(top:INTEGER:=3);PORT(a,b,c,d:INBIT_VECTOR(0TOtop);ra,rb,rc,rd:OUTBIT_VECTOR(0TOtop));ENDsort4;ARCHITECTUREmuxesOFsort4ISPROCEDUREsort2(x,y:INOUTBIT_VECTOR(0TOtop))isVARIABLEtmp:BIT_VECTOR(0TOtop);BEGINIFx>yTHENtmp:=x;x:=y;y:=tmp;ENDIF;ENDsort2;BEGINPROCESS(a,b,c,d)VARIABLEva,vb,vc,vd:BIT_VECTOR(0TOtop);BEGINva:=a;vb:=b;vc:=c;vd:=d;sort2(va,vc);sort2(vb,vd);sort2(va,vb);sort2(vc,vd);sort2(vb,vc);ra<=va;rb<=vb;rc<=vc;rd<=vd;ENDPROCESS;ENDmuxes;

8.3VHDL子程序8.3.7子程序调用语句

1.过程调用

2.函数调用函数调用与过程调用是十分相似的,不同之处是,调用函数将返还一个指定数据类型的值,函数的参量只能是输入值。

8.3VHDL子程序8.3.8并行过程调用语句

过程名(关联参量名);

【例8-14】...PROCEDUREadder(SIGNALa,b:INSTD_LOGIC;--过程名为adderSIGNALsum:OUTSTD_LOGIC);...adder(a1,b1,sum1);--并行过程调用...--在此,a1、b1、sum1即为分别对应于a、b、sum的关联参量名PROCESS(c1,c2);--进程语句执行BEGINAdder(c1,c2,s1);--顺序过程调用,在此c1、c2、s1即为分别对ENDPROCESS;--应于a、b、sum的关联参量名8.3VHDL子程序8.3.8并行过程调用语句

【例8-15】PROCEDUREcheck(SIGNALa:INSTD_LOGIC_VECTOR; --在调用时SIGNALerror:OUTBOOLEAN)IS --再定位宽VARIABLEfound_one:BOOLEAN:=FALSE; --设初始值BEGINFORiINa'RANGELOOP--对位矢量a的所有的位元素进行循环检测IFa(i)='1'THEN--发现a中有'1'IFfound_oneTHEN--若found_one为TRUE,则表明发现了一个以上的'1'ERROR<=TRUE;--发现了一个以上的'1',令found_one为TRUERETURN;--结束过程ENDIF;Found_one:=TRUE;--在a中已发现了一个'1'EndIF;EndLOOP;--再测a中的其他位

error<=NOTfound_one;--如果没有任何'1'被发现,error将被置TRUEENDPROCEDUREcheck;8.3VHDL子程序8.3.8并行过程调用语句

...CHBLK:BLOCKSIGNALs1:STD_LOGIC_VECTOR(0TO0);--过程调用前设定位矢尺寸SIGNALs2:STD_LOGIC_VECTOR(0TO1);SIGNALs3:STD_LOGIC_VECTOR(0TO2);SIGNALs4:STD_LOGIC_VECTOR(0TO3);SIGNALe1,e2,e3,e4:Boolean;BEGINCheck(s1,e1);--并行过程调用,关联参数名为s1、e1Check(s2,e2);--并行过程调用,关联参数名为s2、e2Check(s3,e3);--并行过程调用,关联参数名为s3、e3Check(s4,e4);--并行过程调用,关联参数名为s4、e4ENDBLOCK;...

8.4VHDL库8.4.1库的种类

1.

IEEE库

2.

STD库

3.

WORK库

4.

VITAL库

8.4VHDL库8.4.2库的用法

USE库名.程序包名.项目名

USE库名.程序包名.ALL;LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.STD_ULOGIC;USEIEEE.STD_LOGIC_1164.RISING_EDGE;USEWORK.std_logic_1164.ALL;

8.5VHDL程序包定义程序包的一般语句结构如下:PACKAGE程序包名IS--程序包首

程序包首说明部分

END程序包名;PACKAGEBODY程序包名IS--程序包体

程序包体说明部分以及包体内

END程序包名;8.5VHDL程序包【例8-16】

PACKAGEpaclIS--程序包首开始TYPEbyteISRANGE0TO255;--定义数据类型byteSUBTYPEnibbleISbyteRANGE0TO15;--定义子类型nibbleCONSTANTbyte_ff:byte:=255;--定义常数byte_ffSIGNALaddend:nibble;--定义信号addendCOMPONENTbyte_adder--定义元件PORT(a,b:INbyte;c:OUTbyte;overflow:OUTBOOLEAN);ENDCOMPONENT;FUNCTIONmy_function(a:INbyte)Returnbyte;--定义函数ENDpacl;--程序包首结束【例8-17】PACKAGEsevenISSUBTYPEsegmentsisBIT_VECTOR(0TO6);TYPEbcdISRANGE0TO9;ENDseven;USEWORK.seven.ALL;--WORK库默认是打开的,ENTITYdecoderISPORT(input:bcd;drive:outsegments);ENDdecoder;ARCHITECTUREsimpleOFdecoderISBEGINWITHinputSELECTdrive<=B"1111110"WHEN0,B"0110000"WHEN1,B"1101101"WHEN2,B"1111001"WHEN3,B"0110011"WHEN4,B"1011011"WHEN5,B"1011111"WHEN6,B"1110000"WHEN7,B"1111111"WHEN8,B"1111011"WHEN9,

B"0000000"WHENOTHERS;ENDsimple;

KX康芯科技8.6VHDL配置配置语句的一般格式如下:CONFIGURATION配置名OF实体名IS配置说明END配置名;8.7VHDL文字规则8.7.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;--(十六进制表示,等于2#1110000#,等于224)物理量文字(VHDL综合器不接受此类文字)

60s(60秒),100m(100米),k(千欧姆),177A(177安培)8.7VHDL文字规则8.7.2字符串

(1)文字字符串

"ERROR","BothSandQequalto1","X","BB$CC"(2)数位字符串B:二进制基数符号,表示二进制位0或1,在字符串中的每位表示一个Bit。

O:八进制基数符号,在字符串中的每一个数代表一个八进制数,即代表一个3位(BIT)的二进制数。

X:十六进制基数符号(0~F),代表一个十六进制数,即一个4位的二进制数。

data1<=B"1_1101_1110"--二进制数数组,位矢数组长度是9data2<=O"15"--八进制数数组,位矢数组长度是6data3<=X"AD0"--十六进制数数组,位矢数组长度是12data4<=B"101_010_101_010"--二进制数数组,位矢数组长度是12data5<="101_010_101_010"--表达错误,缺B。data6<="0AD0"--表达错误,缺X。8.7VHDL文字规则8.7.3标识符

Decoder_1,FFT,Sig_N,Not_Ack,State0,Idle_Decoder_1 --起始为非英文字母2FFT --起始为数字Sig_#N --符号“#”不能成为标识符的构成Not-Ack --符号“-”不能成为标识符的构成RyY_RST_ --标识符的最后不能是下划线“_”data__BUS --标识符中不能有双下划线return --关键词

8.7VHDL文字规则8.7.4下标名

标识符(表达式)SIGNALa,b:BIT_VECTOR(0TO3);SIGNALm:INTEGERRANGE0TO3;SIGNALy,z:BIT;y<=a(m);--不可计算型下标表示z<=b(3);--可计算型下标表示8.8VHDL数据类型标量型(ScalarType):

包括实数类型、整数类型、枚举类型、时间类型。复合类型(CompositeType):

可以由小的数据类型复合而成,如可由标量型复合而成。复合类型主要有数组型(Array)和记录型(Record)。存取类型(AccessType):

为给定的数据类型的数据对象提供存取方式。文件类型(FilesType):

用于提供多值存取类型。

8.8VHDL数据类型8.8.1预定义数据类型

1.布尔(BOOLEAN)类型

TYPEBOOLEANIS(FALSE,TRUE);

2.位(BIT)数据类型

TYPEBITIS('0','1');

3.位矢量(BIT_VECTOR)类型

TYPEBIT_VECTORISARRAY(NaturalRange<>)OFBIT;8.8VHDL数据类型8.8.1预定义数据类型

4.字符(CHARACTER)类型

5.整数(INTEGER)类型

6.实数(REAL)类型

1.0十进制浮点数0.0十进制浮点数65971.333333十进制浮点数65_971.333_3333与上一行等价8#43.6#e+4八进制浮点数43.6E-4十进制浮点数8.8VHDL数据类型7.字符串(STRING)类型

8.时间(TIME)类型

VARIABLEstring_var:STRING(1TO7);string_var:="abcd";

TYPEtimeISRANGE-2147483647TO2147483647unitsfs;--飞秒,VHDL中的最小时间单位ps=1000fs;--皮秒ns=1000ps;--纳秒us=1000ns;--微秒ms=1000us;--毫秒sec=1000ms;--秒min=60sec;--分hr=60min;--时endunits;8.8VHDL数据类型8.8.1预定义数据类型

9.文件(FILES)类型

PROCEDUERReadline(F:INTEXT;L:OUTLINE);PROCEDUERWriteline(F:OUTTEXT;L:INLINE);PROCEDUERRead(L:INOUTLINE;Value:OUTstd_logic;Good:OUTBOOLEAN);PROCEDUERRead(L:INOUTLINE;Value:OUTstd_logic);PROCEDUERRead(L:INOUTLINE;Value:OUTstd_logic_vector;Good:OUTBOOLEAN);PROCEDUERRead(L:INOUTLINE;Value:OUTstd_logic_vector;PROCEDUERWrite(L:INOUTLINE;Value:INstd_logic;Justiaied:INSIDE:=Right;field;INWIDTH:=0);PROCEDUERWrite(L:INOUTLINE;Value:INstd_logic_vector,Justiaied:INSIDE:=Right;field;INWIDTH:=0);

8.8VHDL数据类型8.8.2IEEE预定义标准逻辑位与矢量

1.标准逻辑位STD_LOGIC数据类型

2.标准逻辑矢量(STD_LOGIC_VECTOR)数据类型

STD_LOGIC_VECTOR类型定义如下:TYPESTD_LOGIC_VECTORISARRAY(NATURALRANGE<>)OFSTD_LOGIC;8.8VHDL数据类型8.8.3其他预定义标准数据类型

无符号型(UNSIGNED)有符号型(SIGNED)小整型(SMALL_INT)LIBRARYIEEE;USEIEEE.STD_LOIGC_ARITH.ALL;8.8VHDL数据类型8.8.3其他预定义标准数据类型

1.无符号数据类型(UNSIGNEDTYPE)UNSIGNED'("1000")VARIABLEvar:UNSIGNED(0TO10);SIGNALsig:UNSIGNED(5TO0);2.有符号数据类型(SIGNEDTYPE)SIGNED'("0101")代表+5,5SIGNED'("1011")代表–5

VARIABLEvar:SIGNED(0TO10);

8.8VHDL数据类型8.8.4VHDL数组类型

TYPE数组名ISARRAY(数组范围)OF数据类型

TYPEstbISARRAY(7DOWNTO0)ofSTD_LOGIC;TYPExis(low,high);TYPEdata_busISARRAY(0TO7,x)ofBIT;TYPE数组名ISARRAY(数组下标名RANGE)OF数据类型

8.8VHDL数据类型8.8.4VHDL数组类型

【例8-18】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYampISPORT(a1,a2:INBIT_VECTOR(3DOWNTO0);c1,c2,c3:INSTD_LOGIC_VECTOR(3DOWNTO0);b1,b2,b3:INTEGERRANGE0TO15;d1,d2,d3,d4:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDamp;d1<=TO_STDLOGICVECTOR(a1ANDa2);--(1)d2<=CONV_STD_LOGIC_VECTOR(b1,4)WHENCONV_INTEGER(b2)=9elseCONV_STD_LOGIC_VECTOR(b3,4);--(2)d3<=c1WHENCONV_INTEGER(c2)=8ELSEc3;--(3)d4<=c1WHENc2=8elsec3;--(4)8.8VHDL数据类型8.8.4VHDL数组类型

【例8-19】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYdecoder3to8ISPORT(input:INSTD_LOGIC_VECTOR(2DOWNTO0);output:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDdecoder3to8;ARCHITECTUREbehaveOFdecoder3to8ISBEGINPROCESS(input)BEGINoutput<=(OTHERS=>'0');output(CONV_INTEGER(input))<='1';ENDPROCESS;ENDbehave;8.8.4VHDL数组类型

【例8-20】FUNCTIONTo_bit(s:std_ulogic;xmap:BIT:='0')RETURNBIT;FUNCTIONTo_bitvector(s:std_logic_vector;xmap:BIT:='0')RETURNBIT_VECTOR;FUNCTIONTo_bitvector(s:std_ulogic_vector;xmap:BIT:='0')RETURNBIT_VECTOR;下面是转换函数To_bitvector的函数体:FUNCTIONTo_bitvector(s:std_logic_vector;xmap:BIT:='0')RETURNBIT_VECTORISALIASsv:std_logic_vector(s'LENGTH-1DOWNTO0)ISs;VARIABLEresult:BIT_VECTOR(s'LENGTH-1DOWNTO0);BEGINFORiINresult'RANGELOOPCASEsv(i)ISWHEN'0'|'L'=>result(i):='0';WHEN'1'|'H'=>result(i):='1';WHENOTHERS=>result(i):=xmap;ENDCASE;ENDLOOP;RETURNresult;END;8.9VHDL操作符8.9.1逻辑操作符(LogicalOperator)逻辑操作符(LogicalOperator)关系操作符(RelationalOperator)算术操作符(ArithmeticOperator)符号操作符(SignOperator)重载操作符(OverloadingOperator)AandBandCandD(AorB)xorC

类型操作符功能操作数数据类型算术操作符+加整数-减整数&并置一维数组*乘整数和实数(包括浮点数)/除整数和实数(包括浮点数)MOD取模整数REM取余整数SLL逻辑左移BIT或布尔型一维数组SRL逻辑右移BIT或布尔型一维数组SLA算术左移BIT或布尔型一维数组SRA算术右移

BIT或布尔型一维数组ROL逻辑循环左移

BIT或布尔型一维数组ROR逻辑循环右移

BIT或布尔型一维数组**乘方

整数ABS取绝对值

整数表8-2VHDL操作符列表

表8-2VHDL操作符列表

类型操作符功能操作数数据类型关系操作符=等于任何数据类型/=不等于任何数据类型<小于枚举与整数类型,及对应的一维数组>大于枚举与整数类型,及对应的一维数组<=小于等于枚举与整数类型,及对应的一维数组>=大于等于枚举与整数类型,及对应的一维数组逻辑操作符AND与BIT,BOOLEAN,STD_LOGICOR或BIT,BOOLEAN,STD_LOGICNAND与非BIT,BOOLEAN,STD_LOGICNOR或非BIT,BOOLEAN,STD_LOGICXOR异或BIT,BOOLEAN,STD_LOGICXNOR异或非BIT,BOOLEAN,STD_LOGICNOT非BIT,BOOLEAN,STD_LOGIC符号操作符+正

整数

-负

整数8.9VHDL操作符8.9.1逻辑操作符(LogicalOperator)运算符优先级NOT,ABS,**最高优先级*,/,MOD,REM+(正号),

-(负号)

+,

&

SLL,SLA,SRL,SRA,ROL,ROR

=,/=,<,<=,>,>=

AND,OR,NAND,NOR,XOR,XNOR最低优先级表8-3VHDL操作符优先级

8.9VHDL操作符8.9.1逻辑操作符(LogicalOperator)【例8-21】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,因而不能相互作用,表达错误8.9VHDL操作符8.9.2关系操作符(RelationalOperator)“=”(等于)“/=”(不等于)“>”(大于)“<”(小于)“>=”(大于等于)“<=”(小于等于)'1'='1';"101"="101";"1">"011";"101"<"110";

8.9VHDL操作符8.9.2关系操作符(RelationalOperator)【例8-22】ENTITYrelational_ops_1ISPORT(a,b:INBIT_VECTOR(0TO3);m:OUTBOOLEAN);ENDrelational_ops_1;ARCHITECTUREexampleOFrelational_ops_1ISBEGINoutput<=(a=b);ENDexample;8.9VHDL操作符8.9.2关系操作符(RelationalOperator)【例8-23】

ENTITYrelational_ops_2ISPORT(a,b:ININTEGERRANGE0TO3;m:OUTBOOLEAN);ENDrelational_ops_2;ARCHITECTUREexampleOFrelational_ops_2ISBEGINoutput<=(a>=b);ENDexample;8.9VHDL操作符8.9.3算术操作符(ArithmeticOperator)

别算术操作符分类1

求和操作符(Addingoperators)+(加),-(减),

(并置)2

求积操作符(Multiplyingoperators)*,/,MOD,REM3

符号操作符(Signoperators)+(正),

-(负)4

混合操作符(Miscellaneousoperators)**,ABS5

移位操作符(Shiftoperators)SLL,SRL,SLA,SRA,ROL,ROR表8-4算术操作符分类表

8.9VHDL操作符8.9.3算术操作符(ArithmeticOperator)1.求和操作符

【例8-24】VARIABLEa,b,c,d,e,f:INTEGERRANGE0TO255;...a:=b+c;d:=e–f;【例8-25】PROCEDUREadding_e(a:ININTEGER;b:INOUTINTEGER)IS...b:=a+b;8.9VHDL操作符8.9.3算术操作符(ArithmeticOperator)1.求和操作符

【例8-26】PACKAGEexample_arithmeticISTYPEsmall_INtISRANGE0TO7;ENDexample_ari

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论