在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

FPGA基礎設計_PS2鍵盤控制及短按、長按

Hx ? 作者:工程師陳翠 ? 2018-06-26 10:06 ? 次閱讀

PS2鍵盤也是一個經典的實驗,可能很多人接觸如何對通信協議、時序編程就是從這個實驗開始學習的。USB鍵盤已經很普及,現在市場上還是有一些USB轉PS2的轉接頭,還有一些轉換芯片。這個實驗雖然簡單,不過不知道您有考慮過單按一次輸出一個有效脈沖、短按、長按等這些是如何實現的么?這就涉及到一些時鐘、邊沿檢測等設計問題。

PS2協議實現

我們見到的PS2的接口電路應該都是這樣的:

FPGA基礎設計_PS2鍵盤控制及短按、長按

一根時鐘線、一根數據線完成通信,PS2通信的幀格式如下所示,時鐘的下降沿數據有效:

FPGA基礎設計_PS2鍵盤控制及短按、長按

按鍵在被按下時,會發送一個字節,這個碼就是通碼;按鍵在釋放時,會發送兩個字節,這個碼就做斷碼(當然也有例外)。每一個按鍵都有唯一的通碼和斷碼,據此進行判斷按下的是哪個鍵,從而執行對應的功能。如一部分按鍵的通碼和斷碼如下所示:

FPGA基礎設計_PS2鍵盤控制及短按、長按

可以看出斷碼其實就是在通碼前加了一個F0,比如A的通碼是1C,則它的斷碼是F01C。另外一些特殊功能的按鍵,在通碼和斷碼前都會加個E0。PS2解碼的代碼如下所示:

//-----------------ps2_clk下降沿捕獲--------------------

//clk相當于中間采樣點的作用,第一個下降沿到來說明起始位開始

reg ps2_clk0, ps2_clk1, ps2_clk2;//緩沖寄存器

wire ps2_clk_neg; //1表示檢測到下降沿

reg ps2_state;

always @ (posedge clk or negedge rst_n)

if (!rst_n)

{ps2_clk0, ps2_clk1, ps2_clk2} 《= 3‘d0;

else

begin

ps2_clk0 《= ps2_clk;

ps2_clk1 《= ps2_clk0;

ps2_clk2 《= ps2_clk1;

end

assign ps2_clk_neg = ~ps2_clk1 & ps2_clk2;

//----------------------數據接收----------------------------

reg [3:0]num; //移位控制

reg [7:0]data_temp;//當前接收的數據

always @ (posedge clk or negedge rst_n)

if (!rst_n)

begin

num 《= 4’d0;

data_temp 《= 8‘d0;

end

else if (ps2_clk_neg)

begin

if (num == 0) num 《= num + 1’b1;//跳過起始位

else if (num 《= 8) //數據位賦值

begin

num 《= num + 1‘b1;

data_temp[num-1] 《= ps2_data;

end

else if (num == 9) num 《= num + 1’b1;//跳過校驗位

else num 《= 4‘d0; //清0

end

//--------------------按鍵按下/松開檢測-------------------------

reg ps2_loosen;//1表示按鍵松開

reg [7:0]ps2_byte;//ps2一個字節數據

always @ (posedge clk or negedge rst_n)

if (!rst_n)

begin

ps2_state 《= 1’b0;

ps2_loosen《= 1‘b0;

end

//每接收完一個數據就進行按鍵檢測

else if (num == 4’d10)

if (data_temp == 8‘hf0) ps2_loosen 《= 1’b1;//斷碼標識符

else

begin

if (ps2_loosen) //1表示按鍵松開,下一次接收數據后清0

begin

ps2_state 《= 1‘b0;

ps2_loosen《= 1’b0;

end

else //loosen變0后的下一個數據表示按鍵被按下

begin

ps2_state 《= 1‘b1;

ps2_byte 《= data_temp; //把讀取到的值賦給ps2_out

end

end

由于PS2通信是在PS2時鐘的下降沿有效,因此第一個always使用三個寄存器對PS2的CLK做一個下降沿捕獲,并輸出一個ps2下降沿的有效信號。

捕捉到了ps2時鐘的下降沿,第二個always便是使用一個計數器在下降沿信號有效時讀取并存儲數據線上的數據。計數器的值正好對應著一幀中的通信格式,因此在計數器為0時為通信的起始位,1~8為數據位,9為校驗位,10為停止位。計數器處于數據位期間內,將數據位依次存儲到一個寄存器中。

得到了數據,第三個always進行的便是通信數據的判斷,這里進行的是斷碼的判斷。每當完成一幀通信時,即計數器計數到10(停止位)時,便對通信數據做判斷,如果是f0,則為斷碼的第一個碼,那么下一次通信來的必然是按鍵的鍵值碼。因此將收到f0后的下一個通信數據作為按鍵的鍵值碼存到一個寄存器中,同時將按鍵有效信號ps2_state置高,表示按下一次按鍵。

這樣便完成了PS2的通信。

PS2按鍵判斷

設想一個問題,假設兩個模塊,他們的時鐘是一樣的,模塊一用來進行PS2鍵盤檢測,模塊二根據按鍵按下的有效信號來決定是否執行對應的操作。如果模塊二采用同步設計,即由時鐘來控制(通常也是這么做的),如果模塊一輸出的按鍵有效信號不能做到恰好只維持一個時鐘的脈沖寬度,那么模塊二就會多次檢測到按鍵按下并觸發多次對應的控制操作。這也是新手常遇到的問題。

