之前探討過PS/2鍵盤編解碼以及數據傳輸協議,這次自己動手實現了利用FPGA接收鍵盤編碼,然后通過串口傳輸到PC。做的比較簡單,只是通過FPGA把大寫字母A-Z轉換成相應的ASCII碼,只要字母按鍵被按下,就能在串口調試助手里顯示相應大寫字母。下面就共享代碼吧!
除了頂層模塊,三個底層模塊分別為PS/2傳輸處理模塊、串口傳輸模塊以及串口波特率選擇模塊(下面只給出頂層模塊和PS/2傳輸處理模塊的Verilog代碼)。
Module Ps2_key(Clk,Rst_n,Ps2k_clk,Ps2k_data,Rs232_tx);
Input Clk; //50M時鐘信號
Input Rst_n; //復位信號
Input Ps2k_clk; //PS2接口時鐘信號
Input Ps2k_data; //PS2接口數據信號
Output Rs232_tx; // RS232發送數據信號
Wire[7:0] Ps2_byte; // 1byte鍵值
Wire Ps2_state; //按鍵狀態標志位
Wire Bps_start; //接收到數據后,波特率時鐘啟動信號置位
Wire Clk_bps; // Clk_bps的高電平為接收或者發送數據位的中間采樣點
Ps2scan Ps2scan( .Clk(Clk), //按鍵掃描模塊
.Rst_n(Rst_n),
.Ps2k_clk(Ps2k_clk),
.Ps2k_data(Ps2k_data),
.Ps2_byte(Ps2_byte),
.Ps2_state(Ps2_state)
);
Speed_select Speed_select( .Clk(Clk),
.Rst_n(Rst_n),
.Bps_start(Bps_start),
.Clk_bps(Clk_bps)
);
My_uart_tx My_uart_tx( .Clk(Clk),
.Rst_n(Rst_n),
.Clk_bps(Clk_bps),
.Rx_data(Ps2_byte),
.Rx_int(Ps2_state),
.Rs232_tx(Rs232_tx),
.Bps_start(Bps_start)
);
Endmodule
Module Ps2scan(Clk,Rst_n,Ps2k_clk,Ps2k_data,Ps2_byte,Ps2_state);
Input Clk; //50M時鐘信號
Input Rst_n; //復位信號
Input Ps2k_clk; //PS2接口時鐘信號
Input Ps2k_data; //PS2接口數據信號
Output[7:0] Ps2_byte; // 1byte鍵值,只做簡單的按鍵掃描
Output Ps2_state; //鍵盤當前狀態,Ps2_state=1表示有鍵被按下
//------------------------------------------
Reg Ps2k_clk_r0,Ps2k_clk_r1,Ps2k_clk_r2; //Ps2k_clk狀態寄存器
//Wire Pos_ps2k_clk; // Ps2k_clk上升沿標志位
Wire Neg_ps2k_clk; // Ps2k_clk下降沿標志位
Always @ (Posedge Clk Or Negedge Rst_n) Begin
If(!Rst_n) Begin
Ps2k_clk_r0 <= 1''B0;
Ps2k_clk_r1 <= 1''B0;
Ps2k_clk_r2 <= 1''B0;
End
Else Begin //鎖存狀態,進行濾波
Ps2k_clk_r0 <= Ps2k_clk;
Ps2k_clk_r1 <= Ps2k_clk_r0;
Ps2k_clk_r2 <= Ps2k_clk_r1;
End
End
Assign Neg_ps2k_clk = ~Ps2k_clk_r1 & Ps2k_clk_r2; //下降沿
//------------------------------------------
Reg[7:0] Ps2_byte_r; //PC接收來自PS2的一個字節數據存儲器
Reg[7:0] Temp_data; //當前接收數據寄存器
Reg[3:0] Num; //計數寄存器
Always @ (Posedge Clk Or Negedge Rst_n) Begin
If(!Rst_n) Begin
Num <= 4''D0;
Temp_data <= 8''D0;
End
Else If(Neg_ps2k_clk) Begin //檢測到Ps2k_clk的下降沿
Case (Num)
4''D0: Num <= Num+1''B1;
4''D1: Begin
Num <= Num+1''B1;
Temp_data[0] <= Ps2k_data; //Bit0
End
4''D2: Begin
Num <= Num+1''B1;
Temp_data[1] <= Ps2k_data; //Bit1
End
4''D3: Begin
Num <= Num+1''B1;
Temp_data[2] <= Ps2k_data; //Bit2
End
4''D4: Begin
Num <= Num+1''B1;
Temp_data[3] <= Ps2k_data; //Bit3
End
4''D5: Begin
Num <= Num+1''B1;
Temp_data[4] <= Ps2k_data; //Bit4
End
4''D6: Begin
Num <= Num+1''B1;
Temp_data[5] <= Ps2k_data; //Bit5
End
4''D7: Begin
Num <= Num+1''B1;
Temp_data[6] <= Ps2k_data; //Bit6
End
4''D8: Begin
Num <= Num+1''B1;
Temp_data[7] <= Ps2k_data; //Bit7
End
4''D9: Begin
Num <= Num+1''B1; //奇偶校驗位,不做處理
End
4''D10: Begin
Num <= 4''D0; // Num清零
End
Default: ;
Endcase
End
End
Reg Key_f0; //松鍵標志位,置1表示接收到數據8''Hf0,再接收到下一個數據后清零
Reg Ps2_state_r; //鍵盤當前狀態,Ps2_state_r=1表示有鍵被按下
Always @ (Posedge Clk Or Negedge Rst_n) Begin //接收數據的相應處理,這里只對1byte的鍵值進行處理
If(!Rst_n) Begin
Key_f0 <= 1''B0;
Ps2_state_r <= 1''B0;
End
Else If(Num==4''D10) Begin //剛傳送完一個字節數據
If(Temp_data == 8''Hf0) Key_f0 <= 1''B1;
Else Begin
If(!Key_f0) Begin //說明有鍵按下
Ps2_state_r <= 1''B1;
Ps2_byte_r <= Temp_data; //鎖存當前鍵值
End
Else Begin
Ps2_state_r <= 1''B0;
Key_f0 <= 1''B0;
End
End
End
End
Reg[7:0] Ps2_asci; //接收數據的相應ASCII碼
Always @ (Ps2_byte_r) Begin
Case (Ps2_byte_r) //鍵值轉換為ASCII碼,這里做的比較簡單,只處理字母
8''H15: Ps2_asci <= 8''H51; //Q
8''H1d: Ps2_asci <= 8''H57; //W
8''H24: Ps2_asci <= 8''H45; //E
8''H2d: Ps2_asci <= 8''H52; //R
8''H2c: Ps2_asci <= 8''H54; //T
8''H35: Ps2_asci <= 8''H59; //Y
8''H3c: Ps2_asci <= 8''H55; //U
8''H43: Ps2_asci <= 8''H49; //I
8''H44: Ps2_asci <= 8''H4f; //O
8''H4d: Ps2_asci <= 8''H50; //P?
8''H1c: Ps2_asci <= 8''H41; //A
8''H1b: Ps2_asci <= 8''H53; //S
8''H23: Ps2_asci <= 8''H44; //D
8''H2b: Ps2_asci <= 8''H46; //F
8''H34: Ps2_asci <= 8''H47; //G
8''H33: Ps2_asci <= 8''H48; //H
8''H3b: Ps2_asci <= 8''H4a; //J
8''H42: Ps2_asci <= 8''H4b; //K
8''H4b: Ps2_asci <= 8''H4c; //L
8''H1z: Ps2_asci <= 8''H5a; //Z
8''H22: Ps2_asci <= 8''H58; //X
8''H21: Ps2_asci <= 8''H43; //C
8''H2a: Ps2_asci <= 8''H56; //V
8''H32: Ps2_asci <= 8''H42; //B
8''H31: Ps2_asci <= 8''H4e; //N
8''H3a: Ps2_asci <= 8''H4d; //M
Default: ;
-
Verilog
+關注
關注
28文章
1351瀏覽量
110391 -
源程序
+關注
關注
63文章
1694瀏覽量
45539 -
PS2鍵盤
+關注
關注
1文章
9瀏覽量
4330
發布評論請先 登錄
相關推薦
評論