矩阵键盘EDA技术课程设计.docx

上传人:说****呢 文档编号:86897504 上传时间:2023-04-15 格式:DOCX 页数:20 大小:237.22KB
返回 下载 相关 举报
矩阵键盘EDA技术课程设计.docx_第1页
第1页 / 共20页
矩阵键盘EDA技术课程设计.docx_第2页
第2页 / 共20页
点击查看更多>>
资源描述

《矩阵键盘EDA技术课程设计.docx》由会员分享,可在线阅读,更多相关《矩阵键盘EDA技术课程设计.docx(20页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、电子设计 EDA课程设计专 业: 电子信息科学与技术班 级:2023 级电信本1班姓 名: *学 号: *指导教师: *完成时间: 2023.112023.12教师评分:目 录一、绪论11.1 FPGA 概况11.2 本课题的争论意义2二、课程设计的任务和目的3三、矩阵键盘接口电路的原理与总体设计33.1 矩阵键盘接口电路的原理33.2 总体设计5四、各模块的设计及仿真64.1 键盘扫描电路64.2 键盘译码电路和按键标志位产生电路84.3 时钟产生模块104.4 键盘接口电路顶层电路实现12五、参考文献13六、心得体会13七、附录147.1 源程序代码142题目:矩阵键盘把握接口设计一、绪论

2、1.1 FPGA 概况早期的可编程规律器件只有可编程只读存储器 (PROM)、紫外线可擦除只读存储器(EPROM)和电可擦除只读存储器(E2PROM)三种。由于构造的限制,它们只能完成简洁的数字规律功能。其后消灭了一类构造上稍简洁的可编程芯片,即可编程规律器件 (PLD),它能够完成各种数字规律功能。典型的PLD 由一个“与”门和一个“或”门阵列组成,而任意一个组合规律都可以用“与或”表达式来描述,所以PLD 能以乘积和的形式完成大量的组合规律功能。这一阶段的产品主要有 PAL(可编程阵列规律)和 GAL(通用阵列规律)。 PAL 由一个可编程的“与”平面和一个固定的“或”平面构成,或门的输出

3、可以通过触发器有选择地被置为存放状态。PAL 器件是现场可编程的,它的实现工艺有反熔丝技术、EPROM 技术和 E2PROM 技术。还有一类构造更为灵敏的规律器件是可编程规律阵列(PLA),它也由一个“与”平面和一个“或”平面构成,但是这两个平面的连接关系是可编程的。 PLA 器件既有现场可编程的,也有掩膜可编程的。在PAL 的根底上又进展了一种通用阵列规律(GAL、Generic ArrayLogic),如 GAL16V8、GAL22V10 等。它承受了 EPROM 工艺, 实现了电可擦除、电可改写,其输出构造是可编程的规律宏单元,因而它的设计具有很强的灵敏性,至今仍有很多人使用。这些早期的

4、PLD 器件的一个共同特点是可以实现速度特性较好的规律功能,但其过于简洁的构造也使它们只能实现规模较小的电路。为了弥补这一缺陷,20 世纪 80 年月中期,Altera 和 Xilinx 分别推出了类似于 PAL 构造的扩展 型 CPLD(Complex Programmable Logic Dvice) 和与标 准门阵列类似的FPGA(FieldProgrammable Gate Array),它们都具有体系构造和规律单元灵敏、集成度高以及适用范围宽等特点。这两种器件兼容了PLD 和通用门阵列的优点,可实现较大规模的电路,编程也很灵敏。与门阵列等其他 ASIC(Application Spe

5、cific IC)相比,它们又具有设计开发周期短、设计制造本钱低、开发工具先进、标准产品不需测试、质量1稳定以及可实时在线检验等优点,因此被广泛应用于产品的原型设计和产品生产一般在 10 000 件以下之中。几乎全部应用门阵列、PLD 和中小规模通用数字集成电路的场合均可应用 FPGA 和 CPLD 器件。1.2 本课题的争论意义近年来 EDA 技术在电子领域引发的技术革命,推动着电子技术的迅猛进展,为世人所瞩目,而 FPGA 为代表的可编程规律器件的应用,更是受到业内人士的普遍关注。伴随着大规模集成电路和计算机技术的高速进展,在设计工业自动化,仪器仪表,计算机设计与应用、通信、国防等领域的电

6、子系统中,FPGA 技术的含量正以惊人的速度提升。将尽可能大的完整的电子系统在单一 FPGA 芯片中实现已成为现实,电子类技术工程的开发也更多地依靠于 FPGA 技术的应用。作为 FPGA 争论课题之一的矩阵键盘把握接口电路的设计,在 FPGA 设计中是一个常常被提到的话题,就像是利用 PFGA 设计数字中一样,虽然简洁,但是却是一个很有争论意义的话题,涉及到怎么样才能是 FPGA 资源更加充分利用,现在很多电子产品都涉及到按键,小的有独立按键,大的有N*N 的矩阵键盘,独立按键由于案件的个数少,也就没必要考虑资源的利用问题了。而矩阵键盘,由于按键多,对整个系统的影响大,所以确定要考虑资源的利

7、用问题,而且还要考虑一下电路里面的时序问题。本次设计要求设计一个 4*9 矩阵键盘,也就是行为 4,列为 9,一共可以设计 36 个按键。其中设计方法为:一般推断键盘中有没有按键按下是通过航线送入扫描信号,然后从列线中读取状态得到的,其方法是依次给行线送入低电平,检查列线的输入。假设列线信号趣味高电平,则代表低电平信号所在的行中无按键按下,反之,则有,则在低电平信号所在的行和消灭低电平的穿插处有按键按下。一共有三个模块,分别为:扫描电路模块、时钟产生模块、键盘译码电路和按键标志位产生电路。扫描模块中是为了产生扫描信号,来利用扫描信号来扫描键盘中中是否有按键按下。键盘译码电路和按键标志位产生电路

8、是为了协作扫描模块来扫描电路中是否有按键按下,而且还要求它来产生按键标志信号,以便和外部电路握手。时钟产生电路是为了产生不同频率的信号,来驱动上面两个电路的运转。在设计完各个模块后,还要对每个模块进展仿真,在仿真的过程中要对参数细心设计,要不然看不出结果的。2二、课程设计的任务和目的20 世纪 90 年月,国际上电子和计算机技术较先进的国家,始终在乐观探究的电子电路设计方法,并在设计方法、工具等方面进展了彻底的变革,取得了巨大成功。在电子技术设计领域,可编程规律器件如CPLD、FPGA的应用,已得到广泛的普及,这些器件为数字系统的设计带来了极大的灵敏性。这一切极大地转变了传统的数字系统设计方法

9、、设计过程和设计观念,促进了 EDA 技术的快速进展。本次设计在EDA 开发平台QUARTUS7.2 上利用VHDL 语言设计矩阵键盘把握接口电路。要求设计一个 49 矩阵键盘,一共有三个模块,分别为:扫描电路模块、时钟产生模块、键盘译码电路和按键标志位产生电路。扫描模块中是为了产生扫描信号,来利用扫描信号来扫描键盘中是否有按键按下。键盘译码电路和按键标志位产生电路也是为了协作扫描模块来扫描电路中是否有按键按下,而且还要求它来产生按键标志信号,以便和外部电路握手。时钟产生电路是为了产生不同频率的信号,来驱动上面两个电路的运转。通过对课题的分析争论,把握了 VHDL 语言编程方法,同时也增加了个

10、人的学习力气和动手力气。三、矩阵键盘接口电路的原理与总体设计本章首先介绍矩阵键盘的设计思路,总体来说行线输出是低电平,一旦有键按下, 则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。最终介绍 4*9 键盘的总体设计思路。3.1 矩阵键盘接口电路的原理在键盘中按键数量较多时,为了削减 I/O 口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在穿插处不直接连通,而是通过一个按键加以连接。这样,一个端口就可以构成 4*4=16 个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区分越明显,比方再多加一条线就可以构成 20 键的键盘,而直接用端口线则

11、只能多出一键9 键。由此可见,在需要的键数比较多时,承受矩阵法来做键盘是合理的。矩阵式构造的键盘明显比直接法要简洁一些,识别也要简洁一些,列线通过电阻接正电源,并将行线所接的 FPGA 的 I/O 口作为输出端,而列线所接的 I/O 口3则作为输入。这样,当按键没有按下时,全部的输出端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。行列式键盘的电路原理如图 3.1.1 所示:为了说明问题以 4*4 为例Keyin3 Keyin2 Keyin1Keyin0FPGAKeydrv0Keydrv01234Keydrv056

12、78Keydrv090ABCDEF+5V+5v图 3.1.1行列式键盘的电路原理图设置扫描信号为 keydrv3keydrv0,列线按键输入信号 keyin3keyin0 与按键位置的关系如表 3.1.1 所示:表 3.1.1 扫描信号和列线按键输入信号与按键之间的关系表keydrv3keydrv0keyin3keyin0对应的按键111011110110121011301114111051101611011011701118411109110101011A0111B1110C1101D1011E0111F101101113.2 总体设计矩阵键盘把握系统的总体设计如图 3.2.1 所示:键盘译

13、码电路keyvalu按键标志产生电路keypresseKeydrv3.04*9 键盘扫描电路时钟产生电路clk图 3.2.1键盘接口电路构造图由行列式键盘原理就可以知道,要正确的完成键盘输入工作必需有按键扫描电路产生 keydrv3keydrv0 信号,同时还必需有按键译码电路从 keydrv3keydrv0 信号和keyin3keyin0 信号中译码出按键的值。此外,一般还需要一个按键发生信号用于和其他模块接口,通知其他模块键盘上有按键动作发生,并可以从键盘上读取按键的键值。由于各个模块需要的时钟频率是不一样的,因此时钟产生模块就是用于产生各个模块需要的时钟信号。因此得到键盘接口电路的构造如

14、上图所示。5四、各模块的设计及仿真4.1 键盘扫描电路键盘扫描电路是用于产生 keydrv3keydrv0信号, 其变化的挨次依次是1110-1101-10110111-周而复始地扫描。其停留在某个状态的时间大约为10ms。更短的停留时间是没有必要的,由于人按键的时间大约为 10ms,不行能有更快的按键动作发生;另外,更短的停留时间还简洁采集到抖动信号,会干扰推断,而太长的停留时间则会使某些较快的按键东走丧失。键盘扫描电路的外部接口电路如图 4.1.1 所示,其中 clk_scan 是周期为 10ms 的扫描时钟,keydrv 为输出到键盘的扫描信号,宽度为 4 位。图 4.1.1键盘扫描电路

15、的外部接口电路图其 VHDL 描述如下:LIBRARY ieee;USE ieee.std_logic_1164.all; ENTITY key_scan IS- ALTERA_IO_BEGIN DO NOT REMOVE THIS LINE! PORT(clk_scan : IN STD_LOGIC;-扫描时钟,周期 10ms keydrv : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)-输出扫描信号);- ALTERA_IO_END DO NOT REMOVE THIS LINE!END key_scan;-Architecture BodyARCHITECTURE