如果模塊一的時鐘是模塊二時鐘的兩倍呢?如果這個時候模塊一輸出的按鍵有效信號仍然只有一個脈沖,那么模塊二就會恰好檢測不到。因此模塊一輸出的按鍵有效信號應該維持兩個時鐘的脈沖寬度。而這可以用一個計數器來控制。

我這里舉一個只輸出一個時鐘長度的有效信號的例子:

reg ps2state_reg;

wire flag;

always @ (posedge clk)

ps2state_reg 《= ps2_state;

assign flag = (ps2state_reg) & (~ps2_state);

//---------------------根據鍵盤掃描碼輸出按鍵有效信號?--------------------------

always @ (posedge clk or negedge rst_n)

if (!rst_n)

begin left 《= 0; right 《= 0; up 《= 0; down 《= 0; end

else if (flag) //每當松開按鍵時才進行輸出

case (ps2_byte)

8’h1C: begin left 《= 1; end //a

8‘h23: begin right 《= 1; end //d

8’h1D: begin up 《= 1; end //w

8‘h1B: begin down 《= 1; end //s

default: begin left 《= 0; right 《= 0; up 《= 0; down 《= 0; end

endcase

else if (left) left 《= 0; //有按鍵有效信號輸出一個脈沖后馬上清零

else if (right) right 《= 0;

else if (up) up 《= 0;

else if (down) down 《= 0;

首先對按鍵狀態ps2_state做一級寄存,然后進行邊沿檢測,那么在alwasy中檢測到邊沿有效時則表示按鍵按下了一次,根據鍵碼將相應的按鍵有效信號置1。而當檢測到有效信號為高時,在下一個時鐘馬上就拉低,從而實現只輸出一個時鐘的脈沖寬度。這樣就不會引起錯誤的檢測到多次按下的問題。

我們在玩游戲的時候還會碰到這種情況,需要長按一個鍵幾秒鐘才會有相應的反應,其實解決了上面的問題后我們對這種短按、長按的控制思路就很清楚了。簡而言之,在模塊一中使用計數器來控制輸出的有效信號的時鐘長度,在模塊二中使用相同的計數器對這個有效信號的時鐘長度進行判斷,進而識別這個鍵到底是短按還是長按,以選擇不同的操作。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FPGA
    +關注

    關注

    1643

    文章

    21982

    瀏覽量

    614552
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    簡單解碼PS2鍵盤

    簡單的解碼PS2鍵盤的W/A/S/D四個按鍵,用來控制H橋,從而控制小車行進的方向
    發表于 07-08 19:02

    ps2鍵盤 協議

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

    【小梅哥FPGA進階教程】第六章 PS2鍵盤驅動設計與驗證

    的信息。在pc機上,我們經常使用104鍵的鍵盤,這種鍵盤與pc機的接口,可分為USB接口和PS2接口,我們FPGA要實現USB接口比較困難,因為USB的接口線路,不是標準的TTL電平,
    發表于 02-04 23:01

    使用FPGA驅動采用PS2接口的pc機鍵盤

    小梅哥和你一起深入學習FPGAPS2鍵盤驅動 在我們的電子系統中,當需要用到大量的按鍵輸入時,普通的獨立按鍵和矩陣鍵盤已經無法滿足我們的輸入需求,這個時候,我們需要使用一種功能更加強
    發表于 04-28 06:06

    USB1口數據線上的PS2鍵盤有問題該怎么解決

    在A40i核心板的USB1口的數據線上,通過WIT122U芯片實現一個PS2接口。在該PS2接口上接PS2鍵盤,發現按下鍵盤不松手的情況下,
    發表于 12-31 06:08

    PS2鍵盤接口引腳定義圖

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

    基于FPGAPS2鍵盤鼠標控制電子琴

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

    PS2鍵盤接口,通過串口打印

    PS2鍵盤接口,通過串口打印,有興趣的同學可以下載學習
    發表于 04-27 15:51 ?11次下載

    PS2鍵盤控制程序

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

    華清遠見FPGA代碼-PS2接口控制

    華清遠見FPGA代碼-PS2接口控制
    發表于 10-27 18:07 ?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 ?4669次閱讀
    主站蜘蛛池模板: 老师解胸罩喂我吃奶 | 欧美极品另类 | 99久久免费精品视频 | 日韩在线视频免费观看 | 大尺度视频网站久久久久久久久 | 午夜在线播放 | 狠狠色婷婷七月色综合 | 天堂在线资源网 | 四虎最新网址入口 | 亚洲a成人 | 天天干天天干天天干天天干天天干 | 香蕉视频色版在线观看 | 两性色午夜视频自由成熟的性 | 日日操夜夜操狠狠操 | 亚洲天堂ww| 国产精品一区电影 | 亚洲精品91大神在线观看 | 天天射天天干天天 | 亚色视频在线 | 久久青草国产手机看片福利盒子 | 四虎永久网址在线观看 | 在线视频资源 | 免看一级a毛片一片成人不卡 | 伊人9| 不卡无毒免费毛片视频观看 | 欧美zooz人禽交免费 | 深深激情网 | 天天做天天爱夜夜爽女人爽宅 | 看一级特黄a大片日本片 | 天天操你| 久久久xxx | 很黄很暴力 很污秽的小说 很黄很黄叫声床戏免费视频 | 男人j进入女人j在线视频 | 国产特黄1级毛片 | 综合精品视频 | 国产三级精品在线 | 一级片免费在线观看视频 | 91成人免费在线视频 | 亚洲成人激情片 | 日韩午夜免费 | 欧美精品国产第一区二区 |