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