16、key_scan_architecture OF key_scan IS CONSTANT s0 :STD_LOGIC_VECTOR (3 DOWNTO 0):=“1110“ ;-定义状态机编码CONSTANTs1:STD_LOGIC_VECTOR(3DOWNTO0):=“1101“;CONSTANTs2:STD_LOGIC_VECTOR(3DOWNTO0):=“1011“;CONSTANTs3:STD_LOGIC_VECTOR(3DOWNTO0):=“0111“;SIGNAL present_state:STD_LOGIC_VECTOR(3 DOWNTO 0);6-状态机现态SIGNAL n

17、ext_state:STD_LOGIC_VECTOR(3 DOWNTO 0);-状态机次态BEGIN-状态更进程PROCESS(clk_scan) BEGINIF(clk_scan”event and clk_scan=”1”) then present_statenext_statenext_statenext_statenext_statenext_state=s0; END CASE;END PROCESS;-输出译码keydrv=present_state;END key_scan_architecture;以上程序承受一个状态机来实现扫描电路。该状态机是一个one-hot 状态机,并

18、且输出值就是状态机的状态,没有通过一个规律电路来做输出译码。这样的好处是得到的输出信号比较“干净”,没有毛刺。其仿真波形如图 4.1.2 所示:图 4.1.2键盘扫描电路的仿真图7从图 4.1.2 中很简洁觉察 present_state 的值的变化是随着扫描信号 key_scan 的上升沿的到来而变化的,也就是 key_scan 每来一个脉冲,相应的 present_state 的值就变化一次。很简洁觉察 keydrv 的值的变化挨次为 1110-1101-1011-0111,也就是每个 key_scan 来一个脉冲时,保证keydrv 相邻的值只有一个变化,这样为了防止产生不必要的毛刺。p

