收藏 分享(赏)

EDA课程设计-键盘驱动程序new.doc

上传人:dzzj200808 文档编号:2283745 上传时间:2018-09-09 格式:DOC 页数:35 大小:884.50KB
下载 相关 举报
EDA课程设计-键盘驱动程序new.doc_第1页
第1页 / 共35页
EDA课程设计-键盘驱动程序new.doc_第2页
第2页 / 共35页
EDA课程设计-键盘驱动程序new.doc_第3页
第3页 / 共35页
EDA课程设计-键盘驱动程序new.doc_第4页
第4页 / 共35页
EDA课程设计-键盘驱动程序new.doc_第5页
第5页 / 共35页
点击查看更多>>
资源描述

1、 键盘驱动程序键盘驱动程序摘要键盘上的每一个键都有两个唯一的数值进行标志。为什么要用两个数值而不是一个数值呢?这是因为一个键可以被按下,也可以被释放。当一个键按下时,它们产生一个唯一的数值,当一个键被释放时,它也会产生一个唯一的数值,我们把这些数值都保存在一张表里面,到时候通过查表就可以知道是哪一个键被敲击,并且可以知道它是被按下还是被释放了。这些数值在系统中被称为键盘扫描码。本课程设计目的旨在使用 Altera 公司的 EP2C35 系列的 FPGA芯片,利用 SOPC-NIOSII-EP2C35 开发板 PS2 键盘接口等资源,实现一个键盘驱动程序。以达到外接键盘按键的选择、8 位动态七段

2、数码管实现按键扫描码显示和 16*16 点阵实现按键字符显示的目的。关键词:键盘;扫描码;数码管键盘驱动程序目录1 绪论 -12 系统设计 -22.1 总体设计 -22.2 八位七段数码管显示模块 -32.3 16*16 点阵显示模块 -42.4 键盘扫描模块 -52.5 动态扫描模块 -73 程序设计 -93.1 流程 -93.2 八位七段数码管显示程序 -93.3 16*16 点阵显示程序 -103.4 键盘扫描程序 -113.5 动态扫描程序 -114 总结 -124.1 遇到的问题及解决 -124.2 扩展设想 -124.3 心得与体会 -13参考文献 -14附录 -15附录 A 八位

3、七段数码管显示程序 -15附录 B 16*16 点阵显示程序 -18附录 C 键盘扫描程序 -28附录 D 动态扫描程序 -30附录 E 总电路图 -32键盘驱动程序第 1 页(共 32 页) 1 绪论EDA 是电子设计自动化(Electronic Design Automation)的缩写,在 20 世纪 60 年代中期从计算机辅助设计(CAD) 、计算机辅助制造(CAM) 、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来的。20 世纪 90 年代,国际上电子和计算机技术较先进的国家,一直在积极探索新的电子电路设计方法,并在设计方法、工具等方面进行了彻底的变革,取得了巨大成

4、功。在电子技术设计领域,可编程逻辑器件(如 CPLD、FPGA)的应用,已得到广泛的普及,这些器件为数字系统的设计带来了极大的灵活性。这些器件可以通过软件编程而对其硬件结构和工作方式进行重构,从而使得硬件的设计可以如同软件设计那样方便快捷。这一切极大地改变了传统的数字系统设计方法、设计过程和设计观念,促进了 EDA 技术的迅速发展。EDA 技术就是以计算机为工具,设计者在 EDA 软件平台上,用硬件描述语言 HDL 完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。EDA 技术的出现,极大地提高了电

5、路设计的效率和可操作性,减轻了设计者的劳动强度。本课程设计目的旨在使用 Altera 公司的 EP2C35 系列的 FPGA 芯片,利用SOPC-NIOSII-EP2C35 开发板 PS2 键盘接口等资源,实现一个键盘驱动程序。以达到外接键盘按键的选择、8 位动态七段数码管实现按键扫描码显示和 16*16点阵实现按键字符显示的目的。利用 EDA 工具,电子设计师可以从概念、算法、协议等开始设计电子系统,大量工作可以通过计算机完成,并可以将电子产品从电路设计、性能分析到设计出 IC 版图或 PCB 版图的整个过程的计算机上自动处理完成。键盘驱动程序第 2 页(共 32 页) 2 系统设计VHDL

