verilog矩阵按键与数码管实验

本文介绍了如何通过拨码开关控制IO扩展板上的LED灯,并利用矩阵键盘扫描技术和数码管显示模块,实现在底层硬件上实现键盘输入识别和动态显示。顶层模块负责整合各个子模块并管理信号交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过拨码开关控制 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值