FPGA课程设计—数字密码锁学院:专业班级:姓名:学号:页脚内容1FPGA基于Verilog HDL密码锁设计1. 摘要 (3)2. 题目来源: (4)3. 理论分析 (4)4. 实现过程 (5)4.1顶层模块 (5)4.2蜂鸣器模块 (7)4.3显示模块 (8)4.4控制模块 (13)5. 实验结果 (17)5.1顶层模块时序仿真: (17)5.2蜂鸣器时序仿真 (20)5.3显示模块时序仿真: (21)5.4控制模块时序仿真 (23)6. 总结 (27)7. 参考文献 (28)页脚内容21.摘要随着科技的发展数字电路的各种产品广泛应用,传统的机械锁由于其构造的简单,安全性不高,电子密码锁其保密性高,使用灵活性好,安全系数高,使用方便,将会是未来使用的趋势。
本设计使用FPGA设计使设计过程廷到高度自动化,其具有强大的设计功能、测试、仿真分析、管理等功能。
用Verilog HDL可以更加快速、灵活地设计出符合各种要求的密码锁。
本设计基于Verilog HDL语言来设计密码锁,先介绍设计要求和整体设计思想,随后对所使用各模块分别为蜂鸣器模块、显示模块、控制模块、顶层模块进行了介绍,给出各个模块的主要代码,在对各个模块的功能进行仿真。
随着现代科技的日益发展,智能化,自动化技术的成熟将会代替以往的人工手动控制。
密码锁不仅可以有效地提高人们的生活效率,节约生活资源,而且十分安全可靠。
电子密码锁运用电子电路控制机械部分,使两者紧密结合,从而避免了因为机械部分被破坏而导致开锁功能失常.大大增加了密码锁得防盗功能。
同时因为电子密码锁不需要携带钥匙,弥补了钥匙极易丢失和仿造的缺陷,方便了锁具的使用。
关键字:页脚内容3密码锁Verilog HDL Quartus II2.题目来源:本设计以007为万能密码在忘记密码时开锁使用。
开始时密码锁处于关闭的状态,输入万能密码将锁打开。
在锁处于打开的状态时设计密码,此时指示灯处于亮的状态,说明锁处于开的状态。
设置好密码后按关闭拨码使锁关闭,指示灯处于灭的状态。
再输入三位数字进行开琐,如果输入的密码正确则指示灯亮,表示开琐成功,否则蜂鸣器发出响声,并持续五秒钟,表示开锁失败。
通过学习FPGA技术,应用于实践当中,掌握FPGA数字电路系统的开发流程,并且在自己的实践设计中熟练这门技术,同时排除和解决开发中遇到的问题,用Verilog语言编写设计所需要的实现的功能。
3.理论分析密码锁分为四个模块:①顶层模块、②显示模块、③蜂鸣器模块、④控制模块。
其中由顶层模块调其他分模块来实现密码锁功能。
密码锁功能:a.由12个拨码开关设置三位密码(0-9)b.再输入密码开锁,密码正确,指示灯亮开锁成功。
c.密码输入错误,蜂鸣器响五秒,表示开锁失败。
页脚内容4总体框图图1.0 总体框图4.实现过程4.1顶层模块实现几个模块的配合工作,它能实现对密码的设置和显示,同时在密码正确时时灯亮,在密码错误时蜂鸣器发出五秒钟的响声。
程序如下:页脚内容5module 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;codeu1(.lock(lock),.warning(X4),.num1(X1),.num2(X2),.num3(X3),.clk(clk1),.n0(n0),.n1(n1),.n2(n2),.n3(n3),.n4(n4),.n5(n 5),.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页脚内容64.2蜂鸣器模块蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用各类电子产品中作发声器件。
如图为其原理图:图 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;页脚内容7always@(posedge CLK2) //CLK2为敏感信号beginif(ENA&&Q1<6) //当ENA为1并且Q1小于6时执行下面的语句Q1=Q1+1;if(~ENA) //ENA为0时,执行下面的语句Q1=0;endalwaysbeginif(Q1==6||Q1==0)COUT='b0;elseCOUT='b1;endEndmodule4.3显示模块页脚内容8数码管常用于电子产品的显示部分,原理简单易于实现,将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)beginM=M+1;页脚内容9if(M=='b11)M<='b00;endalways@(posedge clk)beginif(M=='b00)beginss1<=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;页脚内容107:Q<='b0000111;8:Q<='b1111111;9:Q<='b1101111;endcaseendif(M=='b01)beginss1<=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;页脚内容117:Q<='b0000111;8:Q<='b1111111;9:Q<='b1101111;endcaseendif(M=='b10)beginss1<=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;页脚内容127:Q<='b0000111;8:Q<='b1111111;9:Q<='b1101111;endcaseendendEndmodule4.4控制模块控制模块用于密码的设置控制模块功能实现:模块可以通过程序的执行实现对密码进行设置和进行开琐,开始时锁处于关闭的状态,即为1,输入事先设置的万能密码开琐,在锁开的状态时设置密码,然后将锁关闭,再输入三位数字进行开锁,正确时为1既灯亮,否则为0为1,即蜂鸣器响。
控制模块程序如下:/*页脚内容13clk:时钟信号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)beginif({n0,n1,n2,n3,n4,n5,n6,n7,n8,n9}!=10'b0000000000)begin页脚内容14case({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'b010*******:temp=1'd8;10'b1000000000:temp=1'd9;endcasenum3<=num2;num2<=num1;num1<=temp;endif(close)页脚内容15beginnum1<=0;num2<=0;num3<=0;endendalways@(posedge clk)beginif(lock==0&&set)beginif(code=={num3,num2,num1})lock<=1;else if({num3,num2,num1}==16'b000000000111)lock<=1;else warning<=1;endif(lock==1&&close)页脚内容16lock<=0;if(close)warning<=0;endalways@(posedge clk)beginif(lock==1&&set)code<={num3,num2,num1};endEndmodule5.实验结果5.1顶层模块时序仿真:页脚内容17图1.2 万能密码开锁的波形页脚内容18图1.3 设置密码的波形页脚内容19图1.4 开锁失败的波形5.2蜂鸣器时序仿真图1.5:当ENA为1时且CLK2上升沿到来时,COUT被置1,即蜂鸣器开始发出响声页脚内容20图1.5 蜂鸣器功能波形5.3显示模块时序仿真:图1.6:SS0、SS1不断的进行片选使三个数码管分别显示所输入的密码,以实现对密码的动态显示页脚内容21图1.6 显示模块功能波形页脚内容225.4控制模块时序仿真图1.7:输入万能密码007,并使set置1,运行程序后lock被置1。