2017-02-20 71 views
0

我一直在努力實現異步計數器之外保持其價值,而模擬是正確的,但我一直在從的Quartus錯誤(10818):無法推斷註冊,因爲它沒有時鐘邊沿

收到此錯誤

錯誤(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; 
+1

你能在你自己的話描述瞭如何'encoderCounta'應該以'了'和'B'反應? – mkrieger1

+0

您的工具抱怨你試圖同時分配encoderCounta時鐘邊沿和異步。而不必限定與時鐘分配邊緣上的分配,如'encoderCounta <= encoderCounta + 1;'是一個組合循環(張弛振盪器與由增量提供的延遲)。如果你通過這個錯誤,你會看到關於組合循環的警告。模擬顯示正確,因爲在靈敏度列表中只有一個。 – user1155120

+0

IF(rising_edge(a))'後的'ELSE'應該做什麼?你需要完全失去它才能合成,這正是錯誤信息告訴你的。 –

回答

1

當你想要一個可合成的代碼時,按照它將推斷所需硬件的方式進行編碼。

的寄存器應該只在時鐘沿改變的值,並保持,直到下一個時鐘邊緣值。你說IF (rising_edge(a))分配了一些值,這是可以的。但是,你已經把一個別的!當它不是上升沿時,您也正在分配一些值來計數。這不是註冊表的工作原理。如果不是上升沿,不要改變數值,即移除其他部分。

相關問題