verilog矩阵键盘Word格式.docx
- 文档编号:18278739
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:13
- 大小:33.32KB
verilog矩阵键盘Word格式.docx
《verilog矩阵键盘Word格式.docx》由会员分享,可在线阅读,更多相关《verilog矩阵键盘Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
本实验要求完成的任务是通过编程实现对4X4矩阵键盘按下键的键值的读取,并在数码管上完成一定功能(如移动等)的显示。
按键盘的定义,按下“*”键则在数码管是显示“E”键值。
按下“#”键在数码管上显示“F”键值。
其它的键则按键盘上的标识进行显示。
在此实验中数码管与FPGA的连接电路和管脚连接在以前的实验中都做了详细说明,这里不在赘述。
本实验箱上的4X4矩阵键盘的电路原理如图10-4所示。
与FPGA的管脚连接如表10-1所示。
图10-44X4矩阵键盘电路原理图
表10-14X4矩阵键与FPGA的管脚连接表
信号名称
对应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、建完工程之后,再新建一个VHDLFile,打开VHDL编辑器对话框。
3、按照实验原理和自己的想法,在VHDL编辑窗口编写VHDL程序,用户可参照光盘中提供的示例程序。
4、编写完VHDL程序后,保存起来。
方法同实验一。
5、对自己编写的VHDL程序进行编译并仿真,对程序的错误进行修改。
6、编译仿真无误后,依照4X4矩阵键、数码管与FPGA的管脚连接表(表或参照附录)进行管脚分配。
表10-2是示例程序的管脚分配表。
分配完成后,再进行全编译一次,以使管脚分配生效。
端口名
使用模块信号
对应FPGA管脚
说明
CLK
数字信号源
C13
时钟为1KHZ
KR0
4*4矩阵键盘R0
矩阵键盘行信号
KR1
4*4矩阵键盘R1
KR2
4*4矩阵键盘R2
KR3
4*4矩阵键盘R3
KC0
4*4矩阵键盘C0
矩阵键盘列信号
KC1
4*4矩阵键盘C1
表10-2端口管脚分配表
KC2
4*4矩阵键盘C2
KC3
4*4矩阵键盘C3
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中。
观察实验结果是否与自己的编程思想一致。
五、实验结果与现象
以设计的参考示例为例,当设计文件加载到目标器件后,将数字信号源模块的时钟选择为1KHz,按动“模式”按键使单8字数码管显示“0”(参考实验四),按下矩阵键盘的某一个键,则在数码管上显示对应的这个键标识的键值,当再按下第二个键的时候前一个键的键值在数码管上左移一位。
按下“*”键则在数码管是显示“E”键值。
按下“#”键在数码管上显示“F”键值。
/************************************************
工程:
4x4矩阵键盘
日期:
2011-08-3
最后修改:
功能:
键盘
说明:
ROW【3:
0】设为输入,COL【3:
0】设为输出。
如果没有按键按下,则ROW【3:
0】一直被上
拉为高电平,且COL【3:
0】有低电平输出,
ROW【3:
0】中才有可能低电平输入。
*************************************************/
modulekeys(clk_50M,rst_n,row,col,dataout,smg_wei);
/*************************************************/
output[3:
0]col;
//矩阵键盘列
inputrst_n;
//复位键
inputclk_50M;
//系统时钟
input[3:
0]row;
//矩阵键盘行
output[7:
0]dataout;
//键盘值数码管显示数据
0]smg_wei;
//数码管显示使能
reg[7:
reg[3:
0]key_board_val;
/*************************************************/
assignsmg_wei=0;
//八个数码管显示
//分频部分开始
reg[19:
0]cnt;
//计数子
always@(posedgeclk_50Mornegedgerst_n)
if(!
rst_n)
cnt<
=0;
else
=cnt+1'
b1;
wirekey_clk=cnt[19];
//2^20/50M=21ms
/*************************************************
状态机部分独热码编码
parameterNO_KEY_PRESSED=6'
b000_001;
//没有键按下
parameterSCAN_COL0=6'
b000_010;
//扫描第0列
parameterSCAN_COL1=6'
b000_100;
//扫描第1列
parameterSCAN_COL2=6'
b001_000;
//扫描第2列
parameterSCAN_COL3=6'
b010_000;
//扫描第3列
parameterKEY_PRESSED=6'
b100_000;
//有键按下
reg[5:
0]current_state,next_state;
//现态和次态
//复位
always@(posedgekey_clkornegedgerst_n)
current_state<
=NO_KEY_PRESSED;
else
=next_state;
always@*//(current_state)//根据条件转移状态
case(current_state)
NO_KEY_PRESSED:
//没有键按下
if(row!
=4'
hf)
next_state=SCAN_COL0;
else
next_state=NO_KEY_PRESSED;
SCAN_COL0:
//扫描第0列
next_state=KEY_PRESSED;
next_state=SCAN_COL1;
SCAN_COL1:
//扫描第1列
else
next_state=SCAN_COL2;
SCAN_COL2:
//扫描第2列
next_state=SCAN_COL3;
SCAN_COL3:
//扫描第3列
KEY_PRESSED:
//有按键按下
endcase
regkey_pressed_flag;
//按键按下标志
reg[3:
0]col_val;
//列值
0]row_val;
//行值
//根据次态,给相应的寄存器赋值
always@(posedgekey_clkornegedgerst_n)
if(!
rst_n)//复位
begin
col<
h0;
key_pressed_flag<
end
else
case(next_state)
NO_KEY_PRESSED:
begin
col<
key_pressed_flag<
end
SCAN_COL0:
b1110;
SCAN_COL1:
b1101;
SCAN_COL2:
b1011;
SCAN_COL3:
b0111;
KEY_PRESSED:
col_val<
=col;
//锁存列值
row_val<
=row;
//锁存行值
=1;
//置键盘按下标
endcase
/********************************************************************************/
//扫描行列值部分开始
/********************************************************************************/
key_board_val<
if(key_pressed_flag)
case({col_val,row_val})
8'
b11101110:
key_board_val<
=4'
b11101101:
h4;
b11101011:
h8;
b11100111:
hC;
b11011110:
h1;
b11011101:
h5;
b11011011:
h9;
b11010111:
hD;
b10111110:
h2;
b10111101:
h6;
b10111011:
hA;
b10110111:
hE;
b01111110:
h3;
b01111101:
h7;
b01111011:
hB;
b01110111:
hF;
endcase
/*********************************************************************************/
//键盘值转换为数码管显示
/*********************************************************************************/
always@*//(key_board_val)
begin
case(key_board_val)
4'
h0:
dataout<
=8'
b11000000;
//0
h1:
b11111001;
//1
h2:
b10100100;
//2
h3:
b10110000;
//3
h4:
b10011001;
//4
h5:
b10010010;
//5
h6:
b10000010;
//6
h7:
b11111000;
//7
h8:
b10000000;
//8
h9:
b10010000;
//9
hA:
b10001000;
//a
hB:
b10000011;
//b
hC:
b11000110;
//c
hD:
b10100001;
//d
hE:
b10000110;
//e
hF:
b10001110;
//f
endcase
end
//键盘值转换为数码管显示结束
endmodule
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- verilog 矩阵 键盘