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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第十章PS/2鼠標(biāo)接口控制器

10.1PS/2鼠標(biāo)接口電路10.2PS/2傳輸子系統(tǒng)設(shè)計(jì)10.3PS/2鼠標(biāo)數(shù)據(jù)傳輸系統(tǒng)10.4PS/2鼠標(biāo)數(shù)據(jù)接口電路本章小結(jié) 10.1PS/2鼠標(biāo)接口電路

10.1.1關(guān)于鼠標(biāo)

計(jì)算機(jī)上的鼠標(biāo)是用來檢測在平面二維空間中的移動(dòng)狀態(tài)和坐標(biāo)的。其內(nèi)部電路用來測量移動(dòng)的相對距離以及按鍵狀態(tài)。對于PS/2接口的鼠標(biāo),鼠標(biāo)的傳輸信息打包成三個(gè)數(shù)據(jù)包通過PS/2口發(fā)送出去;在傳輸過程中,數(shù)據(jù)以串行方式發(fā)送并且按照預(yù)先設(shè)定的采樣率持續(xù)傳輸。

PS/2端口的通信是雙向的。主設(shè)備可以發(fā)送命令參數(shù)給鍵盤和鼠標(biāo)。對于鍵盤來說,不需要主設(shè)備向鍵盤發(fā)送參數(shù),因?yàn)檫@樣會(huì)對鍵盤提出更高的要求。而鼠標(biāo)不一樣,上電之后不發(fā)送任何信息給主設(shè)備,反而主設(shè)備需要首先發(fā)送命令初始化鼠標(biāo),使鼠標(biāo)處于連續(xù)發(fā)送信息狀態(tài)。所以PS/2鼠標(biāo)接口是需要支持雙向通信接口的。下面介紹PS/2的鼠標(biāo)接口協(xié)議,并設(shè)計(jì)一個(gè)簡單的雙向鼠標(biāo)數(shù)據(jù)傳輸接口電路。10.1.2鼠標(biāo)PS/2通信協(xié)議

標(biāo)準(zhǔn)的PS/2鼠標(biāo)接口數(shù)據(jù)不僅反映鼠標(biāo)在X軸和Y軸的移動(dòng)情況,而且還包括鼠標(biāo)左鍵、中鍵、右鍵的狀態(tài)信息。鼠標(biāo)電路包含一個(gè)內(nèi)部計(jì)數(shù)器,其用來計(jì)算鼠標(biāo)的每次移動(dòng)量。當(dāng)數(shù)據(jù)傳輸給主機(jī)時(shí),計(jì)數(shù)器清零后重新開始計(jì)數(shù)。該計(jì)數(shù)器的值為一個(gè)9bit寬的帶符號整數(shù),其正值代表向右或向上運(yùn)動(dòng),其負(fù)值代表向左或向下運(yùn)動(dòng)。計(jì)數(shù)器與實(shí)際物理距離之間的關(guān)系由鼠標(biāo)特性參數(shù)來決定。默認(rèn)為每計(jì)數(shù)4次代表1mm。當(dāng)鼠標(biāo)持續(xù)移動(dòng)時(shí),數(shù)據(jù)以固定速率傳輸,這個(gè)速率由鼠標(biāo)采樣率決定。默認(rèn)采樣率為100次每秒。如果鼠標(biāo)移動(dòng)速率過快,采樣期間移動(dòng)量計(jì)數(shù)值則有可能超過計(jì)數(shù)器的最大值。計(jì)數(shù)器在適當(dāng)?shù)姆较蛟O(shè)置有最大幅度,并用兩位溢出位來指示這種情況。

反映鼠標(biāo)的移動(dòng)及點(diǎn)擊活動(dòng)需要三個(gè)字節(jié),它們被封裝在PS/2協(xié)議中。3個(gè)字節(jié)數(shù)據(jù)的具體格式以及含義如表10-1所示。包含有如下的信息:

(1)?X8,…,X0:在2秒完全模式下的X軸移動(dòng)量;

(2)?Xv:X軸移動(dòng)溢出;

(3)?Y8,…,Y0:在2秒完全模式下的Y軸移動(dòng)量;

(4)?Yv;Y軸溢出;

