新闻中心

EEPW首页>嵌入式系统>设计应用> 基于FPGA的PS/2鼠标接口设计方法及其应用

基于FPGA的PS/2鼠标接口设计方法及其应用

作者: 时间:2012-02-08 来源:网络 收藏

  如图6,当状态机m2_state复位时,即进入m2_reset状态,并在 一个clk周期后进入m2_hold_clk_l状态,当ps2_clk_hi_z(时钟线)被拉低并保持400μS后进入m2_data_low_1状态,此时向鼠标 发送起始 位和d[0]、d[1](d[0]=d[1]=0)。完成后进入m2_data_high_1状态, 发送d[2](d[2]=1)并进入m2_data_low_2状态,此时向鼠标发送d[3]位(d[3]=0), 完成发送进入m2_data_high_2状态,向鼠标发送d[4]、d[5]、d[6]、d[7](d[4]=d[5]=d[6]=d[7]=1),完成发送进入m2_data_low_3状 态,向鼠标发送奇偶校验位,然后进入m2_data_high_3状态,将数据线拉高,等待鼠标返回应答信号。若PS/2时钟信号下降沿来临时,数据线仍未变为高电平,则进入m2_error_no_ack状态,此时握手失败,系统将保持m2_error_no_ack状态直到下一次复位,否则进入m2_await_response状态接收应答字,接收完成进入m2_verify数据校验,然后进入m2_use状态,锁存输出数据,并进入m2_wait状态,等待接收数据。当检测到时钟下降沿后进入m2_gather状态,接收鼠标数据包,接收完成进入m2_verify状态,此时便形成了数据接收循环。


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 状态
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 状态传输逻辑
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 => -- 复位后向鼠标发送命令字
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;
-- 用状态机的9个状态实现命令字传输,使鼠标进入"streaming"模式,并等待鼠标正确应答



评论


相关推荐

技术专区

关闭