密码锁verilog课程设计.docx
- 文档编号:11730752
- 上传时间:2023-03-31
- 格式:DOCX
- 页数:18
- 大小:53.44KB
密码锁verilog课程设计.docx
《密码锁verilog课程设计.docx》由会员分享,可在线阅读,更多相关《密码锁verilog课程设计.docx(18页珍藏版)》请在冰豆网上搜索。
密码锁verilog课程设计
课程设计陈述之宇文皓月创作
课程设计题目:
4位串行数字密码锁
学号:
201420130326
学生姓名:
谢渊良
专业:
通信工程
班级:
1421302
指导教师:
钟凯
2017年1月5日
1.摘要
随着科技的发展数字电路的各种产品广泛应用,传统的机械锁由于其构造的简单,平安性不高,电子密码锁其保密性高,使用灵活性好,平安系数高,使用方便,将会是未来使用的趋势。
本设计使用EDA设计使设计过程廷到高度自动化,其具有强大的设计功能、测试、仿真分析、管理等功能。
使用EDA环境完成电路的系统综合设计和仿真。
用VHDL可以更加快速、灵活地设计出符合各种要求的密码锁。
本设计基于VerilogHDL语言来设计密码锁,先介绍设计要求和整体设计思想,随后对所使用各模块分别为键盘模块、连接模块、控制模块进行了介绍,给出各个模块的主要代码,在对各个模块的功能进行仿真。
关键字:
密码锁VerilogHDL
2.设计内容
设计一个4位数字密码锁子系统
1)1.2设计要求开锁密码为4位二进制,当输入密码与锁内给定的密码一致时,方可开锁。
否则进入“错误”状态,发出报警信号。
2)锁内的密码可调。
3)串行数字密码锁的报警,直到按下复位开关,才停下。
此时,数字密码锁又自动等待下一个开锁状态。
3.系统设计
本设计中,FPGA系统采取硬件描述语言Verilog按模块化方式进行设计,并用modersim软件对各个模块进行编写仿真。
3.1键盘模块
键盘电路理想接口图:
0
1flag
Set
Resetkey_value
设计原理:
本模块采取2×2的扫描键盘电路,对输入信号进行收集,此模块的主要功能是每按下一个按键,flag发生一个矩形波,作为连接模块的触发信号。
同时key_value值为所按下键的编码值,与flag一同传入连接模块。
实际设计接口图:
ba
flag
key_value
键盘模块仿真图:
跟据图中所示当输出kevalue:
10值的时候,flag出现一个矩形波。
当输出kevalue:
11值的时候,flag再次出现上跳沿。
实际上,上面的图写的测试文件是有一点错误的,当a扫描到第三个值(01)时,b在实际电路中应该是01而不是11,此时根据程序flag应置为1,当然此时flag原本就是1,不会发生错误。
在实际中,时钟频率跳的如此之快,人按一下按键的持续时间还是有的,所以flag应在按键按完后再下降下来。
否则多出很多无用的矩形波,这个装置就没用了。
3.2连接模块
连接模块接口图:
a_ledb_led
flagflag2
a
keyvalueb
c
d
set
reset
设计原理:
本连接模块通过flag信号下降沿触发,将keyvalue送入连接模块进行运算,当连续四个0和1键按下时,flag2发生一个矩形波,并将四个值分别送入a,b,c,d中,如果按下的是set键,则set置1,如果按下的是reset键,则reset键置1;a_led,b_led是灯泡,如果按的是0键,则a_led置1,若是1键,则b_led置1。
连接模块仿真图如下:
这里有一个需要注意的点是,当第一次按了0键后马上按reset键,再按一下1键时,a的值是1,而不是0。
每次按了reset或set,a,b,c,d都是要重新赋值的,这才符合实际情况。
3.3控制模块:
因为这个密码锁是循环使用的,就一定有分歧的状态。
这里采取有限状态机的方法进行设计。
所以把开锁过程分为三个部分:
1.等待输入状态;
2.重设密码状态;
3.输出结果状态;
状态转换图如下所示:
控制模块接口图:
flag2ena
a
bc_led
c
dd_led
set
rese
clkt
设计原理:
通过各种状态的转变,实现密码锁的开锁,报错,重设密码功能。
当密码错误是ena=1;当重设密码成功时c_led置为1;当输入密码成功开锁时d_led为1。
控制模块仿真如下:
因为初设密码是0000,所以在第一个flag2的矩形波到来后,d_led出现一个矩形波,实际上不该该出现矩形,一直亮直到reset重置才行。
或者设计一个计数器都行,虽然只是一些小错误,但如果在实际验证中可能现象就不容易观察了。
然后就是按下set键的模拟了,波形都达到了课设的要求。
这是令人欣喜的,虽然经过了很多次的修改,实在是很不容易。
4.实验心得
我从第二个星期的星期一开始做,原本只是随便做一下,但是看到周围同学都热情高昂,我也深受感染,然后开始查资料,后面看到这个状态机的方法很不错,很方便的解决了状态的转换问题,然后我就测验考试这个方法。
同时在写程序的时候我也遇到了很多了困难,其中最难找的错误就是逻辑错误,但是最终还是一一被我解决了。
心中的成就感还是有一些的。
通过此次的课设,使我对数字电路的设计有更深条理的了解(各种时序),对verilog语言的运用也更加熟练。
由于时间和心力有限的原因,使我只能止步各个模块的设计了。
原本还想联合仿真的,但是电脑里只装了modersim,其中又有一个键盘开关的硬件,还是比较难实现的。
我想,如果我的程序下载到fpga芯片里,那是一定会出现很多错误的,实际的情况往往更加复杂,这也是我的一大遗憾!
最后我要感谢我的室友,感谢他们对我的关爱,在我将要放弃的时候鼓励我,使我积极向前。
在此,我还要特别感谢英明兄的无私帮忙,减少了我找编译错误的时间。
还依稀记得上次的数电感觉也是如此,很不错啊。
附:
Verilog程序代码
1.1Key_board_input:
modulekey_board_input(clk,a,b,keyvalue,flag,q,j);
inputclk;
input[1:
0]b;
outputreg[1:
0]a;
outputreg[1:
0]keyvalue;
outputregflag;
outputregq=1;
outputreg[1:
0]j=0;
always@(posedgeclk)
begin
q=q+1;
case(q)
0:
a=2'b01;
1:
a=2'b10;
endcase
case({a,b})
4'b10_01:
begin
keyvalue=2'b00;flag=1;j=3;end
4'b10_10:
begin
keyvalue=2'b01;flag=1;j=3;end
4'b01_01:
begin
keyvalue=2'b10;flag=1;j=3;end
4'b01_10:
begin
keyvalue=2'b11;flag=1;j=3;end
default:
keyvalue=keyvalue;
endcase
begin
j=j+1;
if(j==3)flag=0;
end
end
endmodule
1.2key_board_test:
`timescale1s/1s
modulekey_board_test();
regclk;
reg[1:
0]b;
wire[1:
0]a;
wire[1:
0]keyvalue;
wireflag;
wireq;
wire[1:
0]j;
key_board_inputu2(clk,a,b,keyvalue,flag,q,j);
initial
begin
#0clk=0;
#2clk=1;b=1;
#2clk=0;
#2clk=1;b=3;
#2clk=0;
#2clk=1;b=3;
#2clk=0;
#2clk=1;b=3;
#2clk=0;
#2clk=1;b=2;
#2clk=0;
#2clk=1;b=3;
#2clk=0;
#2clk=1;b=3;
#2clk=0;
#2clk=1;b=3;
end
endmodule
2.1connect:
moduleconnect(flag,keyvalue,a_led,b_led,flag2,a,b,c,d,set1,reset,jishu,jishu1,jishu2,hh);
inputflag;
input[1:
0]keyvalue;
outputrega_led,b_led,flag2,a,b,c,d,set1,reset;
outputreg[1:
0]jishu=2'b00;
outputreg[1:
0]jishu1=0,jishu2=0,hh=0;
always@(negedgeflag)
begin
jishu2<=jishu2+1;
jishu1<=jishu1+1;
if(keyvalue<2)
begin
if(jishu==3)
begin
jishu<=0;
end
else
jishu<=jishu+1;
end
if(jishu==0)
flag2=0;
if(keyvalue==2)
begin
hh<=jishu1;
jishu<=0;
end
if(jishu1==(hh+1))
begin
set1<=0;
end
if(keyvalue==2'd3)
begin
hh<=jishu2;
jishu<=0;
end
if(jishu2==(hh+1))
begin
reset<=0;
end
/*if(jishu==0)
flag2=0;/*?
?
?
?
?
?
set?
?
?
?
*/
case(jishu)
0:
begin
case(keyvalue)
0:
begin
a<=0;
a_led=1;
b_led=0;
end
1:
begin
a=1;
a_led=0;
b_led=1;
end
2:
begin
set1=1;
end
3:
begin
reset=1;
end
endcase
end
1:
begin
case(keyvalue)
0:
begin
b=0;
a_led=1;
b_led=0;
end
1:
begin
b=1;
a_led=0;
b_led=1;
end
2:
begin
set1=1;
end
3:
begin
reset=1;
end
endcase
end
2:
begin
case(keyvalue)
0:
begin
c=0;
a_led=1;
b_led=0;
end
1:
begin
c=1;
a_led=0;
b_led=1;
end
2:
begin
set1=1;
end
3:
begin
reset=1;
end
endcase
end
3:
begin
case(keyvalue)
0:
begin
d=0;
a_led=1;
b_led=0;
flag2=1;
end
1:
begin
d=1;
a_led=0;
b_led=1;
flag2=1;
end
2:
begin
set1=1;
end
3:
begin
reset=1;
end
endcase
end
endcase
end
endmodule
2.2connect_test:
`timescale1s/1s
moduleconnect_test();
regflag;
reg[1:
0]keyvalue;
wirea_led,b_led,flag2,a,b,c,d,set1,reset;
wire[1:
0]jishu;
wire[1:
0]jishu1,jishu2,hh;
connectu2(flag,keyvalue,a_led,b_led,flag2,a,b,c,d,set1,reset,jishu,jishu1,jishu2,hh);
initial
begin
#0flag=0;
#2flag=1;keyvalue=1;
#2flag=0;
#2flag=1;keyvalue=3;
#2flag=0;
#2flag=1;keyvalue=0;
#2flag=0;
#2flag=1;keyvalue=0;
#2flag=0;
#2flag=1;keyvalue=1;
#2flag=0;
#2flag=1;keyvalue=0;
#2flag=0;
end
endmodule
3.1control:
modulecontrol(clk,flag2,a,b,c,d,set1,reset,control_set,ena,c_led,d_led,state,a1,b1,c1,d1,hhh);
inputclk,flag2,a,b,c,d,set1,reset;
outputregena,c_led,d_led,control_set;
outputreg[1:
0]state=0;
outputrega1=0,b1=0,c1=0,d1=0;
outputreghhh=0;
parameterin=2'b00,set=2'b01,out1=2'b10;
always@(posedgeclkorposedgeset1orposedgeresetorflag2)
begin
case(state)
in:
begin
if(reset==1)
state=in;
elseif(set1==1)
begin
state=set;
control_set=1;
end
elseif(control_set==1&&hhh==1)
begin
state=in;
control_set=0;
hhh=0;
end
elseif(flag2==1)
state=out1;
else
begin
ena=0;
c_led=0;
control_set=0;
d_led=0;
end
end
set:
begin
if(reset==1)
state=in;
elseif(set1==1)
begin
state=set;
control_set=1;
end
elseif(flag2==1&&control_set==1)
begin
a1=a;
b1=b;
c1=c;
d1=d;
hhh=1;
c_led=1;
state=in;
end
end
out1:
begin
if(reset==1)
state=in;
else
begin
if(a==a1&b==b1&c==c1&d==d1)
begin
ena=0;
d_led=1;
state=in;
end
else
begin
ena=1;
state=out1;
end
end
end
default:
state=in;
endcase
end
endmodule
3.2control_test:
`timescale1s/1s
modulecontrol_test();
regclk,flag2,a,b,c,d,set1,reset;
wireena,c_led,d_led,control_set;
wire[1:
0]state;
wirea1,b1,c1,d1;
wirehhh;
controlu2(clk,flag2,a,b,c,d,set1,reset,control_set,ena,c_led,d_led,state,a1,b1,c1,d1,hhh);
always#10clk=~clk;
initial
beginclk=0;reset=0;flag2=0;a=0;b=0;c=0;d=0;set1=0;reset=0;
#10a=0;
#20b=0;
#20c=0;
#20d=0;flag2=1;
#20flag2=0;
#50reset=1;
#20reset=0;
#50set1=1;
#20a=1;set1=0;
#20b=1;
#20c=0;
#20d=0;flag2=1;
#20flag2=0;
#20reset=1;
#20reset=0;
#80a=0;
#20b=0;
#20c=0;
#20d=0;flag2=1;
#20flag2=0;
#20reset=1;
#20reset=0;
end
endmodule
东华理工大学
课程设计评分表
学生姓名:
谢渊良班级:
1421302学号:
201420130326
课程设计题目:
4位串行数字密码锁
项目内容
满分
实评
选
题
能结合所学课程知识、有一定的能力训练。
符合选题要求
(5人一题)
10
工作量适中,难易度合理
10
能
力
水
平
能熟练应用所学知识,有一定查阅文献及运用文献资料能力
10
理论依据充分,数据准确,公式推导正确
10
能应用计算机软件进行编程、资料搜集录入、加工、排版、制图等
10
能体现创造性思维,或有独特见解
10
成
果
质
量
总体设计正确、合理,各项技术指标符合要求。
10
说明书综述简练完整,概念清楚、立论正确、技术用语准确、结论严谨合理;分析处理科学、条理分明、语言流畅、结构严谨、版面清晰
10
设计说明书栏目齐全、合理,符号统一、编号齐全。
格式、绘图、表格、插图等规范准确,符合国家尺度
10
有一定篇幅,字符数很多于5000
10
总分
100
指导教师评语:
指导教师签名:
年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 密码锁 verilog 课程设计