<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          關(guān) 閉

          新聞中心

          EEPW首頁 > 工控自動(dòng)化 > 設(shè)計(jì)應(yīng)用 > 用于NIOS II 嵌入式處理器系統(tǒng)的鼠標(biāo)控制器設(shè)計(jì)

          用于NIOS II 嵌入式處理器系統(tǒng)的鼠標(biāo)控制器設(shè)計(jì)

          作者: 時(shí)間:2009-03-26 來源:網(wǎng)絡(luò) 收藏

          本文所提出的鼠標(biāo)控制器是一個(gè)Avalon從模式設(shè)備,硬件結(jié)構(gòu)如圖1所示:

          圖1 硬件結(jié)構(gòu)圖

          其設(shè)計(jì)由兩個(gè)文件組成,msmouse.v和ps2_mouse_interface.v。其中,msmouse.v是頂層文件,它定義了整個(gè)鼠標(biāo)控制器模塊和Avalon總線及外設(shè)的接口信號,這個(gè)文件的部分代碼如下:

          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是和鼠標(biāo)的接口信號,這兩個(gè)信號是雙向的(inout類型)。為了和總線模塊進(jìn)行數(shù)據(jù)交互,我們定義了四個(gè)32位寄存器,command_reg、state、 mouse_data和response_data。它們的偏移地址依次為0、1、2、3,根據(jù)address[1:0]的值決定要寫入或讀取哪一個(gè)寄存器。其中command_reg中存儲(chǔ)主機(jī)要發(fā)給鼠標(biāo)的命令;state反映鼠標(biāo)的狀態(tài)信息;mouse_data包含鼠標(biāo)的3個(gè)按鍵信息及在X方向,Y方向和滾輪的位移信息,其最高位表示數(shù)據(jù)是否有效;response_data里包含了主機(jī)發(fā)送命令給鼠標(biāo)后鼠標(biāo)的回應(yīng)信息,其最高位也表示數(shù)據(jù)是否有效。這四個(gè)寄存器通過ps2_mouse_interface元件中的x_increment和write_response 等接口信號和鼠標(biāo)接口進(jìn)行數(shù)據(jù)傳送。msmode信號決定鼠標(biāo)是在標(biāo)準(zhǔn)PS/2模式或Intellimouse模式。另外,為了讓下文所述的狀態(tài)機(jī)正常工作,我們在這個(gè)文件中對系統(tǒng)時(shí)鐘進(jìn)行了1/64分頻,作為ps2_mouse_interface元件的時(shí)鐘。

            在ps2_mouse_interface.v中,我們通過一個(gè)狀態(tài)機(jī)實(shí)現(xiàn)主機(jī)和鼠標(biāo)之間的通訊。其狀態(tài)轉(zhuǎn)換圖如圖2所示。系統(tǒng)重啟之后,主機(jī)發(fā)送命令F4使能鼠標(biāo),鼠標(biāo)響應(yīng)后進(jìn)入等待狀態(tài)。如果鼠標(biāo)有位移或按鍵事件發(fā)生,則進(jìn)入收集數(shù)據(jù)狀態(tài)。等數(shù)據(jù)收集結(jié)束并驗(yàn)證符合數(shù)據(jù)幀格式后輸出,否則重新回到等待狀態(tài)。如果在規(guī)定時(shí)間沒有收到完整的一幀數(shù)據(jù),則重新使能鼠標(biāo)。在等待狀態(tài)下主機(jī)也可對鼠標(biāo)發(fā)送命令,然后等待鼠標(biāo)的響應(yīng),并把響應(yīng)數(shù)據(jù)輸出。

          由于標(biāo)準(zhǔn)PS/2模式和微軟的Intellimouse模式數(shù)據(jù)幀格式不同,因此要收集的數(shù)據(jù)位位數(shù)和數(shù)據(jù)幀格式的驗(yàn)證在兩種模式下是不同的。我們采用如下代碼驗(yàn)證在兩種模式下收到的數(shù)據(jù)幀是否有效:

          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]) // 奇偶校驗(yàn)位
          ):
          (
          (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]) //奇偶校驗(yàn)位
          );

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)


          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();