verilog_矩阵键盘要点_第1页
verilog_矩阵键盘要点_第2页
verilog_矩阵键盘要点_第3页
verilog_矩阵键盘要点_第4页
verilog_矩阵键盘要点_第5页
已阅读5页,还剩7页未读, 继续免费阅读

下载本文档

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

文档简介

1、、矩阵键盘显示电路设计(显示键盘值的平方) 矩阵键盘显示电路的设计 一、实验目的 1、了解普通4 X 4键盘扫描的原理。 2、进一步加深七段码管显示过程的理解。 3、了解对输入/输出端口的定义方法。 二、实验原理 实现键盘有两种方案:一是采用现有的一些芯片实现键盘扫描;再就 是用软件实现键盘扫描。作为一个嵌入系统设计人员,总是会关心产品成 本。目前有很多芯片可以用来实现键盘扫描,但是键盘扫描的软件实现方 法有助于缩减一个系 统的重复开发成本,且只需要很少的 CPU开销。嵌 入式控制器的功能能强,可 能充分利用这一资源,这里就介绍一下软键盘 的实现方案。 VCC 图10-1 简单键盘电路 通常在

2、一个键盘中使用了一个瞬时接触开关, 并且用如图10-1所示 的简单电路,微处理器可以容易地检测到闭合。当开关打开时,通过处理器 的I/O 口的一个上拉电阻提供逻辑 1;当开关闭合时,处理器的/IO 口的 输入将被拉低得到逻辑 0。可遗憾的是,开关并不完善,因为当它们被按 下或者被释放时,并不能够产生一个明确的1或者0。尽管触点可能看起来 稳定而且很快地闭合,但与微处理器快速的运行速度相比,这种动作是比 较慢的。当触点闭合时,其弹起就像一个球。弹起效果将产生如图10-2所示 的好几个脉冲。弹起的持续时间通常将维 持在5ms0ms之间。如果需要多 个键,则可以将每个开关连接到微处理器上它自己的输入

3、端口。然而,当 开关的数目增加时,这种方法将很快使用完所有的输入端口。 1 | | o U o30ms 图10-2按键抖动 键盘上阵列这些开关最有效的方法(当需要5个以上的键时)就形成了一 个如图10-3所示的二维矩阵。当行和列的数目一样多时,也就是方型的矩 阵,将产生一个最优化的布列方式(I/O端被连接的时候),一个瞬时接触 开关(按钮)放置在每一行与线一列的交叉点。矩阵所需的键的数目显然根据 应用程序而不同 每一行由一个输出端口的一位驱动,而每一列由一个电 阻器上拉且供 给输入端口一位。 一 3 H2 13 T7 Bl 盟 B3 *5 图10-3矩阵键盘 键盘扫描的实现过程如下:对于4X

4、4键盘,通常连接为4行、4列,因 此要识别按键,只需要知道是哪一行和哪一列即可,为了完成这一识别过 程,我们的思想是,首先固定输出4行为高电平,然后输出4列为低电平, 在读入输出的4行的值,通常高电平会被低电平拉低,如果读入的4行均为 高电平,那么肯定没有按键按下,否则,如果读入的 4行有一位为低电平, 那么对应的该行肯定有一个按键按下,这样便可以获取到按键的行值。同 理,获取列值也是如此,先输出4列为高电平,然后在输出4行为低电平, 再读入列值,如果其中有哪一位为低电平,那么肯定对应的那一列有按键 按下。 获取到行值和列值以后,组合成一个8位的数据,根据实现不同的编码在 对每个按键进行匹配,

5、找到键值后在7段码管显示。 三、实验内容 本实验要求完成的任务是通过编程实现对 4X4矩阵键盘按下键的键值的 读 取,并在数码管上完成一定功能(如移动等)的显示。按键盘的定义,按 下“* ”键则在数码管是显示“ E”键值。按下“ #”键在数码管上显示“ F” 键值。其它的键则按键盘上的标识进行显示。 在此实验中数码管与 FPGA的连接电路和管脚连接在以前的实验中都 做了详细说明,这里不在赘述。本实验箱上的 4X4矩阵键盘的电路原理如 表10-14X4矩阵键与F PGA的管脚连接表 信号名称 对应FPGA管脚名 说明 KEY-CO B8 矩阵键盘的第 1列选择 KEY-C1 A9 矩阵键盘的第