19、resent_state 值和 keydrv 值是一样的,只不过一个用的是二进制, 一个用的是十进制,所以它的变化为 1413117。4.2 键盘译码电路和按键标志位产生电路键盘译码电路是从keydrv3keydrv0 和keyin3keyin0 信号中译码出按键的键值的电路,它的真值表就是以前行扫描信号、列扫描与按键位置的关系图。按键标志位产生电路是产生按键标志位信号 keypressed 的电路。由于这两个电路关系严密,因此放入同一个模块中实现,其外部接口图如图 4.2.1 所示。其中 clk 为局信号,它是由 FPGA 芯片的外部晶振给出的。 clk 在系统中的频率是最高,其他时钟都是它

20、的分频产生。keydrv 为键盘扫描信号,keyin 为键盘输入信号,keyvalue 为键值代表按键所在的位置,keypressed 表示有一个按键被按下,每发生一次按键动作,keypressed 就输出一个宽度为全局时钟周期的正脉冲。该信号用于与其他模块握手,负责通知其他模块键盘是否有按键发生。其他模块在 keypressed 有效时,可以读取键值。图 4.2.1键盘译码电路的外部接口其 VHDL 实现如下:LIBRARY ieee;USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ENTITY keydecoder IS

21、PORT(clk : IN STD_LOGIC;-全局时钟clk_scan : IN STD_LOGIC;-扫描时钟8keyin : IN STD_LOGIC_VECTOR(8 DOWNTO 0);-键盘输入keydrv : IN STD_LOGIC_VECTOR(3 DOWNTO 0); -扫描信号keyvalue : OUT STD_LOGIC_VECTOR(8 DOWNTO 0);-键值keypressed : OUT STD_LOGIC-有按键按下);END keydecoder;ARCHITECTURE keydecoder_architecture OF keydecoder IS

