《verilog_矩阵键盘要点.pdf》由会员分享,可在线阅读,更多相关《verilog_矩阵键盘要点.pdf(12页珍藏版)》请在三一文库上搜索。
1、二、矩阵键盘显示电路设计(显示键盘值的平方) 矩阵键盘显示电路的设计 一 、实 验 目 的 1、了解普通 4 4 键盘扫描的原理。 2、进一步加深七段码管显示过程的理解。 3、了解对输入 /输出端口的定义方法。 二 、 实 验 原 理 实现键盘有两种方案:一是采用现有的一些芯片实现键盘扫描;再就 是用软 件实现键盘扫描。作为一个嵌入系统设计人员,总是会关心产品成 本。目前有很多芯片可以用来实现键盘扫描,但是键盘扫描的软件实现方 法有助于缩减一个系统的重复开发成本,且只需要很少的CPU 开销。嵌 入式控制器的功能能强,可能充分利用这一资源,这里就介绍一下软键盘 的实现方案。 图 10-1 简单键
2、盘电路 通常在一个键盘中使用了一个瞬时接触开关,并且用如图10-1 所示 的简单电路,微处理器可以容易地检测到闭合。当开关打开时, 通过处理器 的 I/O 口的一个上拉电阻提供逻辑1;当开关闭合时,处理器的/IO口的 输入将被拉低得到逻辑0。可遗憾的是,开关并不完善,因为当它们被按 下或者被释放时,并不能够产生一个明确的 1或者 0。尽管触点可能看起来 稳定而且很快地闭合,但与微处理器快速的运行速度相比,这种动作是比 较慢的。当触点闭合时, 其弹起就像一个球。 弹起效果将产生如图 10-2所示 的好几个脉冲。 弹起的持续时间通常将维持在 5ms 30ms 之间。如果需要多 个键,则可以将每个开
3、关连接到微处理器上它 自己的输入端口。然而,当 开关的数目增加时,这种方法将很快使用完所有的输入端口。 图 10-2 按键抖动 键盘上阵列这些开关最有效的方法 (当需要 5个以上的键时)就形成了一 个如图 10-3 所示的二维矩阵。 当行和列的数目一样多时,也就是方型的矩 阵,将产生一个最优化的布列方式(I/O 端被连接的时候),一个瞬时接触 开关(按钮)放置在每一行与线一列的交叉点。 矩阵所需的键的数目显然根据 应用程序而不同。每一行由一个输出端口的一位驱动,而每一列由一个电 阻器 上拉且供给输入端口一位。 图 10-3 矩阵键盘 键盘扫描的实现过程如下:对于4 4键盘,通常连接为 4行、4
4、列,因 此要识别按键,只需要知道是哪一行和哪一列即可,为了完成这一识别过 程,我们的思想是,首先固定输出4行为高电平,然后输出 4列为低电平, 在读入输出的 4行的值,通常高电平会被低电平拉低,如果读入的 4 行均为 高电平,那么肯定没有按键按下,否则,如果读入的4 行有一位为低电平, 那么对应的该行肯定有一个按键按下,这样便可以获取到按键的行值。同 理,获取列值也是如此,先输出4 列为高电平,然后在输出4 行为低电平, 再读入列值,如果其中有哪一位为低电平,那么肯定对应的那一列有按键 按下。 获取到行值和列值以后,组合成一个8位的数据,根据实现不同的编码在 对每个按键进行匹配,找到键值后在7
5、段码管显示。 三 、 实 验 内 容 本实验要求完成的任务是通过编程实现对4X4矩阵键盘按下键的键值的 读 取,并在数码管上完成一定功能 (如移动等) 的显示。 按键盘的定义, 按 下“*” 键则在数码管是显示“ E”键值。按下“ #”键在数码管上显示“ F” 键值。其它的键则按键盘上的标识进行显示。 在此实验中数码管与FPGA的连接电路和管脚连接在以前的实验中都 做了详细说明,这里不在赘述。本实验箱上的 4X4 矩阵键盘的电路原理如 图 10-4 所示。与 FPGA 的管脚连接如表 10-1 所示。 图 10-4 4X4 矩阵键盘电路原理图 表 10-1 4X4 矩阵键与 FPGA 的管脚连
6、接表 信号名称对应FPGA 管脚名说明 KEY-C0 B8 矩阵键盘的第1 列选择 KEY-C1 A9 矩阵键盘的第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 编辑窗口
7、编写 VHDL 程序, 用户可参照光盘中提供的示例程序。 4、编写完VHDL 程序后,保存起来。方法同实验一。 5、对自己编写的 VHDL 程序进行编译并仿真,对程序的错误进行修改。 6、编译仿真无误后, 依照 4X4 矩阵键、数码管与 FPGA 的管脚连接表 (表或参照附录)进行管脚分配。 表10-2 是示例程序的管脚分配表。 分配完 成后,再进行全编译一次,以使管脚分配生效。 表 10-2 端口管脚分 配表 KC2 4*4 矩阵键盘C2 B9 矩阵键盘列信号 KC3 4*4 矩阵键盘C3 E5 A 数码管模块A 段F13 键值显示 B 数码管模块B 段F14 C 数码管模块C 段F15 D
8、 数码管模块D 段E15 E 数码管模块E 段F16 F 数码管模块F 段F17 G 数码管模块G 段E18 SA 数码管模块SEL0 G18 SB 数码管模块SEL1 G17 SC 数码管模块SEL2 G16 7、用下载电缆通过 JTAG 口将对应的 sof 文件加载到 FPGA 中。观察实 验 结果是否与自己的编程思想一致。 五 、 实 验 结 果 与 现 象 端口名使用模块信号对应FPGA 管脚 说明 CLK 数字信号源C13 时钟为1KHZ KR0 4*4 矩阵键盘R0 B6 矩阵键盘行信号 KR1 4*4 矩阵键盘R1 A7 KR2 4*4 矩阵键盘R2 B7 KR3 4*4 矩阵键
9、盘R3 A8 KC0 4*4 矩阵键盘C0 B8 矩阵键盘列信号 KC1 4*4 矩阵键盘C1 A9 以设计的参考示例为例,当设计文件加载到目标器件后,将数字信号 源模块 的时钟选择为 1KHz,按动“模式”按键使单 8字数码管显示“0” (参 考实验四),按下矩阵键盘的某一个键,则在数码管上显示对应的这个键标 识的键值,当再按下第二个键的时候前一个键的键值在数码管上左移一位。 按下“*”键则在数码管是显示 “E”键值。按下“#”键在数码管上显示 “F” 键 值。 /* 工程: 4x4 矩阵键盘 日期: 2011-08-3 最后修改: 功能:键盘 说明: ROW 【3:0】设为输入, COL
10、【 3:0】设为输出。 如果没有按键按下,则ROW【3:0】一直被上 拉为高电平,且COL 【3:0】有低电平输出, ROW 【3:0】中才有可能低电平输入。 */ module keys(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; /数码管显示使能 reg 7:0dataout; reg
11、3:0col; reg 3:0key_board_val; /*/ assign smg_wei=0; /八个数码管显示 /*/ /分频部分开始 /*/ reg19:0cnt; /计数子 always (posedge clk_50M or negedge rst_n) if(!rst_n) cnt=0; else cnt=cnt+1b1; wire key_clk=cnt19; / 220/50M=21ms /* 状态机部分独热码编码 */ parameter NO_KEY_PRESSED=6b000_001;/ 没有键按下 parameter SCAN_COL0 =6b000_010;/扫
12、描第0 列 parameter SCAN_COL1 =6b000_100;/扫描第1 列 parameter SCAN_COL2 =6b001_000;/扫描第2 列 parameter SCAN_COL3 =6b010_000;/扫描第3 列 parameter KEY_PRESSED =6b100_000;/ 有键按下 /*/ reg 5:0current_state,next_state; /现态和次态 /*/ /复位 /*/ always (posedge key_clk or negedge rst_n) if(!rst_n) current_state=NO_KEY_PRESSED
13、; else current_state=next_state; /*/ always * /(current_state) /根据条件转移状态 case (current_state) NO_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) n
14、ext_state=KEY_PRESSED; else next_state=SCAN_COL2; SCAN_COL2: /扫描第2 列 if(row!=4hf) next_state=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
15、_PRESSED; endcase /*/ reg key_pressed_flag; /按键按下标志 reg 3:0col_val; /列值 reg 3:0row_val; /行值 /*/ /根据次态,给相应的寄存器赋值 /*/ 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:
16、 /扫描第0 列 col=4b1110; SCAN_COL1: /扫描第1 列 col=4b1101; SCAN_COL2: /扫描第2 列 col=4b1011; SCAN_COL3: /扫描第3 列 col=4b0111; KEY_PRESSED: /有按键按下 begin col_val=col; / 锁存列值 row_val=row; / 锁存行值 key_pressed_flag=1; / 置键盘按下标 end endcase /* */ / 扫描行列值部分开始 /* */ always (posedge key_clk or negedge rst_n) if(!rst_n) ke
17、y_board_val=4h0; else if(key_pressed_flag) case(col_val,row_val) 8b11101110 : key_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 = 4h
18、9; 8b11010111 : key_board_val = 4hD; 8b10111110 : key_board_val = 4h2; 8b10111101 : 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_va
19、l = 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 4h7: dataout=8b11111000; /7 4h8: dataout=8b10000000; /8 4h9: dataout=8b10010000; /9 4hA: dataout=8b10001000; /a 4hB: dataout=8b10000011; /b 4hC: dataout=8b11000110; /c 4hD: dataout=8b10100001; /d 4hE: dataout=8b10000110; /e 4hF: dataout=8b10001110; /f endcase end /* */ / 键盘值转换为数码管显示结束 /* */ endmodule
链接地址:https://www.31doc.com/p-5198407.html