6、2列选择 KEY-C2 B9 矩阵键盘的第 3列选择 KEY-C3 E5 矩阵键盘的第 4列选择 KEY-R0 B6 矩阵键盘的第1行选择 KEY-R1 A7 矩阵键盘的第 2行选择 KEY-R2 B7 矩阵键盘的第 3行选择 KEY-R3 A8 矩阵键盘的第 4行选择 四、实验步骤 1、打开QUARTUSII软件,新建一个工程。 2、建完工程之后,再新建一个VHDL File,打开VHDL编辑器对话框。 3、 按照实验原理和自己的想法,在 VHDL编辑窗口编写VHDL程序, 用户可参照光盘中提供的示例程序。 4、编写完VHDL程序后,保存起来。方法同实验一o 5、对自己编写的VHDL程序进行

7、编译并仿真,对程序的错误进行修改。 6编译仿真无误后,依照4X4矩阵键、数码管与FPGA的管脚连接表 (表或参照附录)进行管脚分配。表10-2是示例程序的管脚分配表。分配完 成后,再进行全编译一次,以使管脚分配生效。 表10-2端口管脚分 端口名 使用模块信号 对应FPGA管脚 说明 CLK 数字信号源 C13 时钟为 1KHZ KR0 4*4矩阵键盘 R0 B6 矩阵键盘行信号 KR1 4*4矩阵键盘 R1 A7 KR2 4*4矩阵键盘 R2 B7 KR3 4*4矩阵键盘 R3 A8 KC0 4*4矩阵键盘 C0 B8 矩阵键盘列信号 KC1 4*4矩阵键盘 C1 A9 配表 KC2 4*4

8、矩阵键盘C2 B9 矩阵键盘列信号 KC3 4*4矩阵键盘C3 E5 A 数码管模块 A段 F13 键值显示 B 数码管模块 B段 F14 C 数码管模块C段 F15 D 数码管模块 D段 E15 E 数码管模块 E段 F16 F 数码管模块 F段 F17 G 数码管模块G段 E18 SA 数码管模块 SEL0 G18 SB 数码管模块 SEL1 G17 SC 数码管模块 SEL2 G16 7、用下载电缆通过JTAG 口将对应的sof文件加载到FPGA中。观察实 验 结果是否与自己的编程思想一致 五、实验结果与现象 以设计的参考示例为例,当设计文件加载到目标器件后,将数字信号 源模块 的时钟选

9、择为1KHz ,按动“模式”按键使单8字数码管显示“0”(参 考实验四),按下矩阵键盘的某一个键,则在数码管上显示对应的这个键标 识的键值,当再按下第二个键的时候前一个键的键值在数码管上左移一位。 按下“*”键则在数码管是显示“E”键值。按下“#”键在数码管上显示“F” 键 值。 /* 工 程: 4x4 矩阵键盘 日 期: 2011-08-3 最后修改: 功 能:键盘 说 明:ROW【3:0】设为输入,COL【3:0】设为输出。 如果没有按键按下,则 ROW【 3:0】一直被上 拉为高电平,且 COL 【3:0】有低电平输出, ROW【 3:0】中才有可能低电平输入。 */ module ke

10、ys(clk_50M,rst_n,row,col,dataout,smg_wei); * output 3:0col; input rst_n; input clk_50M; input 3:0row; output 7:0dataout; output 7:0smg_wei; /矩阵键盘列 /复位键 /系统时钟 /矩阵键盘行 /键盘值数码管显示数据 /数码管显示使能 assign smg_wei=0;/八个数码管显示 reg 7:0dataout; reg 3:0col; reg 3:0key_board_val; * /*/ /分频部分开始 /*/ reg19:0cnt; /计数子 alw

