Asynchronous 错误(10818):Can';t推断寄存器,因为它的值不在时钟边缘之外

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;

我一直在尝试实现一个异步计数器,模拟结果是正确的,但我一直从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;


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
应该做什么?您需要完全失去它才能使此合成,这正是错误消息告诉您的。可能重复此主题存在许多问题。搜索“错误的同步描述”。您的代码需要匹配这样的模板才能符合条件。