日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 工業(yè)控制 > 電子設(shè)計自動化
[導(dǎo)讀]引言 當(dāng)前嵌入式系統(tǒng)技術(shù)已得到了廣泛應(yīng)用,但傳統(tǒng)嵌入式系統(tǒng)的人機(jī)接口多采用小鍵盤操作的文本菜單方式,用戶操作較為不便。本設(shè)計利用FPGA實現(xiàn)對PS/2接口鼠標(biāo)的控制,是在以VGA作為輸出設(shè)備的單片機(jī)系統(tǒng)上初步實現(xiàn)

引言

當(dāng)前嵌入式系統(tǒng)技術(shù)已得到了廣泛應(yīng)用,但傳統(tǒng)嵌入式系統(tǒng)的人機(jī)接口多采用小鍵盤操作的文本菜單方式,用戶操作較為不便。本設(shè)計利用FPGA實現(xiàn)對PS/2接口鼠標(biāo)的控制,是在以VGA作為輸出設(shè)備的單片機(jī)系統(tǒng)上初步實現(xiàn)圖形化用戶界面的方案,它成本低、效果好,并且有很強(qiáng)的實用性。

FPGA(Field Programmable Gate Array)是 20世紀(jì)80年代中期出現(xiàn)的高密度、可編程邏輯器件,F(xiàn)PGA及其軟件系統(tǒng)是開發(fā)數(shù)字電路的最新技術(shù),它利用EDA技術(shù),以電路原理圖、硬件描述語言及狀態(tài)機(jī)等形式輸入設(shè)計邏輯,提供功能模擬、時序仿真等模擬手段,在功能模擬和時序仿真度滿足要求后,經(jīng)過一系列變換,將輸入邏輯轉(zhuǎn)換成FPGA器件的編程文件,以實現(xiàn)專用集成電路。本設(shè)計選用Altera公司推出的Cyclone II系列的EP2C5T144C8 FPGA來設(shè)計PS/2接口,體積減小,可靠性提高。


PS/2接口和協(xié)議

接口的物理特性

PS/2接口用于許多現(xiàn)代的鼠標(biāo)和鍵盤,由IBM最初開發(fā)和使用。物理上的PS/2接口有兩種類型的連接 器 :5腳的DIN和6腳的MINI-DIN。圖1就是兩種連接器的引腳定義。使用中,主機(jī)提供+5V電源給鼠標(biāo),鼠標(biāo)的地連接到主機(jī)電源地上。

圖1 PS/2接口連接器引腳定義(略)

接口協(xié)議原理

PS/2鼠標(biāo)接口采用一種雙向同步串行協(xié)議,即每在時鐘線上發(fā)一個脈沖,就在數(shù)據(jù)線上發(fā)送一位數(shù)據(jù)。在相互傳輸中,主機(jī)擁有總線控制權(quán),即它可以在任何時候抑制鼠標(biāo)的發(fā)送,方法是把時鐘線一直拉低,鼠標(biāo)就不能產(chǎn)生時鐘信號并發(fā)送數(shù)據(jù)。在兩個方向的傳輸中,時鐘信號都由鼠標(biāo)產(chǎn)生,主機(jī)不產(chǎn)生通信時鐘信號。

圖2 鼠標(biāo)到主機(jī)傳輸時序(略)

如果主機(jī)要發(fā)送數(shù)據(jù),就必須控制鼠標(biāo)產(chǎn)生時鐘信號,方法如下:主機(jī)首先下拉時鐘線至少100μS抑制通信,然后再下拉數(shù)據(jù)線,最后釋放時鐘線。鼠標(biāo)檢測到這個時序狀態(tài)后,會在10mS內(nèi)產(chǎn)生時鐘信號。如圖3中(A)時序段。主機(jī)和鼠標(biāo)之間,傳輸數(shù)據(jù)幀的時序如圖2、圖3所示。

圖3 主機(jī)到鼠標(biāo)的傳輸時序(略)

PS/2鼠標(biāo)的工作模式和協(xié)議數(shù)據(jù)包格式

PS/2鼠標(biāo)的四種工作模式