(5)?l:左鍵狀態(tài),當(dāng)左鍵按下時(shí)為1;

(6)?r:右鍵狀態(tài),當(dāng)右鍵按下時(shí)為1;

(7)?m:可選擇中鍵,當(dāng)鍵按下時(shí)為1。

傳輸過程中,字節(jié)1首先被發(fā)送,字節(jié)3最后被發(fā)送。10.1.3初始化過程

鼠標(biāo)的操作相對于鍵盤的操作要復(fù)雜的多。它有各種不同的模式,通常用的最多的是串行流模式,即鼠標(biāo)檢測有移動(dòng)或者有鍵按下時(shí),不斷將數(shù)據(jù)發(fā)送給主機(jī),如果運(yùn)動(dòng)是持續(xù)的,數(shù)據(jù)按照設(shè)計(jì)的采樣率發(fā)送。

操作過程中,主機(jī)可以給鼠標(biāo)發(fā)送命令,修改默認(rèn)值或其他參數(shù),來設(shè)置不同的操作模式,然后鼠標(biāo)發(fā)送狀態(tài)信號進(jìn)行響應(yīng)。在設(shè)計(jì)中要求所有設(shè)置為默認(rèn)值,不做變化,唯一任務(wù)是設(shè)置鼠標(biāo)為持續(xù)數(shù)據(jù)流模式。這時(shí)PS/2和FPGA開發(fā)板之間的初始化步驟如下:

(1)上電時(shí)鼠標(biāo)首先進(jìn)行上電自檢,如果鼠標(biāo)發(fā)送一個(gè)字節(jié)AA,則表示自檢通過;然后發(fā)送一個(gè)字節(jié)數(shù)據(jù)00,為標(biāo)準(zhǔn)鼠標(biāo)的ID號。

(2)?FPGA主機(jī)端發(fā)送命令F4,使能數(shù)據(jù)流模式,鼠標(biāo)返回FE來響應(yīng)命令。

(3)鼠標(biāo)進(jìn)入數(shù)據(jù)流模式,然后發(fā)送正常的數(shù)據(jù)包。

如果在FPGA板上電之前鼠標(biāo)已經(jīng)插在了FPGA驗(yàn)證板上,則當(dāng)板子上電時(shí),鼠標(biāo)立即發(fā)送“AA00”,由于FPGA芯片當(dāng)時(shí)還沒有被配置,那么將不能接收到鼠標(biāo)發(fā)送的數(shù)據(jù)。所以通常會(huì)忽略上述步驟(1),將鼠標(biāo)接口時(shí)序電路做簡化,僅需要發(fā)送F4命令來檢測鼠標(biāo)FE響應(yīng),然后直接進(jìn)入正常工作狀態(tài)來傳輸鼠標(biāo)數(shù)據(jù)包。也可以通過發(fā)送復(fù)位命令來強(qiáng)制鼠標(biāo)返回到初始狀態(tài)。

(1)?FPGA主機(jī)端發(fā)送命令FE復(fù)位鼠標(biāo),鼠標(biāo)將返回FE來響應(yīng)。

(2)鼠標(biāo)執(zhí)行上電自測,然后發(fā)送“AA00”,在這個(gè)過程中,數(shù)據(jù)流模式將被禁止。

新型鼠標(biāo)增加了很多功能,比如鼠標(biāo)帶有滾輪或者另外增加新的按鈕,這樣就需要發(fā)送更多的信息,這些多出來的字節(jié)將和原始的三字節(jié)數(shù)據(jù)打包一起發(fā)送。

10.2PS/2傳輸子系統(tǒng)設(shè)計(jì)

10.2.1主系統(tǒng)對PS/2設(shè)備的通信協(xié)議

主系統(tǒng)對PS/2設(shè)備的通信協(xié)議包含雙向數(shù)據(jù)交換。鼠標(biāo)數(shù)據(jù)和時(shí)鐘為開漏極電路,可以認(rèn)為它們?yōu)槿龖B(tài)門。基本時(shí)序傳輸協(xié)議如圖10-1所示,其中,數(shù)據(jù)和時(shí)鐘信號線標(biāo)為ps2d和ps2c??梢郧宄匕l(fā)現(xiàn),時(shí)序圖被分成兩部分,一部分反映主系統(tǒng)(host)的活動(dòng),而另一部分反映設(shè)備(mouse)的活動(dòng)?;静僮鲿r(shí)序如下:

