根据时钟极性信号改变触发边沿

Changing triggering edge depending on clock polarity signal

我正在尝试实现一些在同一时钟的上升沿或下降沿触发的逻辑,具体取决于时钟极性信号。我尝试了以下操作,但在 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;

我目前的解决方法是将整个逻辑块写两次,一次分别针对每个条件。但是由于逻辑块不是那么小并且仍在开发中,所以这确实不是最佳选择。有人对此有更好的解决方案吗?

编辑:实现此目的的一种简单方法是门控时钟,但据我了解,这通常是个坏主意,因此我尝试在时钟路径中不使用多路复用器或异或器。

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

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

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

如果 pol 为“1”,这与 rising_edge(clk) 的结果相同。