通过拨码开关控制 IO 扩展板上的 LED 灯亮灭,然后将矩阵键盘的按键编号显示在数码管上。
矩阵键盘扫描模块原理图:
在处理这个键盘中首先需要通过row和column来确定键盘的位置,具体过程就是先扫描行确定哪一行是低电平,再对这一行的线路传入进行0111,1011,1101,1110的轮换直到电平输出仍然是最初一致,那么说明按下按键就处于这一列
1)顶层模块(top_matrix_keyboard):顶层模块主要是对其它三个子模块进行例化,实现子模块间的信号连接。
2)矩阵键盘扫描模块(key_4x4):矩阵键盘扫描模块主要是对IO扩展板上的矩阵键盘进行行列扫描, 定位出哪一个按键被按下并将其对应的编号传递给数码管显示模块。
3)数码管显示模块(seg_led):接收矩阵键盘扫描模块(key_4x4)传递出的按键编号值并将数据流水方式显示。
4)拨码开关模块(swi_led):主要检测拨码开关的开合状态,并将状态值赋给 led 灯控制 led 灯的亮灭。
顶层模块:
module board_top
(input clk,input rstn,
input [3:0]row_btn,input [7:0]swi,
output [3:0]col_btn,output [7:0] led,
output [3:0]sel,output [7:0]seg);
wire key_flag;
wire[3:0]key_result;
keyboard kb_u(
.clk(clk),.rstn(rstn),
.row_btn(row_btn),.col_btn(col_btn),.key_result(key_result),
.key_flag(key_flag));
seg_light sl_u(
.clk(clk),.rstn(rstn),
.key_flag(key_flag),.key_result(key_result),
.sel(sel),.seg(seg)
);
led_cg lc_u(
.clk(clk),.rstn(rstn),
.swi(swi),.led(led));
endmodule
矩阵键盘模块:
module keyboard(
input clk,input rstn,
input [3:0]row_btn,output reg[3:0]col_btn,key_result,
output reg key_flag);
localparam delay_tim=1_000_000;
reg [31:0]delay_cnt;
reg [3:0]btn_reg;
reg[3:0]row_num,col_num;
reg row_flag;
reg [2:0]cstate;
always @(posedge clk or negedge rstn) begin
if(!rstn)
begin
delay_cnt<='d0;
btn_reg<=4'b1_111;
end
else begin
btn_reg<=row_btn;//btn_reg = prev row_btn
if(btn_reg!=row_btn)
delay_cnt<=delay_tim;
else if