关 闭

新闻中心

EEPW首页>工控自动化>设计应用> 用于NIOS II 嵌入式处理器系统的鼠标控制器设计

用于NIOS II 嵌入式处理器系统的鼠标控制器设计

作者: 时间:2009-03-26 来源:网络 收藏

本文所提出的鼠标控制器是一个Avalon从模式设备,硬件结构如图1所示:

图1 硬件结构图

其设计由两个文件组成,msmouse.v和ps2_mouse_interface.v。其中,msmouse.v是顶层文件,它定义了整个鼠标控制器模块和Avalon总线及外设的接口信号,这个文件的部分代码如下:

module msmouse(clk,rst,irq,chipselect,read,write,address,readdata,writedata,
ps2_clk,ps2_data);
reg [31:0] command_reg; // address 00
wire [31:0] state; // address 01
wire [31:0] mouse_data; // address 10
wire [31:0] response_data;// address 11

wire wacc = chipselect write;
wire racc = chipselect read;
wire rx_read = (racc (address != 2’b00)) ? 1:0 ;
wire rx_write = (wacc (address == 2’b00)) ? 1:0 ;
assign mouse_data = {data_ready, 2’h0, left_button, right_button, middle_button, x_increment, y_increment, z_increment};
assign response_data = {write_ack, write_response};
assign state = {30’h0, write_sync , error_no_ack};
ps2_mouse_interface the_ps2(
.clk(clk64),
.left_button(left_button),
.x_increment(x_increment),
.write_data(command_reg[7:0]),
…… ……
.write_response(write_response),
.msmode(msmode),
.error_no_ack(error_no_ack)
);
endmodule

  在msmouse的接口信号中,clk、rst、 chipselect等是和Avalon总线的接口信号。ps2_clk和ps2_data是和鼠标的接口信号,这两个信号是双向的(inout类型)。为了和总线模块进行数据交互,我们定义了四个32位寄存器,command_reg、state、 mouse_data和response_data。它们的偏移地址依次为0、1、2、3,根据address[1:0]的值决定要写入或读取哪一个寄存器。其中command_reg中存储主机要发给鼠标的命令;state反映鼠标的状态信息;mouse_data包含鼠标的3个按键信息及在X方向,Y方向和滚轮的位移信息,其最高位表示数据是否有效;response_data里包含了主机发送命令给鼠标后鼠标的回应信息,其最高位也表示数据是否有效。这四个寄存器通过ps2_mouse_interface元件中的x_increment和write_response 等接口信号和鼠标接口进行数据传送。msmode信号决定鼠标是在标准PS/2模式或Intellimouse模式。另外,为了让下文所述的状态机正常工作,我们在这个文件中对系统时钟进行了1/64分频,作为ps2_mouse_interface元件的时钟。

  在ps2_mouse_interface.v中,我们通过一个状态机实现主机和鼠标之间的通讯。其状态转换图如图2所示。系统重启之后,主机发送命令F4使能鼠标,鼠标响应后进入等待状态。如果鼠标有位移或按键事件发生,则进入收集数据状态。等数据收集结束并验证符合数据帧格式后输出,否则重新回到等待状态。如果在规定时间没有收到完整的一帧数据,则重新使能鼠标。在等待状态下主机也可对鼠标发送命令,然后等待鼠标的响应,并把响应数据输出。

由于标准PS/2模式和微软的Intellimouse模式数据帧格式不同,因此要收集的数据位位数和数据帧格式的验证在两种模式下是不同的。我们采用如下代码验证在两种模式下收到的数据帧是否有效:

assign packet_good = (~msmode)?
(
(q[0] == 0) (q[11] == 0) (q[22] == 0) // 起始位
(q[10] == 1) (q[21] == 1) (q[32] == 1) // 停止位
(q[9] == ~^q[8:1]) (q[20] == ~^q[19:12])
(q[31] == ~^q[30:23]) // 奇偶校验位
):
(
(q[0] == 0) (q[11] == 0) (q[22] == 0) (q[33] == 0) //起始位
(q[10] == 1) (q[21] == 1) (q[32] == 1) (q[43] == 1) //停止位
(q[9] == ~^q[8:1]) (q[20] == ~^q[19:12])
(q[31] == ~^q[30:23]) (q[42] == ~^q[41:34]) //奇偶校验位
);

linux操作系统文章专题:linux操作系统详解(linux不再难懂)


评论


相关推荐

技术专区

关闭