Verilog HDL 之 矩阵键盘接口
1、矩阵键盘的原理
矩阵键盘又叫行列式键盘。用带IO口的线组成行列结构,按键设置在行列的交点上。例如用4×4的行列式结构可以构成16个键的键盘。这样,当按键数量平方增长时,I/O口只是线性增长,这样就可以节省I/O口。矩阵键盘的原理图如图1.1所示:
图1.1 矩阵键盘的原理图
按键设置在行列线交叉点,行列线分别连接到按键开关的两端。列线通过上拉电阻接3.3V电压,即列线的输出被钳位到高电平状态。 判断键盘中有无按键按下式通过行线送入扫描线好然后从列线读取状态得到的。其方法是依次给行线送低电平,检查列线的输入。如果列线全是高电平,则代表低电平信号所在的行中无按键按下;如果列线有输入为低电平,则代表低电平信号所在的行和出现低电平的列的交点处有按键按下。2、一个完整的键盘控制程序应解决以下任务:
(1)检测有无按键按下
(2)有键按下,在无硬件去抖得情况下,应有软件延时除去抖动影响
(3)键扫描程序
(4)将键编码转换成相应建值
整个设计程序包括三个模块:时钟分频、键盘扫描和键译码转换。为了显示,还必须在顶层添加显示部分。
3、时钟分频
scan_clk.v
1 //-------------------------------------------------------------------------------------------------
2 // File
: scan_clk.v
3 // Generated : 2011-07-20
4 // Author
: wangliang
5 //-------------------------------------------------------------------------------------------------
6 `timescale 1 ns /1 ps
7
8 module scan_clk ( clkout ,clk ,rst );
9
10 input rst ;
11 input clk ;
12 wire clk ;
13
14 output clkout ;
15
16 reg clkout_r ;
17
18 parameter period=200000;
19 //parameter period= 10;
20 reg [31:0] cnt;
21
22 always @( posedge clk or negedge rst)
//分频50Hz
23 begin
24 if ( !rst )
25
begin
26
cnt <= {31{1\'b0}} ;
27
clkout_r <=0 ;
28
end
29 else begin
30
cnt<= cnt+1;
31 if (cnt == (period >>1) -1)
//设定周期时间的一半
32
clkout_r <= #11\'b1;
33 elseif (cnt == period -1)
//设定的周期时间
34
begin
35
clkout_r <= #11\'b0;
36
cnt <= #1\'b0;
37
end
38
39
end
40
end
41 assign clkout = clkout_r ;
42
43 endmodule