verilog矩阵键盘分析Word文件下载.docx

上传人:b****6 文档编号:19025631 上传时间:2023-01-03 格式:DOCX 页数:13 大小:35.83KB
下载 相关 举报
verilog矩阵键盘分析Word文件下载.docx_第1页
第1页 / 共13页
verilog矩阵键盘分析Word文件下载.docx_第2页
第2页 / 共13页
verilog矩阵键盘分析Word文件下载.docx_第3页
第3页 / 共13页
verilog矩阵键盘分析Word文件下载.docx_第4页
第4页 / 共13页
verilog矩阵键盘分析Word文件下载.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

verilog矩阵键盘分析Word文件下载.docx

《verilog矩阵键盘分析Word文件下载.docx》由会员分享,可在线阅读,更多相关《verilog矩阵键盘分析Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。

verilog矩阵键盘分析Word文件下载.docx

本实验要求完成的任务是通过编程实现对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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 家庭教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1