[信息与通信]ga接口.doc_第1页
[信息与通信]ga接口.doc_第2页
[信息与通信]ga接口.doc_第3页
[信息与通信]ga接口.doc_第4页
[信息与通信]ga接口.doc_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

毕 业 设 计题 目 基于FPGA的VGA图像显示控制系统的设计 班 级 08应用电子技术 姓 名 余琪 陈亮 邱淑萍 学 号 08353013 08353026 08353038 指导老师:张 龙 滨发题日期: 2010 年 2 月 完成日期: 2010 年 3 月 目 录摘要:2一 设计目的2二 设计内容2三 设计工具2四 实验原理34-1 PS/2通信协议34-2 PS/2设备到主机的通讯34-3 主机到PS/2设备的通讯44-4 PS/2鼠标简介44-5 PS/2鼠标位移数据包54-6 设计思想54-7 PS2_mouse_interface模块的接口与控制5五设计步骤6六实验参考程序66-1 PS2鼠标接口设计顶层文件,文件名ps2_mouse_test.v76-2 Ps2鼠标接口模块,文件名ps2_mouse_inferface.v96-3 Ps2鼠标坐标位置计算模块,文件名count.v186-4 鼠标按键测试模块,文件名Ps2mouse_test.v206-5 pll模块,文件名Pll.v226-6 VGA-logic模块,文件名VGA-logic.v26七MagicSOPC开发平台连接图及30八参考资料34九毕业设计感想34摘要:飓风 (Cyclone)Altera公司FPGA系列知名品牌系列:Cyclone(飓风):Altera中等规模FPGA,2003年推出,0.13um工艺,1.5v内核供电,与Stratix结构类似,是一种低成本FPGA系列 ,是目前主流产品,其配置芯片也改用全新的产品。 CycloneII:Cyclone的下一代产品,2005年开始推出,90nm工艺,1.2v内核供电,属于低成本FPGA,性能和Cyclone相当,提供了硬件乘法器单元。 CycloneIII FPGA系列2007年推出,采用台积电(TSMC)65nm低功耗(LP)工艺技术制造,以相当于ASIC的价格实现了低功耗。Cyclone IV FPGA系列2009年推出,60nm工艺,面向对成本敏感的大批量应用,帮助您满足越来越大的带宽需求,同时降低了成本。CycloneV FPGA系列2011年推出,28nm工艺,实现了业界最低的系统成本和功耗,其性能水平使得该器件系列成为突出您大批量应用优势的理想选择。与前几代产品相比,它具有高效的逻辑集成功能,提供集成收发器型号,总功耗降低了40,静态功耗降低了30.一设计目的 学习PS/2鼠标接口的设计与应用 熟悉ps/2传输协议 熟悉quartuss软件的操作及流程 能够运用quartuss软件的波形仿真图分析二设计内容本设计的内容是学习PS/2鼠标接口模块的设计,通过VGA模块(vga-logic)控制显示器显示可以动的鼠标指针(windows系统的鼠标操作一样):通过按鼠标的键,可改变显示器的颜色。利用QuartusII完成设计,仿真等工作,最后在MagicSOPC平台上进行硬件测试PS/2鼠标接口电路原理图1.4所示三设计工具 Quartus软件,MagicSOPC平台四 实验原理4-1 PS/2通信协议PS/2通信协议是一种双向同步串行通讯协议。通讯的两端通过Clock(时钟脚)同步并通过Data(数据脚)交换数据。任何一方如果想抑制另外一方通讯时,只需要把clock(时钟脚)拉到低电平。如果是PC机和PS/2键盘的通讯,则PC机必须做主机,也就是说,PC机可以抑制PS/2键盘发送数据,而PS/2键盘则不会抑制PC机发送数据,也即主机总是在总线上有优先权。推荐值在15KHz左右,也就是说,clock(时钟脚)高、低电平的持续时间为40us。每一数据帧包含1112个位,具体含义如表1.1所示 表1.1 PS/2通讯数据帧格式1个起始位总是逻辑08个数据位(LSB)低位在前1个奇偶校验位奇校验1个停止位总是逻辑11个应答位仅用在主机对设备的通讯中 表中,如果数据位中1的个数为偶数,校验位就为1;如果数据位中1的个数为奇数,校验位就为0;总之,数据位中1的个数加上校验位中1的个数总为奇数,因此总进行奇校验。4-2 PS/2设备到主机的通讯 PS/2到主机的通讯时序图如图1.1所示。数据在PS/2时钟的下降沿读取,PS/2的时钟频率为1016.7KHz。对于PS/2设备,一般来说从时钟脉冲的上升沿到一个数据转变的时间至少要有5微秒;数据变化到时钟脉冲的下降沿的时间至少要有5微秒,并且不大于25微秒,这个时序非常重要应该严格遵循。主机可以在第11个时钟脉冲停止位之前把时钟线拉低,使设备放弃发送当字节,当然这个比较少见。在停止位发送后设备在发送下个包前应该至少等待50微秒,给主机时间做相应的处理。不过主机处理接收到的字节时一般会抑制发送(主机在收到每个包时通常自动做这个)。在主机释放抑制后,设备应该在发送任何数据前等50微秒。 图1.1设备到主机的通讯4-3 主机到PS/2设备的通讯 由于时钟信号总是由PS/2设备产生,所以如果主机要发送数据就应该必须先把时钟和数据线设置位请求。发送状态如下所示l 通过下拉时钟线至少100微秒来抑制通讯。l 通过下拉数据线来应用请求,发送然后释放时钟。设备应该在不超过10毫秒的时间间隔内就要检查这个状态。当设备检测到这个它将开始产生时钟信号,并且时钟脉冲标记下输入八个数据和一位停止位。主机应该在时钟线为低的时候改变数据线,而数据在时钟脉冲的上升沿被所存,这与PS/2设备到主机的通讯的过程正好相反。在停止位发送后,设备要应答接收到的字节,会把数据线拉低并产生最后一个时钟脉冲,如果主机在第11个时钟脉冲后不释放数据线,设备将继续产生时钟脉冲直到数据线被释放。然后设备将产生一个错误。通讯时序图如图1.2,1.3所示。主机也可以在第11个时钟脉冲应答位前中止一次传送,只要下拉时钟至少100微秒。图1.2主机到设备的通讯 图1.3 主机到设备通讯的详细过程4-4 PS/2鼠标简介标准的PS/2鼠标,支持下面的输入X(左右)位移、Y(上下)位移、左键、中建和右键鼠标以一个固定的频率读取这些输入,并更新不同的计数器,然后标出反映的移动和按键状态。标准的鼠标有两个计数器,保持位移的跟踪,X位移计数器和Y位移计数器。可存放9位的2进制补码,并且每个计数器都有相关的益处标志,它们的内容连同三个鼠标按钮的状态一起以三个字节移动数据包的形式发送给主机。位移计数器表示从最后一次位移数据包送往主机后,有位移量发生。当鼠标读取它的输入的时候,它记录按键的当前状态,然后检查位移,如果位移发生它就增加(对正位移)或减少(对负移位 )X和/或Y位移计数器的值。如果有一个计数器溢出了就设置相应的益出标志。4-5 PS/2鼠标位移数据包标准的PS/2鼠标,发送位移和按键信息给主机采用如表5.3所示所列的3节数据包格式。 表5.33字节数据包格式 字节D7D6D5D4D3D2D1D0Byet1Y溢出位Y符号位X符号位X符号位Always1中间按键右按键左按键BYTE2X位移增量BYTE3 Y位移增量 位移计数器是一个9位2进制的补码整数。它的是最高位作为符号出现,当鼠标读取输入发现有位移是被计数器更新。这些值是自从上一次发送位移数据包给主机后位移的累(即最后一次数据包发给主机后位移计数器被复位)。位移计数器可以表示的值的范围是-255到+255.如果超过了范围,相应的溢出位就被设置,并且在复位前计数器不会增减。一旦位移数据包成功地发送给主机,位移计数器就会复位,同样鼠标在收到主机不是Resend(0xFE)命令外的其他命令计数器也会复位。 设计要注意时序驱动,详细情况可参考相关资料。4-6 设计思想针对FPGA做时序状态控制不灵活的缺点,本设计简化了通讯过程,对PS2鼠标读取的操作只用了一条指令,使能数据报告(0xF4)。利用鼠标上电自动复位并进入Stream模式后,送使能数据报告指令(0xF4),便完成对鼠标的初始化。之后便可以接受PS2鼠标发送过来的数据包。该方案的优点是简化程序,节省资源:缺点是不能软复位,即鼠标由于出现异常情况而不正常工作,不能用软件复位,只能重新拔插鼠标。但出现异常状况的情况比较少,所以总来的该方案是比较合理的。4-7 PS2_mouse_interface模块的接口与控制l Clock(input)系统时钟,默认为100MHz,如要改为其他频率,需改动如下几个参数:Parameter WATCHDOG_TIME_CALUE=40000; /看门狗计时器,400usParameter WATCHDOG_TIME_BITS =16;/400us计时器所需计数器位数ParameterTIMER_5US_VALUE =500;/5us计数值ParameterTIMER_5US_BITS =;/5us计时器所需计数器位数l Reset(inpt)复位信号,高电平有效。复位时不会向PS/2鼠标发送复位命令,只向鼠标发送数据使能报告。l Ps2_clk(bidir)PS/2时钟线,为双向端口,外围电路需加上拉电阻。l Ps2_clk(bidir)PS/2数据线,位双向端口,外围电路需加上上拉电阻。l Left_button(output)左键标志位,高电平表示左键按下。l Right_button(output)右键标志位,高电平表示右键按下。l Middle_button(putput)中间标志位,高电平表示中建按下、l X_increment80(output)X轴曾量,位9位二进制补码,最高位为符位。鼠标左移,位移增量为负;右移增量正。l Y_ increment80(output)Y轴增量,为9位二进制补码,最高位为符位。鼠标上移,位移增量为负;下移,位移增量为正。l Data_ready(output)高电平表示有新数据输出。输出为一个时钟脉冲。 五设计步骤 启动QuartusII建立一个空白工程,然后命名为PS2_mouse_test.qpf。 建立PLL宏单元,命名为pll,设置输入频率位50MHz,c0输出频率位00MHz,cl输出频率位25MHz. 将光盘中EDA_Componet目录下的vga_logic.vqm、ps2_mouse_test.tcl和mouse_inc.mif为鼠标图形数据文件。 新建Verilong HDL源程序文件ps2_mouse_.v、ps2_mouse_interface.v、mouse_test.v和count.v,写出程序代码并报保存(完整的Verilog HDL程序参考程序清单5.2),进行综合编译,若在编译过程中发信错误,则找出并更正错误,直到编译成功为止。 选择目标期器件并对相应的引脚进行锁定,在这里所选择的器件为Altera公司Cyclone系列的EP2C35F72C8芯片,引脚锁定方法如表所列(表5.1中的ps2_keyboard_data、ps2_keybord_clk这两个信号不用分配;disp_dato7:0、hsync、vsync应该选择2.5V的I/O标准)将未使用的引脚设置为三态输入(一定要设置,否则可能会损坏芯片)。设置方法见3.1节。或用CTL命令行完成引脚分配,使用方法见5.1. 对该工程文件进行全程编译处理,若在编译过程中发现错误,则找出并更正错误,直到编译成功为止。 将显示器和PS/2鼠标分别接到256色VGA接口和PS/2鼠标接口上,然后把程序下载到FPGA器件中。移动PS/2鼠标,按鼠标按键,观察显示器的现实情况,应该是单击鼠标左键显示器颜色变化相对较小,单击右键颜色变化相对大一点,单击中键中变为浅蓝色。移动鼠标,显示器上的鼠标指针也跟着移动。六实验参考程序程序设计6-1 PS2鼠标接口设计顶层文件,文件名ps2_mouse_test.v本模块的主要作用是对鼠标接口模块(PS2_mouse_interface)、鼠标移位累计模块(count)、鼠标按键测试模块(mouse_tset)及VGA模块(vga_logic)进行封装。实现的功能是在显示器上显示移动的鼠标。module ps2_mouse_test(clock,rst_n,ps2_mouse_clk,ps2_mouse_data,sram_data,sram_nwe,sram_noe,sram_addr,sram_ncs,byte3,byte2,byte1,byte0,hsync,vsync,disp_dato); input clock; input rst_n; inout ps2_mouse_clk; inout ps2_mouse_data; inout15:0 sram_data; output17:0 sram_addr; output sram_nwe; output sram_noe; output sram_ncs; output byte3; output byte2; output byte1; output byte0; output hsync; output vsync; output 7:0 disp_dato; wire clk_100m; wire clk_25m; wire wr_ack; wire wr_req; wire 18:0 wr_addr; wire 7:0 wr_data; wire 9:0 mouse_x; wire 8:0 mouse_y; wire left_button; wire middle_button; wire right_button; wire 8:0 x_increment;wire 8:0 y_increment;wire datn_ready;pll pll(.inclk0(clock),.c0(clk_100m),.c1(clk_25m);ps2_mouse_interface ps2_mouse_interface(.clock(clk_100m),.reset(rst_n),.ps2_clk_in(ps2_mouse_clk),.ps2_data_in(ps2_mouse_data),.left_button(left_button),.right_button(right_button),.middle_button(middle_button),.x_increment(x_increment),.y_increment(y_increment),.data_ready(data_ready);count count(.clock(clk_100m),.data_ready(data_ready),.x_inc(x_increment),.y_inc(y_increment),.x_addr(mouse_x),.y_addr(mouse_y);mouse_test mouse_test(.clock(clk_100m),.left_btn(left_button),.right_btn(right_button),.middle_btn(mddle_button),.wr_addr(wr_addr),.wr_data(wr_data),.wr_ack(wr_ack),.wr_req(wr_req);vga_logic vga_logic(.ico_wr_clk(clk_100m),.clk_100m(clk_100m),.clk_25m(clk_25m),.vga_clk(),.vga_reset(rst_n),.wr_req( wr_req),.wr_addr(wr_addr),.wr_data(wr_data),.wr_ack(wr_ack),.sram_nwe(sram_nwe),.sram_noe(sram_noe),.sram_addr(sram_addr),.sram_data(sram_data),.ico_wr_data(),.ico_wr_en(1b0),.mouse_en(1b1),.mouse_x(mouse_x),.mouse_y(mouse_y),.hsync(hsync),.vsync(vsync),.disp_dato(disp_dato),.data_enab(data_enab);Endmodule 图1.4 PS_MOSUE_TEST RTL结构图6-2 Ps2鼠标接口模块,文件名ps2_mouse_inferface.vdefine TOTAL_BITS 33 / 一个数据包有33位数据module ps2_mouse_interface (clock,reset, /复位,高电平有效ps2_clk_in,ps2_data_in,ps2_clk_out,left_button,right_button,middle_button,ps2_data_out,ps2_clk_dir,ps2_data_dir,x_increment,y_increment,data_ready); /数据已经正确收到input clock;input reset;input ps2_clk_in; /PS/2时钟线,输入口input ps2_data_in; /PS/2数据线,输入口output ps2_clk_out; /PS/2时钟线,输出口output ps2_data_out; /PS/2数据线,输出口output ps2_clk_dir; /PS/2时钟方向控制,高电平为输出,低电平为输output ps2_data_dir; /PS/2数据方向控制,高电平为输出,低电平为输output left_button;output right_button;output middle_button;output 8:0 x_increment;output 8:0 y_increment;output data_ready;/输出寄存器reg left_button_r;reg right_button_r;reg middle_button_r;reg 8:0 x_increment_r;reg 8:0 y_increment_r;reg data_ready_r;reg ps2_clk_out_r;reg ps2_data_out_r;reg ps2_clk_dir_r;reg ps2_data_dir_r;/内部节点wire watchdog_timer_done; /看门狗状态指示,SP2无时钟脉冲超过400US置位wire timer_5us_done; /用于延时缓冲,防止毛刺干扰wire packet_good; /数据包正确收到-状态指示/内部寄存器reg TOTAL_BITS-1:0 q; /移位寄存器reg 2:0 m1_state;reg 2:0 m1_next_state;reg 3:0 m2_state;reg 3:0 m2_next_state;reg 5:0 bit_count; /发送接收数据是的位计数器reg WATCHDOG_TIMER_BITS-1:0 watchdog_timer_count; /看门狗计时器,400usreg TIMER_5US_BITS-1:0 timer_5us_count; /5uS计时器reg ps2_clk_in_r; /同步后的PS2时钟reg ps2_data_in_r; /同步后的PS2数据reg sync_clk; /滤波后的PS2时钟-由状态机M1产生输出reg rising_edge; /PS2时钟上升沿标志-由状态机M1产生输出reg falling_edge; /PS2时钟下降沿标志-由状态机M1产生输出parameter WATCHDOG_TIMER_VALUE = 30000; /看门狗计时器,400uSparameter WATCHDOG_TIMER_BITS = 16; /400uS计时器所需计数器位数parameter TIMER_5US_VALUE = 375; / 5uS计数值parameter TIMER_5US_BITS = 9; / 5uS计时器所需计数器位数/状态机M1参数表parameter m1_clk_h = 3b000,m1_falling_edge = 3b001,m1_falling_wait = 3b011,m1_clk_l = 3b010,m1_rising_edge = 3b110,m1_rising_wait = 3b100;/状态机M2参数表parameter m2_reset = 4b0000,m2_wait = 4b0001,m2_gather = 4b0011,m2_verify = 4b0010,m2_use = 4b0110,m2_hold_clk_l = 4b0111,m2_data_low_1 = 4b0101,m2_data_high_1 = 4b0100,m2_data_low_2 = 4b1100,m2_data_high_2 = 4b1101,m2_data_low_3 = 4b1001,m2_data_high_3 = 4b1011,m2_await_response = 4b1010;assign ps2_clk_out = ps2_clk_out_r; /PS2时钟线输出assign ps2_data_out = ps2_data_out_r; /PS2数据线输出assign ps2_clk_dir = ps2_clk_dir_r; /PS2时钟方向assign ps2_data_dir = ps2_data_dir_r; /PS2数据方向assign left_button = left_button_r;assign right_button = right_button_r;assign middle_button = middle_button_r;assign y_increment = y_increment_r;assign x_increment = x_increment_r;assign data_ready = data_ready_r;always (posedge clock)beginps2_clk_in_r = ps2_clk_in;ps2_data_in_r = ps2_data_in;endalways (posedge clock)beginif (reset = 1b1)m1_state = m1_clk_h;elsem1_state = m1_next_state;endalways (m1_state or ps2_clk_in_r or timer_5us_done or watchdog_timer_done)beginsync_clk = 1b0;rising_edge = 1b0;falling_edge = 1b0;case (m1_state)m1_clk_h : /时钟高电平beginsync_clk = 1b1;if(ps2_clk_in_r)m1_next_state = m1_falling_edge;elsem1_next_state = m1_clk_h;endm1_falling_edge : /时钟下降沿beginfalling_edge = 1b1;m1_next_state = m1_falling_wait;endm1_falling_wait : /等待5US延时防止毛刺干扰beginif(timer_5us_done)m1_next_state = m1_clk_l;elsem1_next_state = m1_falling_wait;endm1_clk_l : /时钟低电平beginif(ps2_clk_in_r)m1_next_state = m1_rising_edge;elsem1_next_state = m1_clk_l;endm1_rising_edge : /时钟上升沿beginrising_edge = 1b1;m1_next_state = m1_rising_wait;endm1_rising_wait : /等待5US延时防止毛刺干扰beginsync_clk = 1b1;if(timer_5us_done)m1_next_state = m1_clk_h;elsem1_next_state = m1_rising_wait;enddefault : m1_next_state = m1_clk_h;endcaseendalways (posedge clock)beginif(reset = 1b1)m2_state = m2_reset;elsem2_state = m2_next_state;endalways (m2_stateor qor falling_edgeor rising_edgeor watchdog_timer_doneor bit_countor packet_goodor ps2_data_in_ror sync_clk)beginps2_clk_out_r = 1b1;ps2_data_out_r = 1b1;ps2_clk_dir_r = 1b0;ps2_data_dir_r = 1b0;data_ready_r = 1b0;case (m2_state)m2_reset : beginm2_next_state = m2_hold_clk_l;endm2_wait :beginif (falling_edge)m2_next_state = m2_gather;elsem2_next_state = m2_wait;endm2_gather : /判断数据是否收完beginif (watchdog_timer_done & (bit_count = TOTAL_BITS)m2_next_state = m2_verify;else if (watchdog_timer_done & (bit_count TOTAL_BITS)m2_next_state = m2_hold_clk_l;elsem2_next_state = m2_gather;endm2_verify : /检验数据包是否正确beginif (packet_good)m2_next_state = m2_use;elsem2_next_state = m2_wait;endm2_use : /数据包是否正确begindata_ready_r = 1b1;m2_next_state = m2_wait;endm2_hold_clk_l : /拉低时钟线400US,准备发送命令beginps2_clk_dir_r = 1b1;ps2_clk_out_r = 1b0;if(watchdog_timer_done & sync_clk)m2_next_state = m2_data_low_1;elsem2_next_state = m2_hold_clk_l;endm2_data_low_1 : /发送起始位0,d0,d1beginps2_data_dir_r = 1b1;ps2_data_out_r = 1b0;if (falling_edge & (bit_count = 6d2)m2_next_state = m2_data_high_1;elsem2_next_state = m2_data_low_1;endm2_data_high_1 : /发送位d2beginps2_data_dir_r = 1b1;if (falling_edge)m2_next_state = m2_data_low_2;elsem2_next_state = m2_data_high_1;endm2_data_low_2 :beginps2_data_dir_r = 1b1;ps2_data_out_r = 1b0; /发送位d3if (falling_edge)m2_next_state = m2_data_high_2;elsem2_next_state = m2_data_low_2;endm2_data_high_2 : /发送位d4,d5,d6,d7beginps2_data_dir_r = 1b1;if (falling_edge & (bit_count = 6d8)m2_next_state = m2_data_low_3;elsem2_next_state = m2_data_high_2;endm2_data_low_3 : /发送奇偶校验位beginps2_data_dir_r = 1b1;ps2_data_out_r = 1b0;if(falling_edge)m2_next_state = m2_data_high_3;elsem2_next_state = m2_data_low_3;endm2_data_high_3 : /停止位1,应答处理beginif (falling_edge & ps2_data_in_r)m2_next_state = m2_hold_clk_l; /有错误产生,重新复位else if (falling_edge & ps2_data_in_r)m2_next_state = m2_await_response;elsem2_next_state = m2_data_high_3;endm2_await_response :beginif (bit_count = 6d22)m2_next_state = m2_verify;elsem2_next_state = m2_await_response;enddefault : m2_next_state = m2_wait;endcaseendalways (posedge clock)beginif(reset = 1b1)bit_count = 6d0; /复位时计数器清零else if(falling_edge)bit_count = bit_count + 6d1;else if(watchdog_timer_done)bit_count = 6d0; /接收完一个数据包后计数器清零end/移位寄存器,在时钟的下降沿锁存数据/功能:接收PS2发送到来的数据always (posedge clock)beginif (reset = 1b1) q = TOTAL_BITSd0; else if (falling_edge) q = ps2_data_in_r,qTOTAL_BITS-1:1;endalways (posedge clock)begin if(reset | rising_edge | falling_edge) watchdog_timer_count = 0; else if(watchdog_timer_done) watchdog_timer_count = watchdog_timer_count + 1;endassign watchdog_timer_done = (watchdog_timer_count=WATCHDOG_TIMER_VALUE-1);/缓冲时间5US计数器always (posedge clock)begin if (reset | falling_edge | rising_edge ) timer_5us_count = 0; else timer_5us_count = timer_5us_count + 1;endassign timer_5us_done = (timer_5us_count = TIMER_5US_VALUE-1);/验证收到的数据包数据是否有效、正确assign packet_good = ( (q0 = 1b0) /第一字节起始位 & (q10 = 1b1) /第一字节停止位 & (q11 = 1b0)/第二字节起始位 & (q21 = 1b1)/第二字节停止位 & (q22 = 1b0)/第三字节起始位 & (q32 = 1b1)/第三字节停止位 & (q9 = q8:1) /第一字节奇验证位 & (q20 = q19:12) /第二字节奇验证位 & (q31 = q30:23) /第三字节奇验证位 );always (posedge clock)begin if (reset = 1b1) begin left_button_r = 1b0; right_button_r = 1b0; middle_button_r = 1b0; x_increment_r = 1b0; y_increment_r = 1b0; end else if (data_ready_r = 1b1) begin left_button_r = q1; /BIT10 right_button_r = q2; /BIT11 middle_button_r = q3; /BIT12 x_increment_r = q5,q19:12; /BIT14,BIT2 y_increment_r = q6,q30:23; /BIT15,BIT3 endendendmodule 图1.5 PS_MOSUE_INTERFACE RTL结构图6-3 Ps2鼠标坐标位置计算模块,文件名count.v该模块的主要功能是将鼠标接口模块发送过来的鼠标位移增量信号装换成坐标参数信号输出,送给vga_logic。 module count(clock,data_ready,x_inc, y_inc, x_addr,y_addr); input clock; input data_ready; input8:0 x_inc; input8:0 y_inc; output9:0 x_addr; output8:0 y_addr; reg10:0 x_addr_r; reg9:0 y_addr_r; assign x_addr=x_addr_r9:0; assign y_addr=y_addr_r8:0; always (posedge clock) begin if(data_ready) begin if(x_inc8) begin if(x_addr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论