信号与变量

时间:2011-11-03 20:02:12

标签: variables signals vhdl

VHDL提供了两种主要的对象类型来保存数据,名称为signalvariable,但我无法找到何时使用一种数据类型而不是另一种数据类型。任何人都可以阐明他们的优势/局限/范围/综合/情况,其中使用一个会比另一个更好吗?

2 个答案:

答案 0 :(得分:5)

信号可用于在进程之间传递值。变量不能。有shared variables可以在较旧的编译器中使用,但如果你这样做,你真的要问问题(有竞争条件) - 除非你使用类似类的protected types。然后它们用于通信,但不是(据我所知)可合成的。

这种对通信的基本限制来自信号和变量的更新工作方式。

最大的区别在于变量会立即更新(使用:=运算符)。当分配给(<=运算符)时,信号具有预定更新,但是任何人在读取信号时看到的值在一段时间后才会改变。

(旁白:那个时间量可以和delta周期一样小,这是VHDL模拟器中最小的时间 - 没有“真实”时间过去。像wait for 0 ps;之类的东西导致模拟器等待继续之前的下一个delta周期。)

如果您需要相同的逻辑将输入多个触发器,则变量是将逻辑分解为单个点的好方法,而不是复制/粘贴代码。

就逻辑而言,在时钟控制的过程中,信号总是推断触发器。变量可用于组合逻辑和推断触发器。有时两者都是同一个变量。有些人认为这令人困惑,我个人认为这很好:

process (clk)
  variable something : std_logic;
  if rising_edge(clk) then
    if reset = '1' then
       something := '0';
    else
       output_b <= something or input c; -- using the previous clock's value of 'something' infers a register
       something := input_a and input_b; -- comb. logic for a new value
       output_a <= something or input_c; -- which is used immediately, not registered here
    end if;
  end if;
end process;

使用变量观察的一件事是因为如果在它们被写入后被读取,没有使用寄存器输出,你可以获得长链逻辑,这可能导致错过你的fmax目标

使用信号(在时钟进程中)观察的一件事是它们总是推断寄存器,因此导致延迟。

答案 1 :(得分:3)

正如其他人所说,信号在时间片结束时使用新值更新,但变量会立即更新。

// inside some process
// varA = sigA = 0. sigB = 2
varA := sigB + 1;      // varA is now 3
sigC <= varA + 1;      // sigC will be 4

sigA <= sigB + 1;      // sigA will be 3
sigD <= sigA + 1;      // sigD will be 1 (original sigA + 1)

对于硬件设计,我很少使用变量。通常情况下,当我攻击某些功能时,确实需要对代码进行重新考虑,但我正处于截止日期。我避免使用它们,因为我发现处理信号和变量的心智模型太不同了,无法在一段代码中很好地生存。这并不是说它无法完成,但我认为大多数RTL工程师都避免混合......你无法避免信号。

其他要点:

  • 信号具有实体范围。变量是过程的本地变量。
  • 两者合成