1. 程式人生 > >FPGA 實現PS/2鍵盤控制LED

FPGA 實現PS/2鍵盤控制LED

今天發現開發板上有PS/2介面,所以就打算試試是不是好的。
在這裡簡單說一下PS/2的基本知識,增加了解。PS/2
如圖即為PS/2介面的公頭,是一種6針的介面。包括資料(1腳)、時鐘(5腳)、電源(+5V)(4腳)、地(3腳),以及預留了2個針腳。
它名字的來歷是最早出現在IBM的PS/2的機子上,故之。它是一種滑鼠和鍵盤的專用介面,輸速率比COM介面稍快一些,而且是ATX主機板的標準介面,是目前應用最為廣泛的鍵盤介面之一。
鍵盤和滑鼠都可以使用PS/2介面,但是按照PC’99顏色規範,滑鼠通常佔用淺綠色介面,鍵盤佔用紫色介面。儘管鍵盤滑鼠對於的ps/2針腳一樣,但是這兩個介面還是不能混插,這是由它們在電腦內部不同的訊號定義所決定的。
接下來說說鍵盤編碼,普通計算機都是採用編碼鍵盤,編碼方式分為第一套、第二套、第三套編碼,民用都是第二套。具體編碼細則可以自行百度。在這裡我用到了Z鍵、Y鍵和Ctrl鍵,他們對於的編碼分別是0x1A、0x35、0x14。
然後是PS/2的時序,具體如下:起始位、資料0、資料1、資料2、資料3。。。。資料7、校驗位、停止位。(這和串列埠很相似),在PS/2時鐘下降沿採集資料。
接下來直接上程式碼

module ps2
(
/*系統訊號*******/
input clk,
input rst_n,
/**ps2訊號************/
input data_in,
input clk_in,
/*測試訊號*******/
output reg done_flag,
output reg[3:0] led
);

