2、运行速度比较关键的项目中,使用case语句的效果会更好。下面的例子给出了if语句和case语句的综合结果 If 语句综合结果 Case语句综合结果有关if, case语句另外一个值得一提的东西是在用if或者case语句做逻辑电路的时候,必须为信号设置默认值。有两种方法,第一种方法是在if, case语句之前对目标信号进行赋值,采用这种方法,就不必专门写else或者when others语句对信号进行默认赋值。第二种方法就是在else或者when others语句中对信号进行默认条件下的赋值。如果违反了上述规则,那么会在综
3、合电路的时候形成一个transparent latch(锁存器),也就是电平触发的锁存器,这对电路的时序分析等会造成很大的麻烦。在时序电路中,如果没有在else语句或者when others语句中对信号赋值,那么综合工具会认为寄存器保持当前输入。从电路图上看,即把寄存器的输出接回寄存器的输入。有兴趣的朋友可以用综合工具试一下面的代码,鉴于篇幅,时序电路部分的代码就不贴了,有需要的朋友可以给我留言。library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;entity CaseComb is port
4、 (aSel : in std_logic_vector(3 downto 0); aDin : in std_logic_vector(3 downto 0); aDout : out std_logic);end CaseComb;architecture rtl of CaseComb isbeginprocess(aSel, aDin)begincase aSel iswhen "1000" => aDout <= aDin(3);when "0100" => aDout <= aDin(2);when "0010" =>
5、 aDout <= aDin(1);when "0001" => aDout <= aDin(0); when others => --aDout <= '0'; end case;end process;end rtl;library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;entity IfComb is port (aSel : in std_logic_vector(3 downto 0); aDin : in std_logic_vector(3
6、 downto 0); aDout : out std_logic);end IfComb;architecture rtl of IfComb isbeginprocess(aSel, aDin)begin if aSel(3)='1' then aDout <= aDin(3); elsif aSel(2)='1' then aDout <= aDin(2); elsif aSel(1)='1' then aDout <= aDin(1); elsif aSel(0)='1' then aDout