




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第九章PS/2鍵盤接口控制器9.1PS/2基礎(chǔ)9.2PS/2鍵盤掃描設(shè)計9.3PS/2鍵盤接口電路 9.1PS/2基礎(chǔ)
9.1.1PS/2端口的物理接口
除了數(shù)據(jù)線和時鐘線之外,PS/2端口還包括電源線(VCC)和地(GND)。電源由主系統(tǒng)提供,VCC是5V供電,數(shù)據(jù)和時鐘線是開漏極的。不過現(xiàn)在大部分的鍵盤和鼠標支持3.3V供電,所以在S3開發(fā)板上針對PS/2接口有兩個電源供電,一個是5V,針對老的計算機,另外一個是3.3V供電,針對新的計算機,可以通過跳線來選擇。另外,大家不必擔(dān)心電平匹配的問題,F(xiàn)PGA的引腳是支持PS/2端口的5V電平的。9.1.2PS/2接口主從設(shè)備通信協(xié)議
PS/2設(shè)備與其主系統(tǒng)之間通過包的方式進行通信?;镜膹脑O(shè)備到主系統(tǒng)的數(shù)據(jù)傳輸協(xié)議如圖9-1所示,其中,數(shù)據(jù)與時鐘信號分別標為ps2d和ps2c。
數(shù)據(jù)以串行比特流傳輸,其格式與UART的非常相似,傳輸從開始位開始,然后進行8位的數(shù)據(jù)和奇偶校驗,最后是停止位。與UART不同的是時鐘信息由單獨的時鐘信號線提供,每次ps2c的下降沿時刻數(shù)據(jù)線ps2d上的數(shù)據(jù)開始有效并可以存取。時鐘信號ps2c的周期在60到100μs之間(約10~16.7kHz),而且要求ps2d信號在ps2c信號來臨之前已經(jīng)保持穩(wěn)定的時間為5μs,同時在ps2c下降沿結(jié)束之后同樣保持有5μs的穩(wěn)定時間。按照前面講述的數(shù)字電路術(shù)語,就是建立時間和保持時間都是5μs。圖9-1PS2的端口時序圖9.1.3PS/2接收模塊設(shè)計
基于PS/2端口的接收系統(tǒng)設(shè)計與UART的接收模塊很相似,只是在采樣過程中不需要過采樣。根據(jù)PS/2的協(xié)議,信號ps2c的下降沿為接收數(shù)據(jù)的參考點。子系統(tǒng)包含一個下降沿檢測電路,其功能是當(dāng)檢測到ps2c信號下降沿來臨時,生成一個時鐘寬度的脈沖信號,同時接收器從串行線移位一位數(shù)據(jù)并存儲下來。
在這里要注意,下降沿檢測過程中需要考慮雜波的干擾,因而需要增加濾波電路來過濾毛刺,其代碼如下:always@(posedgeclk,posedgereset)
filter-reg<=filter-next;
...
//1-bit移位寄存器
assignfilter-next={ps2c,filter-reg[7:11]};
//濾波器
assignf_ps2c_next=(filter_reg==8'bllllllll)?l'bl:
(filter_reg==8'b00000000)?1'b0:
f-ps2c-reg;濾波電路主要包含一個8位的移位寄存器電路,另外還有判斷部分。當(dāng)8位數(shù)據(jù)全部為1或0時,對應(yīng)返回值為1或0,因此小于8個時鐘周期的信號變化都會當(dāng)作毛刺被忽略,而通過濾波器的信號輸出到下降沿檢測電路中。
接收電路的ASMD流程圖如圖9-2所示,接收器一開始處于idle狀態(tài),系統(tǒng)包含了一個rx_en的控制寄存器,用來使能或停止接收操作,目的是為了雙向傳輸操作的控制。在本系統(tǒng)中,由于鍵盤為單向操作,可以固定設(shè)置為1(僅用來做接收操作)。當(dāng)檢測到下降沿并且rx_en信號為有效時,狀態(tài)機將起始位移入并進入數(shù)據(jù)傳輸狀態(tài)dps。由于接收數(shù)據(jù)模式固定,所以連續(xù)移入10bit數(shù)據(jù),而不是分數(shù)據(jù)、校驗和停止三個狀態(tài)移入數(shù)據(jù)。然后狀態(tài)機進入置位狀態(tài),多余一個時鐘用來完成停止位的移位操作,并置位psrx_done_tick信號一個時鐘周期。具體濾波電路和ASMD狀態(tài)機描述如程序9-1所示。圖9-2PS/2接收部分狀態(tài)機流程圖
【程序9-1】PS/2接收程序。
moduleps2_rx
(
input
wireclk,reset,
input
wireps2d,ps2c,rx_en,
output
regrx_done_tick,
output
wire[7:0]dout
);
//狀態(tài)機信號聲明
localparam[1:0]
idle=2'b00,
dps=2'b01,
load=2'b10;
//信號聲明
reg[1:0]state_reg,state_next;
reg[7:0]filter_reg;
wire[7:0]filter_next;
regf_ps2c_reg;
wiref_ps2c_next;
reg[3:0]n_reg,n_next;
reg[10:0]b_reg,b_next;
wirefall_edge;
//主體
//=============================================
//濾波和下降沿檢測ps2c
//=============================================
always@(posedgeclk,posedgereset)
if(reset)
begin
filter_reg<=0;
f_ps2c_reg<=0;
end
else
begin
filter_reg<=filter_next;
f_ps2c_reg<=f_ps2c_next;
end
assignfilter_next={ps2c,filter_reg[7:1]};
assignf_ps2c_next=(filter_reg==8'b11111111)?1'b1:
(filter_reg==8'b00000000)?1'b0:
f_ps2c_reg;
assignfall_edge=f_ps2c_reg&~f_ps2c_next;
//=================================================
//FSMD
//=================================================
//FSMD狀態(tài)和數(shù)據(jù)寄存器
always@(posedgeclk,posedgereset)
if(reset)
begin
state_reg<=idle;
n_reg<=0;
b_reg<=0;
end
else
begin
state_reg<=state_next;
n_reg<=n_next;
b_reg<=b_next;
end
//FSMD下一狀態(tài)邏輯
always@*
begin
state_next=state_reg;
rx_done_tick=1'b0;
n_next=n_reg;
b_next=b_reg;
case(state_reg)
idle:
if(fall_edge&rx_en)
begin
//從開始位移位
b_next={ps2d,b_reg[10:1]};
n_next=4'b1001;
state_next=dps;
end
dps://8位數(shù)據(jù)+1位校驗+1位停止
if(fall_edge)
begin
b_next={ps2d,b_reg[10:1]};
if(n_reg==0)
state_next=load;
else
n_next=n_reg-1;
end
load://額外一個時鐘周期完成最后一位移位
begin
state_next=idle;
rx_done_tick=1'b1;
end
endcase
end
//輸出
assigndout=b_reg[8:1];//數(shù)據(jù)位
endmodule
9.2PS/2鍵盤掃描設(shè)計
9.2.1關(guān)于鍵盤掃描編碼
鍵盤包括矩陣按鍵和一個嵌入式控制器。嵌入式控制器用來監(jiān)視鍵盤的動態(tài)以及發(fā)送鍵盤掃描碼。有三種鍵盤狀態(tài)需要嵌入式控制器進行檢測:
(1)當(dāng)按鍵按下去時,按鍵編碼被發(fā)送。
(2)當(dāng)按鍵一直保持被按下狀態(tài)時,即處于打字狀態(tài),按鍵編碼會以一個固定的頻率重復(fù)發(fā)送同樣的按鍵編碼。一般情況下,當(dāng)按鍵被按下去0.5s后,按鍵編碼每100ms被發(fā)送一次。
(3)當(dāng)按鍵釋放時,停止編碼被發(fā)送。圖9-3展示了大部分的PS/2鍵盤編碼表,普通按鍵編碼由一個字節(jié)(兩位十六進制數(shù))組成。比如,按鍵A編碼為1C。這些編碼在傳輸過程中被打包傳輸,某些特定功能的按鍵由2到4字節(jié)組成;圖9-3中也顯示了一部分,比如向上按鍵E075,這類編碼傳輸需要多個包傳輸;彈起鍵編碼為在普通按鍵前面加F0,比如,A鍵的彈起編碼為F01C。圖9-3PS/2鍵盤掃描編碼表
PS/2編碼傳輸過程中會根據(jù)鍵盤的活動情況不同而形成不同的序列,如將A鍵按下去再彈上來,發(fā)送的鍵盤編碼為
1CF01C
如果把A鍵按下去一直不讓彈上來,發(fā)送的按鍵編碼就會發(fā)送多次:
1C1C1C1C…F01C
復(fù)合鍵可以同時被按下。比如,按下Shift鍵,再按下A鍵,然后釋放A鍵,再釋放Shift鍵,這個過程的按鍵代碼為
121CF01CF012
以上步驟也就是如何獲得大寫字母A的按鍵編碼順序。注意,沒有專門的編碼針對大寫或小寫,只是主機通過對Shift鍵的跟蹤來判斷屬于哪一種情況。9.2.2按鍵掃描電路設(shè)計
按鍵掃描監(jiān)視電路用來接收PS/2端發(fā)送的按鍵編碼數(shù)據(jù),并在超級終端上顯示對應(yīng)的按鍵。其基本設(shè)計思想為:首先,將收到的鍵盤編碼分解成兩個4位的編碼,并將它們當(dāng)作十六進制數(shù)轉(zhuǎn)換成ASCII碼,再通過UART發(fā)送到PC終端。接收掃描碼的方法與上述步驟相似。具體代碼如程序9-2所示。
【程序9-2】PS/2鍵盤掃描電路。
modulekb_monitor
(
input
wireclk,reset,
input
wireps2d,ps2c,
output
wiretx
);
//常數(shù)定義
localparamSP=8'h20; //空格的ASCII碼
//狀態(tài)機狀態(tài)符號定義
localparam[1:0]
idle=2'b00,
send1=2'b01,
send0=2'b10,
sendb=2'b11;
//信號聲明
reg[1:0]state_reg,state_next;
reg[7:0]w_data,ascii_code;
wire[7:0]scan_data;
regwr_uart;
wirescan_done_tick;
wire[3:0]hex_in;
//==============================================
//例化ps2接收器
//==============================================
ps2_rxps2_rx_unit
(.clk(clk),.reset(reset),.rx_en(1'b1),
.ps2d(ps2d),.ps2c(ps2c),
.rx_done_tick(scan_done_tick),.dout(scan_data));
//例化UART
uartuart_unit
(.clk(clk),.reset(reset),.rd_uart(1'b0),
.wr_uart(wr_uart),.rx(1'b1),.w_data(w_data),
.tx_full(),.rx_empty(),.r_data(),.tx(tx));
//狀態(tài)寄存器
always@(posedgeclk,posedgereset)
if(reset)
state_reg<=idle;
else
state_reg<=state_next;
//下一狀態(tài)邏輯
always@*
begin
wr_uart=1'b0;
w_data=SP;
state_next=state_reg;
case(state_reg)
idle:
if(scan_done_tick) //掃描接收到的字符
state_next=send1;
send1: //發(fā)送十六進制字符的高8位
begin
w_data=ascii_code;
wr_uart=1'b1;
state_next=send0;
end
send0: //發(fā)送十六進制字符的低8位
begin
w_data=ascii_code;
wr_uart=1'b1;
state_next=sendb;
end
sendb: //發(fā)送空格字符
begin
w_data=SP;
wr_uart=1'b1;
state_next=idle;
end
endcase
end
//=========================================
//掃描碼轉(zhuǎn)換成ASCII碼顯示
//=========================================
//分離掃描碼為兩個4bit
assignhex_in=(state_reg==send1)?scan_data[7:4]:
scan_data[3:0];
//十六進制數(shù)到ASCII碼轉(zhuǎn)換
always@*
case(hex_in)
4'h0:ascii_code=8'h30;
4'h1:ascii_code=8'h31;
4'h2:ascii_code=8'h32;
4'h3:ascii_code=8'h33;
4'h4:ascii_code=8'h34;
4'h5:ascii_code=8'h35;
4'h6:ascii_code=8'h36;
4'h7:ascii_code=8'h37;
4'h8:ascii_code=8'h38;
4'h9:ascii_code=8'h39;
4'ha:ascii_code=8'h41;
4'hb:ascii_code=8'h42;
4'hc:ascii_code=8'h43;
4'hd:ascii_code=8'h44;
4'he:ascii_code=8'h45;
default:ascii_code=8'h46;
endcase
endmodule
狀態(tài)機用來控制溢出操作,當(dāng)新的按鍵被掃描到時(即當(dāng)scan-done-tick信號有效時),UART被初始化,F(xiàn)SM電路通過send1、send0與sendb三個狀態(tài),將高十六進制數(shù)值和低十六進制數(shù)值,以及空格數(shù)據(jù)寫入UART中去。由于UART的FIFO深為4個字寬,所以不會有溢出發(fā)生。如果要用在第八章開發(fā)的完全UART程序,則需要注意的是,UART的接收功能未用,相關(guān)通信端口需要例化為常數(shù)。
9.3PS/2鍵盤接口電路
9.3.1接口電路設(shè)計
實際應(yīng)用中,與UART電路一樣,按鍵電路也作為主系統(tǒng)的接口電路,并需要一種與主系統(tǒng)之間的通信方法。之前講述的UART接口電路中,采用狀態(tài)標志和緩沖器來實現(xiàn)與主系統(tǒng)之間的接口電路的方法,在按鍵電路中也同樣適用。采用4個字符的FIFO緩沖器來設(shè)計按鍵接口電路,系統(tǒng)框圖如圖9-4所示。圖9-4PS/2鍵盤通信接口電路系統(tǒng)由PS/2接收器、FIFO緩沖器和控制狀態(tài)機三部分組成。其基本設(shè)計思想為:用狀態(tài)機來追蹤F0數(shù)據(jù)包(即彈起編碼),當(dāng)接收到該數(shù)據(jù)時,下一個數(shù)據(jù)包一定是按鍵編碼,所以要將此按鍵編碼寫入到FIFO緩沖區(qū)中。需要注意的是,這個方案對復(fù)合按鍵情況是不適合的,因為其編碼是多個包發(fā)送的。具體代碼如程序9-3所示。
【程序9-3】PS/2鍵盤通信接口電路。
modulekb_code
#(parameterW_SIZE=2)
(
input
wireclk,reset,
input
wireps2d,ps2c,rd_key_code,
output
wire[7:0]key_code,
output
wirekb_buf_empty
);
//常數(shù)聲明
localparamBRK=8'hf0; //暫停編碼
//狀態(tài)定義
localparam
wait_brk=1'b0,
get_code=1'b1;
//信號聲明
regstate_reg,state_next;
wire[7:0]scan_out;
reggot_code_tick;
wirescan_done_tick;
//程序主體部分
//例化PS/2接收器
ps2_rxps2_rx_unit
(.clk(clk),.reset(reset),.rx_en(1'b1),
.ps2d(ps2d),.ps2c(ps2c),
.rx_done_tick(scan_done_tick),.dout(scan_out));
//例化FIFO緩沖器
fifo#(.B(8),.W(W_SIZE))fifo_key_unit
(.clk(clk),.reset(reset),.rd(rd_key_code),
.wr(got_code_tick),.w_data(scan_out),
.empty(kb_buf_empty),.full(),
.r_data(key_code));
//=========================================
//接收到F0時狀態(tài)機獲得按鍵掃描碼
//=========================================
//狀態(tài)寄存器
always@(posedgeclk,posedgereset)
if(reset)
state_reg<=wait_brk;
else
state_reg<=state_next;
//下一狀態(tài)邏輯
always@*
begin
got_code_tick=1'b0;
state_next=state_reg;
case(state_reg)
wait_brk: //等待暫停碼—F0
if(scan_done_tick==1'b1&&scan_out==BRK)
state_next=get_code;
get_code: //接收后面的掃描碼
if(scan_done_tick)
begin
got_code_tick=1'b1;
state_next=wait_brk;
end
endcase
end
endmodule
9.3.2接口電路驗證
設(shè)計一個簡單的串行接口譯碼電路來驗證PS/2鍵盤接口電路。系統(tǒng)框圖如圖9-5所示.此電路的功能是將按鍵編碼轉(zhuǎn)換成ASCII碼并發(fā)送給UART,在超級終端上顯示按鍵代表的符號或者數(shù)字。轉(zhuǎn)換譯碼電路如程序9-4所示。圖9-5PS/2串口驗證電路
【程序9-4】PS/2譯碼程序。
modulekey2ascii
(
input
wire[7:0]key_code,
output
reg[7:0]ascii_code
);
always@*
case(key_code)
8'h45:ascii_code=8'h30; //0
8'h16:ascii_code=8'h31; //1
8'h1e:ascii_code=8'h32; //2
8'h26:ascii_code=8'h33; //3
8'h25:ascii_code=8'h34; //4
8'h2e:ascii_code=8'h35; //5
8'h36:ascii_code=8'h36; //6
8'h3d:ascii_code=8'h37; //7
8'h3e:ascii_code=8'h38; //8
8'h46:ascii_code=8'h39; //9
8'h1c:ascii_code=8'h41; //A
8'h32:ascii_code=8'h42; //B
8'h21:ascii_code=8'h43; //C
8'h23:ascii_code=8'h44; //D
8'h24:ascii_code=8'h45; //E
8'h2b:ascii_code=8'h46; //F
8'h34:ascii_code=8'h47; //G
8'h33:ascii_code=8'h48; //H
8'h43:ascii_code=8'h49; //I
8'h3b:ascii_code=8'h4a; //J
8'h42:ascii_code=8'h4b; //K
8'h4b:ascii_code=8'h4c; //L
8'h3a:ascii_code=8'h4d; //M
8'h31:ascii_code=8'h4e; //N
8'h44:ascii_code=8'h4f; //O
8'h4d:ascii_code=8'h50; //P
8'h15:ascii_code=8'h51; //Q
8'h2d:ascii_code=8'h52; //R
8'h1b:ascii_code=8'h53; //S
8'h2c:ascii_code=8'h54; //T
8'h3c:ascii_code=8'h55; //U
8'h2a:ascii_code=8'h56; //V
8'h1d:ascii_code=8'h57; //W
8'h22:ascii_code=8'h58; //X
8'h35:ascii_code=8'h59; //Y
8'h1a:ascii_code=8'h5a; //Z
8'h0e:ascii_code=8'h60; //‘
8'h4e:ascii_code=8'h2d; //-
8'h55:ascii_code=8'h3d; //=
8'h54:ascii_co
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 割膠打膠施工方案
- 工程項目文件及信息管理要點
- 山東省威海市2024-2025學(xué)年高二上學(xué)期期末考試英語試題【含答案】
- 隔斷吊頂施工方案模板
- 廣西南寧市2024-2025學(xué)年高一上學(xué)期期末教學(xué)質(zhì)量調(diào)研數(shù)學(xué)試卷
- 2025年山東臨沂二模試題及答案
- 2025年食品行駛測試題及答案
- 6年級求陰影部分面積與周長的題
- cordic算法求三角函數(shù)verilog
- 5年級上冊科學(xué)資料內(nèi)容
- 2025屆東北三省三校高三第一次聯(lián)合模擬考試地理試題(原卷版+解析版)
- 四年級數(shù)學(xué)(小數(shù)加減運算)計算題專項練習(xí)與答案
- 天津市建筑安全員-C證考試題庫
- 2024年南信語文數(shù)學(xué)試卷(含答案)
- JGJ46-2024 建筑與市政工程施工現(xiàn)場臨時用電安全技術(shù)標準
- 2016-2023年江蘇電子信息職業(yè)學(xué)院高職單招(英語/數(shù)學(xué)/語文)筆試歷年考點試題甄選合集含答案解析
- 8.6《林黛玉進賈府》課本劇劇本
- 融媒體檔案信息化管理探究
- 新房購房合同
- SAE-J2412測試標準
- SuperKids4 教學(xué)計劃
評論
0/150
提交評論