您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > 第六章:可编程逻辑器件-VHDL
五、VHDL语言的顺序语句顺序语句(SequentialStatements)用来实现模型的算法描述。这些语句从多侧面完整地描述数字系统的硬件结构和基本逻辑功能,其中包括通信的方式、信号的赋值、多层次的元件例化以及系统行为等。顺序语句和并行语句是VHDL程序设计中两大基本描述语句系列。并行语句(ConcurrentStatements)用来表示各模型算法描述之间的连接关系。顺序语句只能出现在进程(PROCESS)过程(PROCEDURE)函数(FUNCTION)中,其它都是并行语句。顺序语句是相对于并行语句而言的,其特点是每一条顺序语句的执行(指仿真执行)顺序是与它们的书写顺序基本一致的,[理解]一个进程是由一系列顺序语句构成的,而进程本身属并行语句。也就是说,在同一设计实体中,所有的进程是并行执行的,每个进程内部是顺序执行的。VHDL有如下六类基本顺序语句:信号赋值语句变量赋值语句1、赋值语句2、流程控制语句3、等待语句4、子程序调用语句5、返回语句6、空操作语句IF语句CASE语句LOOP语句NEXT语句EXIT语句RETURN语句NULL语句WAIT语句过程调用函数调用目的变量:=表达式;变量的说明和赋值限定在顺序区域内,即只能在进程或子程序中使用,它无法传递到进程之外。目的信号=表达式;例:y=‘1’;例:x:=15;信号赋值可以在顺序区域内作顺序语句,也可以在结构体中当作并行语句使用。1、赋值语句A、变量赋值语句B、信号赋值语句2、流程控制语句第一种第二种A、IF语句IF条件句THEN顺序语句;ENDIF;IF条件句THEN顺序语句;ELSE顺序语句;ENDIF;第三种IF条件句1THEN顺序语句1;ELSIF条件2THEN顺序语句2;…ELSIF条件nTHEN顺序语句n;ELSE顺序语句n+1;ENDIF;例:IF(SET=’1’)THENc=bENDIF;例:IF(sel=’1’)THENc=a;ELSEc=b;ENDIF;例用IF语句描述一个四选一电路LIBRARYIEEE;USEIEEE.STE_LOGIC_1164.ALL;ENTITYmux4ISPORT(input:INSTD_LOGIC_VECTOR(3DOWNTO0);sel:INSTD_LOGIC_VECTOR(1DOWNTO0);Y:OUTSTD_LOGIC);ENDmux4;ARCHITECTURErt1OFmux4ISBEGINPROCESS(input,sel)BEGINIF(sel=”00”)THENY=input(0);ELSIF(Sel=”01”)THENY=input(1);ELSIF(Sel=”10”)THENY=input(2);ELSEY=input(3);ENDIF;ENDPROCESS;ENDrt1;IF语句不仅可用于选择器设计,还可用于比较器,译码器等进行条件控制的逻辑设计。IF语句中至少应有一个条件句,条件句必须由布尔表达式构成,条件表达式中能使用关系运算操作及逻辑运算操作的组合表达式。IF语句颠倒条件判别次序,会引起在综合时逻辑功能的变化,即IF语句判别条件不可颠倒。IF语句中,先处理最起始的条件;如果不满足,再处理下一个条件。一般把条件约束最多的作为起始条件。B、CASE语句CASE表达式ISWhen选择值=顺序语句;When选择值=顺序语句;...[WhenOTHERS=顺序语句;]ENDCASE;选择值可以有四种不同的表达方式:单个普通数值,如6。数值选择范围,如(2TO4),表示取值为2、3或4。并列数值,如35,表示取值为3或者5。混合方式,以上三种方式的混合。例用CASE语句描述4选1多路选择器。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYMUX41ISPORT(S1,S2:INSTD_LOGIC;A,B,C,D:INSTD_LOGIC;Z:OUTSTD_LOGIC);ENDENTITYMUX41;ARCHITECTUREARTOFMUX41ISSIGNAS:STD_LOGIC_VECTOR(1DOWNTO0);BEGINS=S1&S2;PROCESS(S,A,B,C,D)ISBEGINCASESISWHEN00=Z=A;WHEN01=Z=B;WHEN10=Z=C;WHEN11=Z=D;WHENOTHERS=Z='X';ENDCASE;ENDPROCESS;ENDARCHITECTUREART;(1)条件句中的选择值必须在表达式的取值范围内。(2)除非所有条件句中的选择值能完整覆盖CASE语句中表达式的取值,否则最末一个条件句中的选择必须用“OTHERS”表示。(3)CASE语句中每一条语句的选择只能出现一次,不能有相同选择值的条件语句出现。(4)CASE语句执行中必须选中,且只能选中所列条件语句中的一条。这表明CASE语句中至少要包含一个条件语句。使用CASE语句需注意以下几点:CASE语句常用来描写总线行为、编码器和译码器的结构。CASE语句与IF语句功能相似但CASE语句的可读性好,非常简洁。C、LOOP语句[标号:]FOR循环变量IN循环次数范围LOOP顺序语句;ENDLOOP[标号];用法示例:L2:LOOPa:=a+1;EXITL2WHENa10;--当a大于10时跳出循环ENDLOOPL2;...(2)FOR…LOOP语句,语法格式如下:(1)单个LOOP语句,其语法格式如下:[标号:]LOOP顺序语句;ENDLOOP[标号];[标号:]WHILE条件LOOP顺序语句;ENDLOOP[标号];(3)WHILE…LOOP语句,语法格式如下:用法示例:FORIIN0TO7LOOPTmp:=tmpXORa(I);ENDLOOP;用法示例:FORIIN0TO7LOOPTmp:=tmpXORa(I);ENDLOOP;用法示例:WHILEi4LOOPb:=bANDa(i);vout(i):=b;I:=I+1;ENDLOOP;D、NEXT语句NEXT;--第一种语句格式NEXTLOOP标号;--第二种语句格式NEXTLOOP标号WHEN条件表达式;--第三种语句格式NEXT有三种用法,其语法格式如下:当LOOP标号缺省时,则执行NEXT语句时,即刻无条件终止当前的循环,跳回到本次循环LOOP语句开始处,开始下一次循环,否则跳转到指定标号的LOOP语句开始处,重新开始执行循环操作。若WHEN子句出现并且条件表达式的值为TRUE,则执行NEXT语句,进入跳转操作,否则继续向下执行。用法示例:…L1:FORCNTIN1TO8LOOPS1:A(CNT):=‘0’;NEXTWHEN(B=C);S2:A(CNT+8):=‘0’;ENDLOOPL1;当程序执行到NEXT语句时,如果条件判断式(b=c)的结果为TRUE,将执行NEXT语句,并返回到L1,使cnt加1后执行S1开始的赋值语句,否则执行S2开始的赋值语句。E、EXIT语句EXIT;--第一种语句格式EXITLOOP标号;--第二种语句格式EXITLOOP标号WHEN条件表达式;--第三种语句格式EXIT有三种用法,其语法格式如下:这种语句格式与前述的NEXT语句的格式和操作功能非常相似,惟一的区别是NEXT语句是跳向LOOP语句的起始点,而EXIT语句则是跳向LOOP语句的终点。EXIT语句为程序需要处理保护、出错和警告状态时,提供了一种快捷、简便的调试方法。3、等待语句WAIT语句WAIT;--第一种语句格式WAITON信号表;--第二种语句格式WAITUNTIL条件表达式;--第三种语句格式WAITFOR时间表达式;--第四种语句格式,超时等待语句EXIT有四种用法,其语法格式如下:用法示例1:SIGNALs1,s2:STD_LOGIC;...PROCESSBEGIN...WAITONs1,s2;ENDPROCESS;WAIT[ON信号表][UNTIL条件表达式][FOR时间表达式];用法示例2:...Waituntilenable='1';单独的WAIT表示永远挂起。一般地,只有WAIT_UNTIL格式的等待语句可以被综合器接受(其余语句格式只能在VHDL仿真器中使用),WAIT_UNTIL语句有以下三种表达方式:WAITUNTIL信号=Value;--(1)WAITUNTIL信号’EVENTAND信号=Value;--(2)WAITUNTILNOT信号’STABLEAND信号=Value;--(3)如果设clock为时钟信号输入端,以下四条WAIT语句所设的进程启动条件都是时钟上跳沿,所以它们对应的硬件结构是一样的:WAITUNTILclock='1';WAITUNTILrising_edge(clock);WAITUNTILNOTclock’STABLEANDclock='1';WAITUNTILclock='1'ANDclock’EVENT;例:PROCESSBEGINrst_loop:LOOPWAITUNTILclock='1'ANDclock’EVENT;--等待时钟信号NEXTrst_loopWHEN(rst='1');--检测复位信号rstx=a;--无复位信号,执行赋值操作WAITUNTILclock='1'ANDclock’EVENT;--等待时钟信号NEXTrst_loopWhen(rst='1');--检测复位信号rsty=b;--无复位信号,执行赋值操作ENDLOOPrst_loop;ENDPROCESS;VHDL规定,已列出敏感量的进程中不能使用任何形式的WAIT语句。调用过程的语句格式如下:过程名[([形参名=]实参表达式{,[形参名=]实参表达式})];一个过程的调用将分别完成以下三个步骤:(1)将IN和INOUT模式的实参值赋给欲调用的过程中与它们对应的形参;(2)执行这个过程;(3)将过程中IN和INOUT模式的形参值返回给对应的实参。4、子程序调用语句A、过程调用语句B、函数调用语句函数调用与过程调用是十分相似的,不同之处是,调用函数将返还一个指定数据类型的值,函数的参量只能是输入值。5、返回语句RETURN语句是一段子程序结束后,返回主程序的控制语句。它有两种格式:第一种格式只能用于过程,它后面一定不能有表达式;第二种格式只能用于函数,它后面必须有条件表达式,它是函数结束的必要条件,函数结束必须用RETURN语句。RETURN;--第一种语句格式RETURN表达式;--第二种语句格式【例】PROCEDURErs(SIGNALs,r:INSTD_LOGIC;SIGNALq,nq:INOUTSTD_LOGIC)ISBEGINIF(s='1'ANDr='1')THENREPORTForbiddenstate:sandrarequualto'1';RETURN;ELSEq=sANDnqAFTER5ns;nq=sANDqAFTER5ns;ENDIF;ENDPROCEDURErs;【例】FUNCTIONopt(a,b,opr:STD_LOGIC)RETURNSTD_LOGICISBEGINIF(opr='1')THENRETURN(aANDb);ELSERETURN(aORb);ENDIF;ENDFUNCTIONopt;6、空操作语句空操作语句的语句格式如下:NULL;在下例的CASE语句中,NULL用于排除一些不用的条件。CASEOpcodeISWHEN001=tmp:=regaANDregb;WHEN101=tmp:=regaORregb;WHEN110=tmp:=NOTrega;WHENOTHERS=NULL;ENDCASE;6、断言(ASSERT)语句ASSERT条件表达式REPORT字符串SEVERITY错误等级[SEVERITY_LEVEL];ASSERT语句的格式如下:断言(ASSERT)语句只能在VHDL仿真器中使用,综合器通常忽略此语句。ASSERT语句判断指定的条件是否为T
本文标题:第六章:可编程逻辑器件-VHDL
链接地址:https://www.777doc.com/doc-51309 .html