原创 VHDL中 If语句和Case语句的综合

2008-3-27 17:48 5157 10 11 分类: FPGA/CPLD

If 和case语句是VHDL里边两个非常重要的语句,如何用好她们来描述逻辑电路和时序电路是学会VHDL编程重要的一步。if 和 case语句有一定的相关性,也有一定的区别。相同的地方是他们可以实现几乎一样的功能。下面主要介绍一下她们之间的区别。

If 语句每个分支之间是有优先级的,综合得到的电路是类似级联的结构。Case语句每个分支是平等的,综合得到的电路则是一个多路选择器。因此,多个if elseif语句综合得到的逻辑电路延时往往比case语句要大。一些初学者在一开始往往喜欢用if elsif语句,因为这种语法表达起来更加直接,但是在运行速度比较关键的项目中,使用case语句的效果会更好。下面的例子给出了if语句和case语句的综合结果

 
               If 语句综合结果


              Case语句综合结果

有关if, case语句另外一个值得一提的东西是在用if或者case语句做逻辑电路的时候,必须为信号设置默认值。有两种方法,第一种方法是在if, case语句之前对目标信号进行赋值,采用这种方法,就不必专门写else或者when others语句对信号进行默认赋值。第二种方法就是在else或者when others语句中对信号进行默认条件下的赋值。如果违反了上述规则,那么会在综合电路的时候形成一个transparent latch,也就是电平触发的锁存器,这对电路的时序分析等会造成很大的麻烦。

在时序电路中,如果没有在else语句或者when others语句中对信号赋值,那么综合工具会认为寄存器保持当前输入。从电路图上看,即把寄存器的输出接回寄存器的输入。

有兴趣的朋友可以用综合工具试一下面的代码,鉴于篇幅,时序电路部分的代码就不贴了,有需要的朋友可以给我留言。

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;


entity CaseComb is
  port
    (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 is


begin


  process(aSel, aDin)
  begin
  case aSel is
  when "1000" =>
    aDout <= aDin(3);
  when "0100" =>
    aDout <= aDin(2);
  when "0010" =>
    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 downto 0);
     aDout  : out std_logic);
end IfComb;


architecture rtl of IfComb is


begin


  process(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 <= aDin(0);
    --else
    -- aDout <= '0';
    end if;
  end process;
 
end rtl;

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户158304 2008-8-17 14:37

为什么都没有图啊? 有图的话会容易理解很多。
相关推荐阅读
用户48973 2008-04-22 21:59
Xilinx与Altera FPGA比较系列之杂项
最近遇到一个时钟选择的问题,即有两个输入时钟和一个控制信号,根据控制信号输出一个时钟。如何使得输出的时钟没有毛刺?在Xilinx的FPGA中,可以使用BUFGMUX来实现,即使控制信号不同步,BUFG...
用户48973 2008-04-22 21:59
Xilinx与Altera FPGA比较系列之一 逻辑资源速度(3)
上次的分析还剩下一点点尾巴,就是寻找直接形式滤波器Xilinx V5比Altera S3快的原因。 在对直接形式的滤波器做比较时,发现Xilinx的V5比Altera的S3要快一些,时序分析报告显示关...
用户48973 2008-04-22 21:58
Xilinx与Altera FPGA比较系列之一 逻辑资源速度(2)
为了能够更好的理解造成这些差异的原因,下面对两个公司的FPGA做进一步的分析。首先,作者对32 bit的加法在两个FPGA进行编译,比较两者的速度。 表1 32-bit加法器速度 FPGA Platf...
用户48973 2008-04-22 21:57
Xilinx与Altera FPGA比较系列之一 逻辑资源速度(1)
一开始没想到这个比较会得到大家的关注,纯粹是出于自己的兴趣。两个厂商都会宣称自己某一方面比对方好,到底是谁的更好呢?这肯定是个仁者见仁,智者见智的问题。最近这段时间比较忙,项目到了比较关键的阶段,加上...
用户48973 2008-04-22 21:55
Xilinx与Altera FPGA比较系列之二 DSP速度(1)
大家知道,高端的FPGA中都有为数不少的DSP块,里边主要包括一些18X18的乘法器,以及加法器等单元,相邻的DSP往往可以通过专用的连线互连,从而实现滤波器的级联设计,提高滤波器的运行速度。Xili...
用户48973 2008-04-22 21:52
Xilinx与Altera FPGA比较系列之二 DSP速度(2)
随着FPGA在信号处理领域应用越来越广泛, 其内部的DSP资源越来越受到了开发者的重视. 本文对Xilinx和Altera FPGA的固定乘法器(DSP)做一个比较深入的分析, 以对今后的设计提供参考...
我要评论
1
10
关闭 站长推荐上一条 /4 下一条