第7章VHDL基本语句与基本设计EDA技术与VHDL设计7.1顺序语句并行语句VHDL组合逻辑电路设计VHDL时序逻辑电路设计7.27.37.4VHDL基本语句与基本设计顺序语句的执行顺序与书写顺序一致,与传统软件设计语言的特点相似。顺序语句只能用于进程和子程序中,被用来描述组合逻辑和时序逻辑。常用的顺序描述语句有:赋值语句、IF语句、CASE语句、LOOP语句、NEXT语句、EXIT语句、子程序、RETURN语句、WAIT语句和NULL语句。7.1顺序语句信号赋值语句:7.1.1赋值语句赋值目标=赋值源;变量赋值语句:赋值目标:=赋值源;根据语句所设条件,if语句有选择地执行指定的语句,其语法格式由简单到复杂可以分为三种:(1)具有开关控制的IF语句(2)具有二选择控制的IF语句(3)具有多选择控制的IF语句7.1.2IF语句一般格式:if条件then顺序语句;endif;当条件成立,执行顺序语句,否则跳过语句。具有开关控制的IF语句if(EN=’1’)thenA=B;--当条件EN=1时,A随B变化;否则,该语句不执行endif;具有开关控制的IF语句举例一般格式:if条件then顺序语句;else顺序语句;endif;条件成立执行then后顺序语句;否则执行else后的顺序语句。具有二选择控制的IF语句ifOE=‘0’thenY=notx;elseY=‘Z’;--高阻符号“Z”要大写endif;用IF语句描述三态非门一般格式:if条件then顺序语句;elsif条件then顺序语句;[elsif条件then顺序语句;][else顺序语句;]endif;具有多选择控制的IF语句case语句根据表达式的取值直接从多组顺序语句中选择一组执行,其语句格式为:case表达式iswhen选择值=顺序语句;when选择值=顺序语句;......whenothers=顺序语句;endcase;7.1.3CASE语句一般格式:(1)关键词others只能出现一次,且只能作为最后一种条件取值。使用others的目的是为了使条件句中的所有选择值能涵盖表达式的所有取值,以免综合器会插入不必要的锁存器。使用CASE语句注意事项一般格式:(2)条件句中的选择值必须在表达式的取值范围内。(3)case语句中每一条件句的选择值只能出现一次,不能有相同选择值的条件语句出现。(4)case语句执行必须选中,且仅能选中所列语句中的一条。使用CASE语句注意事项(1)WHEN取值=顺序语句:(2)WHEN取值|取值|…|取值=顺序语句:(3)WHEN取值TO取值=顺序语句;(4)WHEN取值DOWNTO取值=顺序语句;(5)WHENOTHERS=顺序语句;CASE语句中WHEN字句书写格式d0=‘0’;d1=‘0’;d2=‘0’;d3=‘0’;CASEselISWHEH“00”=d0=d;WHEN“01”=d1=d;WHEN“10”=d2=d;WHENOTHERS=d3=d;ENDCASE;CASE语句应用举例LOOP语句与其它高级语言中的循环语句相似,它可以使所包含的一组顺序语句被循环执行,其执行次数可由设定的循环参数决定。LOOP语句有三种格式:(1)无限LOOP语句(2)FOR_LOOP语句(3)WHILE_LOOP语句7.1.4LOOP语句[标号:]LOOP顺序语句EXIT标号;ENDLOOP;举例:L2:LOOPa:=a+1;EXITL2WHENa10;ENDLOOPL2;无限LOOP语句[标号]:FOR循环变量IN离散范围LOOP顺序处理语句;ENDLOOP[标号];注意:(1)循环变量是LOOP内部自动声明的局部量,仅在LOOP内可见。(2)离散范围必须是可计算的整数范围。循环次数范围规定LOOP语句中的顺序语句被执行的次数。FOR_LOOP语句LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYparity_checkISPORT(a:INSTD_LOGIC_VECTOR(7DOWNTO0);y:OUTSTD_LOGIC);ENDENTITYparity_check;ARCHITECTUREoneOFparity_checkISBEGINPROCESS(a)VARIABLEtmp:STD_LOGIC;BEGINtmp:=’1’;FORiIN0TO7LOOPtmp:tmpxora(i);ENDLOOP;y=tmp;ENDPROCESS;END;用FORLOOP语句描述8位奇偶校验电路[标号]:WHILE循环条件LOOP顺序处理语句;ENDLOOP[标号];例:sum:=0;i:=0;abcd:WHILE(i10)LOOPsum:=sum+i;i:=i+1;ENDLOOPabcd;WHILE_LOOP语句LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYparity_checkISPORT(a:INSTD_LOGIC_VECTOR(7DOWNTO0);y:OUTSTD_LOGIC);ENDENTITYparity_check;ARCHITECTUREoneOFparity_checkISBEGINPROCESS(a)VARIABLEtmp:STD_LOGIC;VARIABLEi:INTEGER;BEGINtmp:=’0’;i:=0;WHILE(i8)LOOPtmp:tmpxora(i);i:=i+1;ENDLOOP;y=tmp;ENDPROCESS;END;用WHILE_LOOP语句描述8位奇偶校验电路在LOOP语句中,NEXT语句用来跳出本次循环。其格式分三种:(1)NEXT:无条件终止当前的循环,跳回到本次循环LOOP语句开始处,开始下次循环。(2)NEXT:[标号];无条件终止当前的循环,跳转到指定标号的LOOP语句开始处,重新开始执行循环操作。(3)NEXT[标号][WHEN条件表达式];7.1.5NEXT语句L1:WHILEi10LOOPL2:WHILEj20LOOPNEXTL1WHENi=j;ENDLOOPL2;ENDLOOPL1;NEXT语句举例EXIT语句是LOOP语句的内部循环控制语句,作用是结束循环状态。而区别在于NEXT语句是跳向LOOP语句的起始点,EXIT语句则是跳向LOOP语句的终点。EXIT的语句格式也有3种:(1)EXIT;(2)EXITLOOP标号;(3)EXITLOOP标号WHEN条件表达式;7.1.6EXIT语句PROCESS(a)VARIABLEint_a:INTEGER;BEGINint_a:=a;FORiIN0TOmax_limitLOOPIF(int_a=0)THENEXIT;ELSEint_a:=int_a-1;ENDIF;ENDLOOP;ENDPROCESS;EXIT语句举例在进程中(包括过程中),当执行到WAIT(等待语句时),运行程序将被挂起,直到满足此语句设置的结束挂起条件后,才重新开始执行进程或过程中的程序。WAIT语句有以下四种不同的语句格式:(1)WAIT--无限等待(2)WAITON--敏感信号量变换(3)WAITUNTIL--条件满足(可综合)(4)WAITFOR--时间到7.1.7WAIT语句进程中其一般格式为:WAITON信号[,信号];例如,以下两种描述是完全等价的:PROCESS(a,b)PROCESSBEGINBEGINy=aANDb;y=aANDb;ENDPROCESS;WAITONa,b;ENDPROCESS;敏感信号量列表和WAIT语句选其一,不能同时使用。1.WAITON语句进程中其一般格式为:WAITUNTIL表达式;例如,WAITUNTIL语句有三种表达方式:(1)WAITUNTIL信号=某个数值;(2)WAITUNTIL信号’EVENTAND信号=某个数值;(3)WAITUNTILNOT(信号’STABLE)AND信号=某个数值;2.WAITUNTIL语句在进程中允许对子程序进行调用。对子程序的调用语句是顺序语句的一部分。子程序包括过程和函数,可以在VHFL的结构体或程序包中的任何位置对子程序进行调用。子程序调用可以在任何地方根据其名称调用子程序。7.1.8子程序调用语句调用过程的语句格式如下:过程名([参数名=]表达式{,[参数名=]表达式});其中表达式也称为实参,它可以是一个具体的数值,也可以是一个标识符,是当前调用程序中过程形参的接受体。过程调用函数调用与过程调用十分类似,不同之处是调用函数将返回一个指定类型的值,函数的参量只能是输入值。函数调用的一般格式为:函数名([参数名=]表达式{,[参数名=]表达式});函数调用7.2并行语句并行信号赋值语句进程语句并行过程调用语句元器件例化语句生成语句33/387.2.1并行信号赋值语句三种并行信号赋值:简单信号赋值条件信号赋值选择信号赋值34/381.并行简单信号赋值语句35/382.条件信号赋值语句36/38用when-else语句描述2选一的MUXentitymux2to1isport(a,b:inbit;sel:inbit;y:outbit);endmux2to1;architectureoneofmux2to1isbeginy=bwhensel='1'elsea;endone;信号定义成比特类型,可取0和1。如果把=‘1’去掉,结果如何?37/38用when-else语句描述4选1的MUXentitymux4to1isport(a,b,c,d:inbit;sel1,sel0:inbit;y:outbit);endmux4to1;architectureoneofmux4to1isbeginy=awhen(sel1='0')and(sel0='0')elsebwhen(sel1='0')and(sel0='1')elsecwhen(sel1='1')and(sel0='0')elsed;endone;问题:如果00时选a,01时选b,10和11时都选c,怎么办?y=awhen(sel1='0')and(sel0='0')elsebwhen(sel1='0')and(sel0='1')elsecwhen(sel1=‘1’)and(sel0=‘0’)elsed;38/383.选择信号赋值语句39/38问题:如果00时选a,01时选b,10和11时都选c,怎么办?architectureoneofmux4to1issignalsel:bit_vector(1downto0);beginsel(1)=sel1;sel(0)=sel0;withselselecty=awhen00,bwhen01,cwhenothers;endone;entitymux4to1isport(a,b,c:inbit;sel1,sel0:inbit;y:outbit);endmux4to1;注意:whenothers包含那些未被列出的可能。40/38如果信号类型换成STD_LOGIClibraryieee;useieee.std_logic_1164.all;entitymux4to1isport(a,b,c:instd_logic;sel1,sel0:instd_logic;y:outstd_logic);endmux4to1;architectureoneofmux4to1issignalsel:std_logic_vector(1downto0);beginsel(1)=sel1;sel(0)=sel0;withselselecty=awhen00,bwhen01,cwhenothers;endone;41/38VHDL模型-并行信号赋值libraryieee;useieee.std_logic_1164.all;entitycmpl_sigisport(a,b,sel:in