(1)主設(shè)備強(qiáng)行置低ps2c至少100μs來禁止任何鼠標(biāo)活動(dòng),可以認(rèn)為是主系統(tǒng)請求發(fā)送數(shù)據(jù)包。

(2)主設(shè)備強(qiáng)行置低ps2d,禁止ps2c,可以認(rèn)為是主機(jī)發(fā)送一個(gè)開始信號。

(3)此時(shí)PS/2從設(shè)備開始控制ps2c,負(fù)責(zé)PS/2時(shí)鐘信號的產(chǎn)生;當(dāng)檢測到開始信號時(shí),PS/2設(shè)備產(chǎn)生1到0的信號傳輸。

(4)一旦檢測到傳輸開始,主系統(tǒng)串行移位最低位數(shù)據(jù)在ps2d線上,并一直保持原值直到PS/2設(shè)備在ps2c線上產(chǎn)生1到0的跳變,也稱數(shù)據(jù)響應(yīng)位。

(5)重復(fù)步驟(4),直到剩余的7位數(shù)據(jù)和1位奇偶校校驗(yàn)位發(fā)送結(jié)束。

(6)發(fā)送完奇偶校驗(yàn)位之后,主機(jī)禁止ps2d(設(shè)為高阻態(tài)),PS/2從設(shè)備接管ps2d數(shù)據(jù)線并通過置ps2d為0來響應(yīng)傳輸完成。根據(jù)需要,主設(shè)備可以通過在ps2c從1到0跳變時(shí)刻檢查ps2d上面的值來驗(yàn)證是否成功傳輸。圖10-1PS/2接口主從設(shè)備之間的時(shí)序圖10.2.2設(shè)計(jì)與編碼

與前面講述的接收子系統(tǒng)不同之處在于ps2c與ps2d信號為雙向傳輸。每個(gè)信號都需要三態(tài)緩沖器,三態(tài)緩沖器的接口如圖10-2所示。tri_c與tri_d信號為三態(tài)緩沖器的使能信號,當(dāng)置為1時(shí),ps2c_out與ps2d_out信號傳輸?shù)捷敵龆丝冢駝tps2c_out與ps2d_out信號為高阻狀態(tài)。圖10-2PS/2傳輸子系統(tǒng)三態(tài)緩沖器 為了更加明確設(shè)計(jì)傳輸子系統(tǒng)的流程,根據(jù)鼠標(biāo)數(shù)據(jù)傳輸控制協(xié)議來畫出ASMD狀態(tài)圖,如圖10-3所示。狀態(tài)機(jī)起始狀態(tài)為空狀態(tài)(idle狀態(tài))。當(dāng)主機(jī)置位wr_ps2信號并將數(shù)據(jù)放在din上時(shí),狀態(tài)機(jī)啟動(dòng)并裝載din信號和校驗(yàn)位par,并一同送到移位寄存器shift_reg中,然后置c_reg寄存器為全1,c_reg寄存器由一個(gè)13位計(jì)數(shù)器組成,用來產(chǎn)生164μs的延遲。緊接著狀態(tài)機(jī)進(jìn)入請求發(fā)送狀態(tài)(rts狀態(tài))。在rts狀態(tài),狀態(tài)機(jī)置位ps2c_out為0,并將相對應(yīng)三態(tài)緩沖器的使能位tri_c置位,判斷c_reg還沒有清零,狀態(tài)機(jī)進(jìn)入開始狀態(tài)(start狀態(tài))。這時(shí),ps2時(shí)鐘信號被禁止,數(shù)據(jù)線被置為0,PS/2設(shè)備接管并生成時(shí)鐘信號在ps2c信號線上。當(dāng)通過fall_edge信號檢測到ps2c信號下降沿時(shí),狀態(tài)機(jī)進(jìn)入數(shù)據(jù)傳輸狀態(tài)(data狀態(tài)),開始移位8位數(shù)據(jù)和1位檢驗(yàn)位,而寄存器n用來保持追蹤移位數(shù)目。當(dāng)寄存器n為0,即數(shù)據(jù)移位傳輸結(jié)束時(shí),狀態(tài)機(jī)進(jìn)入停止位(stopstate);此時(shí),數(shù)據(jù)線被停止,當(dāng)檢測到最后一個(gè)下降沿時(shí)返回到idle狀態(tài)。另外,狀態(tài)機(jī)還包含tx_idle信號來指示傳輸是否正在進(jìn)行,此信號可以被用來作為與發(fā)送和接收接口模塊的狀態(tài)指示信號,具體細(xì)節(jié)如程序10-1所示。fall_edge信號也是通過與前面所述的濾波電路產(chǎn)生的。圖10-3PS/2發(fā)送子系統(tǒng)FSM流程圖