6、 语言是一种用于电路设计的高级语言。它在 80 年代的后期出现。最初是由美国国防部开发出来供美军用来提高设计的可靠性和缩减开发周期的一种使用范围较小的设计语言 。VHDL 主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL 的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。对于用 VHDL 完成的一个确定的设计,可以利用 EDA工具进行逻辑综合和优化,并自动的把 VHDL 描述设计转变成门级网表。VHDL 的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分)

7、,既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是 VHDL 系统设计的基本点。与其他的硬件描述语言相比,VHDL 具有更强的行为描述能力,从而决定了它成为系统设计领域最佳的硬件描述语言。强大的行为描述能力是避开具体的器件结构,从逻辑行为上描述和设计大规模电子系统的重要保证。本文利用模块化思想将整个设计分为八位七段数码管显示、16*16 点阵显示和键盘扫描等模块,以达到键盘扫描码的显示。2.1 总体设计在本课程设计中要求利用外接键盘实现键盘按键的选择,在8位动态七段数码管上实现按键扫

8、描码的显示,在16*16点阵上实现按键字符的显示。设计中采用模块化,用键盘扫描输出端作为数据总线来对整个程序控制,各模块共一个系统时钟,数字信号源模块的时钟选择为1MHZPS2键盘采用是键盘内部的时钟。其总体设计如下图2.1所示。键盘驱动程序第 3 页(共 32 页) 图2.1 系统总体设计2.2 八位七段数码管显示模块八位七段数码管是电子开发过程中常用的输出显示设备。在实验系统中使用的是两个四位一体、共阴极型七段数码管。由于七段数码管公共端连接到 GND(共阴极型) ,当数码管的中的那一个段被输入高电平,则相应的这一段被点亮。反之则不亮。共阳极性的数码管与之相么。四位一体的七段数码管在单个静

9、态数码管的基础上加入了用于选择哪一位数码管的位选信号端口。八个数码管的 a、b、 c、d、e、f、g、h、dp 都连在了一起,8 个数码管分别由各自的位选信号来控制,被选通的数码管显示数据,其余关闭。其单个静态数码管如下图 2.2 所示,数码管显示模块的电路原理如图 2.3 所示。图 2.2 静态七段数码管键盘驱动程序第 4 页(共 32 页) 图 2.3 数码管显示电路原理2.3 16*16 点阵显示模块16*16 点阵由此 256 个 LED 通过排列组合而形成 16 行*16 列的一个矩阵式的 LED 阵列,俗称 16*16 点阵。单个的 LED 的电路如下图 2.4 所示。图 2.4

10、单个 LED 电路图由上图可知,对于单个 LED 的电路图当 Rn 输入一个高电平,同时 Cn 输入一个低电平时,电路形成一个回路,LED 发光。也就是 LED 点阵对应的这个点被点亮。16*16 点阵也就是由 16 行和 16 列的 LED 组成,其中每一行的所有 16 个 LED 的 Rn 端并联在一起,每一列的所有 16 个 LED 的 Cn 端并联在一起。通过给 Rn 输入一个高电平,也就相当于给这一列所有 LED 输入了一个高电平,这时只要某个 LED 的 Cn 端输入一个低电平时,对应的 LED 就会被点亮。具体的电路如下图 2.5 所示。图 2.5 16*16 点阵电路原理图键盘

11、驱动程序第 5 页(共 32 页) 16*16 点阵的电路原理在前面已经做了详尽的说明,在此实验中,16*16 点阵由 4 个 8*8 点阵组成,考虑到 LED 电流功耗与 FPGA 电流功耗的关系,在实验的电路中加入驱动电路。具体电路如下图 2.6 所示。图 2.6 16*16 点阵电路图2.4 键盘扫描模块PS2 通信协议是一种双向同步串行通迅协议。通迅的两端通过 CLOCK(时钟信号端)同步,并通过 DATA(数据端口)交换数据。任何一方如果想要抑制另外一方的通迅时,只需要把 CLOCK 拉到低电平。PS2 控制接口仅使用到两条传输端口,一为频率端口,另一则为数据端口如图 2.7 所示,

