概论:FPGA开发板上的按键太少,只有一个复位键,用户要进行选择操作什么的很不方便,所以扩展一个4x4矩阵键盘,本文主要是扩展矩阵键盘的Verilog程序实现过程。
关键字:FPGA 4x4矩阵键盘 Verilog HDL I/O外设
FPGA开发板如图1所示。
图1 EP4CE6E22C8N开发板
可以看到,只有一个复位按建,对于很多需要根据用户的选择进行操作的项目来说是很不方便的,重新买一块FPGA开发板又太贵了,所以选择扩展一个矩阵键盘。
矩阵键盘如图2。
图2 4x4矩阵键盘
扩展该矩阵键盘的Verilog代码如下:
module key4x4
#(
parameter CNT_MAX=16'd50_000
)
(
input wire sys_clk ,
input wire sys_rst_n ,
input wire [3:0] key_in ,//此信号为从键盘传到FPGA开发板的信号
output reg [3:0] key_out ,//此信号为从FPGA开发板传到键盘上的信号
output reg [3:0] led_out //注意信号灯为低信号时会亮
);
reg [15:0] cnt ;
reg cnt_clk ;
reg [1:0] q ;
always @ (posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n==1'b0)
cnt<=16'd0;
else if (cnt==CNT_MAX)
cnt<=16'd0;
else cnt<=cnt+16'd1;
always @ (posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n==1'b0)
cnt_clk<=1'b0;
else if (cnt==CNT_MAX-16'd1)
cnt_clk<=1'b1;
else cnt_clk<=1'd0;
always @ (posedge cnt_clk or negedge sys_rst_n)
if(sys_rst_n==1'b0)
begin
q<=2'd0;
key_out<=4'b1110;
led_out<=4'b1111;
end
else
begin
q<=q+2'd1;
case(q)
//分别对每一行row输入扫描信号
2'd0:key_out<=4'b1110;
2'd1:key_out<=4'b1101;
2'd2:key_out<=4'b1011;
2'd3:key_out<=4'b0111;
default:key_out<=4'b0000;
endcase
case ({key_out,key_in})
//按下第1个按键后则全灭,0000 -> 1111,按下第16个按键后全部的灯亮,1111 -> 0000。
//每一行扫描信号,对应的扫描信号灯输出
8'b1110_1110:begin led_out<=4'b1111; end
8'b1110_1101:begin led_out<=4'b1110; end
8'b1110_1011:begin led_out<=4'b1101; end
8'b1110_0111:begin led_out<=4'b1100; end
8'b1101_1110:begin led_out<=4'b1011; end
8'b1101_1101:begin led_out<=4'b1010; end
8'b1101_1011:begin led_out<=4'b1001; end
8'b1101_0111:begin led_out<=4'b1000; end
8'b1011_1110:begin led_out<=4'b0111; end
8'b1011_1101:begin led_out<=4'b0110; end
8'b1011_1011:begin led_out<=4'b0101; end
8'b1011_0111:begin led_out<=4'b0100; end
8'b0111_1110:begin led_out<=4'b0011; end
8'b0111_1101:begin led_out<=4'b0010; end
8'b0111_1011:begin led_out<=4'b0001; end
8'b0111_0111:begin led_out<=4'b0000; end
8'b0000_1111:begin led_out<=4'b1111; end
default: begin led_out<=4'b1111; end
endcase
end
endmodule
本文是用Quartus和Modelsim实现联合仿真,所以还要写一个仿真测试代码,如下所示:
`timescale 1ns/1ns
module tb_key4x4 ();
reg sys_clk ;
reg sys_rst_n ;
reg [3:0] key_in ;
wire [3:0] key_out ;
wire [3:0] led_out ;
initial
begin
sys_clk=1'b1;
sys_rst_n<=1'b0;
key_in<=4'b1110;
#50
sys_rst_n<=1'b1;
#2000
key_in<=4'b1101;
#2000
key_in<=4'b1011;
#2000
key_in<=4'b0111;
end
always #10 sys_clk = ~sys_clk ;
key4x4
#(
.CNT_MAX (16'd2)
)
key4x4_inst1
(
. sys_clk (sys_clk ) ,
. sys_rst_n (sys_rst_n) ,
. key_in (key_in ) ,//此信号为从键盘传到FPGA开发板的信号
. key_out (key_out ) ,//此信号为从FPGA开发板传到键盘上的信号
. led_out (led_out ) //注意信号灯为低信号时会亮
);
endmodule
仿真验证的波形如图3所示:
图3 仿真波形
仿真结果的话,可以观看我在bilibili(哔哩哔哩)上传的视频:用FPGA扩展4x4矩阵键盘,并分别简单控制LED灯,key4x4_哔哩哔哩_bilibili