1

好吧,我在我的主要组件中有进程 a,在我的其他子组件中有进程 b(在主组件中实现)。进程 a 和 b 在它们的敏感度列表中都只有时钟:进程一个名为 ready 的控制启用信号,如果 1 进程 b 可以工作,0 进程 b 将什么也不做。问题在于进程 a ,当进程 a 将使能信号的值更改为 0 时,必须等待下一个时钟周期才能更改,因此进程 b 结束并运行额外的时钟周期。

a:process(clk)
begin
if(rising_edge(clk)) then
if(output/=old_output) then
        enable<='0';
end if;
end if;
end process;

b:process(clk)
begin
if(rising_edge(clk)) then
if(enable='1') then
        --do anything
end if;
end if;
end process;
4

1 回答 1

2

原因是该值在时钟的确切上升沿被锁存/采样。那时,'enable' 仍然等于 1。在该模拟增量中,启用的值将为零,但直到第一个增量之后才可用。

当 enable 变为 one 时也是如此(假设它也是在时钟上升沿产生的),该过程将在时钟上升时准确锁存该值,并且在模拟器中,启用将在整个时钟周期内看起来很高,甚至虽然“--do anything”不会发生。

您可以将其视为真正的电路而不是编程语言。考虑到“输出/=旧输出”的评估将消耗时间,并且作为设计人员,您希望在下一个时钟上升沿之前完成。

希望这会有所帮助,但这就是语言的工作方式。如果启用的设置和重置,我可以给你一个更好的答案。

于 2013-03-25T06:43:32.750 回答