PS/2鼠標(biāo)的四種工作模式分別是:Reset模式,當(dāng)鼠標(biāo)上電或主機(jī)發(fā)復(fù)位命令(0xFF)給它時,進(jìn)入這種模式;Stream模式,鼠標(biāo)的默認(rèn)模式,當(dāng)鼠標(biāo)上電或復(fù)位完成后,自動進(jìn)入此模式,鼠標(biāo)基本上以此模式工作;Remote模式,只有在主機(jī)發(fā)送了模式設(shè)置命令(0xF0)后,鼠標(biāo)才進(jìn)入這種模式;Wrap模式,這種模式只用于測試鼠標(biāo)與主機(jī)連接是否正確。

數(shù)據(jù)包結(jié)構(gòu)

PS/2鼠標(biāo)在工作過程中,會及時把它的狀態(tài)數(shù)據(jù)發(fā)送給主機(jī)。發(fā)送的數(shù)據(jù)包格式如表1所示。

表1:鼠標(biāo)發(fā)送數(shù)據(jù)格式(略)

Byte1中的Bit0、Bit1、Bit2分別表示左、右、中鍵的狀態(tài),狀態(tài)值0表示釋放,1表示按下;Byte2和Byte3分別表示X軸和Y軸方向的移動計量值,是二進(jìn)制補(bǔ)碼值;Byte4的低四位表示滾輪的移動計量值,也是二進(jìn)制補(bǔ)碼值,高四位作為擴(kuò)展符號位。這種數(shù)據(jù)包由帶滾輪的三鍵三維鼠標(biāo)產(chǎn)生,若是不帶滾輪的三鍵鼠標(biāo),產(chǎn)生的數(shù)據(jù)包沒有Byte4,其余的相同。


VGA信號時序

圖4所示是計算機(jī)VGA(640×480,60Hz)圖像格式的信號時序圖,其點時鐘DCLK為25.175MHz,場頻為59.94Hz。圖中,Vsync為場同步信號,場周期Tvsync為16.683mS,每場有525行,其中480行為有效顯示行,45行為場消隱期。場同步信號Vs每場有一個脈沖,該脈沖的低電平寬度twv為63μS(2行)。場 消隱期包括場同步時間twv、場消隱前肩tHV(13行)和場消隱后肩tVH(30行),共45行。行周期THSYNC為31.78μS,每顯示行包 括800點,其中640點為有效顯示,160點為行消隱期(非顯示 區(qū))。行同步信號Hs每行有一個脈沖,該脈沖的低電平寬度tWH為3.81μS(即96個DCLK);行消隱期包括行同步時間tWH,行消隱前肩tHC(19個DCLK)和行消隱后肩tCH(45個DCLK),共160個點時鐘。復(fù)合消隱信號是行消隱信號和場消隱信號的邏輯與,在有效顯示期復(fù)合消隱信號為高電平,在非顯示區(qū)域它是低電平。

圖4 VGA顯示驅(qū)動時序(略)


設(shè)計實現(xiàn)

實現(xiàn)功能

1、 用FPGA實現(xiàn)PS/2鼠標(biāo)接口。

2、鼠標(biāo)左鍵按下時十字形鼠標(biāo)圖象的中間方塊改變顏色,右鍵按下時箭頭改變顏色。

3、 Reset按鍵:總復(fù)位。

設(shè)計原理

主機(jī)復(fù)位后,首先向鼠標(biāo)發(fā)送初始化命令(0xf4)。當(dāng)鼠標(biāo)收到命令字后會給出一個應(yīng)答字節(jié)(0xfa),主機(jī)根據(jù)應(yīng)答字節(jié)來判斷鼠標(biāo)是否正確應(yīng)答。如果應(yīng)答正確則接收鼠標(biāo)數(shù)據(jù)包,然后從接收到的數(shù)據(jù)包中獲得鼠標(biāo)位置及狀態(tài)數(shù)據(jù),并輸出給顯示模塊。顯示模塊在CRT上顯示出當(dāng)前鼠標(biāo)的狀態(tài)和位置,否則,停止處理。如圖5。

