以下面的代码为例:
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) 代替?
答案 0 :(得分:2)
由于您描述的增量循环延迟的原因,应避免重新分配时钟。
它对合成结果没有影响,但它很可能在模拟中引起问题,例如,如果几个嵌套模块重新分配时钟,那么时钟最终可能被多个延迟延迟,但是相关数据可能没有类似的delta延迟,因此设计不会模拟为预期的同步设计。
下图显示了发生的情况,clk
更新cnt
,clk
也用于将cnt
捕获到cap_clk
,以及{{1}然后重新分配为:
clk
然后使用和clk_delta_1 <= clk;
将clk_delta_1
捕获到cnt
。结果是cap_delta_1
和cap_clk
在模拟中不捕获相同的值。
但是,在合成设计中,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
。但是,如果可能的话,应该避免这种重命名,因为它使得阅读代码变得困难。