2013-01-10 51 views
1

我是Verilog的新手,我正在嘗試創建一個我的第一個程序,它應該在keybord上的鍵被按下時顯示某些內容。我想使用Verilog教程中的示例代碼,但是我在引腳分配方面存在一些問題(我使用Altera的DE2-70)。Verilog中的Keybord接口設計

  1. 爲什麼我有input ReadKB;而在模塊定義中沒有這樣的東西?
  2. 我知道哪些引腳應該分配給KBclk和KBdata。 ?(PS2_KBCLK PIN_F24 PS/2 Clock和(PS2_KBDAT PIN_E24 PS/2 Data)怎麼樣ResetKB

在泛讀教材,沒有解釋,我真的courious它

代碼:!

module KeyboardInterface(KBclk, KBdata, ResetKB, SYNclk, ScanRdy, ScanCode, KeyReleased); 
input KBclk; 
input KBdata; 
input ResetKB; 
input ReadKB; 
input SYNclk; 
output ScanRdy; 
output ScanCode; 
output KeyReleased; 

    //Generate an internal synchronized clock 
    reg Clock; 
    always @(posedge SYNclk) Clock = KBclk; 

    reg[3:0] BitCount; 
    reg StartBitDetected, ScanRdy; 
    reg[7:0] ScanCode; 


    //Count the number of serial bits and collect data into ScanCode 
    always @(posedge Clock) begin 
     if(ResetKB) begin 
      BitCount=0; StartBitDetected =0; 
     end else begin 
      if(KBdata == 0 && StartBitDetected == 0) begin 
       StartBitDetected=1; 
       ScanRdy = 0; 
      end else if (StartBitDetected) begin 
       if(BitCount < 8) begin 
        BitCount = BitCount + 1; 
        ScanCode = {KBdata, ScanCode[7:1]}; 
       end else begin 
        StartBitDetected = 0; 
        BitCount = 0; 
        ScanRdy = 1; 
       end 
      end 
     end 
    end 



    reg [1:0] CompletionState; 
    wire KeyReleased; 

     //keep track of the state of Scan Codes outputted 
    always @(posedge SYNclk) begin 
     if(ResetKB) CompletionState = 0; 

     else case(CompletionState) 
      0: if(ScanCode == 8'h70 && ScanRdy == 1) CompletionState =1; 
       else CompletionState =0; 
      1: if(ScanRdy == 1) CompletionState =1; 
       else CompletionState =2; 
      2: if(ScanRdy == 0) CompletionState = 2; 
       else CompletionState = 0; 
      3: CompletionState = 0; 
     endcase 
    end 

    assign KeyReleased = CompletionState == 3 ? 1 : 0; 

endmodule 

謝謝

+0

#1看起來像一個錯字,只是繼續並將缺少的電線添加到模塊defn。我不明白#2;你是什​​麼意思「我可以找到別針」,你準確地使用了什麼設置? – Tim

+0

@Tim,我編輯了我的問題。我的意思是:我知道應該分配哪些引腳。 – alicjasalamon

+0

如果這就是你所要求的,那麼你的鍵盤可能實際上並沒有「重置」。如果可用,我只需將它與Altera上的某個按鈕綁定即可。 – Tim

回答

1
  1. 看起來像一個錯字,只是繼續往模塊定義添加缺少的線。
  2. 如果這就是您要求的,那麼您的鍵盤可能實際上並沒有「重置」。如果可用,我只需將它與Altera上的某個按鈕綁定即可。
+0

我還有一點問題。我想做'assign left =(ScanCode == 8'h1C)'或者設置'left'(輸出)homehow爲1,但只有在按下鍵的時候。我能做什麼? – alicjasalamon

+0

我真的不明白你的問題。你告訴我你要寫什麼,你爲什麼不這麼做?我沒有看到你的問題在哪裏。也許你可以詳細說明或(最好)提出一個新問題。 – Tim

+0

好的,我會試試。我在說英語時需要一些問題。當鍵1C被按下時,我想有1,當沒有按下時,有0。這個分配不能像這樣工作(當鍵被釋放時1仍然存在)。有什麼我可以添加到這個任務或更改代碼? – alicjasalamon

1

它只是一個高電平復位信號,您可以將它連接到一個按鈕,然後您可以使用按鈕來複位reg信號,bitcount和startbitdetect。

但是你應該注意的一件重要的事情是reg信號不能在always節中使用「=」,它應該是「< =」。這是阻塞和非阻塞分配之間的區別,您應該更多關注。祝你好運。:-)

+0

*表示reg信號在always部分*內不能使用「=」。他們當然可以在always塊中使用'='。你是正確的,這是阻塞和非阻塞之間的區別,但使用阻塞語句沒有什麼問題(例如,用於設置中間信號)。 – Tim

+0

密鑰釋放後是否導致密鑰代碼保留在ScanCode中?我想'assign left =(ScanCode == 8'h1C)',但只有在按下鍵的時候。我能做什麼? – alicjasalamon