如圖6,當(dāng)狀態(tài)機(jī)m2_state復(fù)位時,即進(jìn)入m2_reset狀態(tài),并在 一個clk周期后進(jìn)入m2_hold_clk_l狀態(tài),當(dāng)ps2_clk_hi_z(時鐘線)被拉低并保持400μS后進(jìn)入m2_data_low_1狀態(tài),此時向鼠標(biāo) 發(fā)送起始 位和d[0]、d[1](d[0]=d[1]=0)。完成后進(jìn)入m2_data_high_1狀態(tài), 發(fā)送d[2](d[2]=1)并進(jìn)入m2_data_low_2狀態(tài),此時向鼠標(biāo)發(fā)送d[3]位(d[3]=0), 完成發(fā)送進(jìn)入m2_data_high_2狀態(tài),向鼠標(biāo)發(fā)送d[4]、d[5]、d[6]、d[7](d[4]=d[5]=d[6]=d[7]=1),完成發(fā)送進(jìn)入m2_data_low_3狀 態(tài),向鼠標(biāo)發(fā)送奇偶校驗位,然后進(jìn)入m2_data_high_3狀態(tài),將數(shù)據(jù)線拉高,等待鼠標(biāo)返回應(yīng)答信號。若PS/2時鐘信號下降沿來臨時,數(shù)據(jù)線仍未變?yōu)楦唠娖?,則進(jìn)入m2_error_no_ack狀態(tài),此時握手失敗,系統(tǒng)將保持m2_error_no_ack狀態(tài)直到下一次復(fù)位,否則進(jìn)入m2_await_response狀態(tài)接收應(yīng)答字,接收完成進(jìn)入m2_verify數(shù)據(jù)校驗,然后進(jìn)入m2_use狀態(tài),鎖存輸出數(shù)據(jù),并進(jìn)入m2_wait狀態(tài),等待接收數(shù)據(jù)。當(dāng)檢測到時鐘下降沿后進(jìn)入m2_gather狀態(tài),接收鼠標(biāo)數(shù)據(jù)包,接收完成進(jìn)入m2_verify狀態(tài),此時便形成了數(shù)據(jù)接收循環(huán)。


PS/2程序源碼

