密码锁verilog课程设计之欧阳物创编.docx

上传人:b****7 文档编号:15938181 上传时间:2023-07-09 格式:DOCX 页数:21 大小:53.35KB
下载 相关 举报
密码锁verilog课程设计之欧阳物创编.docx_第1页
第1页 / 共21页
密码锁verilog课程设计之欧阳物创编.docx_第2页
第2页 / 共21页
密码锁verilog课程设计之欧阳物创编.docx_第3页
第3页 / 共21页
密码锁verilog课程设计之欧阳物创编.docx_第4页
第4页 / 共21页
密码锁verilog课程设计之欧阳物创编.docx_第5页
第5页 / 共21页
密码锁verilog课程设计之欧阳物创编.docx_第6页
第6页 / 共21页
密码锁verilog课程设计之欧阳物创编.docx_第7页
第7页 / 共21页
密码锁verilog课程设计之欧阳物创编.docx_第8页
第8页 / 共21页
密码锁verilog课程设计之欧阳物创编.docx_第9页
第9页 / 共21页
密码锁verilog课程设计之欧阳物创编.docx_第10页
第10页 / 共21页
密码锁verilog课程设计之欧阳物创编.docx_第11页
第11页 / 共21页
密码锁verilog课程设计之欧阳物创编.docx_第12页
第12页 / 共21页
密码锁verilog课程设计之欧阳物创编.docx_第13页
第13页 / 共21页
密码锁verilog课程设计之欧阳物创编.docx_第14页
第14页 / 共21页
密码锁verilog课程设计之欧阳物创编.docx_第15页
第15页 / 共21页
密码锁verilog课程设计之欧阳物创编.docx_第16页
第16页 / 共21页
密码锁verilog课程设计之欧阳物创编.docx_第17页
第17页 / 共21页
密码锁verilog课程设计之欧阳物创编.docx_第18页
第18页 / 共21页
密码锁verilog课程设计之欧阳物创编.docx_第19页
第19页 / 共21页
密码锁verilog课程设计之欧阳物创编.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

密码锁verilog课程设计之欧阳物创编.docx

《密码锁verilog课程设计之欧阳物创编.docx》由会员分享,可在线阅读,更多相关《密码锁verilog课程设计之欧阳物创编.docx(21页珍藏版)》请在冰点文库上搜索。

密码锁verilog课程设计之欧阳物创编.docx

密码锁verilog课程设计之欧阳物创编

课程设计报告

时间:

2021.02.07

命题人:

欧阳物

课程设计题目:

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

指导教师评语:

指导教师签名:

年月日

时间:

2021.02.07

命题人:

欧阳物

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2