例7-12每一时钟上升沿的到来都将结束进程的挂起,继而检测复位信号rst是否为高电平。若为高电平则返回循环的起始点:若为低电平,则执行正常的顺序语句操作。【例7-13】同步复位、左右移、并行加载电路描述。LIBRARYIEEE;USEIEEE.STD LOGIC1164.ALL;ENTITY shifterISPORT(data : IN STD_LOGIC_ VECTOR (7 DOWNTO O),shift left:INSTD LOGIC;shift_right: IN STD LOGIC;clk: IN STD LOGIC:reset:IN STD LOGIC:mode:INSTDLOGIC VECTOR(1DOWNTOO);qout:BUFFERSTD_LOGIC_VECTOR(7DOWNTOO));END shifter,ARCHITECTUREbehaveOFshifterISSIGNALenable:STDLOGIC;BEGINPROCESSBEGIN-等待时钟上升沿WAITUNTIL(RISINGEDGE(clk));IF(reset="1)THENqout<="00000000";ELSECASEmodeISWHEN"01"=>qout<=shift_right&qout(7DOWNTO1);--右移WHEN"10"=>qout<=qout(6DOWNTO0)&shift_left,--左移WHEN "11" => qout <= data,并行加载WHENOTHERS=>NULL;ENDCASE;END IF;ENDPROCESS;END behave;7.1.8返回语句(RETURN)第一种语句格式:只能用于过程,并不返回任何值;RETURN:第二种语句格式:只能用于函数,且必须返回一个值;RETURN表达式;返回语句只能用于子程序体中。执行返回语句将结束子程序的执行,无条件地跳转到子程序的结束处END。用于函数的语句中的表达式提供函数返回值。每一函数必须至少包含一个返回语11
11 例 7-12 每一时钟上升沿的到来都将结束进程的挂起,继而检测复位信号 rst 是否为高电平。若为高电平则返回循环的起始点;若为低电平,则执行正常的顺 序语句操作。 【例 7-13】同步复位、左右移、并行加载电路描述。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY shifter IS PORT ( data : IN STD_LOGIC_VECTOR (7 DOWNTO 0); shift_left: IN STD_LOGIC; shift_right: IN STD_LOGIC; clk: IN STD_LOGIC; reset : IN STD_LOGIC; mode : IN STD_LOGIC_VECTOR (1 DOWNTO 0); qout : BUFFER STD_LOGIC_VECTOR (7 DOWNTO 0) ); END shifter; ARCHITECTURE behave OF shifter IS SIGNAL enable: STD_LOGIC; BEGIN PROCESS BEGIN WAIT UNTIL (RISING_EDGE(clk) ); -等待时钟上升沿 IF (reset = '1') THEN qout <= "00000000"; ELSE CASE mode IS WHEN "01" => qout<=shift_right & qout(7 DOWNTO 1);-右移 WHEN "10" => qout<=qout(6 DOWNTO 0) & shift_left; -左移 WHEN "11" => qout <= data; - 并行加载 WHEN OTHERS => NULL; END CASE; END IF; END PROCESS; END behave; 7.1.8 返回语句(RETURN) 第一种语句格式:只能用于过程,并不返回任何值; RETURN; 第二种语句格式:只能用于函数,且必须返回一个值; RETURN 表达式; 返回语句只能用于子程序体中。 执行返回语句将结束子程序的执行,无条件地跳转到子程序的结束处 END。 用于函数的语句中的表达式提供函数返回值。每一函数必须至少包含一个返回语
句,并可拥有多个返回语句,但在函数调用时,只有一个返回语句可以将值返回。【例7-14】RS触发器描述PROCEDURE rs(SIGNALsI:INSTD LOGIC:SIGNAL q, nq:INOUT STD_LOGIC)ISBEGINIF (S=1 AND {=1) THENREPORT"Forbidden state : s and r are quual to'1";RETURN;ELSEq <= s AND nq AFTER 5 ns ;nq<=sAND qAFTER 5 ns ;END IF ;ENDPROCEDURErs;【例7-15】多个RETURN语句,只有一个返回值FUNCTIONopt(a,b,opr:STDLOGIC)RETURNSTDLOGICISBEGINIF (opr =1) THENRETURN (a AND b):ELSE RETURN (aORb);END IF ;ENDFUNCTIONopt;7.1.9空操作语句(NULL)空操作语句的语句格式如下:NULL;,在下例的CASE语句中,NULL用于排除一些不用的条件。CASE OpcodeIS"001"=>WHENtmp := rega AND regb ;WHEN"101"=>tmp=regaORregb;WHEN"110"=>tmp=NOTrega;WHENOTHERS=> NULL;END CASE;注意:很多情况对NULL语句的执行会出现加入锁存器的情况,对此应避免使用NULL语句,可改动如下:WHENOTHERS=>tmp:=rega;12
12 句,并可拥有多个返回语句,但在函数调用时,只有一个返回语句可以将值返回。 【例 7-14】RS 触发器描述 PROCEDURE rs (SIGNAL s , r : IN STD_LOGIC ; SIGNAL q , nq : INOUT STD_LOGIC) IS BEGIN IF ( s ='1' AND r ='1') THEN REPORT "Forbidden state : s and r are quual to '1'"; RETURN ; ELSE q <= s AND nq AFTER 5 ns ; nq <= s AND q AFTER 5 ns ; END IF ; END PROCEDURE rs ; 【例 7-15】多个 RETURN 语句,只有一个返回值 FUNCTION opt (a, b, opr :STD_LOGIC) RETURN STD_LOGIC IS BEGIN IF (opr ='1') THEN RETURN (a AND b); ELSE RETURN (a OR b) ; END IF ; END FUNCTION opt ; 7.1.9 空操作语句(NULL) 空操作语句的语句格式如下: NULL; 在下例的 CASE 语句中,NULL 用于排除一些不用的条件。 CASE Opcode IS WHEN "001" => tmp := rega AND regb ; WHEN "101" => tmp := rega OR regb ; WHEN "110" => tmp := NOT rega ; WHEN OTHERS => NULL ; END CASE ; 注意: 很多情况对 NULL 语句的执行会出现加入锁存器的情况,对此应避免使用 NULL 语句,可改动如下: WHEN OTHERS => tmp := rega ;