/************************/
reg r1,r2;
reg[7:0] ps2_data;
reg[4:0] i;//狀態
wire ps2_clk_n;
/************************

/
//clk_in下降沿檢測
/*************************/
[email protected](posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
r1 <= 1’b0;
r2 <= 1’b0;
end
else
begin
r1 <= clk_in;
r2 <= r1;
end
end

assign ps2_clk_n = r2&(!r1);
/***************************/
//獲取ps2鍵值
/***************************/
[email protected](posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
i<= ‘d0;
done_flag <= 1’b0;
ps2_data <= 8’b0;
end
else case(i)
‘d0:
begin
if(ps2_clk_n)
i <= i + 1’b1;
else i <= i;
end
‘d1,’d2,’d3,’d4,’d5,’d6,’d7,’d8:
begin
if(ps2_clk_n)
begin
i <= i + 1’b1;
ps2_data[i-1] <= data_in;
end
else i <= i;
end
‘d9,’d10:
begin
if(ps2_clk_n)
i <= i + 1’b1;
else
i <= i;
end
‘d11://判斷通斷碼,為F0則是斷碼
begin
if(ps2_data==8’hF0)
i <= ‘d12;
else
i <= ‘d23;
end
‘d12,’d13,’d14,’d15,’d16,’d17,’d18,’d19,’d20,’d21,’d22:
begin
if(ps2_clk_n)
i <= i + 1’b1;
else
i <= i;
end
‘d23:
begin
i <= i + 1’b1;
done_flag <= 1’b1;
end
‘d24:
begin
i <= ‘d0;
done_flag <= 1’b0;
end
default:i <= ‘d0;
endcase

end 

/*****************************/
//輸出控制led,Z鍵左移;Y鍵右移;CTRL切換
/****************************/
[email protected](posedge clk or negedge rst_n)
begin
if(!rst_n)
led <= 4’b1110;
else if(done_flag)
case(ps2_data)
8’h1a://字母z
begin
led <= {led[2:0],led[3]};//左移
end
8’h35://字母y
begin
led <= {led[0],led[3:1]};//右移
end
8’h14:
begin
led <= {led[0],led[1],led[2],led[3]};
end
default:;
endcase
end

endmodule
首先進行PS/2時鐘下降沿檢測,然後接受鍵盤過來的鍵值(即按鍵的編碼,比如Z鍵接收到的就是0x1A),通過對按鍵編碼的判斷來控制LED的左右移動和切換。
這是最簡單的PS/2操作,如果要做更復雜處理,同樣可以按照這個思路擴充套件,以支援不同操作。

相關推薦

FPGA 實現PS/2鍵盤控制LED

今天發現開發板上有PS/2介面,所以就打算試試是不是好的。 在這裡簡單說一下PS/2的基本知識,增加了解。 如圖即為PS/2介面的公頭,是一種6針的介面。包括資料(1腳)、時鐘(5腳)、電源(+5V)(4腳)、地(3腳),以及預留了2個針腳。 它名字的來歷

arduino學習筆記2 按鍵控制LED和搶答器

ps. 每個例程實驗的第一組程式碼來自購買arduino板是附贈的例程程式碼,第二組程式碼為根據前者進行的修改練習。 1.按鍵控制LED int ledpin=11;//定義數字11 介面 int inpin=7;//定義數字7 介面 int val;//定義變數val void

STM32F407ZET6 用串列埠通過鍵盤控制LED燈的亮滅

1、串列埠定義 串列埠通訊是一種裝置間非常常用序列通訊(資料互動)方式,因為它比較簡單便捷,大部分電子裝置支援串列埠通訊方式,電子工工程師除錯裝置時常用的介面 序列通訊:佔用I/O較少,速度上較慢點 並行通訊:佔用I/O較多,速度上快速 2、

【黑金原創教程】【FPGA那些事兒-驅動篇I 】實驗七:PS/2模組① — 鍵盤

實驗七:PS/2模組① — 鍵盤 實驗七依然也是熟爛的PS/2鍵盤。相較《建模篇》的PS/2鍵盤實驗,實驗七實除了實現基本的驅動以外,我們還要深入解PS/2時序,還有PS/2鍵盤的行為。不過,為了節省珍貴的頁數,怒筆者不再重複有關PS/2的基礎內容,那些不曉得的讀者請複習《建模篇》或者自行谷歌一下。 市場

【黑金原創教程】【FPGA那些事兒-驅動篇I 】實驗九:PS/2模組③ — 鍵盤與多組合鍵

實驗九:PS/2模組③ — 鍵盤與多組合鍵 筆者曾經說過,通碼除了單位元組以外,也有雙位元組通碼,而且雙位元組通碼都是 8’hE0開頭,別名又是 E0按鍵。常見的的E0按鍵有,<↑>,<↓>,<←>,<→>,<HOME>,<PRTSC>

【黑金原創教程】【FPGA那些事兒-驅動篇I 】實驗八:PS/2模組② — 鍵盤與組合鍵

實驗八:PS/2模組② — 鍵盤與組合鍵 實驗七之際,我們學習如何讀取PS/2鍵盤傳送過來的通碼與斷碼,不過實驗內容也是一鍵按下然後釋放,簡單按鍵行為而已。然而,實驗八的實驗內容卻是學習組合鍵的按鍵行為。 不知讀者是否有類似的經歷?當我們使用鍵盤的時候,如果5~6按鍵同時按下,電腦隨之便會發出“嗶嗶”的警

K1 K2作為中斷源控制紅色LED燈,實現任意鍵按一下LED燈亮或者滅

指向 很多 pan ports type bsp cnblogs rip handler 1 #include "stm32f10x.h" // 相當於51單片機中的 #include <reg51.h> 2 #include "stm32f10

[Python Study Notes]實現鍵盤控制與監控

實現 博客 pac rip art 字符串 line 一個 sys ‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘ >

RTOS_TINY中實現串列埠傳送字串控制LED

題目內容 在RTOS_TINY作業系統下實現以下目標: 有四個LED,使用AT89S52的4個引腳驅動它們分別以5Hz,8Hz,20Hz,32Hz的頻率閃爍。設使用12MHz的晶振。用串列埠助手,通過傳送 “TURN on 1”,使得LED1持續閃爍,並回顯“LED1 on”;傳送

java操作樹莓派GPIO控制LED燈--結合springboot實現介面呼叫

1、概述 本文使用java結合springboot實現了對樹莓派GPIO介面的操作以達到控制LED燈的功能 2、pom檔案如下: <project xmlns="http://maven.apache.org/POM/4.0.0"      &nb

zigbee 之ZStack-2.5.1a原始碼分析(二) 無線接收控制LED

本文描述ZStack-2.5.1a 模板及無線接收移植相關內容。 main HAL_BOARD_INIT // HAL_TURN_OFF_LED1 InitBoard HalDriverInit HalAdcInit

題目:求s=a+aa+aaa+aaaa+aa…a的值,其中a是一個數字。例如2+22+222+2222+22222(此時共有5個數相加),幾個數相加由鍵盤控制

 先定義為字串型別,字串相加只會增加字串的長度,將兩個字串相連。再轉化成整型相加求和即可。 public class Test8 { public static void main(String[] args) { Scanner s = new Scanner(System

STM32 嵌入式學習入門(2)——STM32的GPIO介紹 STM32 嵌入式學習入門(3)——STM32F103 按鍵輸入控制LED

STM32簡介及STM32學習方法簡介 STM32是新的基於ARM核心的32位MCU系列,該核心為ARM公司為要求高效能、低成本、低功耗的嵌入式應用專門設計的Cortex-M核心,該核心採用標準的ARM架構。該核心具有超前的體系結構以及高效能、低電壓、低功耗,且

Java小專案——飛機大戰(一、實現執行緒繪製背景和我方飛機,鍵盤控制飛機運動)

1 總體需求分析 1.1 類 1、主類 2、我方飛機類 3、執行緒類 2.2 效果圖 2 實現 2.1 飛機類 MyPlane 飛機類包括以下引數: 位置x、y 速度vx、vy 圖片圖示myicom:設定為飛機的圖片   飛機類

js實現鍵盤控制移動div

簡單原理: 獲取鍵盤keyCode,按一定規則改變指定div的邊距實現控制指定div的移動。需注意的是要考慮div的溢位問題,要編寫函式限制移動範圍。 實現效果: 使用者通過鍵盤的指定鍵指定div在web頁面內移動。 程式碼塊 html程式碼 &

嘗試解決鍵盤LED有時控制失靈

在wince上使用lzg7290來實現鍵盤和led。最近出了點問題,有時會失靈。 查了程式碼,發現iic速率跟建議的20kbps左右差別比較大。 首先嚐試將rIICCON重新配置,從0xaf,改為0xe3(具體看s3c2410的說明),降低速率。 所有操作沒有反應,測試發現訊

unity 實現鍵盤控制物體移動和轉向

unity 的character controller不太好用,碰撞什麼的不好操作,經常需要自己寫人物移動的指令碼,所以就記錄一下。 這個指令碼程式碼很簡單,實現的是按下鍵盤上下方向鍵,人物前進後退,按下鍵盤左右方向鍵,人物向左或向右轉彎。一般情況下使用一個膠囊體代表pl

【黑金原創教程】【FPGA那些事兒-驅動篇I 】實驗十:PS/2模組④ — 普通滑鼠

實驗十:PS/2模組④ — 普通滑鼠 學習PS/2鍵盤以後,接下來就要學習 PS/2 滑鼠。PS/2滑鼠相較PS/2鍵盤,驅動難度稍微高了一點點,因為FPGA(從機)不僅僅是從PS/2滑鼠哪裡讀取資料,FPGA還要往滑鼠裡寫資料 ... 反之,FPGA只要對PS/2鍵盤讀取資料即可。然而,最傷腦筋的地方就在

【黑金原創教程】【FPGA那些事兒-驅動篇I 】實驗十一:PS/2模組⑤ — 擴充套件滑鼠

實驗十一:PS/2模組⑤ — 擴充套件滑鼠 當普通滑鼠即三鍵滑鼠再也無法滿足需求的時候,擴充套件滑鼠即滾輪滑鼠就誕生了,然而實驗十一的實驗目的就是實現滾輪滑鼠的驅動。不過,進入整體之前,先讓我們來了解一下滑鼠的常用命令。 圖11.1 命令F3,設定取樣頻率。 命令F3也是Set Sample Rat

ESP8266-01之NodeMCU(lua)實現遠端控制LED

開發環境 ESP-01 wifi模組 LualLoader NodeMCU nodemcu_float_0.9.6-dev_20150704.bin nodemcu_integer_0.9.6-de