12、且此传输埠必为三态(Tri-State)并具有双向(bidirectional)特性。PS2 传输产品上,常见为鼠标与键盘,两者的驱动原理均相同,仅扫描码(scan code)不同。因此我们以 PS2 键盘为例进行说明。Male (Plug)Female (Socket)6-pin Mini-DIN (PS2): 1 - Data 2 - Not Implemented 3 - Ground 4 - Vcc (+5V) 5 - Clock 6 - Not Implemented图 2.7 PS2 端口脚位定义键盘其实就是一个大型的按键矩阵,它们由安装在电路板上的处理器(叫做“键盘编码器 ”)来

13、监视着。虽然不同的键盘可能采用不同的处理器,但是它键盘驱动程序第 6 页(共 32 页) 们完成的任务都是一样的,即监视哪些按键被按下,哪些按键被释放了,并将这些信息传送到主机。如果有必要,处理器处理所有的去抖动,并在它的 16 字节的缓冲区里缓冲数据。主机端包含了一个“键盘控制器” 与键盘处理器进行通讯,并解码来自键盘处理器的信息,然后高速系统当前按键对应的处理事情。主机与键盘之间的通讯仍旧采用 IBM 的协议。键盘处理器花费很多时间来扫描或监视按键矩阵。如果发现有按键按下、释放或长按,键盘就发送“扫描码” 的信息到主机。扫描码有两种不同的类型:“通码”和“断码 ”。当一个键被按下去或长按的

14、时候,键盘就发送通码;当一个键被释放的时候,键盘就发送断码。每个键盘被分配了唯一的通码和断码,这样主机通过查找唯一的扫描码就可以确定是哪个按键被按下或释放。每个键一整套的通断码组成了“ 扫描码集 ”,现在所有的键盘都采用第二套扫描码。由于没有一个简单的公式可以计算扫描码,所以要知道某个特定按键的通码和断码,只能采用查表的方法来获得。需要特别注意的是,按键的通码值表示键盘上的一个按键,并不表示印刷在按键上的那个字符,这就意味着通码和 ASCII 码之间没有任何关联。另外,第二套通码都只有一个字节宽,但也有少数“扩展按键” 的通码是两字节或四字节宽,这类码的第一个字节总是 0xE0。与通码一样,每

15、个按键在释放的时候,键盘就会发送一个断码。每个键也都有它自己的唯一的断码,不过庆幸的是,断码与断码之间存在着必然的联系。多数第二套断码有两个字长,它们的第一个字节是 0xF0,第二个字节就是对应按键的通码。扩展按键的断码通常有三个字节,前两个字节 0xE0 和 0xF0,最后一个字节是这个按键通码的最后一个字节。表 2-1 列出了键盘的扫描码。键值 通码 断码 键值 通码 断码 键值 通码 断码A 1C F0,1C 9 46 F0,46 54 F0,54B 32 F0,32 0E F0,0E INSERT 67 F0,67C 21 F0,21 - 4E F0,4E HOME 6E F0,6ED

16、 23 F0,23 = 55 F0,55 PG UP 6F F0,6FE 24 F0,24 5C F0,5C DELETE 64 F0,64F 2B F0,2B BKSP 66 F0,66 END 65 F0,65G 34 F0,34 SPACE 29 F0,29 PG DN 6D F0,6D键盘驱动程序第 7 页(共 32 页) H 33 F0,33 TAB 0D F0,0D U ARROW 63 F0,63I 43 F0,48 CAPS 14 F0,14 L ARROW 61 F0,61J 3B F0,3B L SHFT 12 F0,12 D ARROW 60 F0,60K 42 F0,4

17、2 L CTRL 11 F0,11 R ARROW 6A F0,6AL 4B F0,4B L WIN 8B F0,8B NUM 76 F0,76M 3A F0,3A L ALT 19 F0,19 KP / 4A F0,4AN 31 F0,31 R SHFT 59 F0,59 KP * 7E F0,7EO 44 F0,44 R CTRL 58 F0,58 KP - 4E F0,4EP 4D F0,4D R WIN 8C F0,8C KP + 7C F0,7CQ 15 F0,15 R ALT 39 F0,39 KP EN 79 F0,79R 2D F0,2D APPS 8D F0,8D KP .

18、71 F0,71S 1B F0,1B ENTER 5A F0,5A KP 0 70 F0,70T 2C F0,2C ESC 08 F0,08 KP 1 69 F0,69U 3C F0,3C F1 07 F0,07 KP 2 72 F0,72V 2A F0,2A F2 0F F0,0F KP 3 7A F0,7AW 1D F0,1D F3 17 F0,17 KP 4 6B F0,6BX 22 F0,22 F4 1F F0,1F KP 5 73 F0,73Y 35 F0,35 F5 27 F0,27 KP 6 74 F0,74Z 1A F0,1A F6 2F F0,2F KP 7 6C F0,6C

