基于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。基于fpga的ps2鼠标接口设计及vga显示word格式
相关推荐
辨率较差。 FPGA器件通过 频率合成的方法做成的信号发生器。 由于合成信号发生器具有较高的频率稳定度,很容易实现数字显示频率,因此,频率分辨率高和频率的置定重复性好,以及能方便实现频率的程序控制是合成信号发生 8 器的重要特点。 由此可见通过设计频率合成器 是整个信号发生器的最为关键的部分。 根据上文提到的课题要求,特列出以下论证方案,为了显出该设计的优
988 年, Milstd454 规定所有为美国国防部设计的 ASIC 产品必须采用 VHDL 来进行描述。 1993 年,经过几年的修订 和扩展,IEEE 公布了 VHDL 的新版本 IEEE1164。 1996 年, 成为 VHDL 的综合标准。 1995 年,我国国家技术监督局制定的《 CAD 通用技术规范》推荐 VHDL 作为我国电子设计自动化硬件描述语言的国家标准。 自此, VHDL
内占据首位。 但是由于直流电动机本身有机械换向器,给直流调速系统造成一些固有的、难于解决的问题。 随着交流传动电动机调速的理论问题的突破 和调速装置 (主要指变频器 )性能的完善,交流电动机调速系统的性能差的缺点已经得到了克服,目前,交流调速系统的性能已经可以和直流系统相媲美,甚至可以超过直流系统。 由于交流调速不断显示其本身的优越性和巨大的社会效益,使变频器具有越来越旺盛的生命力。
)直到门级电路逐层进行描述。 另外,高层次的行为描述可以与底层次的寄存器描述和结构描述混合使用。 采用 VHDL 语言设计硬件电路时,当门级或门级以上层次的描述通过仿真检验以后,再用相应的工具将设计映射成不同的工艺。 在工艺更新时无须 原设计程序,只需改变相应的映射工具。 由此可见,修改电路和修改工艺相互之间不会产生影响。 作为 IEEE 标准的 VHDL 语言,语法严格,设计成果便于复用和交流
中的 t个或更少个错误的任意组合,称之为能纠正t个错误的二元本原 BCH码。 BCH码是循环码的一类,因此,它具有分组码、循环码的一切性质。 但它明确界定了码长,校验位数目,码的最小距离之间的关系。 可以看出它的性能较好,在同样的编码效率下,纠错能力均较强,故可在无线通信系统中获得广泛应用。 根据 BCH码的定义,若 a是 ( )中的本原元,又码长为 ,能纠正 t个错误的二元
when 0111 =b:=0001110000010100。 when 1000 =b:=0001101000011110。 when 1001 =b:=0010100111110000。 when 1010 =b:=0010100000010000。 when 1011 =b:=0100100000010000。 when 1100 =b:=1000100000010000。 when