数字密码锁FPGA课程设计报告.doc
西安邮电学院FPGA课程设计报告题 目: 数字密码锁 院 系: 专业班级: 学生姓名: 导师姓名: 起止时间: 至 2012年 9 月 21 日FPGA课程设计报告提纲1 任务设计一个简单的数字密码锁,假设预设密码为4位数:0000,当输入正确时输出为1、输入错误时输出为0。同时输出输入的次数,当3次以上输入错误时,输出一个超告警信号,即使第四、五次输入正确也输出告警信号。2 目的通过学习FPGA技术,应用于实践当中,掌握FPGA数字电路系统的开发流程,并且在自己的实践设计中熟练这门技术,同时排除和解决开发中遇到的问题,用Verilog语言编写设计所需要的实现的功能。3 使用环境 (软件/硬件环境,设备等)功能仿真和后仿真采用第三方验证工具(Modelsim),综合与布局布线工具为:Quartus II。4 FPGA课程设计详细内容4.1 技术规范一、 功能定义具体功能如下: (1)、用户初次使用,可按下am_en键进行密码设置。(2)、开锁时一次完整的输入密码,当输入的密码与设置的密码相同时密码锁打开,即lockopen为高电平,连接的绿灯亮;否则密码锁关闭,即warn_en为高电平,连接的红灯亮。 (3)、当输入错误的次数>3时,密码锁强制自动关闭。二、引脚定义Inputrst复位信号高电平有效Inputam_en密码设置键高电平有效Inputcipher_in 3:0密码输入InputEnter确定键高电平有效OutputReturn清除键高电平有效Outputwarn_en密码错误或输入次>3高电平有效4.2 设计方案一、 总体设计(1) 密码设置或修改模块用户初次使用密码锁时可通过按am_en键进行密码设置,先输入初始密码0000,则进入密码设置,高电平有效。密码是十进制的四位数字密码。以后修改密码时,按am_en键,然后输入旧密码,正确时方可进入密码设置选项,否则重新开始。输入旧密码密码正确YN存储密码输入新密码按am_en键(2) 密码输入模块开锁时,一次完整输入密码后,按下enter键进行密码验证,高电平有效,看输入的数字是否等于原密码的值,密码正确时开锁,否则关闭。当输入有误时,按下return键,清除输入的数字,重新输入(3) 密码输入次数计数模块开始时count=0,当输入密码按下enter键时且密码错误时count+1,当conut>3时,密码锁强制自动关闭。当输入的密码正确时,count不计数。(4) 显示模块当密码输入正确时,lockopen为高电平,绿色发光二极管灯亮,当密码输入错误时或者当count>3时,warn_en为高电平,红色发光二极管灯亮。输入密码密码正确N+1N>3红灯亮 开锁YYNN绿灯亮二、 总体设计图4.3 功能验证方案一、密码输入验证如图所示,输入密码时,当第一次输入错误,第二次输入密码正确时,计数器count计数为2,验证正确二、密码修改验证如图黄线后边仿真的验证,当更改密码时,需先使am_en为高电平时,方可更改密码,输入旧密码,然后输入新密码,再次验证新密码,验证正确4.4 电路设计源代码,功能仿真激励源代码及功能仿真结果报告设计源代码module latch(cipher_in,count,warn_en,rst,am_en);input rst,am_en;/am_en?input 3:0cipher_in;output warn_en;output1:0count;reg warn_en;reg1:0state,state_out;reg1:0count;/?reg3:0amend_cipher;parameter s0=2'b00, s1=2'b01, s2=2'b10, s3=2'b11;integer i;/?always(cipher_in or posedge rst)/?if(rst) begin state<=0; warn_en<=0; count<=0; amend_cipher<=0; i<=0;endelse if(!am_en) begin /?case(state_out) s0: if(cipher_in=amend_cipher) begin count<=1; warn_en<=0; end else state<=s1; s1:if(cipher_in=amend_cipher) begin count<=i; warn_en<=0; end else state<=s2; s2:if(cipher_in=amend_cipher) begin count<=i; warn_en<=0; end else state<=s3; s3:begin warn_en<=1; state<=s3; end /s4:; default:state<=s0; endcase end else begin state<=state; state_out<=0; end always(state or posedge rst)/? if(rst) begin i<=1; state_out<=0;end else begin i<=i+1; state_out<=state; end integer j; always(cipher_in or am_en or rst)/?if(rst)j<=0;elseif(am_en) case(j) 2'b00:begin if(cipher_in=amend_cipher) j<=j+1; else j<=j; end 2'b01:begin amend_cipher<=cipher_in; end default: j<=0; endcase else j<=0; endmodule 激励源代码module t_latch;/cipher_in,count,warn_en,rstreg rst,am_en;reg3:0cipher_in; wire warn_en;wire 1:0count;latch unit(.rst(rst), .count(count), .warn_en(warn_en), .cipher_in(cipher_in), .am_en(am_en);initial begin#10 rst=1;#10 rst=0;#10 am_en=0;#10 cipher_in=4'b1000;#10 cipher_in=4'b0000;#10 rst=1;#10 rst=0;#10 am_en=1;#10 cipher_in=4'b0000;#10 cipher_in=4'b1000;#10 am_en=0;#10 cipher_in=4'b0000;#10 cipher_in=4'b0001;#10 cipher_in=4'b1000;endendmodule上面的仿真结果显示1.输入密码时,当第一次输入错误,第二次输入密码正确时,计数器count计数为2,验证正确2.当更改密码时,需先使am_en为高电平时,方可更改密码,输入旧密码,然后输入新密码,再次验证新密码,验证正确4.5 综合及布局布线报告和引脚分布报告4.6 后仿真结果报告由于该设计有许多警告之处,后仿真的结果没能实现4.7 对结果和结论的问题讨论课程设计的结果讨论数字密码锁的密码验证、密码输错次数记录和密码修改实现了,但缺陷是密码是二进制的,没有设计为十进制的,还有密码输入错误时的清除功能没有实现。设计主要功能实现了,算是一个简单的数字密码锁,有好多的功能还可以添加,例如密码输错的报警功能,密码的显示功能,本设计还可以在以后的设计中更见完善。5 课程设计的心得体会为期两周的课程设计也终于结束,全身心的轻松瞬间涌上来,不仅是为自己的课程设计高兴,更是为获得的知识与经验而兴奋,也不算白费两周时间全身心的精力。自己设计的是数字密码锁,从一开始还是比较迷茫,但是通过各方面的参考和深入了解的学习,又回到课本里面的相关知识,慢慢拨开一层一层迷雾,渐渐熟悉数字系统的设计流程,从设计方案到拟定详细模块再到编写Verilog代码,其中也遇到的很多问题,有些拟定要实现的功能并没有在实际设计中实现出来,这是一个缺陷,但是大部分的功能还是被设计出来了,并进行了验证,完全符合设定的要求,其中也遇到了非常多的问题,并且在后面的后仿真与综合中也是出现了许多无法想象的问题,又是进行一系列的错误排除和解决,最终也勉强设计出来了主要的功能。本次的课程设计也让我对FPGA课程有一个熟悉的了解与实践,对数字系统的设计流程掌握了许多方面的知识,从理论到实践的结合,算是对专业知识的一次完整学习吧,也肯定会让自己受益终身,感谢这次的课程设计,更见感谢得到的这么许多的知识与技术。6 参考资料等基于Verilog的FPGA设计课本Verilog设计课本