entity mouse is
Port (clk : in std_logic; reset : in std_logic; ps2_clk : inout std_logic; ps2_data : inout std_logic; left_button : out std_logic; right_button : out std_logic; mousex: buffer std_logic_vector(9 downto 0); mousey: buffer std_logic_vector(9 downto 0); data_ready : out std_logic; error_no_ack : out std_logic);
end mouse;
architecture Behavioral of mouse is
--變量、信號定義(略)
begin
ps2_clk <= '0' when ps2_clk_hi_z='0' else 'Z';
ps2_data <= '0' when ps2_data_hi_z='0' else 'Z';
--檢測ps2clk上升沿和下降沿(略)
m2statech: process (reset, clk) ------------------m2 狀態(tài)
begin
if (reset='0') then
m2_state <= m2_reset;
elsif (clk'event and clk='1') then
m2_state <= m2_next_state;
end if;
end process;
--m2 狀態(tài)傳輸邏輯
m2statetr: process (m2_state, q, fall,rise,watchdog_timer_done,bitcount,ps2_data,packet_good)
begin
ps2_clk_hi_z <= '1';
ps2_data_hi_z <= '1';
error_no_ack <= '0';
output_strobe <= '0';
case m2_state is
when m2_reset => -- 復(fù)位后向鼠標(biāo)發(fā)送命令字
m2_next_state <= m2_hold_clk_l;
when m2_wait =>
if (fall='1') then
m2_next_state <= m2_gather;
else
m2_next_state <= m2_wait;
end if;
when m2_gather =>
if ((watchdog_timer_done='1') and (bitcount=TOTAL_BITS))then
m2_next_state <= m2_verify;
else
m2_next_state <= m2_gather;
end if;
when m2_verify =>
--if (bitcount < TOTAL_BITS) then
--m2_next_state <= m2_wait;
--else
m2_next_state <= m2_use;
--end if;
when m2_use =>
output_strobe <= '1';
m2_next_state <= m2_wait;
-- 用狀態(tài)機(jī)的9個狀態(tài)實現(xiàn)命令字傳輸,使鼠標(biāo)進(jìn)入"streaming"模式,并等待鼠標(biāo)正確應(yīng)答
when m2_hold_clk_l =>
ps2_clk_hi_z <= '0'; -- 啟動看門狗!
if (watchdog_timer_done='1') then
m2_next_state <= m2_data_low_1;
else
m2_next_state <= m2_hold_clk_l;
end if;
when m2_data_low_1 =>
ps2_data_hi_z <= '0'; -- 數(shù)據(jù)位 開始位, d[0] and d[1]
if (fall='1' and (bitcount = 2)) then
m2_next_state <= m2_data_high_1;
else
m2_next_state <= m2_data_low_1;
end if;
when m2_data_high_1 =>
ps2_data_hi_z <= '1'; -- 數(shù)據(jù)位 d[2]
if (fall='1' and (bitcount = 3)) then
m2_next_state <= m2_data_low_2;
else
m2_next_state <= m2_data_high_1;
end if;
when m2_data_low_2 =>
ps2_data_hi_z <= '0'; -- 數(shù)據(jù)位 d[3]
if (fall='1' and (bitcount = 4)) then
m2_next_state <= m2_data_high_2;
else
m2_next_state <= m2_data_low_2;
end if;
when m2_data_high_2 =>
ps2_data_hi_z <= '1'; -- 數(shù)據(jù)位 d[4],d[5],d[6],d[7]
if (fall='1' and (bitcount = 8)) then
m2_next_state <= m2_data_low_3;
else
m2_next_state <= m2_data_high_2;
end if;
when m2_data_low_3 =>
ps2_data_hi_z <= '0'; -- 奇偶校驗位
if (fall='1') then
m2_next_state <= m2_data_high_3;
else
m2_next_state <= m2_data_low_3;
end if;
when m2_data_high_3 =>
ps2_data_hi_z <= '1'; -- 允許鼠標(biāo)拉成低電平(ACK脈沖)
if (fall='1' and (ps2_data='1')) then
m2_next_state <= m2_error_no_ack;
elsif (fall='1' and (ps2_data='0')) then
m2_next_state <= m2_await_response;
else
m2_next_state <= m2_data_high_3;
end if;
when m2_error_no_ack =>
error_no_ack <= '1';
m2_next_state <= m2_error_no_ack;

-- 為了鼠標(biāo)正確進(jìn)入"streaming"模式,狀態(tài)極必須等待足夠長的時間,確保鼠標(biāo)正確應(yīng)答0xFA。

when m2_await_response =>
--if (bitcount = 22) then
m2_next_state <= m2_verify;
--else
-- m2_next_state <= m2_await_response;
--end if;
when others => m2_next_state <= m2_wait;
end case;
end process;-----------------------------m2 狀態(tài)結(jié)束
-- 位計數(shù)器 (略)
-- 數(shù)據(jù)移位寄存器(略)
-- 看門狗時間計數(shù)器(略)
watchdog_timer_done <= '1' when (watchdog_timer_count=WATCHDOG-1) else '0';
packet_good <= '1'; -- 接收數(shù)據(jù)包有效標(biāo)志
outdata: process (reset, clk) -- 輸出數(shù)據(jù)
begin
if (reset='0') then
left_button <= '0';
right_button <= '0';
elsif (clk'event and clk='1') then
if (output_strobe='1') then
left_button <= q(1);
right_button <= q(2);
mouseyy <= not (q(6) & q(6) & q(30 downto 23)) + "1";
end if;
end if;
end process;
cordinatex: process (reset, clk)
begin
if (reset='0') then
mousex <= "0110010000"; -- 400
elsif (clk'event and clk='1') then
if (output_strobe='1') then
if ((mousex >= 797 and q(5)='0') or (mousex <= 2 and
q(5)='1')) then
mousex <= mousex;
else
mousex <= mousex + (q(5) & q(5) & q(19 downto
12));--q(5):xsign q(6):ysign
end if;
end if;
end if;
end process;
cordinatey: process (reset, clk)
begin
if (reset='0') then
mousey <= "0100101100"; -- 300
elsif (clk'event and clk='1') then
if (output_strobe='1') then
if ((mousey >= 597 and q(6)='1') or (mousey <= 2
and q(6)='0')) then
mousey <= mousey;
else
m ousey <= mousey + mouseyy; --(q(6) & q(6) & q(30
downto 23));
end if;
end if;
end if;
end process;
data_ready <= output_strobe;
end Behavioral;


結(jié)束語

該設(shè)計采用了清華大學(xué)THCII-1創(chuàng)新SoPC實驗套件進(jìn)行綜合、仿真和下載,測試得到了滿意的效果,完整地實現(xiàn)了對PS/2和VGA的時序驅(qū)動。

該設(shè)計可以被應(yīng)用到各種需要鼠標(biāo)操作、以VGA作為顯示的嵌入式系統(tǒng)中,從而大大提高人機(jī)交互能力,降低了開發(fā)成本,提高了開發(fā)效率,使系統(tǒng)的穩(wěn)定性也得到了可靠的保障。



參考文獻(xiàn):

[1].VGAdatasheethttp://www.dzsc.com/datasheet/VGA_2568786.html.
[2].60Hzdatasheethttp://www.dzsc.com/datasheet/60Hz_2517196.html.
[3].CRTdatasheethttp://www.dzsc.com/datasheet/CRT_2331578.html.
[4].m2 datasheethttp://www.dzsc.com/datasheet/m2+_2039448.html.


來源:零八我的愛0次

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

其他電腦(比如安卓手機(jī)/平板電腦)的屏幕壞了,你可能想在安排維修之前緊急訪問一些東西。你可以使用android的USB OTG功能(是的,幾乎每個android都支持這個功能,你可以將鼠標(biāo)和鍵盤連接到它)。

關(guān)鍵字: USB 鼠標(biāo) Android 樹莓派

在當(dāng)今數(shù)字化時代,汽車不再僅僅是一種交通工具,更是一個移動的智能空間。隨著人們對汽車電子設(shè)備依賴程度的不斷提高,車內(nèi) USB 接口的重要性也日益凸顯。從最初單純?yōu)槭謾C(jī)充電,到如今支持?jǐn)?shù)據(jù)傳輸、連接各種智能設(shè)備,USB 接...

關(guān)鍵字: 接口 數(shù)據(jù)傳輸 汽車供電

根據(jù)Semico Research的預(yù)測,到2025年RISC-V芯片出貨量將達(dá)到624億顆,覆蓋計算、消費電子和工業(yè)等領(lǐng)域。而在這其中,RISC-V MCU是整個RISC-V生態(tài)的基本盤,以高質(zhì)量、應(yīng)用驅(qū)動的解決方案為...

關(guān)鍵字: 青稞 RISC-V 沁恒 接口 MCU

下一代配備沖擊式線性磁力驅(qū)動馬達(dá)的槍式鼠標(biāo),突破桌面游戲沉浸感極限

關(guān)鍵字: 觸覺馬達(dá) 鼠標(biāo) VR

NodeMCU是一個開源物聯(lián)網(wǎng)平臺,包含運行在expressif Systems ESP8266 Wi-Fi SoC上的固件,硬件基于ESP-12模塊。NodeMCU的特點之一是可以使用Arduino IDE進(jìn)行簡單的編...

關(guān)鍵字: GPS NodeMCU ESP8266 接口 物聯(lián)網(wǎng)

在浩瀚的電子科技海洋中,GPIO(General Purpose Input/Output)作為一個基礎(chǔ)而強(qiáng)大的概念,始終扮演著連接微控制器與物理世界的橋梁角色。它不僅僅是一組簡單的引腳,更是賦予電子設(shè)備感知與響應(yīng)能力的...

關(guān)鍵字: GPIO 接口 微控制器

接口的類型對圖像傳輸?shù)馁|(zhì)量起到了決定性的影響。隨著液晶顯示屏的風(fēng)靡,許多原來接駁在電視平臺的娛樂設(shè)備轉(zhuǎn)移到了液晶顯示屏上。

關(guān)鍵字: LCD 接口 RGB

隨著科技的飛速發(fā)展,電子產(chǎn)品在我們?nèi)粘I钪邪缪葜絹碓街匾慕巧?。而在這些電子產(chǎn)品中,接口作為連接設(shè)備與外部設(shè)備的橋梁,其重要性不言而喻。其中,Type-C接口作為一種新型的接口標(biāo)準(zhǔn),因其獨特的優(yōu)勢,逐漸成為了眾多電子...

關(guān)鍵字: 電子產(chǎn)品 Type-C 接口

為增進(jìn)大家對鼠標(biāo)的認(rèn)識,本文將對鼠標(biāo)左鍵單擊變雙擊的維修方法以及鼠標(biāo)單擊異常的解決方法予以介紹。

關(guān)鍵字: 鼠標(biāo) 指數(shù) 驅(qū)動

本文中,小編將對鼠標(biāo)DPI予以介紹,如果你想對它的詳細(xì)情況有所認(rèn)識,或者想要增進(jìn)對它的了解程度,不妨請看以下內(nèi)容哦。

關(guān)鍵字: 鼠標(biāo) DPI
關(guān)閉