VHDL语言的描述语句按语句执行的顺序分类,可以分为两类:ⅰ)顺序(Sequential)描述语句,ⅱ)并发(Concurrent)描述语句。顺序描述语句特点:每一条顺序语句的执行顺序与其书写顺序对应。所谓“顺序执行”是指在仿真意义上的顺序性,并不意味着顺序语句对应的硬件结构也有相同的顺序性。顺序语句只能出现在进程或子程序中(包括函数和过程)。进程是由一系列顺序语句构成的,而进程本身是并行语句,也就是说,在同一设计实体中,所有进程是并行执行的,而在任一时刻,在进程内部只有一条语句被执行。顺序描述语句的种类:◆WAIT语句◆顺序断言语句◆顺序信号代入语句◆顺序变量赋值语句◆IF语句◆CASE语句◆LOOP语句◆NEXT语句◆EXIT语句◆顺序过程调用语句◆NULL语句WAIT语句WAIT——无限等待WAITON信号列表——敏感信号量变化WAITUNTIL条件表达式——条件满足WAITFOR时间表达式——时间到WAITONa,b;WAITUNTIL“en=‘1’;WAITFOR10ns;WAITON信号[,信号];eg:Process(a,b)processbeginbeginy=aandb;waitona,b;Endprocess;y=aandb;endprocess;Pay:Process(a,b)beginwaitona,b;--错误语句(如果进程中已有敏感变量,y=aandb;则再使用WAITON是错误的)Endprocess;WAITUNTIL布尔表达式;WAITUNTIL((x*10)100);WAITFOR时间表达式;WAITFOR20ns;WAITFOR(a+b);多条件WAIT语句WAITONen,aUNTIL((EN=‘1’)or(a=true))FOR5us;说明:表达式的值至少包含一个信号量的值,如果都是变量,即使有新的变化,也不会计算表达式,这样就成为恒久等待语句,包含该等待语句的进程将不能再启动。2020/1/19IFIF条件表达式THEN顺序语句;ENDIF;IF条件表达式THEN顺序语句;ELSE顺序语句;ENDIF;判断条件是否成立。若条件成立,则执行THEN和ENDIF之间的顺序语句;若条件不成立,则跳过不执行,IF语句结束,执行后续语句。判断条件是否成立。若条件成立,则执行THEN和ELSE之间的顺序语句;若条件不成立,则执行ELSE和ENDIF之间的顺序语句。2020/1/19IFIF条件表达式1THEN顺序语句;ELSIF条件表达式2THEN顺序语句;…ELSE顺序语句;ENDIF;自上而下逐一判断条件是否成立。若条件成立,则执行相应的顺序语句,并不再判断其它表达式,直接结束IF语句的执行。这种语法格式能够进行优先级的判断,因此各条件表达式中的条件可以重叠。MUX4-1Input(0)Input(1)Input(2)Input(3)Sel(0)Sel(1)qsel00011011qinput(0)input(1)input(2)input(3)功能表:Eg:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYMUX4ISPORT(input:INSTD_LOGIC_VECTOR(3DOWNTO0);sel:INSTD_LOGIC_VECTOR(1DOWNTO0);y:OUTSTD_LOGIC);ENDMUX4;ARCHITECTUREMUX4_ARCHOFMUX4ISBEGINPROCESS(sel,input)BEGINIF(sel=“00”)THENy=input(0);ELSIF(sel=“01”)THENy=inpit(1);ELSIF(sel=“10”)theny=input(2);ELSEy=input(3);ENDIF;ENDPROCESS;ENDMUX4_ARCH;2020/1/19CASECASE表达式ISWHEN条件表达式1=顺序语句;WHEN条件表达式2=顺序语句;…WHENOTHERS=顺序语句;ENDCASE;若有多个选择值,则用“|”间隔,例如:2|3表示2或3。“=”相当于IF语句中的THEN。条件表达式的值不可重叠,例如不可同时出现WHEN“00”|”01”和WHEN“00”|”11”。当CASE语句的条件表达式的值无法覆盖所有情况时,要用OTHERS指出未能列出的其它所有情况的输出值。2020/1/19CASE三线八线译码器y(0)y(1)y(2)y(3)y(4)y(5)y(6)y(7)abcG1G2AG2B2020/1/19CASE输入输出G1G2A+G2BcbaY(7)Y(6)Y(5)Y(4)Y(3)Y(2)Y(1)Y(0)0XXXX11111111X1XXX11111111100001111111010001111111011001011111011100111111011110100111011111010111011111101101011111110111011111112020/1/19CASElibraryieee;useieee.std_logic_1164.all;entitydecode_3to8isPort(a,b,c,G1,G2A,G2B:instd_logic;y:outstd_logic_vector(7downto0));enddecode_3to8;architecturedec_archofdecode_3to8issignalindata:std_logic_vector(2downto0);beginindata=c&b&a;process(indata,G1,G2A,G2B)beginif(G1='1'andG2A='0'andG2B='0')thencaseindataiswhen000=y=11111110;when001=y=11111101;when010=y=11111011;when011=y=11110111;when100=y=11101111;when101=y=11011111;when110=y=10111111;when111=y=01111111;whenothers=y=XXXXXXXX;endcase;elsey=11111111;endif;endprocess;enddec_arch;2020/1/19LOOP[标号]:FOR循环变量IN循环范围LOOP顺序处理语句;ENDLOOP[标号];循环变量是一个临时变量,仅在此LOOP语句中有效,不必事先定义。i不必事先定义。不要将sum定义成信号而是变量。sum:=0;FORiin1to9LOOPsum:=sum+i;ENDLOOP;2020/1/19LOOP[标号]:WHILE条件LOOP顺序处理语句;ENDLOOP[标号];如果条件为真,则进行循环,如果条件为假,则结束循环。i:=1;sum:=0;WHILEi10LOOPsum:=sum+i;i=i+1;ENDLOOP;不要将sum定义成信号。2020/1/19LOOP[标号]:LOOP顺序语句;ENDLOOP[标号];需要引入其它的控制语句(如EXIT)。L1:LOOPa:=a+1;EXITL1WHENa10;ENDLOOPL1;2020/1/19EXITEXIT;EXITLOOP标号;EXITLOOP标号WHEN条件表达式FORiin0TO7LOOPIF(flag=TRUE)THENEXIT;ELSEc=aandb;ENDIF;ENDLOOP;L1:FORiin0TO7LOOPIF(flag=TRUE)THENEXITL1;ELSEc=aandb;ENDIF;ENDLOOP;L1:WHILEi10LOOPL2:WHILEj10LOOP...EXITL1WHENi=j;...ENDLOOPL2;ENDLOOPL1;VHDL并行描述语句并发处理的常用语句有:◆元件例化语句(ComponentInstant)◆进程语句(PROCESS)◆并发信号代入语句(ConcurrentSignalAssignment)◆条件信号代入语句(ConditionalSignalAssignment)◆选择信号代入语句(SelectiveSignalAssignment)◆并发过程调用语句(ConcurrentProcedureCall)◆块语句(Block)元件例化语句(1)元件例化说明语句COMPONENTCOMPONENT元件名GENERIC说明;--参数说明PORT说明;--端口说明ENDCOMPONENT;COMPONENT可以在ARCHITECTURE,PACKAGE,BLOCK的说明部分使用COMPONENTand2PORT(a,b:INBIT;c:OUTBIT);ENDCOMPONENT;说明:通过COMPONENT调用库中的门电路,无需再次定义。(2)元件例化语句PORTMAP。标号名:元件名PORTMAP(信号,…);映射的方式有两种:位置映射和名称映射u2:and2PORTMAP(nsel,d1,ab);或者u2:and2PORTMAP(a=nsel,b=b,c=ab);元件例化语句PROCESS归纳一下process大致有一下几个特点:☆它可以与其他进程并发运行,并可存取构造体或实体信号中所定义的信号;☆进程结构中的所有语句都是按顺序执行的;☆为启动进程,在进程结构中必须包含一个显式的敏感信号量表或者包含一个WAIT语句;☆进程之间的通信是通过信号量传递来实现的。2020/1/19并发信号代入语句赋值目标=表达式;在进程内部时,作为顺序语句使用;在进程外部时,作为并行语句使用。作为并行语句使用时,表达式的值是此条语句的敏感信号,即表达式值的变化会激发语句的执行。2020/1/19并发信号代入语句architecture…of…isbeginoutput=input;end;architecture…of…isbeginprocess(input)beginoutput=input;endprocess;end;条件信号代入语句与IF语句:IF语句只能在进程(PROCESS)中使用,因为它是顺序语句,而条件语句中的ELSE不可以省略,IF中的就可以省略,除此之外重要的一点是条件信号代入语句不能嵌套。用条件信号代入语句描述的电路与实际的逻辑电路工作情况类似,所以需要有较多的硬件知识,掌握起来有些难度。条件信号代入语句BLOCK标号:BLOCK块头{说明语句};BEGIN{并发处理语句};ENDBLOCK标号名;块头通常用于信号的映射和参数的定义,通常通过GENERIC语句,GENERIC_MAP语句,PORT语句和PORT_MAP语句来实现。说明语句和构造体的说明语句相同BLOCKlibraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitymuxisport(d0,d1,sel:inbit;q:outbit);endmux;architectureconnectofmuxissignaltemp1,temp2,temp3:bit;--内部信号不需要声明方向begincale:blockbegintemp1=d0andsel;temp2=d1and(notsel);temp3=d0ortemp2;q=temp3;endblockcale;endconnect;BLOCKlibraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitymuxisport(d0,d1,sel:inbit;q:outbit);endmux;architectureconn