错误(10818):无法推断寄存器,因为它不在时钟边沿之外保持其值

时间:2017-02-20 20:15:47

标签: asynchronous vhdl counter quartus

我一直在尝试实现异步计数器,模拟是正确的,但我继续从Quartus那里得到这个错误

  

错误(10818):无法推断" encoderCounta [0]"在EncoderComputation.vhd(35),因为它没有在时钟边缘之外保持其值。

任何帮助将不胜感激!

GPIO_0(1) <= encoderBits(0);
GPIO_0(3) <= encoderBits(1);
GPIO_0(5) <= readPosition;
GPIO_0(7) <= clk;


PROCESS(a)
BEGIN
    IF (rising_edge(a)) THEN
        IF (b = '0') THEN
            IF (encoderCounta = 399) THEN
                encoderCounta <= 0;
            ELSE 
                encoderCounta <= encoderCounta + 1;
            END IF;
        ELSIF(b = '1') THEN
             IF (encoderCounta = 0) THEN
                encoderCounta <= 399;
             ELSE
                encoderCounta <= encoderCounta - 1;
             END IF;
        END IF;
    ELSE
        IF(b = '1') THEN
             IF (encoderCounta = 399) THEN
                encoderCounta <= 0;
             ELSE
                encoderCounta <= encoderCounta + 1;
             END IF;
        ELSIF (b = '0') THEN
             IF (encoderCounta = 0) THEN
                encoderCounta <= 399;
             ELSE
                encoderCounta <= encoderCounta - 1;
             END IF;
        END IF;
    END IF;
END PROCESS;


result <= encoderCounta;

1 个答案:

答案 0 :(得分:1)

如果您需要可合成代码,请按照它推断所需硬件的方式进行编码。

寄存器应该仅在时钟边沿上改变值并保持该值直到下一个时钟沿。你说IF (rising_edge(a))分配了一些值,这没关系。但是你已经放了别的!当它不是上升沿时,您还要为计数器分配一些值。这不是寄存器的工作原理。如果它不是上升沿,则不要更改值,即删除其他部分。