将输入参数缓冲到process语句

时间:2014-12-15 14:40:35

标签: vhdl fpga

以下面的代码为例:

s_Clock_Data <= pi_Clock_Data;

Shifter :
process(s_Clock_Data)
begin
    if falling_edge(s_Clock_Data) then
        s_Shifter <= s_Shifter(s_Shifter'high - 1 downto 0) & pi_Data;
    end if;
end process;

pi_Clock_Data和pi_Data是模块的端口输入。

是否有某些原因要求在进程运行之前首先将pi_Clock_Data分配给s_Clock_Data?由于pi_Data也是fpga的输入,因此通过这样做,时钟数据可能滞后于相对于pi_Data的增量循环。

我们不能拥有 处理(pi_Clock_Data) 代替?

1 个答案:

答案 0 :(得分:2)

由于您描述的增量循环延迟的原因,应避免重新分配时钟。

它对合成结果没有影响,但它很可能在模拟中引起问题,例如,如果几个嵌套模块重新分配时钟,那么时钟最终可能被多个延迟延迟,但是相关数据可能没有类似的delta延迟,因此设计不会模拟为预期的同步设计。

下图显示了发生的情况,clk更新cntclk也用于将cnt捕获到cap_clk,以及{{1}然后重新分配为:

clk
然后使用

clk_delta_1 <= clk; clk_delta_1捕获到cnt。结果是cap_delta_1cap_clk在模拟中不捕获相同的值。

enter image description here

但是,在合成设计中,cap_delta_1将是普通线,因此clk_delta_1 <= clk;将基于cap_delta_1捕获,因此模拟和合成结果将不相同在这种情况下设计,这就是应该避免重新分配时钟的原因。

如果由于某种原因需要重命名信号,则可以使用别名,从而为clk创建一个没有delta延迟的新名称,例如:

clk

如图所示,alias clk_delta_0 : std_logic is clk; cnt上捕获的clk_delta_0将具有与cap_delta_0相同的值,因为{{1}之间没有delta延迟}和cap_clk。但是,如果可能的话,应该避免这种重命名,因为它使得阅读代码变得困难。