【问题标题】:Changing triggering edge depending on clock polarity signal根据时钟极性信号改变触发边沿
【发布时间】: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 的其他部分不同步。双组寄存器在时钟线中没有逻辑。一组将是上升沿和第二个下降沿。

标签: vhdl clock edges quartus


【解决方案1】:

编辑:我误解了这个问题。以下仅适用于 pol 为常量时:

试试老派的写法,用单独的事件属性和级别:

if clk'event and clk = pol then
  -- logic
end if;

如果pol 为“1”,则合成为与rising_edge(clk) 相同的内容。

【讨论】:

  • 谢谢,但我已经尝试过了,但它不起作用。据我了解,Quartus 需要能够从时钟事件中推断出时钟上升沿或下降沿,如果不能,则抛出错误。
  • 你是对的。我假设pol 是一个常数,你说它是一个信号。如果它在运行时会发生变化,您将需要执行其他操作。
  • 对不起,我可能应该更清楚地说明这一点。在这种情况下,您的解决方案看起来非常优雅,但它的缺点是检测从未定义到 1(或 0)的转换。
  • 我想你会发现它的综合逻辑与例如rising_edge() 会。
  • 对于合成是的,但在模拟时它们的行为略有不同。无论哪种方式,我通过使用不同的 clk_pol 泛型两次实例化整个组件来解决我的问题,然后在组件中使用您的方法。然后在顶层我使用我的实际 clk_pol 信号来复用两者的数据输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多