时钟变低时更新数据 - VHDL

时间:2015-05-07 10:01:44

标签: vhdl fpga

我需要在时钟变低时设置输出数据而不是下一个rising_edge,我已修改代码以这种方式工作,但是我发出了这样的警告:

  

时钟寄存器空连接到常量   寄存器上的时钟完全连接到常量

这是代码:

elsif rising_edge(Clock) then  
                if (Head = Tail) then
                    if Looped then
                        FullVar := '1';
                    else
                        EmptyVar := '1';
                    end if;
                else
                    EmptyVar := '0';
                    FullVar := '0';
                end if;
   else
      Full <= FullVar;
      Empty <= EmptyVar;
   end if;
end process;

为了消除此警告,我以这种方式修改了代码:

elsif rising_edge(Clock) then  
                if (Head = Tail) then
                    if Looped then
                        FullVar := '1';
                    else
                        EmptyVar := '1';
                    end if;
                else
                    EmptyVar := '0';
                    FullVar := '0';
                end if;
   end if;
   Full <= FullVar;
   Empty <= EmptyVar;
end process;

但是当我编译代码并模拟我在标志被断言之前有更高的延迟时(在没有警告的情况下纠正的代码中)。这是为什么?此外,代码有效,但是正确的这种类型的代码或数据应该在rising_edge时始终更新?

1 个答案:

答案 0 :(得分:0)

是的,你应该总是使用rising_edge(时钟),除非你真的&#39;需要第二个时钟域。在您的情况下,您不需要第二个时钟域。

在您的示例中也没有理由使用变量。如果Head等于Tail并且循环为&#39; 1&#39;以下代码将在时钟的rising_edge之后引发Empty。在上升之前。

check : process (Clock)
if rising_edge(Clock) then
    if Head = Tail then
        if Looped then
            Full <= '1';
        else
            Empty <= '1';
        end if;
    else
        Empty <= '0';
        Full <= '0';
    end if;
end if;
end process;

如果你想在上升边缘前进行空加注,你应该这样组合,如下:

check : process (Head,Tail,Looped)
Empty <= '0';
Full <= '0';
if Head = Tail then
    if Looped then
        Full <= '1';
    else
        Empty <= '1';
    end if;
end process;

我希望这会有所帮助。