Asynchronous 错误(10818):Can';t推断寄存器,因为它的值不在时钟边缘之外
我一直在尝试实现一个异步计数器,模拟结果是正确的,但我一直从Quartus那里得到这个错误 错误(10818):无法在encodercompution.vhd(35)处推断“encoderCounta[0]”的寄存器,因为它的值不在时钟边缘之外 任何帮助都将不胜感激Asynchronous 错误(10818):Can';t推断寄存器,因为它的值不在时钟边缘之外,asynchronous,vhdl,counter,quartus,Asynchronous,Vhdl,Counter,Quartus,我一直在尝试实现一个异步计数器,模拟结果是正确的,但我一直从Quartus那里得到这个错误 错误(10818):无法在encodercompution.vhd(35)处推断“encoderCounta[0]”的寄存器,因为它的值不在时钟边缘之外 任何帮助都将不胜感激 GPIO_0(1) <= encoderBits(0); GPIO_0(3) <= encoderBits(1); GPIO_0(5) <= readPosition; GPIO_0(7) <= clk;
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;
GPIO_0(1)当您想要一个可合成的代码时,按照它推断所需硬件的方式编码
寄存器应仅在时钟边缘上更改值,并将该值保留到下一个时钟边缘。你说如果(上升沿(a))
分配一些值,这是可以的。但是,你已经把另一个!当计数器不是上升沿时,您还将分配一些值以进行计数。这不是寄存器的工作方式。如果不是上升沿,请不要更改值,即删除其他部分。您能用自己的话描述一下encoderCounta
应该如何对a
和b
作出反应吗?您的工具抱怨您试图在时钟边缘异步分配encoderCounta。在不使用时钟边缘限定赋值的情况下,诸如encoderCounta之类的赋值在IF(上升沿(a))
之后ELSE
应该做什么?您需要完全失去它才能使此合成,这正是错误消息告诉您的。可能重复此主题存在许多问题。搜索“错误的同步描述”。您的代码需要匹配这样的模板才能符合条件。