【发布时间】:2017-02-20 20:15:47
【问题描述】:
我一直在尝试实现一个异步计数器,并且模拟是正确的,但我不断从 Quartus 收到此错误
错误 (10818):无法在 EncoderComputation.vhd(35) 中推断“encoderCounta[0]”的寄存器,因为它没有在时钟沿之外保持其值。
任何帮助将不胜感激!
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;
【问题讨论】:
-
你能用你自己的话描述一下
encoderCounta对a和b的反应吗? -
您的工具抱怨您试图在时钟边沿和异步分配 encoderCounta。如果不使用时钟边沿限定分配,则诸如
encoderCounta <= encoderCounta + 1;的分配是组合循环(具有由增量提供的延迟的张弛振荡器)。如果您克服了错误,您将看到有关组合循环的警告。模拟显示正确,因为敏感度列表中只有 a。 -
ELSE在IF (rising_edge(a))之后应该做什么?您需要完全失去它才能使其可合成,这正是错误消息告诉您的内容。 -
关于这个话题有很多现有的问题。搜索“错误的同步描述”。您的代码需要匹配 stackoverflow.com/a/34067908/4090959 之类的模板才能符合综合条件。
标签: asynchronous vhdl counter quartus