使用时钟和启用

时间:2016-03-08 18:26:19

标签: vhdl

我获得了启用D触发器的代码。

process(clk, en)
    begin
        if rising_edge(clk) then
             if en = ‘1’ then
                 Q <= D;
        end if;
     end if;
end process;
  1. 我被告知我应该使用if rising_edge(clk) and en = ‘1’ then ...为什么?
  2. 由于时钟频繁变化,为什么不在en = '1'之前的if en
  3. 是否有必要在流程括号process(clk, en)中指定document.getElementById("hello").style.left="100px"; document.getElementById("hello").style.top="100px";

2 个答案:

答案 0 :(得分:3)

  1. 有些人认为VHDL编译器和合成器无法弄清楚它与你在这里展示的一样。我从来没有直接比较输出,但如果重要的话,我会非常难过。

  2. 更频繁地更改在硬件中并不重要。从理论上讲,这应该不重要。实际上,如果您更改了条件的顺序,编译器可能会错误地警告您的敏感列表。

  3. 不是。

答案 1 :(得分:2)

以下是您所有3个问题的答案:

如果您正在编写顺序逻辑,那么坚持使用模板是明智之举。下面是一个这样的顺序逻辑模板,无异步复位,所有综合工具都应该理解:

process(clock)  -- nothing else should go in the sensitivity list
begin
    -- never put anything here
    if rising_edge(clock) then  -- or falling_edge(clock)
        -- put the synchronous stuff here
        -- ie the stuff that happens on the rising or falling edge of the clock
    end if;
     -- never put anything here
end process;        

所以en不应该在敏感性列表中,并且不应该在测试时钟的同一个if语句中进行测试。

如果你考虑一下,还有另一个很好的理由说明en不应该出现在灵敏度列表中:没有异步复位的触发器的输出只会在时钟变化时发生变化;当D输入改变时,它不会改变。