關 閉

        新聞中心

        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不再難懂)


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 汝城县| 嘉定区| 星子县| 闸北区| 曲松县| 株洲市| 桃江县| 霍城县| 曲阳县| 新沂市| 嘉黎县| 富锦市| 东明县| 泰和县| 姜堰市| 沿河| 浪卡子县| 邹平县| 法库县| 元朗区| 安宁市| 都昌县| 定日县| 嘉定区| 龙山县| 青冈县| 冕宁县| 涡阳县| 元谋县| 巨鹿县| 商河县| 荆门市| 松潘县| 嘉义县| 建湖县| 张家口市| 弋阳县| 淮北市| 建德市| 马鞍山市| 庆元县|