--a、b不相等WHENnot equal=>IF (a /= b) THEN result <= x"01";ELSEresult <= x"00",END IF;END CASE;END PROCESS;ENDbehave;7.1.4LO0P语句LOOP语句就是循环语句,它可以使所包含的一组顺序语句被循环执行,其执行次数可由设定的循环参数决定。(1)单个LOOP语句,其语法格式如下:[LOOP标号:]LOOP顺序语句ENDLOOP[LOOP标号];注意:这种循环方式需引入其它控制语句(如EXIT语句)后才能确定。用法示例如下:L2 : LOOPa:= a+1;EXITL2WHENa>10;-当a大于10时跳出循环ENDLOOPL2;(2)FOR_LOOP语句,语法格式如下:[LOOP标号:]FOR循环变量,IN循环次数范围LOOP顺序语句ENDLOOP[LOOP标号1:FOR后的循环变量是一个临时变量,属于LOOP语句的局部变量,不必事先定义。这个变量只能作为赋值源,不能被赋值,它由LOOP语句自动定义。使用时要注意在LOOP语句范围内,不要再使用其他与此循环变量同名的标示符。循环变量从循环范围次数的初值开始,每执行一次顺序语句后递增1,直到达到循环次数范围指定的最大值。【例7-4】8位奇偶校验LIBRARYIEEE;USEIEEE.STDLOGIC1164.ALL:6
6 WHEN not_equal => - a、b 不相等 IF (a /= b) THEN result <= x"01"; ELSE result <= x"00"; END IF; END CASE; END PROCESS; END behave; 7.1.4 LOOP 语句 LOOP 语句就是循环语句,它可以使所包含的一组顺序语句被循环执行,其 执行次数可由设定的循环参数决定。 (1)单个 LOOP 语句,其语法格式 如下: [ LOOP 标号:] LOOP 顺序语句 END LOOP [ LOOP 标号 ]; 注意:这种循环方式需引入其它控制语句(如 EXIT 语句)后才能确定。 用法示例如下: . L2 : LOOP a := a+1; EXIT L2 WHEN a >10 ; - 当 a 大于 10 时跳出循环 END LOOP L2; . (2)FOR_LOOP 语句,语法格式如下: [LOOP 标号:] FOR 循环变量,IN 循 环次数范围 LOOP 顺序语句 END LOOP [LOOP 标号]; FOR 后的循环变量是一个临时变量,属于 LOOP 语句的局部变量,不必事 先定义。 这个变量只能作为赋值源,不能被赋值,它由 LOOP 语句自动定义。 使用时要注意在 LOOP 语句范围内,不要再使用其他与此循环变量同名的 标示符。 循环变量从循环范围次数的初值开始,每执行一次顺序语句后递增 1,直到 达到循环次数范围指定的最大值。 【例 7-4】8 位奇偶校验 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;
ENTITYpcheckISPORT(a:INSTD_LOGIC_VECTOR(7 DOWNTO O);y : OUT STD_LOGIC);ENDp_check;ARCHITECTURE opt OF p_check ISSIGNALtmp:STD_LOGIC;BEGINPROCESS(a)BEGINtmp<='0';FOR n IN O TO 7 LOOPtmp<= tmp XOR a(n);END LOOP ;y <= tmp;ENDPROCESS:END opt,【例7-5】SIGNAL a, b, c : STD LOGIC_VECTOR (1 TO 3);FOR n IN 1 TO 3 LOOPa(n) <= b(n) AND c(n);END LOOP:此段程序等效于顺序执行以下三个信号赋值操作:a(1)<=b(1) AND c(1);a(2)<=b(2) AND c(2);a(3)<=b(3) AND c(3);注意:LOOP循环的范围最好以常数表示,否则LOOP体内的逻辑可以重复任何可能的范围,将导致消耗过大的硬件资源。7.1.5NEXT语句第一种语句格式:无条件跳转到前面LOOP语句的起始点;NEXT:第二种语句格式:无条件跳转到前面LOOP标号语句的起始点:NEXTLOOP标号:第三种语句格式:条件为Ture时,跳转到前面LOOP标号语句的起始点;NEXTLOOP标号WHEN条件表达式:【例7-6】单层LOOP循环,可省去关键词NEXT与WHEN之间的“LOOP标号”。L1 : FOR cnt_ value IN 1 TO 8 LOOPsl:a(cnt_value) :='0';7
7 ENTITY p_check IS PORT ( a : IN STD_LOGIC_VECTOR (7 DOWNTO 0); y : OUT STD_LOGIC ); END p_check; ARCHITECTURE opt OF p_check IS SIGNAL tmp :STD_LOGIC ; BEGIN PROCESS(a) BEGIN tmp <='0'; FOR n IN 0 TO 7 LOOP tmp <= tmp XOR a(n); END LOOP ; y <= tmp; END PROCESS; END opt; 【例 7-5】 SIGNAL a, b, c : STD_LOGIC_VECTOR (1 TO 3); . FOR n IN 1 TO 3 LOOP a(n) <= b(n) AND c(n); END LOOP; 此段程序等效于顺序执行以下三个信号赋值操作: a(1)<=b(1) AND c(1); a(2)<=b(2) AND c(2); a(3)<=b(3) AND c(3); 注意:LOOP 循环的范围最好以常数表示,否则 LOOP 体内的逻辑可以重复任何 可能的范围,将导致消耗过大的硬件资源。 7.1.5 NEXT 语句 第一种语句格式:无条件跳转到前面 LOOP 语句的起始点; NEXT; 第二种语句格式:无条件跳转到前面 LOOP 标号语句的起始点; NEXT LOOP 标号; 第三种语句格式:条件为 Ture 时,跳转到前面 LOOP 标号语句的起始点; NEXT LOOP 标号 WHEN 条件表达式; 【例 7-6】单层 LOOP 循环,可省去关键词 NEXT 与 WHEN 之间的“LOOP 标 号”。 . L1 : FOR cnt_value IN 1 TO 8 LOOP s1:a(cnt_value) := '0';
NEXTWHEN (b=c);s2:a(cnt_ value + 8 ):='0';END LOOP L1:【例7-7】多层LOOP循环,LOOP标号不可省!L x:FOR cnt _ value IN 1 TO 8LOOPsl:a(cnt_ value):='0';k:= 0;LOOPL y:s2:b(k) :='0';NEXT L x WHEN (e>f);s3:b(k+8) :='0':k :=k+1;NEXT LOOPL_y;NEXT LOOPL_X;7.1.6EXIT语句第一种语句格式:无条件跳转到LOOP语句的结束处;EXIT:第二种语句格式:无条件跳转到LOOP标号语句的结束处:EXITLOOP标号;第三种语句格式:条件为Ture时,跳转到LOOP标号语句的结束处:EXITLOOP标号WHEN条件表达式;【例7-8】SIGNALa,b:STDLOGIC_VECTOR(1DOWNTOO);SIGNAL a less _then _b : Boolean;a less_then b<=FALSE;设初始值FORiIN1DOWNTOOLOOPIF (a(i)=I AND b(i)=0') THEN--a>ba_less_then_b <=FALSE;EXIT;ELSIF (a(i)=0' AND b(i)=1) THEN--a<balessthenb<=TRUE;EXIT;ELSENULL:END IF;END LOOP:-当i=1时返回LOOP语句继续比较7.1.7WAIT语句8
8 NEXT WHEN (b=c); s2:a(cnt_value + 8 ):= '0'; END LOOP L1; 【例 7-7】多层 LOOP 循环,LOOP 标号不可省! . L_x: FOR cnt_value IN 1 TO 8 LOOP s1: a(cnt_value):= '0'; k := 0; L_y: LOOP s2: b(k) := '0'; NEXT L_x WHEN (e>f); s3: b(k+8) := '0'; k := k+1; NEXT LOOP L_y ; NEXT LOOP L_x ; . 7.1.6 EXIT 语句 第一种语句格式:无条件跳转到 LOOP 语句的结束处; EXIT; 第二种语句格式:无条件跳转到 LOOP 标号语句的结束处; EXIT LOOP 标号; 第三种语句格式:条件为 Ture 时,跳转到 LOOP 标号语句的结束处; EXIT LOOP 标号 WHEN 条件表达式; 【例 7-8】 SIGNAL a, b : STD_LOGIC_VECTOR (1 DOWNTO 0); SIGNAL a_less_then_b : Boolean; .a_less_then_b <= FALSE ; - 设初始值 FOR i IN 1 DOWNTO 0 LOOP IF (a(i)='1' AND b(i)='0') THEN a_less_then_b <= FALSE ; - a > b EXIT ; ELSIF (a(i)='0' AND b(i)='1') THEN a_less_then_b <= TRUE ; - a < b EXIT; ELSE NULL; END IF; END LOOP; - 当 i=1 时返回 LOOP 语句继续比较 7.1.7 WAIT 语句
第一种语句格式:永远挂起:WAIT;第二种语句格式:敏感信号等待语句;WAITON信号表;第三种语句格式:条件等待语句;WAITUNTIL条件表达式;第四种语句格式:超时等待语句;WAITFOR时间表达式;【例7-9】SIGNAL s1,s2 : STD LOGIC;PROCESSBEGINWAITON sl,s2 :ENDPROCESS;注意:已列出敏感表的进程中不能使用任何形式的WAIT语句。进程在WAIT处被挂起,一直到s1或s2中任一信号发生改变时,进程才重新开始。【例7-10】以下两种表达方式是等效的(b)WAIT_ON结构(a)WAIT_UNTIL结构LOOPWait until enable ='1';Wait on enable;EXITWHEN enable =1';ENDLOOP;对于条件等待语句:WAITUNTIL条件表达式:被此语句挂起的进程需顺序满足如下两个条件,进程才能脱离挂起状态:1、在条件表达式中所含的信号发生了改变:2、此信号改变后,且满足WAIT语句所设的条件。这两个条件不但缺一不可,而且必须按照以上顺序来完成。一般地,只有WAITUNTIL格式的等待语句可以被综合器接受(其余语句格式只能在VHDL仿真器中使用),WAIT_UNTIL语句有以下三种表达方式:WAITUNTIL信号=Value:- (1)WAITUNTIL信号”EVENTAND信号=Value;--(2)WAITUNTILNOT信号STABLEAND信号=Value;--(3)9
9 第一种语句格式:永远挂起; WAIT; 第二种语句格式:敏感信号等待语句; WAIT ON 信号表; 第三种语句格式:条件等待语句; WAIT UNTIL 条件表达式; 第四种语句格式:超时等待语句; WAIT FOR 时间表达式; 【例 7-9】 SIGNAL s1,s2 : STD_LOGIC; . PROCESS BEGIN . WAIT ON s1,s2 ; END PROCESS ; 注意:已列出敏感表的进程中不能使用任何形式的 WAIT 语句。 进程在 WAIT 处被挂起,一直到 s1 或 s2 中任一信号发生改变时,进程才重新开 始。 【例 7-10】以下两种表达方式是等效的 (a) WAIT_UNTIL 结构 (b) WAIT_ON 结构 . LOOP Wait until enable ='1'; Wait on enable; . EXIT WHEN enable ='1'; END LOOP; 对于条件等待语句: WAIT UNTIL 条件表达式; 被此语句挂起的进程需顺序满足如下两个条件,进程才能脱离挂起状态: 1、在条件表达式中所含的信号发生了改变; 2、此信号改变后,且满足 WAIT 语句所设的条件。 这两个条件不但缺一不可,而且必须按照以上顺序来完成。 一般地,只有 WAIT_UNTIL 格式的等待语句可以被综合器接受(其余语句 格式只能在 VHDL 仿真器中使用) ,WAIT_UNTIL 语句有以下三种表达方式: WAIT UNTIL 信号=Value; - (1) WAIT UNTIL 信号’EVENT AND 信号=Value; - (2) WAIT UNTIL NOT 信号’STABLE AND 信号=Value; - (3)
如果设clock为时钟信号输入端,以下四条WAIT语句所设的进程启动条件都是时钟上跳沿,所以它们对应的硬件结构是一样的:WAIT UNTIL clock ='1':WAIT UNTIL rising_edge(clock);WAITUNTILNOTclock'STABLEANDclock =1';WAITUNTILclock=I'ANDclock'EVENT;【例7-11】4个时钟后将获得4个数值的平均值。PROCESSBEGINWAIT UNTIL clk =I';ave<=a,WAIT UNTIL clk ='1':ave <= ave + a,WAITUNTILclk=I':ave <= ave + a,WAIT UNTIL clk='I';ave<=(ave + a)/4 ;END PROCESS ;原因:1、信号赋值需要一个8延时:2、在进程中,所有赋值语句(包括变量赋值)都必须在一个8延时中完成。3、在进程中存在同一信号有多个赋值源时,赋值对象的值发生更新的信号,是最接近“ENDPROCESS”语句的信号。信号赋值的进一步说明:1、在进程中的所有信号赋值语句,在进程启动的一瞬间立即执行赋值操作:2、所有赋值语句都必须在一个8延时中完成赋值(令赋值对象的值发生更新)。3、执行赋值和完成赋值是两个不同的概念。“执行赋值”值是一个过程,它具有顺序特征;而“完成赋值”是一种结果,它的发生具有HDL最本质的并行的特征。【例7-12】用WAIT语句描述具有同步复位功能的电路。PROCESSBEGINrst_loop :LOOPWAITUNTILclock=IANDclock'EVENT;-等待时钟信号检测复位信号rstNEXT rst_loop WHEN (rst=1');无复位信号,执行赋值操作x<=a;,WAITUNTILclock=I'ANDclockEVENT:等待时钟信号检测复位信号rstNEXT rst loop WHEN (rst='1');无复位信号,执行赋值操作y<=b;END LOOP rst_loop ;ENDPROCESS;10
10 如果设 clock 为时钟信号输入端,以下四条 WAIT 语句所设的进程启动条件 都是时钟上跳沿,所以它们对应的硬件结构是一样的: WAIT UNTIL clock ='1'; WAIT UNTIL rising_edge(clock) ; WAIT UNTIL NOT clock’STABLE AND clock ='1'; WAIT UNTIL clock ='1' AND clock’EVENT; 【例 7-11】4 个时钟后将获得 4 个数值的平均值。 . PROCESS BEGIN WAIT UNTIL clk ='1'; ave <= a; WAIT UNTIL clk ='1'; ave <= ave + a; WAIT UNTIL clk ='1'; ave <= ave + a; WAIT UNTIL clk ='1'; ave <= (ave + a)/4 ; END PROCESS ; 原因: 1、信号赋值需要一个δ延时; 2、在进程中,所有赋值语句(包括变量赋值)都必须在一个δ延时中完成。 3、在进程中存在同一信号有多个赋值源时,赋值对象的值发生更新的信号,是 最接近“END PROCESS”语句的信号。 信号赋值的进一步说明: 1、在进程中的所有信号赋值语句,在进程启动的一瞬间立即执行赋值操作; 2、所有赋值语句都必须在一个δ延时中完成赋值(令赋值对象的值发生更新)。 3、执行赋值和完成赋值是两个不同的概念。“执行赋值”值是一个过程,它具有 顺序特征;而“完成赋值”是一种结果,它的发生具有 HDL 最本质的并行的特 征。 【例 7-12】用 WAIT 语句描述具有同步复位功能的电路。 PROCESS BEGIN rst_loop : LOOP WAIT UNTIL clock ='1' AND clock’EVENT; - 等待时钟信号 NEXT rst_loop WHEN (rst='1'); - 检测复位信号 rst x <= a ; - 无复位信号,执行赋值操作 WAIT UNTIL clock ='1' AND clock’EVENT; - 等待时钟信号 NEXT rst_loop WHEN (rst='1'); - 检测复位信号 rst y <= b ; - 无复位信号,执行赋值操作 END LOOP rst_loop ; END PROCESS;