在这个简单的代码中可以调整什么来在fsm中改变信号

时间:2013-03-24 22:19:08

标签: scheduling vhdl clock fsm

我已经在我的主要组件中处理a并在我的其他子组件中处理b(在主要组件中实现)。 进程a和b在灵敏度列表中只有时钟: 处理一个名为ready的控制可用信号,如果1个进程b可以工作,则0进程b将不执行任何操作。 问题在于过程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;

1 个答案:

答案 0 :(得分:2)

原因是该值在时钟的确切rising_edge处被锁存/采样。那时,'enable'仍然等于1。在该模拟增量中,启用将获得零值,但在第一个增量之后它将不可用。

当使能BECOMES为1时(假设它也在时钟上升沿产生),这也是正确的,当时钟上升时,该过程将精确锁存该值,并且在模拟器中,对于整个时钟,启用将看起来很高期间,即使“ - 什么都不会”也不会发生。

您可以将其视为真正的电路而非编程语言。考虑到“output / = old_output”的评估将消耗时间,并且您作为设计者希望在下一个上升时钟边缘之前完成DONE。

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