BASYS3開發板與鍵盤連線實驗

2021-09-12 07:05:34 字數 4689 閱讀 3947

數字邏輯部分的最後一篇部落格。當初是為了做課設,需要用到外接鍵盤,但是只有一塊4*4的鍵盤。無奈只能想到連usb介面的外接鍵盤。然後在網上搜了很多,找到了一篇ps/2協議外接鍵盤的微博。在那篇微博的基礎上完成了課設。

從ps/2向pc機傳送乙個位元組可按照下面的步驟進行:

(1)檢測時鐘線電平,如果時鐘線為低,則延時50μs;

(2)檢測判斷時鐘訊號是否為高,為高,則向下執行,為低,則轉到(1);

(3)檢測資料線是否為高,如果為高則繼續執行,如果為低,則放棄傳送(此時pc機在向ps/2裝置傳送資料,所以ps/2裝置要轉移到接收程式處接收資料);

(4)延時20μs(如果此時正在傳送起始位,則應延時40μs);

(5)輸出起始位(0)到資料線上。這裡要注意的是:在送出每一位後都要檢測時鐘線,以確保pc機沒有抑制ps/2裝置,如果有則中止傳送;

(6)輸出8個資料位到資料線上;

(7)輸出校驗位;

(8)輸出停止位(1);

(9)延時30μs(如果在傳送停止位時釋放時鐘訊號則應延時50μs)。

中間8個資料位裡填充的是ps/2的鍵碼。因為實驗只是涉及到了怎麼用,所以我沒有詳細地檢視它的原理。需要說明的ps/2鍵盤的鍵值並不是ascii碼的值。需要我們去自己轉換。具體原理可以參考:ps/2協議分析。以及本實驗沒有附上的鍵盤鍵值。

//

module ps2scan(clk,ps2k_clk,ps2k_data,ps2_byte,ps2_state);

input clk; //50m時鐘訊號 //復位訊號

input ps2k_clk; //ps2介面時鐘訊號

input ps2k_data; //ps2介面資料訊號

output[3: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)

begin //鎖存狀態,進行濾波

ps2k_clk_r0 <= ps2k_clk;

ps2k_clk_r1 <= ps2k_clk_r0;

ps2k_clk_r2 <= ps2k_clk_r1;

endassign 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) begin

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

end4'd2: begin

num <= num+1'b1;

temp_data[1] <= ps2k_data; //bit1

end4'd3: begin

num <= num+1'b1;

temp_data[2] <= ps2k_data; //bit2

end4'd4: begin

num <= num+1'b1;

temp_data[3] <= ps2k_data; //bit3

end4'd5: begin

num <= num+1'b1;

temp_data[4] <= ps2k_data; //bit4

end4'd6: begin

num <= num+1'b1;

temp_data[5] <= ps2k_data; //bit5

end4'd7: begin

num <= num+1'b1;

temp_data[6] <= ps2k_data; //bit6

end4'd8: begin

num <= num+1'b1;

temp_data[7] <= ps2k_data; //bit7

end4'd9: begin

num <= num+1'b1; //奇偶校驗位,不做處理

end4'd10: begin

num <= 4'd0; // num清零

enddefault: ;

endcase

endendreg key_f0; //松鍵標誌位,置1表示接收到資料8'hf0(鍵盤斷碼),再接收到下乙個資料後清零

reg ps2_state_r; //鍵盤當前狀態,ps2_state_r=1表示有鍵被按下

always @ (posedge clk) begin //接收資料的相應處理,這裡只對1byte的鍵值進行處理

if(num==4'd10&&neg_ps2k_clk) 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; //鎖存當前鍵值

endelse begin

ps2_state_r <= 1'b0;

key_f0 <= 1'b0;

endend

endendreg[3:0] ps2_asci=0; //接收資料的相應ascii碼

always @ (posedge clk) begin

case (ps2_byte_r) //鍵值轉換為ascii碼,這裡做的比較簡單,只處理

8'h45: ps2_asci <= 4'h0;//0

8'h16: ps2_asci <= 4'h1;//1

8'h1e: ps2_asci <= 4'h2;//2

8'h26: ps2_asci <= 4'h3;//3

8'h25: ps2_asci <= 4'h4;//4

8'h2e: ps2_asci <= 4'h5;//5

8'h36: ps2_asci <= 4'h6;//6

8'h3d: ps2_asci <= 4'h7;//7

8'h3e: ps2_asci <= 4'h8;//8

8'h46: ps2_asci <= 4'h9;//9

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'h1a: 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: ;

endcase

endassign ps2_byte = ps2_asci;

assign ps2_state = ps2_state_r;

endmodule

Ubuntu 開啟 NFS 與 開發板 連線

ubuntu nfs 涉及檔案 portmap hosts.deny hosts.allow 涉及操作 按順序如下 etc init.d portmap restart etc init.d nfs common restart etc init.d nfs kernel server restar...

開發板與虛擬機器網路連線

使用無線網絡卡上網,有線網絡卡與開發板 虛擬機器互聯。首先修改有線網絡卡的ip位址為靜態ip 192.168.1.10 255.255.255.0 將開發板和電腦直接用網線連線,這樣電腦和開發板就互通了。配置開發板ip,不同開發板配置檔案不一樣,jz2440是vi etc init.d rcs if...

Ubuntu12與開發板連線網路,IP位址設定

使用的是vmware9.0.2裡面裝載 ubuntu12.04的系統 問題 怎麼設定虛擬機器裡的ubuntu12的ip,以及vmare使其與arm9開發板互聯?1 先檢查虛擬機器裡的橋接方式是否開啟,橋接方式就可以自動獲取和宿主機一樣的ip網段,直接與主機互聯,設定 圖 一 二 圖一 圖二2,那麼怎...