基于fpga的ps2鼠标接口设计及vga显示word格式内容摘要:

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状态,此时便形成了数据接收循环 [5][6][7]。 在上述的理论基础上,首先编写 VHDL 硬件实现流程图,然后用 VHLD 语言在 QuartusⅡ软件下 编写程序,并进行综合和时序仿真,最后得到 PS/2 接口模块,如图 、 所示。 PS/2 接口的 VHDL 硬件实现流程图见附录 1,PS/2 接口电路的 VHDL 语言见附录 2。 FPGA VGA 显示 PS/2 图 PS/2接口模块 图 PS/2接口模块仿真时序图 VGA 显示模块 VGA 显示模式要求:行 、场同步都为负极性,即都是负脉重。 所以在设计显示模块的时候要注意时序驱动和 VGA 信号的电平驱动,其行、场扫描时序如表 、 所示 [3] 表 行扫描时序 行同步头 行图像 行周期 对应位置 Tf Ta Tb Tc Td Te Tg 时间 8 96 40 8 640 8 800 表 场扫描时序 行同步头 行图像 行周期 对应位置 Tf Ta Tb Tc Td Te Tg 时间 2 2 25 8 480 8 525 当 HS 和 VS都等于 0的时候, CRT 显示的内容为亮,这个过程为正向扫描。 当一行扫描完成的时候, CRT 扫描产生消隐,电子束回到 CRT左边下一行的起始位置,依次进行扫描 ,其 VGA 显示模块如图 ,源代码见附录 4。 图 VGA显示模块 系统顶层文件 由以上两个模块: PS/2 接口模块和 VGA 显示模块,根据方案图封装成系统所需的顶层模块就得到系统所需的顶层文件。 如图。 图 系统顶层模块 功能实现 在得到系统顶层模块后,先进行全程编译,并进行时序仿真,然后对芯片进行配置,最后将编译产生的 SOF格式文件下载到 FPGA 芯片中进行硬件测试。 6 结束语 毕业设计是培养我们综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对我们实际工作能力的具体训练和考察过程。 随着 EDA 技术发展的日新日异, EDA 已经成为现代电子技术中必不可少的技术, 在生活中可以说得是无处不在。 因此作为电子专业的学生来说掌握 EDA 的开发技术是十分重要的。 我本次设计的题目是 基于 FPGA的 PS/2 鼠标接口设计及 VGA显示 ,对于我们这些实践中的新手来说,这是一次考验。 这次毕业设计让我学到很多很多的东西,学会了怎么在遇到问题时去解决问题。 不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识,掌握了一种系统的研究方法,可以进行一些简单的编程。 通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从而提高自己的实际动手能力和独立思考的能力。 同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握 得不够牢固。 这次毕业设计设计通过我的努力终于顺利完成了,在设计中遇到了很多问题,最后在导师的辛勤指导下,终于迎刃而解,在此我表示感谢。 附录 1: PS/2 接口的 VHDL 硬件实现流程图 附录 2: 设计流程图 初始化 判断鼠标是否正确应答 接收数据 输出并传给 VGA 复位 是 否 附录 3: PS/2 接口电路的 VHDL 语言源程序 [5] library IEEE。 编写设计说明书 建立 PS/2 行为模型 建立 VGA驱动行为 行为仿真 行为仿真 RTL 级建模 RTL 级建模 前端功能仿真 PS/2 功能仿真 逻辑综合 测试向量表 功能仿真 结构综合 门级时序仿真 下载并硬件测试 设计完成 use。 use。 use。 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。 rx_read_o error_no_ack : out std_logic )。 end mouse。 architecture Behavioral of mouse is constant TOTAL_BITS : integer :=33。 数据包位数 constant WATCHDOG : integer :=320。 400usec 所需 sys_clk 脉冲数 constant DEBOUNCE_TIMER : integer := 2。 type m1statetype is ( m1_clk_h, m1_falling_edge, m1_falling_wait, m1_clk_l, m1_rising_edge, m1_rising_wait)。 type m2statetype is (m2_reset, m2_wait, m2_gather, m2_verify, m2_use, m2_hold_clk_l, m2_data_low_1, m2_data_high_1, m2_data_low_2, m2_data_high_2, m2_data_low_3, m2_data_high_3, m2_error_no_ack, m2_await_response)。 signal m1_state,m1_next_state : m1statetype。 signal m2_state,m2_next_state : m2statetype。 signal m3_state,m3_next_state : std_logic。 signal watchdog_timer_done : std_logic。 命令传输超时标志 signal q : std_logic_vector(TOTAL_BITS1 downto 0)。 位序列 signal bitcount : std_logic_vector(5 downto 0)。 位计数器 signal watchdog_timer_count : std_logic_vector(8 downto 0)。 等待时间 signal debounce_timer_count : std_logic_vector(1 downto 0)。 signal ps2_clk_hi_z : std_logic。 signal ps2_data_hi_z : std_logic。 signal fallsig,risesig : std_logic_vector(2 downto 0)。 signal clean_clk : std_logic。 从 m1 跟随 ps2_clk 反向输出 signal rise,n_rise : std_logic。 m1 状态机输出数据 signal fall,n_fall : std_logic。 m1 状态机输出数据 signal output_strobe : std_logic。 锁存数据到输出寄存器 signal packet_good : std_logic。 检查数据是否有效 signal x_increment : std_logic_vector(8 downto 0)。 signal y_increment : std_logic_vector(7 downto 0)。 signal mouseyy : std_logic_vector(9 downto 0)。 begin ps2_clk = 39。 039。 when ps2_clk_hi_z=39。 039。 else 39。 Z39。 ps2_data = 39。 039。 when ps2_data_hi_z=39。 039。 else 39。 Z39。 检测 ps2clk 上升 沿和下降沿 detect_ps2clkfall : process(clk,reset,ps2_clk) begin if reset=39。 039。 then fallsig = 000。 elsif clk39。 event and clk=39。 139。 then fallsig(0) = ps2_clk。 fallsig(1) = fallsig(0)。 fallsig(2) = fallsig(1)。 end if。 end process。 fall = 39。 139。 when fallsig=110 else 39。 039。 detect_ps2clkrise : process(clk,reset,ps2_clk) begin if reset=39。 039。 then risesig = 000。 elsif clk39。 event and clk=39。 139。 then risesig(0) = ps2_clk。 risesig(1) = risesig(0)。 risesig(2) = risesig(1)。 end if。 end process。 rise = 39。 139。 when risesig=001 else 39。 039。 m2 状态 m2statech: process (reset, clk) begin if (reset=39。 039。 ) then m2_state = m2_reset。 elsif (clk39。 event and clk=39。 139。 ) 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 = 39。 139。 ps2_data_hi_z = 39。 139。 error_no_ack = 39。 039。 output_strobe = 39。 039。 case m2_state is when m2_reset = 复位后向鼠标发送命令字 m2_next_state = m2_hold_clk_l。 when m2_wait = if (fall=39。 139。 ) then m2_next_state = m2_gather。 else m2_next_state = m2_wait。 end if。 when m2_gather = if ((watchdog_timer_done=39。 139。 ) and (bitcount=TOTAL_BITS))then m2_next_state = m2_ve。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。