【程序10-1】PS/2發(fā)送子系統(tǒng)。

moduleps2_tx

(

input

wireclk,reset,

input

wirewr_ps2,

input

wire[7:0]din,

inout

wireps2d,ps2c,

output

regtx_idle,tx_done_tick

);

//狀態(tài)機(jī)狀態(tài)信號定義

localparam[2:0]

idle=3'b000,

rts=3'b001,

start??=3'b010,

data=3'b011,

stop=3'b100;

//信號聲明

reg[2: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[8:0]b_reg,b_next;

reg[12:0]c_reg,c_next;

wirepar,fall_edge;

regps2c_out,ps2d_out;

regtri_c,tri_d;

//=================================================

//濾波和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;

c_reg<=0;

n_reg<=0;

b_reg<=0;

end

else

begin

state_reg<=state_next;

c_reg<=c_next;

n_reg<=n_next;

b_reg<=b_next;

end

//偶校驗(yàn)位

assignpar=~(^din);

//FSMD下一狀態(tài)邏輯

always@*

begin

state_next=state_reg;

c_next=c_reg;

n_next=n_reg;

b_next=b_reg;

tx_done_tick=1'b0;

ps2c_out=1'b1;

ps2d_out=1'b1;

tri_c=1'b0;

tri_d=1'b0;

tx_idle=1'b0;

case(state_reg)

idle:

begin

tx_idle=1'b1;

if(wr_ps2)

begin

b_next={par,din};

c_next=13'h1fff; //213-1

state_next=rts;

end

end

rts: //發(fā)送請求

begin

ps2c_out=1'b0;

tri_c=1'b1;

c_next=c_reg-1;

if(c_reg==0)

state_next=start;

end

start: //置位start

begin

ps2d_out=1'b0;

tri_d=1'b1;

if(fall_edge)

begin

n_next=4'h8;

state_next=data;

end

end

data: //8位數(shù)據(jù)+1位校驗(yàn)

begin

ps2d_out=b_reg[0];

tri_d=1'b1;

if(fall_edge)

begin

b_next={1'b0,b_reg[8:1]};

if(n_reg==0)

state_next=stop;

else

n_next=n_reg-1;

end

end

stop://ps2d置位為高

if(fall_edge)

begin

state_next=idle;

tx_done_tick=1'b1;

end

endcase

end

//三態(tài)緩沖器

assignps2c=(tri_c)?ps2c_out:1'bz;

assignps2d=(tri_d)?ps2d_out:1'bz;

endmodule

本代碼中沒有錯(cuò)誤檢查電路。更健壯的設(shè)計(jì)要求檢查校驗(yàn)位的正確性,并且包含一個(gè)看門狗計(jì)數(shù)器來防止鼠標(biāo)在錯(cuò)誤的狀態(tài)下抖動(dòng)。

10.3PS/2鼠標(biāo)數(shù)據(jù)傳輸系統(tǒng)

10.3.1雙向傳輸PS/2接口電路設(shè)計(jì)

綜合接收和發(fā)送系統(tǒng)來設(shè)計(jì)雙向傳輸PS/2接口電路。圖10-4為設(shè)計(jì)模塊框圖,用tx_idle和rx_en作為狀態(tài)信號來調(diào)整傳輸和接收操作。傳輸操作優(yōu)先級略高,當(dāng)系統(tǒng)正在進(jìn)行傳輸時(shí),tx_idle信號無效;否則,禁止接收操作。接收系統(tǒng)只有在傳輸系統(tǒng)為空的情況下才允許輸入,兩者輪流工作,具體細(xì)節(jié)如程序10-2所示。圖10-4雙向PS/2接口的頂層模塊圖

【程序10-2】雙向傳播PS/2接口電路。

moduleps2_rxtx

(

input

wireclk,reset,

input

wirewr_ps2,

inout

wireps2d,ps2c,

input

wire[7:0]din,

output

wirerx_done_tick,tx_done_tick,

output

wire[7:0]dout

);

//信號聲明

wiretx_idle;

//例化PS/2接收器

ps2_rxps2_rx_unit

(.clk(clk),.reset(reset),.rx_en(tx_idle),

.ps2d(ps2d),.ps2c(ps2c),

.rx_done_tick(rx_done_tick),.dout(dout));

//例化PS/2發(fā)送器

ps2_txps2_tx_unit

(.clk(clk),.reset(reset),.wr_ps2(wr_ps2),

.din(din),.ps2d(ps2d),.ps2c(ps2c),

.tx_idle(tx_idle),.tx_done_tick(tx_done_tick));

endmodule10.3.2雙向傳輸PS/2驗(yàn)證電路

設(shè)計(jì)一個(gè)測試電路來驗(yàn)證雙向傳輸PS/2接口電路,整體框圖如10-5所示。人工發(fā)送傳輸命令,用8位撥碼開關(guān)設(shè)置數(shù)據(jù),然后用按鍵產(chǎn)生一個(gè)時(shí)鐘脈寬的脈沖來發(fā)送數(shù)據(jù)包,接收數(shù)據(jù)包首先需要通過byte-to-ascii電路,將數(shù)據(jù)轉(zhuǎn)接成ASCII碼外加空格的形式,然后用UART發(fā)送到PC的超級終端上。具體細(xì)節(jié)如程序10-3所示。圖10-5PS/2雙向接口驗(yàn)證電路【程序10-3】雙向傳輸PS/2驗(yàn)證電路。

moduleps2_monitor

(

input

wireclk,reset,

input

wire[7:0]sw,

input

wire[2:0]btn,

inout

wireps2d,ps2c,

output

wiretx

);

//常數(shù)定義

localparamSP=8'h20; //spaceinASCII

//狀態(tài)聲明

localparam[1:0]

idle=2'b00,

send1=2'b01,

send0=2'b10,

sendb=2'b11;

//信號聲明

reg[1:0]state_reg,state_next;

wire[7:0]rx_data;

reg[7:0]w_data,ascii_code;

wirepsrx_done_tick,wr_ps2;

regwr_uart;

wire[3:0]hex_in;

//==============================================

//例化

//==============================================

//例化PS/2傳輸接收

ps2_rxtxps2_rxtx_unit

(.clk(clk),.reset(reset),.wr_ps2(wr_ps2),

.din(sw),.dout(rx_data),.ps2d(ps2d),.ps2c(ps2c),

.rx_done_tick(psrx_done_tick),.tx_done_tick());

//例化UART發(fā)送模塊

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));