19、0 45 F0,45 F7 37 F0,37 KP 8 75 F0,751 16 F0,16 F8 3F F0,3F KP 9 7D F0,7D2 1E F0,1E F9 47 F0,47 5B F0,5B3 26 F0,26 F10 4F F0,4F ; 4C F0,4C4 25 F0,25 F11 56 F0,56 52 F0,525 2E F0,2E F12 5E F0,5E , 41 F0,416 36 F0,36 PRNTSCRN 57 F0,57 . 49 F0,497 3D F0,3D SCROLL 5F F0,5F / 4A F0,4A8 3E F0,3E PAUSE 62 F

20、0,62 表 2-1 PS2 键盘扫描码2.5 动态扫描模块本次设计所用的实验箱 FPGA 的引脚都和相应的实验开发模块固化了,并且有些引脚在几个模块里有重复定义。在 EDA 中不允许一个引脚同时两个模块使用。在本设计中,八位七段数码管和 16*16 点阵的部分管脚被重复定义,若键盘驱动程序第 8 页(共 32 页) 要同时显示,就要用到动态扫描。当扫描频率达到一定值时,效果就会和静态显示一样。这样既解决了引脚冲突的问题,又有效的节约了硬件资源。同时,实验也达到了预期的效果。键盘驱动程序第 9 页(共 32 页) 3 程序设计3.1 流程键盘扫描程序是整个程序的核心部分,其流程图如下图 3.1

21、 所示。图 3.1 键盘扫描程序流程图3.2 八位七段数码管显示程序八位七段数码管显示程序,采用动态显示,每个数码管均可以从 0 到9、A 到 F 的显示。通过查询键盘输出端的数据总线的通码值,将相应的通码在数码管上显示出来。程序见附录 A,八位七段数码管显示如图 3.2 所示。键盘驱动程序第 10 页(共 32 页) 图 3.2 八位七段数码管3.3 16*16 点阵显示程序16*16 点阵显示程序,通过查询数据总线的通码值,在 LED 点阵上显示键盘上相应的符号。程序见附录 B,16*16 点阵显示如图 3.3 所示。键盘驱动程序第 11 页(共 32 页) 图 3.3 16*16 点阵3

22、.4 键盘扫描程序扫描码有两种不同的类型:“通码” 和“断码”。当一个键被按下去或长按的时候,键盘就发送通码;当一个键被释放的时候,键盘就发送断码。每个键盘被分配了唯一的通码和断码,这样主机通过查找唯一的扫描码就可以确定是哪个按键被按下或释放。程序见附录 C。3.5 动态扫描程序动态扫描程序,控制八位七段数码管和 16*16 点阵单独显示,当系统时钟频率达到一定值时,显示效果就和静态显示一样了。程序见附录 D。键盘驱动程序第 12 页(共 32 页) 4 总结4.1 遇到的问题及解决课程设计一开始,老师先让我们熟悉了实验指导书上的实验一到实验六这六个实验,目的旨在于让我们熟悉课程设计的步骤以及

23、相关的软硬件知识。这六个实验相对来说比较简单,我与同学们基本上实现了仿真,只是我拿到的数据线有问题,实验的先前阶段我又没有发现这问题,所以一直没有实现仿真,后来问了下同学,才知道是数据线的问题,找到了症结所在,接下来的事就水到渠成了。课程设计不可能不碰到一些问题比如:硬件的问题,软件的问题,程序的问题。我们这次课程设计使用的是新的设备,所以基本上没有出现硬件故障,只是有个别同学没有看设备的使用说明书,在做实验时碰到了一些操作问题,像什么数字信号模块的时钟没有选对啊,实验箱的电源没有插好啊等等。仿真软件也由于我们先前做了六个基本实验,碰到的问题也不到,哦,记起来了,有个问题困扰了我们很多同学,就

