2013-01-10 4 views
1

Verilog에 익숙하지 않으며 keybord의 키를 누를 때 뭔가를 표시해야하는 첫 번째 프로그램 중 하나를 만들려고합니다. Verilog 교과서의 예제 코드를 사용하고 싶지만, 핀 할당 (Altera의 DE2-70을 사용)에 문제가 있습니다.Verilog의 Keybord 인터페이스 디자인

  1. 왜 나는 input ReadKB;을 가지고 있는데, 모듈 정의에는 이와 같은 것이 없습니까?
  2. KBclk 및 KB 데이터에 할당되어야하는 핀을 알고 있습니다. ? 어떤 ResetKB에 대한 (PS2_KBCLK PIN_F24 PS/2 Clock 및 (PS2_KBDAT PIN_E24 PS/2 Data)

은 교재에서 아무런 설명이없는 나는 그것에 대해 정말 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

당신이 묻는 것이 실제로 키보드에서 리셋되지는 않습니다. 사용 가능한 경우 알테라의 푸시 버튼에 연결합니다. – Tim

답변

1
  1. 오타와 같아서 모듈 정의에 누락 된 선을 추가하면됩니다.
  2. 당신이 묻는 것이 실제로 키보드에서 리셋되지는 않습니다. 사용 가능한 경우 알테라의 푸시 버튼에 연결합니다.
+0

아직 조금 문제가 있습니다. 나는'left = (ScanCode == 8'h1C) '을 할당하거나'left'(출력) 홈쇼핑을 1로 설정하고 싶을 뿐이다. 내가 무엇을 할 수 있을지? – alicjasalamon

+0

나는 당신의 질문을 정말로 이해하지 못합니다. 당신은 당신이 쓰고 싶은 것을 말했습니다. 왜 그렇게하지 않으시겠습니까? 나는 당신의 문제가 어디 있는지 보지 못한다. 아마도 당신은 새로운 질문을 작성하거나 (선호) 할 수 있습니다. – Tim

+0

좋습니다, 시도하겠습니다. 나는 영어로 필요한 것을 말하기에 문제가있다. 키 1C가 눌려지면 1을, 누르지 않을 때는 0을 갖고 싶습니다. 이 할당은 이와 같이 작동하지 않습니다 (키를 놓을 때 1이 남아 있음). 이 과제에 추가하거나 코드를 변경할 수있는 것이 있습니까? – alicjasalamon

1

그냥 높은 수준의 리셋 신호입니다. 푸시 버튼으로 연결하면 푸시 버튼을 사용하여 reg 신호, 비트 카운트 및 시작 비트 감지를 재설정 할 수 있습니다.

하지만 주목해야 할 중요한 사실은 reg 신호는 항상 섹션에서 "="을 사용할 수 없다는 것입니다. "< ="이어야합니다. 이는 더 많은주의를 기울여야하는 차단 및 비 차단 할당 간의 차이입니다. 행운을 빈다. :-)

+0

* reg 신호는 always 섹션 * 내에서 "="을 사용할 수 없습니다. 그들은 항상'= '을 항상 블록 안에 사용할 수 있습니다. 블로킹과 논 블로킹의 차이점은 맞지만 블로킹 명령문을 사용하는 경우에는 아무런 문제가 없습니다 (예 : 중간 신호 설정 용). – Tim

+0

키를 놓은 후에도 키 코드가 ScanCode에 남아있게합니까? 나는'assign left = (ScanCode == 8'h1C)'를하고 싶습니다만, 키가 눌려져있을 때만합니다. 내가 무엇을 할 수 있을지? – alicjasalamon

관련 문제