使用时钟并使能
Using clock and enable
我得到了启用 D 型触发器的代码。
process(clk, en)
begin
if rising_edge(clk) then
if en = ‘1’ then
Q <= D;
end if;
end if;
end process;
- 我被告知我应该不使用
if rising_edge(clk) and en = ‘1’ then ...
。 为什么?
- 为什么
en = '1'
的 if 不是在时钟的 if 之前,因为时钟变化更频繁?
- 而且在过程括号
process(clk, en)
中是否需要指定en
?
以下是您所有 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输入变化时不变化
有些人认为 VHDL 编译器和合成器无法弄清楚它与您在此处展示的是同一回事。我从来没有直接比较过输出,但如果它重要的话我会很伤心。
更频繁地更改在硬件中并不重要。从理论上讲,这应该无关紧要。实际上,如果您更改了条件的顺序,编译器可能会错误地警告您的敏感列表。
不是。
我得到了启用 D 型触发器的代码。
process(clk, en)
begin
if rising_edge(clk) then
if en = ‘1’ then
Q <= D;
end if;
end if;
end process;
- 我被告知我应该不使用
if rising_edge(clk) and en = ‘1’ then ...
。 为什么? - 为什么
en = '1'
的 if 不是在时钟的 if 之前,因为时钟变化更频繁? - 而且在过程括号
process(clk, en)
中是否需要指定en
?
以下是您所有 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输入变化时不变化
有些人认为 VHDL 编译器和合成器无法弄清楚它与您在此处展示的是同一回事。我从来没有直接比较过输出,但如果它重要的话我会很伤心。
更频繁地更改在硬件中并不重要。从理论上讲,这应该无关紧要。实际上,如果您更改了条件的顺序,编译器可能会错误地警告您的敏感列表。
不是。