CASE语句口条件语句的选择值必须在表达式的取值范围内。口除非所有条件语句中的选择值能完全覆盖CASE语句中表达式的取值,否则最未一个条件句中的选择必须用"OTHERS"表示,它代表已给的所有条件句中未能列出的其他可能的取值。口CASE语句中每一条件句的选择值只能出现一次,不能有相同选择值的条件语句出现。口CASE语句执行中必须选中只能选中所列条件语句中的一条。这表明CASE语句中至少要包含一个条件语句
CASE语句 条件语句的选择值必须在表达式的取值范围内。 除非所有条件语句中的选择值能完全覆盖CASE语句中 表达式的取值,否则最末一个条件句中的选择必须用 “OTHERS”表示,它代表已给的所有条件句中未能列出 的其他可能的取值。 CASE语句中每一条件句的选择值只能出现一次,不能 有相同选择值的条件语句出现。 CASE语句执行中必须选中且只能选中所列条件语句中 的一条。这表明CASE语句中至少要包含一个条件语句
ARCHITECTUREactivOFmux41ISSIGNALSeI:INTEGERRANGE0TO15:BEGINPROCESS(sel, s4, s3,s2,sl)BEGIN【例7-1】四选输入初始值se<=0:LIBRARYIF(sl=1)THENsel<= sel+1;USEIEEE.STELSIF (s2 ='1') THEN sel<= sel+2 ;ENTITYMUELSIF (s3 ='1') THEN sel<= sel+4 :PORT(s4,sELSIF (s4 ='1') THEN sel<= sel+8 ;z4, z3,zELSE NULL;注意,这里使用了空操作语句END mux4l;ENDIF;z1<="0°z2<="0:z3<="0;z4<="0:--输入初始值CASESelISWHEN0.=>zl<="1';--当sel=0时选中WHEN1|3=>z2<=1';--当sel为1或3时选中WHEN4To7|2=>z3<=1;--当sel为2、4、5、6或7时选中WHENOTHERS=>z4<='1-当sel为8~15中任一值时选中END CASE;ENDPROCESS;ENDactiv;
【例7-1】四选一电路描述 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux41 IS PORT (s4,s3, s2,s1 : IN STD_LOGIC; z4,z3, z2,z1 : OUT STD_LOGIC); END mux41; ARCHITECTURE activ OF mux41 IS SIGNAL sel : INTEGER RANGE 0 TO 15; BEGIN PROCESS (sel ,s4,s3,s2,s1 ) BEGIN sel<= 0 ; - 输入初始值 IF (s1 ='1') THEN sel <= sel+1 ; ELSIF (s2 ='1') THEN sel <= sel+2 ; ELSIF (s3 ='1') THEN sel <= sel+4 ; ELSIF (s4 ='1') THEN sel <= sel+8 ; ELSE NULL; - 注意,这里使用了空操作语句 END IF ; z1<='0' ; z2<='0'; z3<='0'; z4<='0'; -输入初始值 CASE sel IS WHEN 0 => z1<=‘1’ ; - 当sel=0时选中 WHEN 13 => z2<='1' ; - 当sel为1或3时选中 WHEN 4 To 72 => z3<='1'; - 当sel为2、4、5、6或7时选中 WHEN OTHERS => z4<='1' ; - 当sel为8~15中任一值时选中 END CASE ; END PROCESS ; END activ ;
CASE语句使用中几种容易发生的错误【例7-2】SIGNALvalue:INTEGER RANGE0 TO15;SIGNAL outI: STD LOGIC ;缺少以WHEN引导的条件句CASEvalueIS-END CASE;CASE value ISWHEN0=>out1<="1;-value2~15的值未包括进去WHEN1=>0ut1<='0";END CASECASEvalueIS选择值中5~~10的值有重叠WHEN0TO10=>0ut1<=1':--WHEN5TO15=>0ut1<='0';ENDCASE:
【例7-2】 SIGNAL value : INTEGER RANGE 0 TO 15; SIGNAL out1 : STD_LOGIC ; . CASE value IS - 缺少以WHEN引导的条件句 END CASE; . CASE value IS WHEN 0 => out1<= '1' ; - value2~15的值未包括进去 WHEN 1 => out1<= '0' ; END CASE . CASE value IS WHEN 0 TO 10 => out1<= '1'; - 选择值中5~10的值有重叠 WHEN 5 TO 15 => out1<= '0'; END CASE; CASE语句使用中几种容易发生的错误
CASE语句和IF语句的比较口和多分支的IF语句相比,CASE语句组的程序可读性比较好。口CASE语句的执行过程即条件性是独立的,排它的,不像IF语句那样有一个逐项条件顺序比较的过程。口CASE语句中条件句的次序是不重要的,它的执行过程更接近于并行方式。口综合后CASE语句和多分支的IF语句相比,要耗费更多的硬件资源。口对于有的逻辑,CASE语句无法描述,只能用IF语句描述,这是因为IF-THEN-ELSIF语句具有条件相与的功能,而CASE语句只有条件相或的功能
CASE语句和IF语句的比较 和多分支的IF语句相比,CASE语句组的程序可读性 比较好。 CASE语句的执行过程即条件性是独立的,排它的, 不像IF语句那样有一个逐项条件顺序比较的过程。 CASE语句中条件句的次序是不重要的,它的执行过 程更接近于并行方式。 综合后CASE语句和多分支的IF语句相比,要耗费更 多的硬件资源。 对于有的逻辑, CASE语句无法描述,只能用IF语句 描述,这是因为IF-THEN-ELSIF语句具有条件相与的功 能,而CASE语句只有条件相或的功能
例7-3是算术逻辑单元的VHDL描述,它在信号opCode的控制下可分别完成相加、相减、相等、不相等等操作,程序在CASE语句中混合了IF-THEN语句。【例7-3】算术逻辑单元描述LIBRARYIEEE:USE IEEE.STD LARCHITECTUREbehaveOFaluISUSEIEEESTDPROCESS(opcode,a,b)EI00):=b"00";BEGINCASE opcode IS00):=b"01";--a、b相加WHENplus=> result<=a+b;EI-a、b相减WHENminus=>result<=a-b;00)=b"10";a、b相等WHEN equal=>IF (a =b) THEN result <= x"01";00):=b"11":ELSEresult<=x"00";ENDIF;a、b不相等WHENnot_equal=>IF (a /=b) THEN result<=x"01";ELSEresult<=x"00";ENDIF;END CASE;ENDPROCESS;END behave;
【例7-3】算术逻辑单元描述 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY alu IS PORT( a, b : IN STD_LOGIC_VECTOR (7 DOWNTO 0); opcode: IN STD_LOGIC_VECTOR (1 DOWNTO 0); result: OUT STD_LOGIC_VECTOR (7 DOWNTO 0) ); END alu; ARCHITECTURE behave OF alu IS CONSTANT plus : STD_LOGIC_VECTOR (1 DOWNTO 0) := b"00"; CONSTANT minus : STD_LOGIC_VECTOR (1 DOWNTO 0) := b"01"; CONSTANT equal : STD_LOGIC_VECTOR (1 DOWNTO 0) := b"10"; CONSTANT not_equal: STD_LOGIC_VECTOR (1 DOWNTO 0) := b"11"; BEGIN PROCESS (opcode,a,b) BEGIN CASE opcode IS WHEN plus => result <= a + b; - a、b相加 WHEN minus => result <= a - b; - a、b相减 WHEN equal => - a、b相等 IF (a = b) THEN result <= x"01"; ELSE result <= x"00"; END IF; 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-3是算术逻辑单元的VHDL描述,它在信号opcode的控制下可分 别完成相加、相减、相等、不相等等操作,程序在CASE语句中混合 了IF-THEN语句