PS2键盘接口控制器设计_第1页
PS2键盘接口控制器设计_第2页
PS2键盘接口控制器设计_第3页
PS2键盘接口控制器设计_第4页
PS2键盘接口控制器设计_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

PS2键盘接口控制器设计 PS/2键盘接口控制器设计班级 姓名: 学号: 班内序号: 时间: 课题名称:PS/2键盘接口控制器设计一、摘要和关键词摘要: PS/2是在电脑上常见的接口之一,用于鼠标、键盘等设备。PS/2接口是输入装置接口,而不是传输接口,所以PS/2口只有扫描速率。在Windows环境下,PS/2鼠标的采样率默认为60次/秒。微控制器所要作的工作就是监测所有的按键,以及当按键被按下或放开时,就回报给主机。本实验中,通过数字可编程芯片模拟控制器将键盘的输入分别输出到数码管和点阵显示。关键词:PS/2接口 点阵 数码管 数字可编程芯片二、设计任务要求设计制作一个PS/2键盘接口控制器,实现以下功能:1. 按照PS/2键盘接口标准设计一个控制器,接收PS/2键盘发送的数据,用数码管显示接收到的键值(只显示09,az,部分不便用数码管显示的字符可自行设定显示方式,接收到其他键值则不显示);2. 用88点阵做显示屏,显示所有按键的键值。三、设计思路、总体结构框图1. 设计思路:带PS/2接口的键盘与实验开发板连接后,通过可编程芯片读取键盘输入的键值,通过数据线分别传送至数码管和8*8点阵显示。在实验中,分三个模块实现实验所要求的功能:检测键盘输入键值模块、数码管显示模块、8*8点阵显示模块。将三个模块分别设计好后,组合在一起,即可实现实验所要求的功能。2. 总体结构框图:四、控制器部分的状态转移图和流程图1. 控制器部分的状态转移图如下图所示(其中状态值是shift_in的值,假设本次传输的字节数据值是11010011,传输其他字节数据信息时,同理,只需修改shift_in值即可):2. 控制器部分的流程图如下图所示:五、分块电路和总体电路设计分三个模块实现实验所要求的功能:检测键盘输入键值模块、数码管显示模块、8*8点阵显示模块。其组合关系如下图所示:实验完成后的总体效果图如下图所示:1. 检测键盘输入键值模块设计检测带PS/2接口的键盘输入时,需要按照特定的步骤来执行操作,才能正确地读取键盘输入的键值。严格的读取数据步骤为:1)等待键盘时钟信号clock = high;2)延时50微秒;3)键盘时钟信号clock仍旧为high?No则回到第1步,Yes则向下执行;4)数据控制信号data=high?No则放弃(并且从主机读取字节),Yes则向下执行;5)延迟20微秒(若正在发送起始位则延时40微秒);6) 输出起始位bit (0) (在发送所有这些位的每一位后都要检测时钟线);7) 输出8个数据位(测试时钟确认主机是否把时钟线拉低了);8) 输出校验位;9) 输出停止位,延迟30 毫秒。而按如下的过程发送单个位1)设置复位数据;2)延迟20微秒;3)把时钟拉低;4)延迟40微秒;5)释放时钟;6)延迟20微秒。通过实际情况修正与改进以上步骤,在本实验中采用的读取键盘输入键值模块的VHDL语言编程的流程图如下图所示:2. 数码管显示模块设计当需要在一个数码管上显示字符时只要在数据端需要点亮的字段管脚上输入1,不需要点亮的字段输入管脚上输入0,同时把相应的控制端置为0即可。当键盘键值和数字09的通码比较后,即可送往数码管显示。数字09对应的ag、p的高低电平如下表所示:数字abcdefgp011111100101100000211011010311110010401100110510110110610111110711100000811111110911110110数码管功能原理图如下图所示:3. 8*8点阵显示模块点阵是由8行8列一共64个发光二极管构成。一共对外的管脚有16条,分为行ROW1ROW8 和列COL1COL8。点亮EPM1270TCC54芯片上的点阵上某一个点的条件是对应该点的行管脚输出高电平,列管脚输出低电平。利用点阵显示某个字符时,需要先计算出需要点亮点阵的哪些点,再使用行扫描的扫描方式对点阵逐行扫描,即可显示所需要显示的字符,其流程图如下所示:六、所实现功能说明1. 已完成的基本功能和扩展功能:1)可分别用拨码开关SW0SW5控制是否使用数码管DSP1DSP6显示数字键值,数码管可显示数字09;2)可用SW7控制是否使用8*8点阵显示键值,点阵可显示数字09、字母AZ;3)可用SW6控制是否读取键盘输入的键值。2. 器件资源占用情况:使用了41个管脚接口,如下图所示:使用了336个宏单元,如下图所示:3. 关键波形仿真:在进行波形仿真时,由于本实验模拟PS/2控制器的特殊性,输入的主要数据是keyboard_data,每次读取1位数据,在波形仿真时,输出的是键盘键值的通码,输入输出的数据的位数不一致(keyboard_data是1位,而输出是8位),由于仿真时系统的时钟不能太快,否则仿真时间会特别长导致软件崩溃,故在仿真波形上只能看到点阵中第一行的波形4. 测试方法与步骤:主要按以下步骤进行本系统的调试与改进:1)键盘与实验开发板之间连接好;2)单独编写数码管显示程序,利用数码管显示特定的数字;3)单独编写点阵显示程序,利用点阵显示特定的字符;4)编写键盘输入键值读取程序,并和数码管程序结合起来,把输出数据送至数码管显示。这时,就可以根据数码管显示的字符是否正确来改进键盘输入键值读取程序,只要数码管能正确显示一个数字,显示其余的数字也就是重复相同的原理而已;5)在前面4步调试好后,把三个模块检测键盘输入键值模块、数码管显示模块、8*8点阵显示模块的程序组合起来即可。七、故障及问题分析在编写检测键盘输入键值模块的VHDL程序时,按照参考资料上的特定步骤,并不能正确地读取键盘输入的键值。问题分析:对于两份PDF参考资料上关于PS/2设备向主机发送一个字节和一位数据的描述,其是建立在向主机(计算机)发送的基础上的,而本实验中利用数字电路实验开发板模拟PS/2控制器,数字芯片可以直接从键盘数据输入口读取数据,省去了很多不必需的步骤:1)校验位和停止位:由于起始位始终为0,数据位为8位,而检验位与停止位读取与否并不影响该程序的功能实现,所以只需读取PS/2键盘的起始位和数据位,并且最终将8位数据位转存入data_cade和data_code1。这样,既不影响程序功能的正确实现,又能精简程序代码。2)时钟信号电平:在参考资料中,在读取数据位时,要求时钟信号为高。但在实际编程仿真中发现:在等待时钟信号时,它的电平高低对后来的读取数据并没有影响。这也是本次实验的特殊之处,同样,对于数据位的高低电平也不必强制要求。3)延时问题:在参考资料中,反复提到读取数据位过程中的延时,但在编程中发现并不需要设置延时,而同样能正确地读取了键盘输入的数据。在使用VHDL语言编程、利用数字可编程芯片仿真PS/2控制器时,并不需要专门的延时时间,键盘数据是每一位连续传向数据线的,其中指令的执行时间已经足够控制芯片读取数据的缓冲时间。八、总结和结论通过这次数电实验,我进一步加深了对可编程逻辑器件的认识,熟练掌握了quartus ii软件的使用方法,包括编程,仿真下载测试。并且系统的学习了VHDL语言。 同时,学习了PS/2协议,了解了PS/2键盘是如何向主机传输数据的,也解开了我从小到大一直的疑惑。九、参考文献1 PS/2键盘协议2数字电路与逻辑设计实验教程北京邮电大学电子工程学院电路实验中心2009年3月十、源程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity keyboard is port( keyboard_clk, keyboard_data, key_stop: in std_logic;-键盘时钟信号,1位数据信号,终止键盘输入信号clk:in std_logic;-系统时钟信号led_clr: in std_logic;-点阵显示复位信号 led_code: out std_logic_vector(7 downto 0); -接收到的送数码管显示的8位数据信号cat: out std_logic_vector(5 downto 0);-控制哪个数码管显示swcat: in std_logic_vector(5 downto 0);-利用拨码开关控制哪个数码管显示 row: out std_logic_vector(7 downto 0);-行通量 col: out std_logic_vector(7 downto 0);-列通量end keyboard;architecture a of keyboard issignal counter : std_logic_vector(3 downto 0); -计数器signal shift_in : std_logic_vector(8 downto 0); -包含1个起始位和8个数据位signal read_bit : std_logic; -是否读取数据控制信号signal data_code : std_logic_vector(7 downto 0); -8位数据信号signal data_code1: std_logic_vector(7 downto 0);-点阵显示signal temp: integer range 1 to 8;-列扫描控制信号signal t: std_logic;signal clkout: std_logic;beginprocess(clk)-1K分频器variable count: integer range 0 to 1000;beginif (clkevent and clk=1) thenif (count = 499) thencount := 0;t = not t;elsecount := count + 1;end if;end if;clkout = t;end process;processbeginwait until (keyboard_clkevent and keyboard_clk = 0);-等待键盘时钟信号为低电平if key_stop = 1 then -终止键盘输入 counter = 0000; -计数器设置为0 read_bit = 0; -读取数据控制信号为低电平else if keyboard_data = 0 and read_bit = 0 then -数据线信号为低电平且读取数据控制信号为低电平 read_bit= 1; -则开始读取数据位 else if read_bit = 1 then -开始处理8个数据位 if counter 1001 then -计数器小于1001时 counter = counter + 1; -计数器加1 shift_in(7 downto 0) = shift_in(8 downto 1); -每次不读取shift_in(0)(该位为起始位) shift_in(8) = keyboard_data; -读取新的数据位 else data_code = shift_in(7 downto 0); -存储8位数据信号 data_code1 = shift_in(7 downto 0); -存储8位数据信号 read_bit = 0; -读取数据控制信号置0 counter = 0000; -计数器置0 end if; end if; end if;end if;end process;process(data_code)-数据送数码管显示begin cat led_code led_code led_code led_code led_code led_code led_code led_code led_code led_code led_code = 00000000; end case;end process;process(data_code1,clkout)-数据送led点阵显示beginif led_clr=1 then -复位row=00000000;col=00000000;temp rowcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcol rowcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcol rowcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcol rowcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolcolc

温馨提示

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

评论

0/150

提交评论