2011-11-18 55 views
-1

這是完整的代碼不能推斷出的Quartus II(VHDL)註冊

library ieee; 
use ieee.std_logic_1164.all; 

entity move_key_detector is 
    PORT(
     clk : IN STD_LOGIC; 
     done : IN STD_LOGIC; 
     hex : IN STD_LOGIC_VECTOR(7 DOWNTO 0); 
     up, down : out std_logic 
    ); 
END move_key_detector; 

architecture arch of move_key_detector is 

    type statetype is (IDLE, RECEIVED_BREAK); 
    signal next_state, current_state : statetype :=IDLE; 

begin 

process (Clk) begin 
    if(rising_edge(Clk)) then 
     current_state <= next_state; 
    end if; 
end process; 


process(done) begin 
next_state <= current_state; 
    case current_state is 
     when IDLE=> 
      if(done = '1') then 
       if (hex = "00011101") then up <= '1'; 
       elsif(hex = "00011011") then down <= '1'; 
       --check to see if a break code is sent 
       elsif (hex = "11110000") then next_state <= RECEIVED_BREAK; 
       end if; 
      end if; 
     when RECEIVED_BREAK=> 
      if(done ='1') then 
       if (hex = "00011101") then up <= '0'; 
       elsif(hex="00011011") then down <= '0'; 
       end if; 
       next_state <= IDLE; 
      end if; 
     end case; 
end process; 

的錯誤是:

錯誤(10821):在move_key_detector.vhd HDL錯誤(31) :不能推斷註冊「向下」,因爲其行爲不符合任何支持寄存器模型

信息(10041):推斷爲鎖「向下」在move_key_detector.vhd(29)

錯誤(10821):move_key_detector.vhd(31)處的HDL錯誤:無法推斷「up」寄存器,因爲其行爲與任何支持的寄存器模型不匹配

Info(10041):推斷「up」在move_key_detector.vhd(29)

錯誤(10818):無法推斷在move_key_detector.vhd(41)註冊 「next_state」,因爲它不保持時鐘邊沿以外的值

誤差(10818 ):無法在move_key_detector.vhd(33)推斷「next_state」的寄存器,因爲它在時鐘邊緣外不保持其值。

我一直在收到這種錯誤。我遵循這個recommendation,閱讀HDL手冊,我仍然不知道如何解決這個問題。

任何人都可以幫助我嗎?非常感謝你!

回答

2

爲什麼你有第二個過程?它看起來像包含了什麼是異步代碼。

如果您需要的過程,所以你可以使用,如果和結構的情況下,你需要把任何可以影響所需的輸出到過程的敏感性列表(即:完成 current_state &十六進制)。

您還可能爲next_state分配兩個不同的值,這在定位FPGA時通常是一件壞事。我建議在case語句中移動「next_state < = current_state」,並明確地分配您的case/if語句的所有分支中的所有術語(我在猜測您對行爲的期望,但您應該得到一般想法):

case current_state is 
    when IDLE=> 
     if(done = '1') then 
      if (hex = "00011101") then 
       up <= '1'; 
       down <= '0'; 
       next_state <= current_state; 
      elsif(hex = "00011011") then 
       up <= '0'; 
       down <= '1'; 
       next_state <= current_state; 
      --check to see if a break code is sent 
      elsif (hex = "11110000") then 
       up <= '0'; 
       down <= '0'; 
       next_state <= RECEIVED_BREAK; 
      ... 

如果您打算生成異步邏輯,也可以在進程外使用選定的信號分配。

如果您確實試圖推斷up/down/next_state信號的鎖存器,您需要更直觀地瞭解您希望發生的事情,無論是直接在您的代碼中還是在您的問題中,我們都可以幫你。