信号可用于在进程之间传递值.变量不能.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;
Run Code Online (Sandbox Code Playgroud)
使用变量需要注意的一点是,因为如果在写入后读取它们,没有使用寄存器输出,您可以获得长链逻辑,这可能导致错过您的fmax目标
使用信号(在时钟进程中)观察的一件事是它们总是推断寄存器,因此导致延迟.