24、是把实验箱与电脑连接的时候,发现实验箱与电脑无法正常的进行数据交换,我们很多同学开始都在想是不是实验箱坏了,后来发现是电脑没有找到硬件,经过扫描让电脑找到新的硬件后,问题也随之解决了。碰到问题最多的是在编程的时候,众所周知,编写程序是项很枯燥无味的事,幸好我们有些例子程序,这样我们也不需要完全把程序编出来,只要编某个模块就行了,这次使用的实验箱上的接口有很多是共用一个端口,这给我们造成了很大的麻烦,要不是老师告诉使用动态扫描的方法,我们也许还不能实现这次课程设计的仿真。4.2 扩展设想我们可以通过按下外接键盘的按键,使实验箱上除了显示键盘的扫描码外播放音乐的基准音符,也可以通过 12 位 LE

25、D 灯的点亮数目来记录你按下了多少次按键。键盘驱动程序第 13 页(共 32 页) 4.3 心得与体会设计之初,我对 EDA 知识的掌握应该说是还没入门,随着设计的深入,碰到了一系列的问题,为了实现仿真,我们就不得不去解决这一系列的问题,这样在解决问题的过程中我们不知不觉的就对 EDA 知识有了更深的了解,同时也巩固了以前的知识。通过编程,我发现 VHDL 语言跟 C 语言、汇编语言在某些方面是相通的,所以无形之中我也对计算机语言有了更深的认识。编程是很费神的,又是一项细致活,这很锻炼人,同时也磨练人的意志。其实不管做什么,只要你用心认真的去做,你总是会发现很多有用的知识,你也会学到很多。键盘

26、驱动程序第 14 页(共 32 页) 参考文献1 SOPCIIEDA 实验指导书(第二版)M2 SOPCII 使用手册(第二版)M3 谭会生 EDA 技术基础 M湖南大学出版社, 20044 潘松,黄继业EDA 技术实用教程(第二版)M科学出版社,2005键盘驱动程序第 15 页(共 32 页) 附录附录 A 八位七段数码管显示程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;-entity led isport( clk : in st

27、d_logic; -Clock Signaldata_in : in std_logic_vector(7 downto 0); -data busledag : out std_logic_vector(6 downto 0); -定义七位输出信号sel : out std_logic_vector(2 downto 0) -ledag Select); end led;-architecture behave of led issignal dcount : std_logic_vector(2 downto 0);signal adh,adl : std_logic_vector(6 d

28、ownto 0);signal adcount : std_logic_vector(7 downto 0);signal din_h,din_l : std_logic_vector(3 downto 0);signal coclk : std_logic;beginprocess(clk) -out enable signal beginif(clkevent and clk=1) thenif adcount=“10000000“ thencoclkadhadhadhadhadhadhadhadhadhadhadhadhadhadhadhadhadhadladladladladladla

29、dladladladladladladladladladladlledagledagledagledagledagledagledagledagledagdotcdotcdotcdotcdotcdotcdotcdotcdotcdotcdotcdotcdotcdotcdotcdotcdotcdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdot

30、rdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdot

31、rdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdot

32、rdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdot

33、rdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotrdotr=“1111111111111111“;end case; end if;end process;end behave;键盘驱动程序第 28 页(共 32 页) 附录 C 键盘扫描程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.al

34、l;USE IEEE.STD_LOGIC_ARITH.all;USE IEEE.STD_LOGIC_UNSIGNED.all;-ENTITY keyboard ISPORT( keyboard_clk, keyboard_data, clk , reset, read : IN STD_LOGIC;scan_code : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);scan_ready : OUT STD_LOGIC);END keyboard;-ARCHITECTURE rtl OF keyboard ISSIGNAL INCNT : std_logic_vector(

35、3 downto 0);SIGNAL SHIFTIN : std_logic_vector(8 downto 0);SIGNAL READ_CHAR : std_logic;SIGNAL INFLAG, ready_set : std_logic;SIGNAL keyboard_clk_filtered : std_logic;SIGNAL filter : std_logic_vector(7 downto 0);BEGINPROCESS (read, ready_set)BEGINIF read = 1 THEN scan_ready = 0;ELSIF ready_setEVENT an

36、d ready_set = 1 THENscan_ready = 1;END IF;END PROCESS;-This process filters the raw clock signal coming from the keyboard using a shift register and two AND gatesClock_filter: PROCESSBEGINWAIT UNTIL clkEVENT AND clk= 1;filter (6 DOWNTO 0) = filter(7 DOWNTO 1) ;filter(7) = keyboard_clk;IF filter = “11111111“ THEN keyboard_clk_filtered = 1;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报