电子密码锁程序设计报告
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告
课程设计题目:8位数字密码锁设计
学院:计算机科学与技术学院
姓名:王小川
班级:10级2班
学号:
指导老师:黄为民
2012年2月17日
1.课程设计的目的和要求
设计一数字密码锁,在锁开的情况下输入密码,设置密码共八位,用数据开关sw0-sw9分别代表数字0,1,2,3,……,9。输入的密码用七段显示器显示。具体要求如下:
always@(posedge clk_1Hz)//开锁及关锁
begin
if(lock==0&&!check)
begin
if(code=={num8,num7,num6,num5,num4,num3,num2,num1})
lock<=1;
else
if({num8,num7,num6,num5,num4,num3,num2,num1}==32'b)//万能密码开锁
//assign clock = {clk_1MHz, clk_100KHz, clk_10KHz, clk_1KHz, clk_100Hz, clk_10Hz, clk_1Hz};
divide_by_50 d6 (clk_1MHz, CLK, RST);
divide_by_10 d5 (clk_100KHz, clk_1MHz, RST);
begin
if({n0,n1,n2,n3,n4,n5,n6,n7,n8,n9}!=10'b)
begin
case({n9,n8,n7,n6,n5,n4,n3,n2,n1,n0})
10'b:temp=4'd0;
10'b:temp=4'd1;
10'b:temp=4'd2;
10'b:temp=4'd3;
10'b:temp=4'd4;
3.设计流程图
4.总体框架
源代码:
Elock.v文件////////////////////////////
module elock(n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,reset,back,check,set,close,lock,clk,nCR,out1,out2,out3,out4,out5,out6,out7,out8,cin,cout);
数字密码锁为八位十进制数字,密码可以设置与修改;开锁时间定位8秒;开锁时间到8秒,锁没开,红灯亮。设计一个万能密码,当主任忘记密码时也能开锁。用一位LED灯(绿色)表示开闭状态。
2.课程设计提示
此系统可以分为密码输入删除控制模块,寄存模块,比较模块,扫描模块,定时模块几部分。
密码输入删除控制模块设计考虑:
lock<=1;
end
else
if(lock==1&&!close)
lock<=0;
else
if(lock==0&&cout==1)
lock<=0;
end
always@(posedge clk_1Hz)//重设密码
begin
if(reset)
code<=32'h;
else
if(lock==1&&set)
1hz.v文件(获取1hz脉冲)///////////////
module clk_1hz(CLK, RST, clk_1Hz);
input CLK, RST;
output clk_1Hz;
wire clk_1MHz, clk_100KHz, clk_10KHz, clk_1KHz, clk_100Hz, clk_10Hz;
case(hex_digit)
5'h0: seg = ~7'h3F;
5'h1: seg = ~7'h06; // ---a----
5'h2: seg = ~7'h5B; // | |
5'h3: seg = ~7'h4F; // f b
5'h4: seg = ~7'h66; // | |
5'h5: seg = ~7'h6D; // ---g----
num1<=temp;
end
else if(!back)//删除修改输入的密码
begin
num1<=num2;
num2<=num3;
num3<=num4;
num4<=num5;
num5<=num6;
num6<=num7;
num7<=num8;
num8<=1'd0;
end
end
always@(posedge clk_1Hz)//启动cin,8秒时没有开锁,进入死锁及报警
begin
count <= count + 1'b1;
end
else
begin
count <= 5'b00000;
Q <= ~Q;
end
end
endmodule
////////////////////////////////////////////////
7p.v文件(七段显示器)////////////////////////
5'h6: seg = ~7'h7D; // | |
5'h7: seg = ~7'h07; // e c
5'h8: seg = ~7'h7F; // | |
5'h9: seg = ~7'h67; // ---d----
5'ha: seg = ~7'h77;
5'hb: seg = ~7'h7C;
5'hc: seg = ~7'h39;
begin
if (~RST)
begin
Q <= 1'b0;
count <= 3'b000;
end
else if (count < 4)
begin
count <= count + 1'b1;
end
else
begin
count <= 3'b000;
Q <= ~Q;
end
end
endmodule
module divide_by_50 (Q, CLK, RST);
input CLK, RST;
output Q;
reg Q;
reg [4:0] count;
always @(posedge CLK or negedge RST)
begin
if (~RST)
begin
Q <= 1'b0;
count <= 5'b00000;
end
else if (count < 24)
input reset;//恢复初始密码
output lock;//开锁状态
output [6:0]out1,out2,out3,out4,out5,outБайду номын сангаас,out7,out8;//七段显示器输出
reg [3:0]num1,num2,num3,num4,num5,num6,num7,num8;//输出的待验证的密码
reg [31:0]code;//密码寄存器
reg [4:1]temp;//
reg lock;
output cout;
reg [3:0]qh,ql;
wire clk_1Hz;//获得1HZ脉冲
clk_1hz clk1(clk,nCR,clk_1Hz);
always@(posedge clk_1Hz)//输入模块
input n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,back,check,set,close,nCR,cin;//n0-n9表示十个开关,输入十进制数;back为返回一次重输入密码;check验证密码;set设置密码;close关闭电子密码锁;cin控制到8秒是否死锁及蜂鸣;
input clk;//50MHZ脉冲
code<={num8,num7,num6,num5,num4,num3,num2,num1};
end
hex_seg seld1(num1,out1);//七段显示器显示8位输入的密码
hex_seg seld2(num2,out2);
hex_seg seld3(num3,out3);
hex_seg seld4(num4,out4);
(1)编码器:对数据开关sw0-sw9的电平信号,分别代表0-9;
(2)设计与删除密码操作及显示按设计要求处理。
(3)信号设置
Set:输入新密码确定键----当锁已经打开,输入新密码,按set建,重设密码成功。
Back:数字删除按键----每按一次删除最后输入的数字,密码显示右移一位,同时左边空位补0.
module hex_seg (hex_digit, seg);
input [3:0] hex_digit;
output [6:0] seg;
reg [6:0] seg;
// seg = {g,f,e,d,c,b,a};
// 0 is on and 1 is off
always @(hex_digit)
5'hd: seg = ~7'h5E;
5'he: seg = ~7'h79;
5'hf: seg = ~7'h71;
endcase
endmodule
divide_by_10 d4 (clk_10KHz, clk_100KHz, RST);
divide_by_10 d3 (clk_1KHz, clk_10KHz, RST);
divide_by_10 d2 (clk_100Hz, clk_1KHz, RST);
divide_by_10 d1 (clk_10Hz, clk_100Hz, RST);
Lock:密码锁显示信号----lock=0(LED灯灭),锁未开;lock=1(LED灯亮),锁已开。
Close:关锁信号----当锁开以后,按close对应的按键,灯灭。
Check:密码校验信号----在lock=0时,从数据开关输入8位开锁密码后按check,若与原密码相同,lock=1,灯亮开锁;否则灯不亮,锁未开。
begin
if(lock||!check||qh==1&&ql==3)
begin qh<=0;ql<=0;end
else if(cin)
begin
if(ql==3)
begin ql<=0;
if(qh==1) qh<=0;
else qh<=qh+1;
end
else ql<=ql+1;
end
end
assign cout=(qh==1&&ql==3&&cin&&lock==0)?1:0;
divide_by_10 d0 (clk_1Hz, clk_10Hz, RST);
endmodule
module divide_by_10 (Q, CLK, RST,);
input CLK, RST;
output Q;
reg Q;
reg [2:0] count;
always @(posedge CLK or negedge RST)
hex_seg seld5(num5,out5);
hex_seg seld6(num6,out6);
hex_seg seld7(num7,out7);
hex_seg seld8(num8,out8);
endmodule
/////////////////////////////////////////
10'b:temp=4'd5;
10'b:temp=4'd6;
10'b:temp=4'd7;
10'b:temp=4'd8;
10'b:temp=4'd9;
endcase
num8<=num7;
num7<=num6;
num6<=num5;
num5<=num4;
num4<=num3;
num3<=num2;
num2<=num1;
课程设计题目:8位数字密码锁设计
学院:计算机科学与技术学院
姓名:王小川
班级:10级2班
学号:
指导老师:黄为民
2012年2月17日
1.课程设计的目的和要求
设计一数字密码锁,在锁开的情况下输入密码,设置密码共八位,用数据开关sw0-sw9分别代表数字0,1,2,3,……,9。输入的密码用七段显示器显示。具体要求如下:
always@(posedge clk_1Hz)//开锁及关锁
begin
if(lock==0&&!check)
begin
if(code=={num8,num7,num6,num5,num4,num3,num2,num1})
lock<=1;
else
if({num8,num7,num6,num5,num4,num3,num2,num1}==32'b)//万能密码开锁
//assign clock = {clk_1MHz, clk_100KHz, clk_10KHz, clk_1KHz, clk_100Hz, clk_10Hz, clk_1Hz};
divide_by_50 d6 (clk_1MHz, CLK, RST);
divide_by_10 d5 (clk_100KHz, clk_1MHz, RST);
begin
if({n0,n1,n2,n3,n4,n5,n6,n7,n8,n9}!=10'b)
begin
case({n9,n8,n7,n6,n5,n4,n3,n2,n1,n0})
10'b:temp=4'd0;
10'b:temp=4'd1;
10'b:temp=4'd2;
10'b:temp=4'd3;
10'b:temp=4'd4;
3.设计流程图
4.总体框架
源代码:
Elock.v文件////////////////////////////
module elock(n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,reset,back,check,set,close,lock,clk,nCR,out1,out2,out3,out4,out5,out6,out7,out8,cin,cout);
数字密码锁为八位十进制数字,密码可以设置与修改;开锁时间定位8秒;开锁时间到8秒,锁没开,红灯亮。设计一个万能密码,当主任忘记密码时也能开锁。用一位LED灯(绿色)表示开闭状态。
2.课程设计提示
此系统可以分为密码输入删除控制模块,寄存模块,比较模块,扫描模块,定时模块几部分。
密码输入删除控制模块设计考虑:
lock<=1;
end
else
if(lock==1&&!close)
lock<=0;
else
if(lock==0&&cout==1)
lock<=0;
end
always@(posedge clk_1Hz)//重设密码
begin
if(reset)
code<=32'h;
else
if(lock==1&&set)
1hz.v文件(获取1hz脉冲)///////////////
module clk_1hz(CLK, RST, clk_1Hz);
input CLK, RST;
output clk_1Hz;
wire clk_1MHz, clk_100KHz, clk_10KHz, clk_1KHz, clk_100Hz, clk_10Hz;
case(hex_digit)
5'h0: seg = ~7'h3F;
5'h1: seg = ~7'h06; // ---a----
5'h2: seg = ~7'h5B; // | |
5'h3: seg = ~7'h4F; // f b
5'h4: seg = ~7'h66; // | |
5'h5: seg = ~7'h6D; // ---g----
num1<=temp;
end
else if(!back)//删除修改输入的密码
begin
num1<=num2;
num2<=num3;
num3<=num4;
num4<=num5;
num5<=num6;
num6<=num7;
num7<=num8;
num8<=1'd0;
end
end
always@(posedge clk_1Hz)//启动cin,8秒时没有开锁,进入死锁及报警
begin
count <= count + 1'b1;
end
else
begin
count <= 5'b00000;
Q <= ~Q;
end
end
endmodule
////////////////////////////////////////////////
7p.v文件(七段显示器)////////////////////////
5'h6: seg = ~7'h7D; // | |
5'h7: seg = ~7'h07; // e c
5'h8: seg = ~7'h7F; // | |
5'h9: seg = ~7'h67; // ---d----
5'ha: seg = ~7'h77;
5'hb: seg = ~7'h7C;
5'hc: seg = ~7'h39;
begin
if (~RST)
begin
Q <= 1'b0;
count <= 3'b000;
end
else if (count < 4)
begin
count <= count + 1'b1;
end
else
begin
count <= 3'b000;
Q <= ~Q;
end
end
endmodule
module divide_by_50 (Q, CLK, RST);
input CLK, RST;
output Q;
reg Q;
reg [4:0] count;
always @(posedge CLK or negedge RST)
begin
if (~RST)
begin
Q <= 1'b0;
count <= 5'b00000;
end
else if (count < 24)
input reset;//恢复初始密码
output lock;//开锁状态
output [6:0]out1,out2,out3,out4,out5,outБайду номын сангаас,out7,out8;//七段显示器输出
reg [3:0]num1,num2,num3,num4,num5,num6,num7,num8;//输出的待验证的密码
reg [31:0]code;//密码寄存器
reg [4:1]temp;//
reg lock;
output cout;
reg [3:0]qh,ql;
wire clk_1Hz;//获得1HZ脉冲
clk_1hz clk1(clk,nCR,clk_1Hz);
always@(posedge clk_1Hz)//输入模块
input n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,back,check,set,close,nCR,cin;//n0-n9表示十个开关,输入十进制数;back为返回一次重输入密码;check验证密码;set设置密码;close关闭电子密码锁;cin控制到8秒是否死锁及蜂鸣;
input clk;//50MHZ脉冲
code<={num8,num7,num6,num5,num4,num3,num2,num1};
end
hex_seg seld1(num1,out1);//七段显示器显示8位输入的密码
hex_seg seld2(num2,out2);
hex_seg seld3(num3,out3);
hex_seg seld4(num4,out4);
(1)编码器:对数据开关sw0-sw9的电平信号,分别代表0-9;
(2)设计与删除密码操作及显示按设计要求处理。
(3)信号设置
Set:输入新密码确定键----当锁已经打开,输入新密码,按set建,重设密码成功。
Back:数字删除按键----每按一次删除最后输入的数字,密码显示右移一位,同时左边空位补0.
module hex_seg (hex_digit, seg);
input [3:0] hex_digit;
output [6:0] seg;
reg [6:0] seg;
// seg = {g,f,e,d,c,b,a};
// 0 is on and 1 is off
always @(hex_digit)
5'hd: seg = ~7'h5E;
5'he: seg = ~7'h79;
5'hf: seg = ~7'h71;
endcase
endmodule
divide_by_10 d4 (clk_10KHz, clk_100KHz, RST);
divide_by_10 d3 (clk_1KHz, clk_10KHz, RST);
divide_by_10 d2 (clk_100Hz, clk_1KHz, RST);
divide_by_10 d1 (clk_10Hz, clk_100Hz, RST);
Lock:密码锁显示信号----lock=0(LED灯灭),锁未开;lock=1(LED灯亮),锁已开。
Close:关锁信号----当锁开以后,按close对应的按键,灯灭。
Check:密码校验信号----在lock=0时,从数据开关输入8位开锁密码后按check,若与原密码相同,lock=1,灯亮开锁;否则灯不亮,锁未开。
begin
if(lock||!check||qh==1&&ql==3)
begin qh<=0;ql<=0;end
else if(cin)
begin
if(ql==3)
begin ql<=0;
if(qh==1) qh<=0;
else qh<=qh+1;
end
else ql<=ql+1;
end
end
assign cout=(qh==1&&ql==3&&cin&&lock==0)?1:0;
divide_by_10 d0 (clk_1Hz, clk_10Hz, RST);
endmodule
module divide_by_10 (Q, CLK, RST,);
input CLK, RST;
output Q;
reg Q;
reg [2:0] count;
always @(posedge CLK or negedge RST)
hex_seg seld5(num5,out5);
hex_seg seld6(num6,out6);
hex_seg seld7(num7,out7);
hex_seg seld8(num8,out8);
endmodule
/////////////////////////////////////////
10'b:temp=4'd5;
10'b:temp=4'd6;
10'b:temp=4'd7;
10'b:temp=4'd8;
10'b:temp=4'd9;
endcase
num8<=num7;
num7<=num6;
num6<=num5;
num5<=num4;
num4<=num3;
num3<=num2;
num2<=num1;