11、ays (posedge clk_50M or negedge rst_n) if(!rst_n) cnt=0; else cnt=cnt+1b1; wire key_clk=cnt19; / 2A20/50M=21ms /* 状态机部分 独热码编码 */ parameter NO_KEY_PRESSED=6b000_001;/ 没有键按 parameter SCAN_COL0 parameter SCAN_COL1 parameter SCAN_COL2 parameter SCAN_COL3 parameter KEY_PRESSED =6b000_010;/ 扫描第 =6b000_100

12、;/ 扫描第 =6b001_000;/ 扫描第 =6b010_000;/ 扫描第 列 列 列 列 =6b100_000;/ 有键按下 /*/ reg 5:0current_state,next_state; / 现态和次态 /*/ /复位 /*/ always (posedge key_clk or negedge rst_n) if(!rst_n) current_state=NO_KEY_PRESSED; else current_state=next_state; */ always * /(current_state)/ 根据条件转移状态 case (current_state) NO

13、_KEY_PRESSED: / 没有键按下 if(row!=4hf) next_state=SCAN_COL0; else next_state=NO_KEY_PRESSED; SCAN_COL0: / 扫描第 0 列 if(row!=4hf) next_state=KEY_PRESSED; else next_state=SCAN_COL1; SCAN_COL1:/扫描第 1 列 if(row!=4hf) next_state=KEY_PRESSED; else next_state=SCAN_COL2; SCAN_COL2:/扫描第 2 列 if(row!=4hf) next_state=

14、KEY_PRESSED; else next_state=SCAN_COL3; SCAN_COL3:/扫描第 3 列 if(row!=4hf) next_state=KEY_PRESSED; else next_state=NO_KEY_PRESSED; KEY_PRESSED:/有按键按下 if(row!=4hf) next_state=KEY_PRESSED; else next_state=NO_KEY_PRESSED; endcase * reg key_pressed_flag; / 按键按下标志 reg 3:0col_val; reg 3:0row_val; /列值 /行值 * /

15、根据次态,给相应的寄存器赋值 * always (posedge key_clk or negedge rst_n) if(!rst_n)/ 复位 begin col=4h0; key_pressed_flag=0; end else case (next_state) NO_KEY_PRESSED: begin col=4h0; key_pressed_flag=0; end SCAN_COL0: col=4b1110; SCAN_COL1: col=4b1101; SCAN_COL2: col=4b1011; SCAN_COL3: col=4b0111; KEY_PRESSED: begi

16、n col_val=col; / / 扫描第 0 列 / 扫描第 1 列 / 扫描第 2 列 /扫描第 3 列 /有按键按下 锁存列值 row_val=row; / 锁存行值 key_pressed_flag=1; / 键盘值转换为数码管显示 / 置键盘按下标 */ / 扫描行列值部分 开始 end endcase * */ * always (posedge key_clk or negedge rst_n) if(!rst_n) key_board_val=4h0; else if(key_pressed_flag) case(col_val,row_val) 8b11101110 : k

17、ey_board_val = 4h0; 8b11101101 : key_board_val = 4h4; 8b11101011 : key_board_val = 4h8; 8b11100111 : key_board_val = 4hC; 8b11011110 : key_board_val = 4h1; 8b11011101 : key_board_val = 4h5; 8b11011011 : key_board_val = 4h9; 8b11010111 : key_board_val = 4hD; 8b10111110 : key_board_val = 4h2; 8b101111

18、01 : key_board_val = 4h6; 8b10111011 : key_board_val = 4hA; 8b10110111 : key_board_val = 4hE; 8b01111110 : key_board_val = 4h3; 8b01111101 : key_board_val = 4h7; 8b01111011 : key_board_val = 4hB; 8b01110111 : key_board_val = 4hF; endcase * /* */ always * /(key_board_val) begin case(key_board_val) 4h0: dataout=8b11000000; /0 4h1: dataout=8b11111001; /1 4h2: dataout=8b10100100; /2 4h3: dataout=8b10110000; /3 4h4: dataout=8b10011001; /4 4h5: dataout=8b10010010; /5 4h6: dataout=8b10000010; /6

温馨提示

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

最新文档

评论

0/150

提交评论