《Xilinx FPGA設(shè)計與實踐教程》課件-第9章_第1頁
《Xilinx FPGA設(shè)計與實踐教程》課件-第9章_第2頁
《Xilinx FPGA設(shè)計與實踐教程》課件-第9章_第3頁
《Xilinx FPGA設(shè)計與實踐教程》課件-第9章_第4頁
《Xilinx FPGA設(shè)計與實踐教程》課件-第9章_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論