名称:4x4矩阵键盘电子密码锁 FPGA 设计 Verilog Quartus
软件:Quartus
语言:Verilog
开发板/平台:Cyclone IV FPGA开发板
功能介绍
本设计实现一个基于 FPGA 的 4x4 矩阵键盘电子密码锁系统,采用 Verilog 编写,工程软件为 Quartus。系统通过 4x4 矩阵键盘输入数字密码,并配合确认、复位、修改、上锁等独立按键完成密码锁常见操作流程,可输出开锁指示和报警信号,同时支持 LCD1602 与数码管显示。 密码锁的主要功能包括数字按键输入、密码确认、密码修改、复位控制、上锁控制、错误报警和状态显示。用户通过矩阵键盘输入密码后,按确认键进行校验;当密码正确时,led_open 输出可用于指示开锁状态;当进入异常或错误处理流程时,alarm 输出可用于报警提示。修改键和上锁键用于完成密码锁的管理操作,使系统具备较完整的交互逻辑。 显示方面,LCD1602 用于展示密码锁运行状态或提示信息,数码管接口提供位选和段选输出,便于观察输入或状态结果。工程结构包含顶层控制、键盘扫描、按键消抖、密码输入、报警控制、LCD 驱动、数码管显示和时钟分频等模块,适合作为 FPGA 综合课程设计、Verilog 模块化设计练习、矩阵键盘与 LCD1602 联合应用实验参考。
运行环境
开发语言:Verilog 开发软件:Quartus 目标平台:Cyclone IV FPGA 开发板 主要外设:4x4 矩阵键盘、独立按键、LCD1602、数码管、报警输出、开锁指示 LED 顶层模块:mimasuo
设计思路
系统以 mimasuo 作为顶层模块,将时钟分频、键盘输入、按键消抖、密码输入/修改、LCD1602 显示、数码管显示、开锁指示和报警控制拆分为多个功能模块。顶层统一连接 50MHz 时钟、4x4 矩阵键盘行列信号、确认/复位/修改/上锁按键,以及 LCD 与数码管输出端口,便于在 Quartus 中综合和进行 FPGA 板级调试。 输入部分先通过 div_clk 将系统时钟分频到 500KHz,作为按键扫描和消抖相关逻辑的工作时钟。4x4 矩阵键盘由 data_input、key_4x4 等逻辑完成数字键识别,独立功能按键则通过 key_jitter2 消抖并提取有效边沿,减少机械按键抖动对密码确认、修改和上锁动作的影响。 密码锁控制逻辑围绕当前状态、输入密码、正确密码、确认信号、修改信号和上锁信号展开。用户输入数字后,系统可进行密码比对;密码正确时输出开锁指示,操作异常或密码错误流程可驱动报警输出。reset_password、mima_input、alarm_on、display 等模块分别承担密码重置/修改、输入组织、报警控制和显示输出相关功能,使整体结构清晰,适合阅读、修改和二次扩展。 显示部分同时使用 LCD1602 与数码管。LCD_Driver、LCD_Top 负责 LCD 控制时序与显示内容组织,数码管显示模块负责位选和段选输出。这样的设计便于在实物演示中同时观察系统状态、输入过程和结果反馈,也方便学生理解 FPGA 中键盘扫描、状态控制和字符显示之间的协同关系。
模块结构
顶层模块为 mimasuo,负责连接系统时钟、矩阵键盘、功能按键、报警输出、开锁指示、LCD1602 接口和数码管接口。 div_clk:将 50MHz 时钟分频为 500KHz,供键盘扫描和按键处理逻辑使用。 data_input、key_4x4:完成 4x4 矩阵键盘扫描与数字按键识别,输出 0-9 数字键的有效触发信号。 key_jitter、key_jitter2、negedge_check:用于机械按键消抖和边沿检测,提升确认、复位、修改、上锁等按键操作的稳定性。 mima_input、reset_password、mimasuo_ctrl:围绕密码输入、密码修改/重置和密码锁状态控制展开,实现密码校验及相关控制流程。 alarm_on:根据密码锁状态或错误条件产生报警控制输出。 display:负责数码管位选、段选显示输出。 LCD_Driver、LCD_Top:负责 LCD1602 控制时序、状态信息组织和显示接口驱动。
开发板验证
工程已完成 Cyclone IV FPGA 开发板的管脚约束配置,按键、4x4 矩阵键盘、LCD1602 控制信号、数码管位选/段选、报警与开锁指示等端口均可结合 Quartus 工程中的 qsf 管脚分配进行综合、编译和下载验证。开发板验证重点覆盖密码输入、确认、修改、复位、上锁、开锁指示以及报警输出等交互流程,适合直接用于 FPGA 课程设计、综合实验和实物演示。
演示视频
配套演示视频用于展示密码锁工程的实际运行效果,可结合开发板操作观察矩阵键盘输入、确认、修改、上锁、复位、LCD1602 显示、开锁指示和报警输出等功能流程。
演示视频请关注公众号后获取对应资料查看。
演示视频请关注公众号后获取对应资料查看。
演示视频请关注公众号后获取对应资料查看。
仿真图/仿真说明/设计文档图片
设计文档图片展示了工程文件、程序文件、程序编译、RTL 图和管脚分配等内容,可用于了解 Quartus 工程组织、源码模块关系、综合编译结果和 FPGA 引脚约束情况。工程目录中同时包含 ModelSim 仿真相关目录,可作为查看模块编译与仿真环境配置的参考。
部分代码
以下展示顶层模块mimasuo的部分代码,完整代码可关注下方公众号卡片获取。
module mimasuo( input clk,//时钟 input [3:0] L_row,//行 output [3:0] H_col,//列 input confirm_key,//key4-确认键 input reset,//key3-复位 input modify_key,//key2--修改 input lock_up_key,//key1--上锁 output alarm,//报警 output led_open,//开锁 //LCD控制信号 output LCD_EN, output RS, output RW, output [7:0] DB8, //数码管 output [5:0] bit_select,//数码管位选 output [7:0] seg_select//数码管段选 ); wire LCD_ON; wire reset_v; wire reset_p; assign reset_p=~reset_v; wire [2:0] current_state; wire [15:0] password; wire [15:0] correct_password; wire confirm; wire modify; wire lock_up; assign LCD_ON=1; wire clk_500KHz; //数字输入按键 wire key_0; wire key_1; wire key_2; wire key_3; wire key_4; wire key_5; wire key_6; wire key_7; wire key_8; wire key_9; //分频 div_clk i_div_clk( . clk(clk),//50M . clk_500KHz(clk_500KHz)//分频到500K ); //输入模块 data_input i_data_input( . clk_500KHz(clk_500KHz),//500KHZ . reset(reset_v), . L_row(L_row),//行 . H_col(H_col),//列 . key_0_rise(key_0),//键0 . key_1_rise(key_1),//键1 . key_2_rise(key_2),//键2 . key_3_rise(key_3),//键3 . key_4_rise(key_4),//键4 . key_5_rise(key_5),//键5 . key_6_rise(key_6),//键6 . key_7_rise(key_7),//键7 . key_8_rise(key_8),//键8 . key_9_rise(key_9) //键9 ); //下降沿检测 key_jitter2 i0_key_jitter( . clkin(clk_500KHz), . key_in(reset),//输入 . key_posedge(),//消抖后按键上升沿 . key_negedge(),//消抖后按键下降沿 . key_value(reset_v)//消抖后按键 ); //下降沿检测 key_jitter2 i1_key_jitter( . clkin(clk_500KHz), . key_in(confirm_key),//输入 . key_posedge(),//消抖后按键上升沿 . key_negedge(confirm),//消抖后按键下降沿 . key_value()//消抖后按键 ); //下降沿检测 key_jitter2 i2_key_jitter( . clkin(clk_500KHz), . key_in(modify_key),//输入 . key_posedge(),//消抖后按键上升沿 . key_negedge(modify),//消抖后按键下降沿 . key_value()//消抖后按键 ); //下降沿检测 key_jitter2 i3_key_jitter( . clkin(clk_500KHz), . key_in(lock_up_key),//输入 . key_posedge(),//消抖后按键上升沿 . key_negedge(lock_up),//消抖后按键下降沿 . key_value()//消抖后按键 ); LCD_Top i_LCD_Top( .clk_50M(clk), .rst(confirm_key & modify_key), .confirm(confirm), .current_state(current_state), .LCD_EN(LCD_EN), .RS(RS), .RW(RW), // ... 以下代码略,完整源码请下载压缩包查看
代码获取:点击下方公众号卡片