基于FPGA的数字密码锁
一、简介
本文篇幅可能有些长,请耐心阅读
本数字密码锁采用矩阵键盘作为十六位按键输入,其中,十位数字键,六位功能按键。密码锁具有清零,密码重置,错误警报等多项功能,采用数码管动态显示的方法显示信息。
1.1设备要求
1、FPGA开发板一块(需要有至少四位数码管)
2、矩阵键盘一块
3、下载线,电源线等以及杜邦线若干
1.2 功能要求
六位功能按键:
- on:密码锁开关,打开初始值显示“0000”
- off:密码锁关闭按键
- clear:清零按键,输入数字错误后按下此键清零
- lock:密码上锁,输入想要的密码按下此键,即可锁定
- reset:密码重置,变更前需核对密码是否正确,在开锁状态下,按下此键后输入新密码,再按下lock键上锁
- check:输入密码按下此键,如正确即可开锁
其他要求:
1.当连续三次输入错误密码时,系统在第四次输入密码时发出警报
2.输入新数字显示在数码管最右端,前一个数字依次往左移动
二、工程分析:
首先,作为一个功能较多的工程而言,其内在逻辑必然十分复杂。所以在建立工程时首先考虑进行模块划分,将整个工程分为几个模块,尽量降低每个模块之间的耦合性,提高模块的独立性,这样才会使逻辑更加清晰,程序的可读性更好,以及更加便于修改。
本密码锁具体分为四个模块:
1、矩阵键盘扫描模块:要求将矩阵键盘的十六个值分别进行输出
2、按键功能模块:对于矩阵键盘输出的十六个值进行划分,分别为十位数字键以及六位功能按键并对下一个模块进行输出
3、中心处理模块:对于各个按键值接受以后,按照各个按键功能进行相应的信号处理,最后将其结果输出给下一个模块
4、结果显示模块:接收上一个模块的结果,并对结果进行数码管的显示
三、具体程序:
顶层模块:
按照划分的几个模块进行顶层模块的编写,顶层模块的编写放到最后,需要根据各个模块的信号接口进行连接。
module top_lock(clk,dxuan,wxuan,led,beep,row,col);
input clk;
input [3:0] row;
output beep;
output [3:0] col;
output led;
output [5:0] wxuan;
output [7:0] dxuan;
wire [4:0] key_out;
wire [8:0] number_key;
wire [3:0] row;
wire [3:0] cow;
wire lock;
wire check;
wire reset;
wire clear_flag;
wire state_lock;
wire [3:0]rece_cnt;
wire rece_flag;
wire [3:0] disp_in1;
wire [3:0] disp_in2;
wire [3:0] disp_in3;
wire [3:0] disp_in4;
key_board key_board1(
.clk (clk ),
.row (row ),
.col (col ),
.key_out (key_out)
);
key_function key_function1(
.clk ( clk ),
.key_out (key_out),
.state_lock (state_lock),
.clear_flag (clear_flag),
.number_key (number_key),
.lock (lock),
.reset (reset),
.check (check),
.rece_cnt (rece_cnt),
.rece_flag (rece_flag)
);
lock_ctrl lock_ctrl1(
.clk (clk),
.check (check),
.state_lock (state_lock),
.clear_flag (clear_flag),
.lock (lock),
.reset (reset),
.rece_cnt (rece_cnt),
.rece_flag (rece_flag),
.number_key (number_key),
.led (led),
.beep (beep),
.disp_in1 (disp_in1)