吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

PS2鍵盤編碼Verilog源程序分享

電子工程師 ? 來源:網絡整理 ? 作者:工程師曾暄茗 ? 2018-07-15 09:55 ? 次閱讀

之前探討過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
收藏 人收藏

    評論

    相關推薦

    PS2鼠標 verilog

    FPGA PS2鼠標verilog
    發表于 06-11 14:01

    PS2鍵盤時鐘與系統時鐘

    請問一下,在編寫ps2鍵盤程序時,鍵盤的時鐘和系統時鐘是什么關系????
    發表于 07-26 10:22

    ps2鍵盤 協議

    我想請教下ps2協議如果鍵盤一直不按的話 ps2協議中時鐘一直是高電平嗎
    發表于 01-27 10:25

    PS2鍵盤接口引腳定義圖

    PS2鍵盤接口引腳定義圖 PS/2 鍵盤接口為 6 針母插,外觀為: 
    發表于 11-27 12:36 ?4.3w次閱讀
    <b class='flag-5'>PS2</b><b class='flag-5'>鍵盤</b>接口引腳定義圖

    verilog PS2鍵盤解碼程序

     之前探討過PS/2鍵盤編解碼以及數據傳輸協議,這次自己動手實現了利用FPGA接收鍵盤編碼,然后通過串口傳輸到PC。做的比較
    發表于 06-05 12:31 ?2059次閱讀

    基于FPGA的PS2鍵盤鼠標控制電子琴

    基于 FPGA的PS2鍵盤鼠標控制電子琴論文
    發表于 10-29 17:18 ?31次下載

    PS2鍵盤控制程序

    Xilinx FPGA工程例子源碼:PS2鍵盤控制程序
    發表于 06-07 14:45 ?17次下載

    VHDL例程_PS2鍵盤接口程序

    VHDL例程 PS2鍵盤接口程序,感興趣的小伙伴們可以瞧一瞧。
    發表于 11-10 17:12 ?8次下載

    PS2鍵盤轉USB鍵盤源碼

    PS2鍵盤轉USB鍵盤
    發表于 05-04 11:52 ?11次下載

    關于PS2鍵盤與單片機通信

      PS2鍵盤與單片機通信的方法與原理說明。
    發表于 08-30 15:21 ?25次下載
    關于<b class='flag-5'>PS2</b><b class='flag-5'>鍵盤</b>與單片機通信

    MCU驅動PS2鍵盤

    MCU驅動PS2鍵盤
    發表于 10-27 14:39 ?17次下載
    MCU驅動<b class='flag-5'>PS2</b><b class='flag-5'>鍵盤</b>

    PS2鍵盤在單片機系統中的應用

    PS2鍵盤在單片機系統中的應用
    發表于 10-27 14:41 ?17次下載
    <b class='flag-5'>PS2</b><b class='flag-5'>鍵盤</b>在單片機系統中的應用

    FPGA DIY開發板的PS2鍵盤控制

    hahaolinux 的PS2鍵盤控制。
    的頭像 發表于 06-22 00:29 ?4433次閱讀

    通用鍵盤鼠標模擬包括USB和PS2程序詳細說明

    本文檔的主要內容詳細介紹的是通用鍵盤鼠標模擬包括USB和PS2程序詳細說明。
    發表于 04-12 18:28 ?9次下載
    通用<b class='flag-5'>鍵盤</b>鼠標模擬包括USB和<b class='flag-5'>PS2</b>的<b class='flag-5'>程序</b>詳細說明

    使用51單片機進行PS2鍵盤解碼實驗的C語言程序免費下載

    本文檔的主要內容詳細介紹的是使用51單片機進行PS2鍵盤解碼實驗的C語言程序免費下載。
    發表于 08-26 17:30 ?10次下載
    使用51單片機進行<b class='flag-5'>PS2</b><b class='flag-5'>鍵盤</b>解碼實驗的C語言<b class='flag-5'>程序</b>免費下載
    百家乐官网游戏教程| 真人百家乐官网导航| 百家乐官网分析概率原件| 五张百家乐官网的玩法技巧和规则| 真人百家乐现金游戏| 龙博百家乐的玩法技巧和规则| 大发888娱乐游戏下载 官方网 | 百家乐官网tt娱乐场开户注册| 百家乐打线| 爱玩棋牌官方下载| 百家乐官网傻瓜式投注法| 百家乐官网游戏什么时间容易出| 明珠百家乐的玩法技巧和规则| 长岛县| 百家乐官网作弊| 太阳城蓝山园| 百家乐官网ipone| 真人百家乐打法| 大发888投注大发娱乐| 噢门百家乐官网注码技巧| 大家赢百家乐投注| 云鼎娱乐城信誉度| 小孟百家乐官网的玩法技巧和规则| 巴厘岛百家乐的玩法技巧和规则 | 微信百家乐官网群规则大全| 百家乐翻天| 百家乐官网换房| 电子百家乐打法| 百家乐官网真钱牌九| 百家乐和局投注法| 澄江县| 百家乐关键词| 百家乐平台| BB百家乐官网HD| 免邮百家乐布桌| 百家乐官网最新的投注方法| 试玩百家乐代理| 百家乐官网玩法教学视频| 百家乐出千的方法| 金臂百家乐官网注册送彩金| 百家乐制胜法宝|