《veriloghdl矩阵键盘实验报告.pdf》由会员分享,可在线阅读,更多相关《veriloghdl矩阵键盘实验报告.pdf(13页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、EDA 实验报告学院:物信学院专业:电信一班小组成员:杨义,王祺,陈鹏,秦成晖指导老师:漆为民目录实验题目 .3 实验目的 .3 实验原理 .3 实验内容 .5 实验程序 .5 实验步骤 .10 实验结果 .10 实验体会 10 附录 11 一实验题目:矩阵键盘显示电路设计二实验目的:1. 了解普通 44 键盘扫描的原理。2. 进一步加深七段码管显示过程的理解。3. 了解对输入 / 输出端口的定义方法。三实验原理:软键盘的工作方式:通常在一个键盘中使用了一个瞬时接触开关,并且用如图所示的简单电路,微处理器可以容易地检测到闭合。当开关打开时,通过处理器的I/O 口的一个上拉电阻提供逻辑1;当开关
2、闭合时,处理器的/IO 口的输入将被拉低得到逻辑0。可遗憾的是,开关并不完善,因为当它们被按下或者被释放时,并不能够产生一个明确的1 或者 0。尽管触点可能看起来稳定而且很快地闭合,但与微处理器快速的运行速度相比,这种动作是比较慢的。当触点闭合时,其弹起就像一个球。弹起效果将产生如图10-2 所示的好几个脉冲。弹起的持续时间通常将维持在5ms 30ms 之间。如果需要多个键,则可以将每个开关连接到微处理器上它自己的输入端口。然而,当开关的数目增加时,这种方法将很快使用完所有的输入端口。键盘上阵列这些开关最有效的方法(当需要5 个以上的键时)就形成了一个如图10-3 所示的二维矩阵。当行和列的数
3、目一样多时,也就是方型的矩阵,将产生一个最优化的布列方式 (I/O 端被连接的时候) 。一个瞬时接触开关(按钮)放置在每一行与线一列的交叉点。矩阵所需的键的数目显然根据应用程序而不同。每一行由一个输出端口的一位驱动,而每一列由一个电阻器上拉且供给输入端口一位。键盘扫描的实现过程如下:对于44 键盘,通常连接为 4 行、 4 列,因此要识别按键,只需要知道是哪一行和哪一列即可,为了完成这一识别过程,我们的思想是,首先固定输出4 行为高电平,然后输出4 列为低电平,在读入输出的4 行的值,通常高电平会被低电平拉低,如果读入的 4 行均为高电平,那么肯定没有按键按下,否则,如果读入的4 行有一位为低
4、电平,那么对应的该行肯定有一个按键按下,这样便可以获取到按键的行值。同理,获取列值也是如此,先输出4 列为高电平,然后在输出4 行为低电平,再读入列值,如果其中有哪一位为低电平,那么肯定对应的那一列有按键按下。获取到行值和列值以后,组合成一个8 位的数据,根据实现不同的编码在对每个按键进行匹配,找到键值后在7 段码管显示。四实验内容:本实验要求完成的任务是通过编程实现对4X4矩阵键盘按下键的键值的读取,并在数码管上完成一定功能(如移动等)的显示。按键盘的定义,按下“* ”键则在数码管是显示“ E”键值。按下“#”键在数码管上显示“F”键值。其它的键则按键盘上的标识进行显示。在此实验中数码管与F
5、PGA的连接电路和管脚连接在以前的实验中都做了详细说明,这里不在赘述。本实验箱上的 4X4矩阵键盘的电路原理如图所示五实验程序:Module key(clk, reset,row, col, key_value ); input clk,reset; input 3:0 row; output 3:0 col; output 3:0 key_value; reg 3:0 col; reg 3:0 key_value; reg 5:0 count;/delay_20ms reg 2:0 state; /状态标志reg key_flag; /按键标志位reg clk_500khz; /500KHZ
6、时钟信号reg 3:0 col_reg; /寄存扫描列值reg 3:0 row_reg; / 寄存扫描行值always (posedge clk or negedge reset) if(!reset) begin clk_500khz=0; count=50) begin clk_500khz=clk_500khz;count=0;end else count=count+1; end always (posedge clk_500khz or negedge reset) if(!reset) begin col=4b0000;state=0;end else begin case (st
7、ate) 0: begin col3:0=4b0000; key_flag=1b0; if(row3:0!=4b1111) begin state=1;col3:0=4b1110;end /有键按下,扫描第一行else state=0; end 1: begin if(row3:0!=4b1111) begin state=5;end / 判断是否是第一行else begin state=2;col3:0=4b1101;end /扫描第二行end 2: begin if(row3:0!=4b1111) begin state=5;end / 判断是否是第二行else begin state=3
8、;col3:0=4b1011;end /扫描第三行end 3: begin if(row3:0!=4b1111) begin state=5;end / 判断是否是第三一行else begin state=4;col3:0=4b0111;end /扫描第四行end 4: begin if(row3:0!=4b1111) begin state=5;end / 判断是否是第一行else state=0; end 5: begin if(row3:0!=4b1111) begin col_reg=col; /保存扫描列值row_reg=row; / 保存扫描行值state=5; key_flag=
9、1b1; / 有键按下end else begin state=0;end end endcase end always (clk_500khz or col_reg or row_reg) begin if(key_flag=1b1) begin case (col_reg,row_reg) 8b1110_1110:key_value=0; 8b1110_1101:key_value=1; 8b1110_1011:key_value=2; 8b1110_0111:key_value=3; 8b1101_1110:key_value=4; 8b1101_1101:key_value=5; 8b
10、1101_1011:key_value=6; 8b1101_0111:key_value=7; 8b1011_1110:key_value=8; 8b1011_1101:key_value=9; 8b1011_1011:key_value=10; 8b1011_0111:key_value=11; 8b0111_1110:key_value=12; 8b0111_1101:key_value=13; 8b0111_1011:key_value=14; 8b0111_0111:key_value=15; endcase end end endmodule 六实验步骤1、打开 QUARTUSII软
11、件,新建一个工程。2、建完工程之后,再新建一个VHDL File ,打开 VHDL编辑器对话框。3、按照实验原理和自己的想法,在VHDL 编辑窗口编写VHDL 程序,用户可参照光盘中提供的示例程序。4、编写完 VHDL 程序后,保存起来。方法同实验一。5、对自己编写的VHDL程序进行编译并仿真,对程序的错误进行修改。编译仿真无误后,依照4X4 矩阵键、数码管与FPGA的管脚连接表或参照附录进行管脚分配。管脚分配完成后,再进行全编译一次,以使管脚分配生效。七实验结果:以设计的参考示例为例,当设计文件加载到目标器件后,将数字信号源模块的时钟选择为2048HZ ,按下矩阵键盘的某一个键, 则在数码管
12、上显示对应的这个键标识的键值。按下“* ”键则在数码管是显示“E”键值。按下“#”键在数码管上显示“F”键值。八实验体会:刚刚开始接触这门课的时候,我们小组什么都不知道,只知道按照老师您打得程序来抄。然后一步步按步骤做,经过一段时间的学习, 学会了程序的运行和管脚的输入及在仪器上的运行,通过阅读简单的程序,来增加自己的知识,然后通过改写成程序来增加对程序的理解。感觉这次能都把这串代码打出来还是很不容易的,不过大家都有收获就行。九附录:相关管脚:端口名使用模块信号对应 FPGA管脚说明CLK 数字信号源PIN_M1 时钟为2048HZ KR0 4*4 钜阵键盘 R0 PIN_J19 钜阵键盘行信
13、号KR1 4*4 钜阵键盘 R1 PIN_P15 KR2 4*4 钜阵键盘 R2 PIN_J17 KR3 4*4 钜阵键盘 R3 PIN_H11 KC0 4*4 钜阵键盘 C0 PIN_R14 钜阵键盘列信号KC1 4*4 钜阵键盘 C1 PIN_R16 KC2 4*4 钜阵键盘 C2 PIN_V19 KC3 4*4 钜阵键盘 C3 PIN_H15 A 数码管模块A 段PIN_H19 键值显示B 数码管模块B 段PIN_J14 C 数码管模块C 段PIN_H18 D 数码管模块D 段PIN_H17 E 数码管模块E 段PIN_H14 F 数码管模块F 段PIN_G20 G 数码管模块G 段PIN_G18 SEL0 数码管模块SEL0 PIN_F20 SEL1 数码管模块SEL1 PIN_E20 SEL2 数码管模块SEL2 PIN_E19 SEL3 数码管模块SEL3 PIN_E18 SEL4 数码管模块SEL4 PIN_D20 SEL5 数码管模块SEL5 PIN_D19 SEL6 数码管模块SEL6 PIN_C18 SEL7 数码管模块SEL7 PIN_C17 表 10-2 端口管脚分配表