//例化按鍵防反彈電路

debouncebtn_db_unit

(.clk(clk),.reset(reset),.sw(btn[0]),

.db_level(),.db_tick(wr_ps2));

//============================================

//發(fā)送ASCII字符狀態(tài)機(jī)模塊

//============================================

//狀態(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(psrx_done_tick) //接收掃描碼

state_next=send1;

send1: //發(fā)送十六進(jìn)制字符高字節(jié)

begin

w_data=ascii_code;

wr_uart=1'b1;

state_next=send0;

end

send0: //發(fā)送十六進(jìn)制字符低字節(jié)

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

//===========================================

//顯示掃描碼

//===========================================

//將掃描碼分離成兩個(gè)4bit十六進(jìn)制數(shù)

assignhex_in=(state_reg==send1)?rx_data[7:4]:

rx_data[3:0];

//十六進(jìn)制數(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 10.4PS/2鼠標(biāo)數(shù)據(jù)接口電路

10.4.1傳輸PS/2接口電路設(shè)計(jì)

PS/2接口電路是在PS/2雙向傳輸電路外面再包一層電路。其主要功能是使能串行流模式和處理三個(gè)傳輸數(shù)據(jù)字節(jié)。電路的輸出包括兩個(gè)9位信號:xm和ym,分別代表鼠標(biāo)在X軸和Y軸的移動(dòng)信號;btm為3位按鍵狀態(tài)信號;信號m_done_tick為一位時(shí)鐘脈寬長度的狀態(tài)信號,當(dāng)傳輸數(shù)據(jù)有效時(shí)置位。

