【发布时间】:2022-01-24 09:45:31
【问题描述】:
我正在尝试实现一些在同一时钟的上升沿或下降沿触发的逻辑,具体取决于时钟极性信号。我尝试了以下方法,但在 Quartus 15.1 中收到错误消息(错误 ID:10628):“无法实现两个时钟边沿与二进制运算符结合的寄存器”。
process(clk)
begin
if (rising_edge(clk) and pol='0') or (falling_edge(clk) and pol='1') then
-- logic
end if;
end process;
我目前的解决方法是只编写整个逻辑块两次,每个条件分别编写一次。但是由于逻辑块不是那么小并且仍在开发中,所以这确实不是最佳的。有人对此有更好的解决方案吗?
编辑:实现此目的的一种简单方法是使用门控时钟,但据我了解,这通常是个坏主意,因此我尝试在时钟路径中不使用多路复用器或异或的情况下做到这一点。
【问题讨论】:
-
想一想:您将在时钟线中添加逻辑。这会增加延迟,影响时间。可能导致同步问题。你不想用普通的逻辑块来做这件事。使用 DCM 或 PLL 或您的 fpga 所拥有的任何东西。关于错误:合成器只能推断单个时钟沿的寄存器。就是那样子。使用时钟块或双逻辑。
-
我不具体了解这些程序,但错误消息表明二进制运算符存在问题。这可能是数据类型问题。您设置 pol = '0' (字符串)而不是 pol = 0 (真值)。如果这不适用,请原谅我,但在其他情况下,数据类型通常是问题,当它看起来应该工作但没有工作时。无法将单词与数字进行比较。
-
@JHBonarius 感谢您的回答。为什么这会将逻辑添加到时钟线中,并且我的解决方法仍在这样做吗?我也找不到任何关于如何用 PLL 反转时钟的信息。 FPGA 是 Cyclone V。
-
Nvm PLL 部分,我可以将它移相 180 度。虽然我不确定提供什么作为参考频率和输出频率,因为事先不知道频率。它甚至重要还是乘数是唯一重要的部分?
-
寄存器是 fpga 中的一个固定块。它有一个时钟输入,可以在上升沿或下降沿起作用。没有有效的逻辑来改变它:它在综合后被修复。动态更改时钟边沿需要您修改寄存器的时钟输入。 IE。把逻辑放在时钟线上。逻辑会增加延迟,因此这些寄存器的时钟将与 fpga 的其他部分不同步。双组寄存器在时钟线中没有逻辑。一组将是上升沿和第二个下降沿。