名称:矩阵键盘密码锁 FPGA 设计 Verilog Vivado
软件:Vivado
语言:Verilog
开发板/平台:Nexys A7
功能介绍
本设计实现一个基于 FPGA 的矩阵键盘密码锁控制器,使用 Verilog 编写并在 Vivado 工程中组织源码。系统面向数字系统课程设计中常见的密码锁场景,完成密码输入、密码判断、开锁指示、错误提示、报警以及状态返回等核心功能。 密码锁平时处于等待状态,用户可通过 4x4 矩阵键盘输入 4 位密码,并通过确认键提交。若输入密码正确,系统进入开锁状态并点亮开锁指示;若密码错误,系统提示重新输入,连续三次错误后触发报警信号。默认密码为 0000,管理员可通过专用控制按键进入密码修改相关流程。 输入过程中支持退格修正,在按下确认键之前可以逐位删除已输入内容,便于模拟真实密码锁的人机交互。系统还结合 LED、蜂鸣/报警输出和数码管显示,使密码状态、输入内容和控制结果能够在开发板上直观呈现。
运行环境
开发语言:Verilog 开发软件:Vivado 适用工程:FPGA 密码锁控制器工程 开发板验证:Nexys A7 主要外设:4x4 矩阵键盘、独立按键、拨码开关、LED 指示、报警输出、八位数码管显示。
设计思路
整体设计采用模块化结构,将密码锁的人机输入、状态控制、显示输出、报警处理和密码重置分开实现。顶层模块 mimasuo 负责连接时钟、矩阵键盘行列信号、确认/修改/上锁/退格按键、复位开关、管理员开关、报警输出、开锁 LED、状态指示灯以及数码管位选和段选信号。 按键部分先经过 key_jitter 模块进行消抖和边沿检测,将机械按键转换为稳定的确认、修改、上锁、退格等控制脉冲。矩阵键盘由 mima_input 模块完成扫描和密码输入组合,根据当前状态接收用户输入,并在退格键作用下修正已输入数字。 密码锁核心控制由 mimasuo_ctrl 完成,控制逻辑围绕等待、输入、开锁、修改、错误和报警等状态展开。用户提交密码后,控制模块比较输入密码与当前正确密码,输出开锁指示并更新状态;错误次数达到要求后进入报警相关状态。reset_password 模块负责在指定状态下更新正确密码,使管理员修改密码功能与普通用户开锁流程分离。 显示与报警分别由 display 和 alarm_on 模块处理。display 根据当前密码、正确密码、系统状态和管理员开关驱动数码管显示;alarm_on 根据状态和按键情况输出报警信号及三色/状态指示灯效果。这样的划分便于单独理解各模块功能,也方便在 Vivado 中查看 RTL 层次结构和后续扩展。
模块结构
顶层模块:mimasuo 主要子模块包括: reset_password:密码重置/修改逻辑。 key44_scan:4x4 矩阵键盘扫描相关模块。 alarm_on:报警输出和指示灯控制。 display:数码管显示控制。 mima_input:密码输入、退格处理和键值组织。 hx75_hex_7seg:数码管段码转换。 key_jitter:按键消抖与边沿检测。 key_7seg:按键显示辅助模块。 mimasuo_ctrl:密码锁状态机与开锁控制核心。 工程包含 Vivado 项目文件、Verilog 源码文件和 XDC 管脚约束文件,顶层通过模块例化方式把输入、控制、显示、报警和密码管理连接为完整密码锁系统。
开发板验证
本设计带有 Nexys A7 相关管脚约束文件,并配套开发板实物验证图片。约束中包含矩阵键盘、独立按键、拨码开关、LED、报警输出以及数码管等接口分配,可用于在开发板上进行密码输入、确认、退格、修改密码、开锁指示和报警效果验证。
演示视频
配套演示视频展示了密码锁工程在开发板上的运行效果,可用于查看矩阵键盘输入、数码管显示、确认开锁、错误处理和报警等功能的实际表现。
演示视频请关注公众号后获取对应资料查看。
仿真图/仿真说明/设计文档图片
设计文档内容包含工程文件、程序文件、程序编译、RTL 图、管脚分配以及课程设计题目说明等部分,并配有多张设计文档图片,可作为理解工程结构、模块连接和管脚配置的参考。
部分代码
以下展示顶层模块mimasuo的部分代码,完整代码可关注下方公众号卡片获取。
module mimasuo( input clk,//时钟 input [3:0] row, //行 output [3:0] col, //列 input confirm_key,//确认键--key1 input modify_key,//修改密码--key2 input lock_up_key,//上锁--key3 input back_key,//退格--key4 input reset,//SW1--(清除报警) input admin_sw,//SW2--(管理) output alarm,//报警(低响) output led_open,//开锁,绿灯 output [2:0] tri_led,//指示灯 //数码管 output [7:0] seg_sel,//数码管位选 output [7:0] seg_led//数码管段选 ); wire reset_p; assign reset_p=reset; wire [2:0] current_state; wire [15:0] password; wire [15:0] correct_password; wire confirm; wire modify; wire lock_up; wire back_s; wire to_idle_en; //上升沿检测 key_jitter i1_key_jitter( . clkin(clk), . key_in(confirm_key),//输入 . key_posedge(confirm),//消抖后按键上升沿 . key_negedge(),//消抖后按键下降沿 . key_value()//消抖后按键 ); //上升沿检测 key_jitter i2_key_jitter( . clkin(clk), . key_in(modify_key),//输入 . key_posedge(modify),//消抖后按键上升沿 . key_negedge(),//消抖后按键下降沿 . key_value()//消抖后按键 ); //上升沿检测 key_jitter i3_key_jitter( . clkin(clk), . key_in(lock_up_key),//输入 . key_posedge(lock_up),//消抖后按键上升沿 . key_negedge(),//消抖后按键下降沿 . key_value()//消抖后按键 ); //上升沿检测 key_jitter i4_key_jitter( . clkin(clk), . key_in(back_key),//输入 . key_posedge(back_s),//消抖后按键上升沿 . key_negedge(),//消抖后按键下降沿 . key_value()//消抖后按键 ); //密码输入模块 mima_input i_mima_input( . clk(clk), . back_s(back_s), . row(row), //行 . col(col), //列 . to_idle_en(to_idle_en), . current_state(current_state), . password(password) ); //密码锁控制模块 mimasuo_ctrl i_mimasuo_ctrl( . clk(clk), . password(password), . correct_password(correct_password), . confirm(confirm), . reset(reset_p), . modify(modify), . lock_up(lock_up), . to_idle_en(to_idle_en), . led_open(led_open), . current_state(current_state) ); //显示控制模块 display i_display ( . clk(clk), . password(password), . state(current_state), .correct_password(correct_password), . admin_sw(admin_sw),//SW2--(管理) . bit_select(seg_sel),//数码管位选 . seg_select(seg_led)//数码管段选 ); //报警模块 alarm_on i_alarm_on( . clk(clk), . tri_led(tri_led), . confirm_key(confirm_key), . current_state(current_state), . alarm(alarm) ); //重置密码模块 reset_password i_reset_password( . clk(clk), . password(password), . correct_password(correct_password), . confirm(confirm), . current_state(current_state) ); // ... 以下代码略,完整源码请下载压缩包查看
代码获取:点击下方公众号卡片