我一直在尝试实现异步计数器,模拟是正确的,但我继续从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;
答案 0 :(得分:1)
如果您需要可合成代码,请按照它推断所需硬件的方式进行编码。
寄存器应该仅在时钟边沿上改变值并保持该值直到下一个时钟沿。你说IF (rising_edge(a))
分配了一些值,这没关系。但是你已经放了别的!当它不是上升沿时,您还要为计数器分配一些值。这不是寄存器的工作原理。如果它不是上升沿,则不要更改值,即删除其他部分。