22、-TEMP =keyin & keydrv;SIGNAL temp:STD_LOGIC_VECTOR(12 DOWNTO 0) ;SIGNAL temp_pressed: STD_LOGIC; SIGNAL keypressed_asy: STD_LOGIC; SIGNAL q1,q2,q3,q4,q5,q6 :STD_LOGIC; BEGINtemp=keyin & keydrv;-译码进程 参见附录程序-按键标志产生电路process (clk_scan) beginif (clk_scan”event and clk_scan=”1”) then q1=temp_pressed;q2=q

23、1; q3=q2; q4=q1;end if;keypressed_asy=q1 or q2 or q3 or q4 ; end process;-同步化 keypressed_asy process(clk)beginif(clk”event and clk=”1”) then q5=keypressed_asy; q6=q5;end if;keypressed=q5 and not(q6) ; end process;END keydecoder_architecture;上面程序是改进的程序,原程序是:-同步化有键被按下PROCESSclk BEGINIFclk”event and cl

24、k =”1”THEN9q1=temp_pressed; q2=q1;END IF;keypressed=q1 and not(q2) ; END PROCESS;END keydecoder_architecture;上面程序中有两个进程。第一个进程负责译码,值得留意的是 WHEN OTHEN 语句有没有对 temp_pressed 和 keyvalue 信号赋值,这相当于不转变 temp_presed 和 keyvalue 信号的值,即实现了锁存输出。在不需要锁存输出时,在 WHEN O-THEN 语句中,确定要对全部的 case 语句中消灭的信号逐一赋值,以免产生意想不到的结果。其次个进程

