VHDL的基本描述语句.ppt

上传人:tia****nde 文档编号:12707480 上传时间:2020-05-14 格式:PPT 页数:60 大小:462.50KB
返回 下载 相关 举报
VHDL的基本描述语句.ppt_第1页
第1页 / 共60页
VHDL的基本描述语句.ppt_第2页
第2页 / 共60页
VHDL的基本描述语句.ppt_第3页
第3页 / 共60页
点击查看更多>>
资源描述
第6章VHDL的基本描述语句,6.1顺序语句,6.1.1顺序赋值语句,6.1.2IF语句,6.1.3CASE语句,6.1.4LOOP语句,6.1.5NEXT语句,6.1.6EXIT语句,6.1.7WAIT语句,6.1.8子程序调用语句,6.1.9返回语句(RETURN),6.1.10空操作语句(NULL),6.1.11断言(ASSERT)语句,6.1.12REPORT语句,6.1顺序语句,6.1.1顺序赋值语句,信号赋值语句,变量赋值语句,赋值目标,赋值符号,赋值源,信号或变量,=:=,数值、逻辑或运算表达式,IFTHEN;ELSIFTHEN;ELSIFTHEN;ELSE;ENDIF;,IF语句的一般形式为:,6.1.2IF语句,IFTHEN;ENDIF;,IFTHEN;ELSE;ENDIF;,LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYddfISPORT(CLK:INSTD_LOGIC;D:INSTD_LOGIC;Q,QD:OUTSTD_LOGIC);ENDddf;ARCHITECTUREexOFddfISBEGIN,【例】D触发器的VHDL语言描述,PROCESS(CLK)BEGINIF(CLKEVENT)AND(CLK=1)THENQ=D;QD=notD;ENDIF;ENDPROCESS;ENDARCHITECTUREex;,【例】D触发器的VHDL语言描述,【例】用VHDL设计一家用告警系统的控制逻辑,它有来自传感器的三个输入信号smoke、door、water和准备传输到告警设备的三个输出触发信号fire_alarm、burg_alarm、water_alarm以及使能信号en和alarm_en。,VHDL程序描述如下:,LIBRARYieee;USEieee.std_logic_1164.all;ENTITYalarmISPORT(smoke,door,water:INstd_logic;en,alarm_en:INstd_logic;fire_alarm,burg_alarm,water_alarm:OUTstd_logic);ENDalarm;,ARCHITECTUREalarm_arcOFalarmISBEGIN,PROCESS(smoke,door,water,en,alarm_en)BEGINIF(smoke=1)AND(en=0)THENfire_alarm=1;ELSEfire_alarm=0;ENDIF;,IF(door=1)AND(en=0)AND(alarm_en=0)THENburg_alarm=1;ELSEburg_alarm=0;ENDIF;,IF(water=1)AND(en=0)THENwater_alarm;WHEN;WHENOTHERS;ENDCASE;,多条件选择值的一般表达式为:选择值|选择值,选择值可以有四种不同的表达方式:单个普通数值,如6。数值选择范围,如(2TO4),表示取值为2、3或4。并列数值,如35,表示取值为3或者5。混合方式,以上三种方式的混合。,PORT(z1,z2,z3,z4:outstd_logic);SIGNALvalue:INTEGERRANGE0TO15;CASEvalueISWHEN0=z1z2z3z4out1out1out1out1=0;ENDCASE;,CASE语句使用时容易发生的错误:,【例】(3-8译码器)libraryieee;useieee.std_logic_1164.all;entitydecode38isport(a,b,c,G1,G2,G2B:instd_logic;y:outstd_logic_vector(7downto0);endentitydecode38;architectureexofdecode38issignalindata:std_logic_vector(2downto0);beginindatayyyyyyyyy=XXXXXXXX;endcase;elsey10;-当a大于10时跳出循环ENDLOOPL2;.,【例】SIGNALa,b,c:STD_LOGIC_VECTOR(1TO3);.FORnIN1To3LOOPa(n)=b(n)ANDc(n);ENDLOOP;,此段程序等效于顺序执行以下三个信号赋值操作:a(1)=b(1)ANDc(1);a(2)=b(2)ANDc(2);a(3)=b(3)ANDc(3);,【例】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYp_checkISPORT(a:INSTD_LOGIC_VECTOR(7DOWNTO0);y:OUTSTD_LOGIC);ENDp_check;ARCHITECTUREoptOFp_checkISSIGNALtmp:STD_LOGIC;BEGINPROCESS(a)BEGINtmp=0;FORnIN0TO7LOOPtmp=tmpXORa(n);ENDLOOP;yf);s3:b(k+8):=0;k:=k+1;NEXTLOOPL_y;NEXTLOOPL_x;.,NEXT语句主要用在LOOP语句执行中进行有条件的或无条件的转向控制。,6.1.6EXIT语句,EXIT;-第一种语句格式EXITLOOP标号;-第二种语句格式EXITLOOP标号WHEN条件表达式;-第三种语句格式,【例】SIGNALa,b:STD_LOGIC_VECTOR(1DOWNTO0);SIGNALa_less_then_b:Boolean;.a_less_then_bbEXIT;ELSIF(a(i)=0ANDb(i)=1)THENa_less_then_b=TRUE;-abEXIT;ELSENULL;ENDIF;ENDLOOP;-当i=1时返回LOOP语句继续比较,6.1.7WAIT语句,WAIT;-第一种语句格式WAITON信号表;-第二种语句格式WAITUNTIL条件表达式;-第三种语句格式WAITFOR时间表达式;-第四种语句格式,超时等待语句,【例】SIGNALs1,s2:STD_LOGIC;.PROCESSBEGIN.WAITONs1,s2;ENDPROCESS;,【例】(a)WAIT_UNTIL结构(b)WAIT_ON结构.LOOPWaituntilenable=1;Waitonenable;.EXITWHENenable=1;ENDLOOP;,6.1.7WAIT语句,一般地,只有WAITUNTIL格式的等待语句可以被综合器接受(其余语句格式只能在VHDL仿真器中使用),WAIT_UNTIL语句有以下三种表达方式:WAITUNTIL信号=Value;-(1)WAITUNTIL信号EVENTAND信号=Value;-(2)WAITUNTILNOT信号STABLEAND信号=Value;-(3),如果设clock为时钟信号输入端,以下四条WAIT语句所设的进程启动条件都是时钟上跳沿,所以它们对应的硬件结构是一样的:WAITUNTILclock=1;WAITUNTILrising_edge(clock);WAITUNTILNOTclockSTABLEANDclock=1;WAITUNTILclock=1ANDclockEVENT;,【例】.PROCESSBEGINWAITUNTILclk=1;ave=a;WAITUNTILclk=1;ave=ave+a;WAITUNTILclk=1;ave=ave+a;WAITUNTILclk=1;ave=(ave+a)/4;ENDPROCESS;,【例】PROCESSBEGINrst_loop:LOOPWAITUNTILclock=1ANDclockEVENT;-等待时钟信号NEXTrst_loopWHEN(rst=1);-检测复位信号rstx实参表达式);,1、过程调用,一个过程的调用将分别完成以下三个步骤:,(1)将IN和INOUT模式的实参值赋给欲调用的过程中与它们对应的形参;,(2)执行这个过程;,(3)将过程中IN和INOUT模式的形参值返回给对应的实参。,【例】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);BEGINIFxyTHENtmp:=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;,2、函数调用,函数调用与过程调用是十分相似的,不同之处是,调用函数将返还一个指定数据类型的值,函数的参量只能是输入值。,6.1.8子程序调用语句,6.1.9返回语句(RETURN),RETURN;-第一种语句格式RETURN表达式;-第二种语句格式,【例】PROCEDURErs(SIGNALs,r:INSTD_LOGIC;SIGNALq,nq:INOUTSTD_LOGIC)ISBEGINIF(s=1ANDr=1)THENREPORTForbiddenstate:sandrarequualto1;RETURN;ELSEqtmp:=regaORregb;WHEN110=tmp:=NOTrega;WHENOTHERS=NULL;ENDCASE;,WHENOTHERS=tmp:=rega;,6.1.11断言(ASSERT)语句,ASSERT语句主要用于程序仿真、调试中的人机对话,它可以给出一个文字串作为警告和错误信息。,ASSERT语句的书写格式为:ASSERT条件REPORT输出信息SEVERITY级别条件为真,向下执行另一个语句,条件为假,则输出错误信息和错误严重程度的级别。出错级别分别是:NOTE(注意)、WARNING(警告)、ERROR(错误)FAILURE(失败)。,【例】七段译码器Assert(NOT(indata=“1001”))Report“Errordata.”Severityerror;,例如:assert(a=255)report“aatedge”severitywarning;-警告a在边缘,可继续assert(a255)report“aoutofedge”severityerror;-报告a溢出,停止仿真,6.1.12REPORT语句,REPORT语句不增加任何语言功能。只是提供某种形式的顺序断言语句的短格式。,REPORT语句的书写格式为:REPORT输出信息SEVERITY级别,【例】七段译码器IF(indata=“1001”)THENReport“Errordata.”;ELSE,6.2VHDL并行语句,结构体中的并行语句主要有七种:1、并行信号赋值语句(ConcurrentSignalAssignments)。2、进程语句(ProcessStatements)。3、块语句(BlockStatements)。4、条件信号赋值语句(SelectedSignalAssignments)。5、元件例化语句(ComponentInstantiations),其中包括类属配置语句。6、生成语句(GenerateStatements)。7、并行过程调用语句(ConcurrentProcedureCalls)。,ARCHITECTURE结构体名OF实体名IS说明语句BEGIN并行语句ENDARCHITECTURE结构体名,6.2.1并行信号赋值语句,1.简单信号赋值语句,赋值目标=表达式,以下结构体中的五条信号赋值语句的执行是并行发生的。ARCHITECTUREcurtOFbc1ISSIGNALs1,e,f,g,h:STD_LOGIC;BEGINoutput1=aANDb;output2=c+d;g=eORf;h=eXORf;s1=g;ENDARCHITECTUREcurt;,6.2VHDL并行语句,2.条件信号赋值语句,赋值目标=表达式WHEN赋值条件ELSE表达式WHEN赋值条件ELSE.表达式;,6.2.1并行信号赋值语句,6.2VHDL并行语句,逻辑电路图,【例】ENTITYmuxISPORT(a,b,c:INBIT;p1,p2:INBIT;z:OUTBIT);END;ARCHITECTUREbehvOFmuxISBEGINz=aWHENp1=1ELSEbWHENp2=1ELSEc;END;,3.选择信号赋值语句,WITH选择表达式SELECT赋值目标信号=表达式WHEN选择值表达式WHEN选择值.表达式WHEN选择值;,6.2.1并行信号赋值语句,6.2VHDL并行语句,【例】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYdecoderISPORT(a,b,c:INSTD_LOGIC;data1,data2:INSTD_LOGIC;dataout:OUTSTD_LOGIC);ENDdecoder;ARCHITECTUREconcuntOFdecoderISSIGNALinstruction:STD_LOGIC_VECTOR(2DOWNTO0);BEGINinstruction=c,3.选择信号赋值语句,.WITHseltSELECTmuxout=aWHEN0|1,-0或1bWHEN2TO5,-2或3,或4或5cWHEN6,dWHEN7,ZWHENOTHERS;.,6.2.1并行信号赋值语句,下例是一个列出选择条件为不同取值范围的4选1多路选择器,当不满足条件时,输出呈高阻态。,6.2VHDL并行语句,1进程语句格式如下:进程标号:process(敏感信号表)is说明区;beginendprocess进程标号;(1)进程敏感表中可包含一个或多个元素值,当这些值中的一个或多个改变时,会激活进程。含有敏感信号表的进程,不允许再出现显式wait语句。如果不含,必须用wait语句。(2)进程说明区内可以说明数据类型、子程序、变量等,限于内部。(3)有关进程内部顺序语句的内容将在顺序语句部分作详细介绍。(4)一个进程可以重复执行多次。,例:结构体用进程实现两位二进制等值比较器。architecturebehave_processofecomp2isbegineqcome:process(a,b)-以敏感表(a,b)代替显式wait语句beginif(a=b)thenequ=1;elseequ=0;endif;endprocesseqcome;endbehave_process;,与其等效的使用显式wait语句的进程如下:architecturebehave_processofecomp2isbeginprocess-无敏感信号表beginif(a=b)thenequ=1;elseequ=0;endif;waitona,b;-本进程无敏感表则必须有显式wait语句endprocess;endbehave_process;,6.2.2块语句结构(BLOCK),块标号:BLOCK(块保护表达式)接口说明类属说明BEGIN并行语句ENDBLOCK块标号;,6.2VHDL并行语句,【例】.b1:BLOCKSIGNALs1:BIT;BEGINS1=aANDb;b2:BLOCKSIGNALs2:BIT;BEGINs2=cANDd;b3:BLOCKBEGINZ实际参数,其中=为关联符号,例:两位二进制等值比较器。libraryieee;useieee.std_logic_1164.all;entityecomp2is-两位等值比较器,第一层实体port(a,b:instd_logic_vector(1downto0);equ:outstd_logic);endecomp2;,architecturestructofecomp2issignalx:std_logic_vector(1downto0);componentxnor2-对元件xnor2进行元件说明port(i1,i2:instd_logic;o1:outstd_logic);endcomponent;componentand2-对元件and2进行元件说明port(i1,i2:instd_logic;o1:outstd_logic);endcomponent;begin-结构体描述使用元件例化语句u0:xnor2portmap(a(0),b(0),x(0);-位置关联方式u1:xnor2portmap(i1=a(1),i2=b(1),o1=x(1);-名称关联方式u2:and2portmap(x(0),x(1),equ);endstruct;,useieee.std_logic_1164.all;-须再次打开std_logic_1164entityxnor2is-二端同或门模块,第二层实体port(i1,i2:instd_logic_vector(1downto0);o1:outstd_logic);endxnor2;architecturexnor2ofxnor2isbegino1b(i);ENDGENERATEgen,.,【例】n位二进制计数器(n=6)LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYd_ffISPORT(d,clk_s:INSTD_LOGIC;q:OUTSTD_LOGIC;nq:OUTSTD_LOGIC);ENDENTITYd_ff;ARCHITECTUREex1OFd_ffISBEGINPROCESS(clk_s)BEGINIFclk_s=1ANDclk_sEVENTTHENq=d;nq=NOTd;ENDIF;ENDPROCESS;ENDARCHITECTUREex1;LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYcnt_bin_nisGENERIC(n:INTEGER:=6);PORT(q:OUTSTD_LOGIC_VECTOR(0TOn-1);in_1:INSTD_LOGIC);ENDENTITYcnt_bin_n;接下页,ARCHITECTUREex2OFcnt_bin_nISCOMPONENTd_ffPORT(d,clk_s:INSTD_LOGIC;Q,NQ:OUTSTD_LOGIC);ENDCOMPONENTd_ff;SIGNALs:STD_LOGIC_VECTOR(0TOn);BEGINs(0)=in_1;q_1:FORiIN0TOn-1GENERATEdff:d_ffPORTMAP(s(i+1),s(i),q(i),s(i+1);ENDGENERATEq_1;ENDARCHITECTUREex2;,6位二进制计数器原理图,6.2.3并行过程调用语句,过程名(关联参量名);,【例】.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的关联参量名,6.2VHDL并行语句,语句“NOT(clockSTABLEANDclock=1)”的表达方式是不可综合的。,6.3属性描述与定义语句,1.信号类属性,综合器支持的属性有:,LEFT、RIGHT、HIGH、LOW、RANGE、REVERSRANGE、LENGTH、EVENT及STABLE。,以下两语句的功能是一样的。(NOTclockSTABLEANDclock=1)(clockEVENTANDclock=1),注意:,2.数据区间类属性,【例】.SIGNALrange1:INSTDLOGICVECTOR(0TO7);.FORiINrange1RANGELOOP.,3、数值类属性,.PROCESS(clock,a,b);TYPEobjISARRAY(0TO15)OFBIT;SIGNALele1,ele2,ele3,ele4:INTEGER;BEGINele1=objRIGNT;ele2=objLEFT;ele3=objHIGH;ele4=objLOW;.,【例】奇偶校验判别信号发生器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYparityISGENERIC(bus_size:INTEGER:=8);PORT(input_bus:INSTD_LOGIC_VECTOR(bus_size-1DOWNTO0);even_numbits,odd_numbits:OUTSTD_LOGIC);ENDparity;ARCHITECTUREbehaveOFparityISBEGINPROCESS(input_bus)VARIABLEtemp:STD_LOGIC;BEGINtemp:=0;FORiINinput_busLOWTOinput_busHIGHLOOPtemp:=tempXORinput_bus(i);ENDLOOP;odd_numbits=temp;-奇数个1时temp=1even_numbits=NOTtemp;-偶数个1时temp=0ENDPROCESS;ENDbehave;,4、数组属性LENGTH,.TYPEarry1ARRAY(0TO7)OFBIT;VARIABLEwth:INTEGER;.wth1:=arry1LENGTH;-wth1=8.,5、用户定义属性,ATTRIBUTE属性名:数据类型;ATTRIBUTE属性名OF对象名:对象类型IS值;,【例】使用pinnum属性为端口锁定芯片引脚LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYcntbufISPORT(Dir:INSTD_LOGIC;Clk,Clr,OE:INSTD_LOGIC;A,B:INOUTSTD_LOGIC_VECTOR(0to1);Q:INOUTSTD_LOGIC_VECTOR(3downto0);ATTRIBUTEPINNUM:STRING;ATTRIBUTEPINNUMOFClk:signalis1;ATTRIBUTEPINNUMOFClr:signalis2;ATTRIBUTEPINNUMOFDir:signalis3;ATTRIBUTEPINNUMOFOE:signalis11;ATTRIBUTEPINNUMOFQ:signalis17,16,15,14;ENDcntbuf;,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!