具體細(xì)節(jié)如程序10-4所示。程序主體狀態(tài)機(jī)由7個(gè)狀態(tài)組成。int1、int2和int3三個(gè)狀態(tài)為在reset有效之后執(zhí)行。在這三個(gè)狀態(tài)中,狀態(tài)機(jī)處理F4命令,等待數(shù)據(jù)傳輸后數(shù)據(jù)包開始響應(yīng),這時(shí)鼠標(biāo)進(jìn)入串行數(shù)據(jù)流模式。之后,狀態(tài)機(jī)在pack1、pack2和pack3三個(gè)狀態(tài)獲取和處理下一個(gè)三字節(jié)數(shù)據(jù)包,然后在done狀態(tài)激活m_done_tick信號,狀態(tài)機(jī)不斷循環(huán)后面四個(gè)狀態(tài)。

【程序10-4】基本鼠標(biāo)接口電路。

modulemouse

(

input

wireclk,reset,

inout

wireps2d,ps2c,

output

wire[8:0]xm,ym,

output

wire[2:0]btnm,

output

regm_done_tick

);

//常數(shù)聲明

localparamSTRM=8'hf4; //數(shù)據(jù)流發(fā)送命令F4

//狀態(tài)聲明

localparam[2:0]

init1=3'b000,

init2=3'b001,

init3=3'b010,

pack1=3'b011,

pack2=3'b100,

pack3=3'b101,

done=3'b110;

//信號聲明

reg[2:0]state_reg,state_next;

wire[7:0]rx_data;

regwr_ps2;

wirerx_done_tick,tx_done_tick;

reg[8:0]x_reg,y_reg,x_next,y_next;

reg[2:0]btn_reg,btn_next;

//例化

ps2_rxtxps2_unit

(.clk(clk),.reset(reset),.wr_ps2(wr_ps2),

.din(STRM),.dout(rx_data),.ps2d(ps2d),.ps2c(ps2c),

.rx_done_tick(rx_done_tick),

.tx_done_tick(tx_done_tick));

//FSMD狀態(tài)和數(shù)據(jù)寄存器

always@(posedgeclk,posedgereset)

if(reset)

begin

state_reg<=init1;

x_reg<=0;

y_reg<=0;

btn_reg<=0;

end

else

begin

state_reg<=state_next;

x_reg<=x_next;

y_reg<=y_next;

btn_reg<=btn_next;

end

//FSMD下一狀態(tài)邏輯

always

@*

begin

state_next=state_reg;

wr_ps2=1'b0;

m_done_tick=1'b0;

x_next=x_reg;

y_next=y_reg;

btn_next=btn_reg;

case(state_reg)

init1:

begin

wr_ps2=1'b1;

state_next=init2;

end

init2: //等待發(fā)送完畢

if(tx_done_tick)

state_next=init3;

init3: //等待數(shù)據(jù)包返回標(biāo)志

if(rx_done_tick)

state_next=pack1;

pack1: //等待第一個(gè)數(shù)據(jù)包

if(rx_done_tick)

begin

state_next=pack2;

y_next[8]=rx_data[5];

x_next[8]=rx_data[4];

btn_next=rx_data[2:0];

end

pack2: //等待第二個(gè)數(shù)據(jù)包

if(rx_done_tick)

begin

state_next=pack3;

x_next[7:0]=rx_data;

end

pack3: //等待第三個(gè)數(shù)據(jù)包

if(rx_done_tick)

begin

state_next=done;

y_next[7:0]=rx_data;

end

done:

begin

m_done_tick=1'b1;

state_next=pack1;

end

endcase

end

//輸出邏輯

assignxm=x_reg;

assignym=y_reg;

assignbtnm=btn_reg;

endmodule

10.4.2傳輸PS/2接口電路測試

我們設(shè)計(jì)一個(gè)簡單的測試電

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論