25、负责把按键同步信号同步化与全局时钟同步的并且脉宽为一个周期的脉冲。重编写按键发生标志电路,该电路不仅要解决按键抖动导致一次按键被当成屡次的问题,同时还要解决按键太长导致一次按键被当成屡次的问题。考虑这些因素之后,编写的程序应当是阴影局部的程序。该电路的仿真结果如图 4.2.2 所示:图 4.2.2键盘译码电路仿真图通过仿真波形图可以看出,按键的抖动不会影响输出结果;无论一个按键动作持续时间有多久,但照旧认为是一个按键。4.3 时钟产生模块时钟产生模块是用于扫描时钟的,它的输出供给给键盘扫描模块和按键标志位的产生模块,其外部接口图如图 4.3.1 所示:10图 4.3.1时钟产生模块外部接口电路

26、其 VHDL 实现如下:LIBRARY ieee;USE ieee.std_logic_1164.all; USE ieee.std_logic_ARITH.all; ENTITY clk_gen ISPORT(clk: IN STD_LOGIC;-全局时钟clk_scan : OUT STD_LOGIC-扫描时钟);END clk_gen;ARCHITECTURE clk_gen_architecture OF clk_gen IS-做程序仿真时,用这个语句signal cnt :integer range 0 to 150;-需要下载到芯片上时,替换为下面这个语句signal cnt :i

27、nteger range 0 to 119999; begin-计数模块process(clk) beginif(clk”event and clk =”1”) then if (cnt=cnt”high) thencnt=0; elsecnt=cnt”high/2 thenclk_scan=”1”; elseclk_scankeyvalue=conv_std_logic_vector(1,9); temp_pressed keyvalue=conv_std_logic_vector(2,9); temp_pressed keyvalue=conv_std_logic_vector(3,9);

28、 temp_pressed keyvalue=conv_std_logic_vector(4,9); temp_pressed keyvalue=conv_std_logic_vector(5,9); temp_pressed keyvalue=conv_std_logic_vector(6,9); temp_pressed keyvalue=conv_std_logic_vector(7,9); temp_pressed keyvalue=conv_std_logic_vector(8,9); temp_pressed keyvalue=conv_std_logic_vector(9,9);

29、 temp_pressed keyvalue=conv_std_logic_vector(10,9); temp_pressed keyvalue=conv_std_logic_vector(11,9); temp_pressed keyvalue=conv_std_logic_vector(12,9); temp_pressed keyvalue=conv_std_logic_vector(13,9); temp_pressed keyvalue=conv_std_logic_vector(14,9); temp_pressed keyvalue=conv_std_logic_vector(

30、15,9); temp_pressed keyvalue=conv_std_logic_vector(16,9); temp_pressed keyvalue=conv_std_logic_vector(17,9); temp_pressed keyvalue=conv_std_logic_vector(18,9); temp_pressed keyvalue=conv_std_logic_vector(19,9); temp_pressed keyvalue=conv_std_logic_vector(20,9); temp_pressed keyvalue=conv_std_logic_v

31、ector(21,9); temp_pressed keyvalue=conv_std_logic_vector(22,9); temp_pressed keyvalue=conv_std_logic_vector(23,9); temp_pressed keyvalue=conv_std_logic_vector(24,9); temp_pressed keyvalue=conv_std_logic_vector(25,9); temp_pressed keyvalue=conv_std_logic_vector(26,9); temp_pressed keyvalue=conv_std_l

32、ogic_vector(27,9); temp_pressed keyvalue=conv_std_logic_vector(28,9); temp_pressed keyvalue=conv_std_logic_vector(29,9); temp_pressed keyvalue=conv_std_logic_vector(30,9); temp_pressed keyvalue=conv_std_logic_vector(31,9); temp_pressed keyvalue=conv_std_logic_vector(32,9); temp_pressed keyvalue=conv_std_logic_vector(33,9); temp_pressed keyvalue=conv_std_logic_vector(34,9); temp_pressed keyvalue=conv_std_logic_vector(35,9); temp_pressed keyvalue=conv_std_logic_vector(36,9); temp_pressed temp_pressed=”0”;end case; end process;15

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