2012-05-16 160 views
0

我想寫一個VHDL狀態機,將掃描一個4x4鍵盤。我希望keyP在開始和復位後設置爲0。我還希望Col在開始和復位後設置爲「1111」。VHDL輸出聲明與狀態機

由於我不完全熟悉VHDL編程,我相信這只是一個愚蠢的語法錯誤。
我得到的錯誤是:

錯誤(10818):無法推斷註冊「上校[0]」在Lab_7_Keypad.vhd(39),因爲它不成立的時鐘邊緣

以外的值

與同爲Col[1]Col[2]Col[3],以及用於keyP爲好。

這是我的代碼,它的全部開始。有人能給我一個想法,我錯了嗎?

感謝

ENTITY Lab_7_Keypad IS 
PORT(
    nReset   : IN STD_LOGIC; 
    clk    : IN STD_LOGIC; 
    row    : IN STD_LOGIC_VECTOR (3 downto 0); 
    Col    : OUT STD_LOGIC_VECTOR (3 downto 0); 
    data   : OUT STD_LOGIC_VECTOR (3 downto 0); 
    keyP   : OUT STD_LOGIC); 

    END Lab_7_Keypad; 

ARCHITECTURE a OF Lab_7_Keypad IS 
TYPE STATE_TYPE IS (Col1Set, Col2Set, Col3Set, Col4Set); 
SIGNAL coltest : STATE_TYPE; 

BEGIN 
PROCESS (clk, nReset) 
BEGIN 
    keyP <= '0'; 
    Col <= "1111"; 
    IF nReset = '0' THEN      -- asynch Reset to zero 
     coltest <= Col1Set; 
     Col <="1111"; 
     keyP <= '0'; 
    ELSIF clk'EVENT AND clk = '1' THEN   -- triggers on PGT 

     CASE coltest IS 
      WHEN Col1Set => 
      Col <="1110"; 
       CASE row IS 
        WHEN "1110"=>--row 1 
        data <= "0001"; 
        keyP <= '1'; 
        WHEN "1101"=>--row 2 
        data <= "0100"; 
        keyP <= '1'; 
        WHEN "1011"=>--row 3 
        data <= "0111"; 
        keyP <= '1'; 
        WHEN "0111"=>--row 4 
        data <= "1110"; 
        keyP <= '1'; 
        WHEN OTHERS => coltest <= Col2Set; 
       END CASE; 
    --And continues with same Case statements three more times. 

回答

2

您的綜合誤差是由於這樣的事實,你是分配到兩個山坳keyP之外的進程的異步復位或時鐘邊緣,這並不正確描述一個註冊表。刪除這些作業,錯誤應該消失。

PROCESS (clk, nReset) 
BEGIN 
    --keyP <= '0'; <------- BAD! 
    --Col <= "1111"; <------- BAD! 
    IF nReset = '0' THEN      -- asynch Reset to zero 
     coltest <= Col1Set; 
     Col <="1111"; 
     keyP <= '0'; 
    ELSIF clk'EVENT AND clk = '1' THEN   -- triggers on PGT 

     CASE coltest IS 
      WHEN Col1Set => 
      Col <="1110"; 
       CASE row IS 
        WHEN "1110"=>--row 1 
        data <= "0001"; 
        keyP <= '1'; 
        WHEN "1101"=>--row 2 
        data <= "0100"; 
        keyP <= '1'; 
        WHEN "1011"=>--row 3 
        data <= "0111"; 
        keyP <= '1'; 
        WHEN "0111"=>--row 4 
        data <= "1110"; 
        keyP <= '1'; 
        WHEN OTHERS => coltest <= Col2Set; 
       END CASE; 
    --And continues with same Case statements three more times.