资源描述
基于Verilog HDL密码锁设计
摘 要
随着科技的发展数字电路的各种产品广泛应用,传统的机械锁由于其构造的简单,安全性不高,电子密码锁其保密性高,使用灵活性好,安全系数高,使用方便,将会是未来使用的趋势.本设计使用EDA设计使设计过程廷到高度自动化,其具有强大的设计功能、测试、仿真分析、管理等功能。使用EDA环境完成电路的系统综合设计和仿真。用VHDL可以更加快速、灵活地设计出符合各种要求的密码锁.
本设计基于Verilog HDL语言来设计密码锁,先介绍设计要求和整体设计思想,随后对所使用各模块分别为蜂鸣器模块、显示模块、控制模块、顶层模块进行了介绍,给出各个模块的主要代码,在对各个模块的功能进行仿真。
关键字
密码锁 Verilog HDL Quartus II
总体设计
密码锁分为四个模块:①顶层模块、②显示模块、③蜂鸣器模块、④控制模块。其中由顶层模块调其他分模块来实现密码锁功能.
密码锁功能:
1。由12个拨码开关设置三位密码(0—9)
2。再输入密码开锁,密码正确,指示灯亮开锁成功.
3。密码输入错误,蜂鸣器响五秒,表示开锁失败.
设计思路:
本设计以007为万能密码在忘记密码时开锁使用。开始时密码锁处于关闭的状态,输入万能密码将锁打开。在锁处于打开的状态时设计密码,此时指示灯处于亮的状态,说明锁处于开的状态。设置好密码后按关闭拨码使锁关闭,指示灯处于灭的状态。再输入三位数字进行开琐,如果输入的密码正确则指示灯亮,表示开琐成功,否则蜂鸣器发出响声,并持续五秒钟,表示开锁失败。
总体框图
调用部分
顶层模块
显示部分
七段数码管
报警部分
蜂鸣器
密码设置
12个拨码开关
图1。0 总体框图
模块功能其及主要代码
1. 顶层模块
实现几个模块的配合工作,它能实现对密码的设置和显示,同时在密码正确时时灯亮,在密码错误时蜂鸣器发出五秒钟的响声。
程序如下:
module dingceng(n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,set,close,clk1,clk2,clk3,lock,alarm,Q,ss1,ss0);
input n0,n1,n2,n3,n4,n5,n6,n7,n8,n9;
input set,close;
input clk1,clk2,clk3;
output lock,alarm,ss1,ss0;
output[6:0] Q;
reg lock,alarm;
reg ss0,ss1;
reg[6:0] Q;
wire[3:0] X1,X2,X3;
wire X4,X5;
code u1(。lock(lock),。warning(X4),。num1(X1),。num2(X2),。num3(X3),。clk(clk1),。n0(n0),.n1(n1),.n2(n2),。n3(n3),.n4(n4),.n5(n5),.n6(n6),。n7(n7),。n8(n8),.n9(n9),。set(set),。close(close));
show u2(。A(X1),.B(X2),.C(X3),.clk(clk2),。Q(Q[6:0]),.ss1(ss1),.ss0(ss0));
speaker u3(。ENA(X4),。CLK2(clk3),。COUT(alarm));
endmodule
2。蜂鸣器模块
蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用各类电子产品中作发声器件.如图为其原理图:
COUT
ENA
CLK2K@
图 1。1 蜂鸣器原理图结构
蜂鸣器功能实现:
程序共有两个输入信号分别为ENA和CLK2,,一个输出信号COUT。当从信号输入模块检测到有开关输入时,信号ENA已置1,CLK2上升沿到来时,有程序使COUT为1,蜂鸣器发出报警信号,并且进入一个5秒钟的循环,时间到达时,跳出循环,蜂鸣器停止报警。
程序如下:
module speaker(ENA,CLK2,COUT);//ENA为使能信号,CLK为时钟信号规定工作频率
input ENA,CLK2;
output COUT;
reg COUT;
reg[3:0] Q1;
always@(posedge CLK2)//CLK2为敏感信号
begin
if(ENA&&Q1<6)//当ENA为1并且Q1小于6时执行下面的语句
Q1=Q1+1;
if(~ENA)//ENA为0时,执行下面的语句
Q1=0;
end
always
begin
if(Q1==6||Q1==0)
COUT=’b0;
else
COUT=’b1;
end
Endmodule
3。显示模块
数码管常用于电子产品的显示部分,原理简单易于实现,将BCD码经译码后显示成十进制的数字
显示模块功能实现:
模块共有四个输入信号A、B、C、CLK,三个输出信号分别为Q、SS1、SS2。SS1、SS2可对三个数码管进行片选,使它们分别亮。A、B、C接段选,以控制数码管显示什么数字.
程序如下:
module show(A,B,C,clk,Q,ss1,ss0);
input[3:0] A,B,C;
input clk;
output[6:0] Q;
output ss1,ss0;
reg[1:0] M;
reg ss0,ss1;
reg[6:0] Q;
always@(posedge clk)
begin
M=M+1;
if(M==’b11)
M〈='b00;
end
always@(posedge clk)
begin
if(M=='b00)
begin
ss1<=0;
ss0〈=0;
case(A)
0:Q〈=’b0111111;
1:Q<=’b0000110;
2:Q〈='b1011011;
3:Q<=’b1001111;
4:Q<=’b1100110;
5:Q〈='b1101101;
6:Q〈='b1111101;
7:Q<=’b0000111;
8:Q<='b1111111;
9:Q<='b1101111;
endcase
end
if(M==’b01)
begin
ss1〈=0;
ss0〈=1;
case(B)
0:Q<=’b0111111;
1:Q〈=’b0000110;
2:Q〈=’b1011011;
3:Q〈=’b1001111;
4:Q〈=’b1100110;
5:Q〈='b1101101;
6:Q〈=’b1111101;
7:Q〈='b0000111;
8:Q<='b1111111;
9:Q<=’b1101111;
endcase
end
if(M=='b10)
begin
ss1〈=1;
ss0<=0;
case(C)
0:Q〈='b0111111;
1:Q<='b0000110;
2:Q<='b1011011;
3:Q〈=’b1001111;
4:Q〈=’b1100110;
5:Q〈=’b1101101;
6:Q〈=’b1111101;
7:Q〈='b0000111;
8:Q<=’b1111111;
9:Q<='b1101111;
endcase
end
end
Endmodule
4.控制模块
控制模块用于密码的设置
控制模块功能实现:
模块可以通过程序的执行实现对密码进行设置和进行开琐,开始时锁处于关闭的状态,即为1,输入事先设置的万能密码开琐,在锁开的状态时设置密码,然后将锁关闭,再输入三位数字进行开锁,正确时为1既灯亮,否则为0为1,即蜂鸣器响。
控制模块程序如下:
/*
clk:时钟信号
n0,n1,n2,n3,n4,n5,n6,n7,n8,n9:密码输入信号
lock:状态显示信号
close:关信号
set:密码确认信号
*/
module code(lock,warning,num1,num2,num3,clk,n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,set,close);
input n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,set,close,clk;
output[3:0]num1,num2,num3;
output lock,warning;
reg lock,warning;
reg[3:0]num1,num2,num3,temp;
reg[11:0]code;
always@(posedge clk)
begin
if({n0,n1,n2,n3,n4,n5,n6,n7,n8,n9}!=10'b0000000000)
begin
case({n9,n8,n7,n6,n5,n4,n3,n2,n1,n0})
10’b0000000001:temp=1’d0;
10'b0000000010:temp=1’d1;
10'b0000000100:temp=1'd2;
10’b0000001000:temp=1’d3;
10’b0000010000:temp=1’d4;
10’b0000100000:temp=1’d5;
10’b0001000000:temp=1'd6;
10'b0010000000:temp=1’d7;
10’b0100000000:temp=1'd8;
10’b1000000000:temp=1’d9;
endcase
num3〈=num2;
num2〈=num1;
num1〈=temp;
end
if(close)
begin
num1<=0;
num2〈=0;
num3<=0;
end
end
always@(posedge clk)
begin
if(lock==0&&set)
begin
if(code=={num3,num2,num1})
lock〈=1;
else if({num3,num2,num1}==16’b000000000111)
lock〈=1;
else warning〈=1;
end
if(lock==1&&close)
lock〈=0;
if(close)
warning〈=0;
end
always@(posedge clk)
begin
if(lock==1&&set)
code〈={num3,num2,num1};
end
Endmodule
各个模块功能仿真波形
1。顶层模块时序仿真:
图1.2 万能密码开锁的波形
图1。3 设置密码的波形
图1.4 开锁失败的波形
2. 蜂鸣器时序仿真
图1。5:当ENA为1时且CLK2上升沿到来时,COUT被置1,即蜂鸣器开始发出响声
图1。5 蜂鸣器功能波形
3. 显示模块时序仿真:
图1。6:SS0、SS1不断的进行片选使三个数码管分别显示所输入的密码,
以实现对密码的动态显示
图1.6 显示模块功能波形
4. 控制模块时序仿真
图1.7:输入万能密码007,并使set置1,运行程序后lock被置1。说明开锁成功。
图1.7 输入万能密码后的波形
图1.8:锁开的状态下设置密码123,并使close置1,使锁关闭,再set使置1,此时lock置0,表示锁关闭。实现设置密码的功能。
图1。8 设置密码波形
图1.9:输入密码123即正确的密码进行解锁。因为输入的密码正确所以使lock置1,表示开锁成功。
图1.9 成功开锁波形
图2。0:输入错误密码234时,warning被置1,表示开锁失败.
图2.0 开锁失败的波形
总结
通过本设计可以学的到很多的东西,同时不仅可以巩固所学过的知识,而且学到了很多在书本上所没有学到过的知识.通过这次设计,进一步加深了对EDA的了解,.每一个子模块编写调试,都需要非常用心。编写过程中遇到了不少问题,通过查找相关资料,并且细心的检查,找出了错误和警告,并且排除在波形仿真时,设定输入的时钟信号,找到比较合适的输入数值,仿真时长等。
通过这次设计使我懂得了理论与实际相结合的重要性,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,用于实践,提高自己的实际动手能力和独立思考的能力。在设计的过程难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。需要耐心,信心去完成。
展开阅读全文