您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 数电课程设计电子密码锁
数字逻辑设计课程设计报告书题目名称:电子密码锁学院:光电信息学院小组成员:钟永捷2011059080024侯晨涛2011059170003徐昊2011059060029指导教师:李力日期:2013年6月28日一、小组成员分工情况侯晨涛:所有编程工作、资料查找工作量:60%钟永捷:辅助编程、图表制作、资料查找工作量:20%徐昊:论文写作、图表制作、资料查找工作量:20%二、题目分析1.输入信号通过扫描键盘的行与检测键盘的列得到输入信号。2.输出信号通过译码器得到的显示器显示信息,开关锁动作。三、设计总框图四、各模块说明(一)键盘扫描模块1.原理通过时序信号产生脉冲,不间断地向矩阵键盘的行输入1110-1101-1011-0111的循环序列。同时将各列的电平置高,检测矩阵键盘各列的电平变化。若在一定时间内,扫描到第n列电平为零时恰好第m行的输入电平也为零,则判断键盘上nm,位置上键被按下。1234859#706*行3210210列2.模块框图3.状态表此模块只需要通过编码器实现即可,假定前四位表示各行扫描结果,后三位表示各列扫描的结果。动作行输入列输入状态命名编码输出按下“0”键0111101S00000按下“1”键1110110S10001按下“2”键1110101S20010按下“3”键1110011S30011按下“4”键1101110S40100按下“5”键1101101S50101按下“6”键1101011S60110按下“7”键1011110S70111时序信号4*3键盘寄存器比较行列行按下“8”键1011101S81000按下“9”键1011011S91001按下“#”键0111011S101010按下“*”键0111110S1110114.仿真结果Key_in代表按键按下与否情况,Key_mem将其记录并输出,scan为行扫描信号,Key_out为按键输出值。如上仿真结果所示,当scan为1110时,扫描第一行。按下第一个键,即Key_in为110,此时Key_out为0001,即输出值为1。其它状态依此类推。(二)输入模块1.原理设置两个寄存器,一个作为用户所想设置密码的密码寄存器。另一个寄存器则是将键盘Input的键值存储起来。最后通过一个比较器将两个寄存器的值进行比较。若相同则输出“open”,反之,输出“error”。比较器内部通过多位异或门实现。2.模块框图3.状态图4.仿真结果1)删除字符判断寄存器输入寄存器第一次输入值为0101,Number_sig第0到3位将其保存。第二次输入值为0011,Number_sig第4到7位将其保存。第三次输入值为0001,Number_sig第8到11位将其保存。第四次输入值为1010,即删除键。第五次输入值为0111,Number_sig第8到11位的值由0001变为0111,即实现了删除功能。2)密码输入正确Correct=1说明密码输入正确,Number_sig的值为000011001101111000000000,Number_sig的值通过七段显示译码器之后将使数码管显示OPEn00。3)密码输入错误Correct=1说明密码输入正确,Number_sig的值为110111111111000011110000,Number_sig的值通过七段显示译码器之后将使数码管显示ERROR0。(三)密码判断及更改1.原理密码判断模块:通过比较器将输入寄存器与存储寄存器中的数据进行比较,如果数据相同,则判断密码正确。如果数据不同,则返回输入等待状态,并对输入寄存器中的数据清零。密码更改模块:将第一次与第二次输入寄存器中的数据输入比较器比较,如果数据相同则将该数据输入进密码存储寄存器中。如果数据不同,则返回数据输入前的数据等待状态。2.模块框图比较器相同不同存储寄存器返回输入前状态第一次输入寄存器第二次输入寄存器输入输入比较器输入寄存器存储寄存器输入输入不同相同判断密码正确3.仿真结果main_state为10000即update状态,按键六次输入值为0110,0110,0110,0110,0110,0010,第二次输入相同。即将密码由666666改为266666。第二次输入完成same为1,说明两次输入相同。按“#”键确认后。当状态变为01000时,即in_put输入密码Inputpd为001001100110011001100110即266666,correct为1说明密码修改成功并开锁。(四)主状态机1.原理状态分五个状态:Waits,Input,Pass,Update,Forbid。在Waits状态下,摁下“#”进入密码“Input”状态,在“Input”状态下摁“*”可删除当前Input的字符。若密码输入正确则进去“Pass”状态,否则进入“Forbid”状态,这时若摁下“#”键,则重新返回“Waits”状态。摁下“*”键进入“Update”状态,输入两次密码然后摁“#”键进行确定,若两次密码不相同则Update失败,重新返回到“Pass”状态。若两次密码相同,则返回到“Waits”状态。2.模块框图#ForbidPass两次输入不同+#键*UpdateWaitsInput#RightWrong两次输入相同+#键3.状态表Waitsin_putPassForbidUpdateRight1Right2Error当前状态SWaitsin_putPassForbidUpdateUpdateUpdateDS*Key_scan#*00Waitsin_putUpdateForbidUpdateUpdateUpdateD01in_putin_putPassWaitsUpdateUpdateWaitsPass10Waitsin_putPassForbidUpdateUpdateUpdateD11DPassDDRight1Right2DD1DForbidDDDErrorDDRight04.仿真结果1)密码输入错误按下“#”键,进行密码输入(main_state由00001变为01000),此时error为1说明密码输入错误。main_state变为forbid状态(由01000变为00100)。再按下“#”键,重新返回waits状态(由00100变为00001)。2)密码输入正确,且修改密码成功按下“#”键,进行密码输入(main_state由00001变为01000),此时correct为1说明密码输入正确。由in_put变为pass(由01000变为00010)。按下“*”进行密码修改,由00010变为10000修改正确,主状态重新返为wait。3)密码输入正确,但密码修改失败按下“#”键,进行密码输入(main_state由00001变为01000),此时correct为1说明密码输入正确。由in_put变为pass(由01000变为00010)。按下“*”进行密码修改,由00010变为00010主状态由修改错误重新返为pass。(五)显示1.原理这里的选择24位数码管控制模块,将24位拆分为六组四位编码输入七段译码器。将译码输出与扫描模块产生的扫描时序共同作用于六位数码管。得到所需显示结果。2.模块框图3.仿真结果输入信号Number_sig的值为000100100011010001010110即123456,Scan_sig的值为011111时,即第一个数码管亮时Duan_date的值为0110000即数码管显示数字为1。综合以上,此时第一个数码管显示为1,之后第二个数码管显示为2,第三个数码管显示为3……数码管控制模块(24位)七段译码器扫描模块六位数码管输入扫描分六组输入四位编码开始扫描五、验证方案采取自上而下的设计方案,首先将题目要求拆分成各大模块,然后通过编写Verilog语言的程序实现各模块的功能。在2quatus中仿真出时序逻辑图,并验证程序的正确性。图1.设计总框图的实现六、课程设计心得体会通过这次数字密码锁的课程设计,我们掌握了如何通过数字逻辑知识来设计一个可应用于生产生活中的拥有实际应用功能的数字逻辑器件。首先我们要了解其具体功能要求,然后采用自上而下的设计方法,建立整体逻辑框图并将其划分为各个具体功能模块。之后,我们通过编写Verilog程序实现每一模块的功能。在编译无错误后,通过quartus2软件自带的波形仿真功能检测模块功能是否实现。当波形达到要求,将各模块拼接,得到最终的密码锁整体逻辑结构(如图1)。在讨论课程设计时,我们最初想通过简单的逻辑门和逻辑器件来实现密码锁功能,以简化程序部分。但是因为状态之间转换的复杂性,无法实现。之后我们决定每一功能模块均通过程序来实现,并自动生成状态图及逻辑图。这样工作的任务全部转移到编程上。编程的感想:对于编程,我想说从对verilog一窍不通(C也不太会)到能独立地使用其进行编程,这将近一月的时间里,我学会了很多,一开始面对这个题目,完全不知道从何下手,从图书馆借了一本书就开始慢慢看,然后就尝试着去写,有时候一个简单的错误困扰了我整整一天甚至两天都想不出来。这个题目的程序是我这将近一个月的心血,每一行都是经过思考后写下的。通过这次课程设计,我体会到了编程的乐趣,当你长时间困扰在一个问题上,突然间的一个奇思妙想就可以解决问题或者实现一个以前实现不了的功能,就是这种偶尔的惊喜使得我坚持了下来。这次课程设计美中不足的是,虽然各个模块都可以实现其功能,但是将其和在一起就会有问题,虽然编译无错误,但是功能无法实现。因为时间原因,无法对其进行修正,这是我的一个遗憾。程序编写的同时我们进行状态表的绘制,不同于软件仿真出的状态表,我们将状态简化绘制表格,只体现编程时的大致思路。在这个过程中,我们熟练掌握了如何将抽象的状态变化绘制成状态转移表。以及简单状态图的绘制方法。七、源文件(详见附件)源代码:top.v//顶层文件******************************************************************************************moduletop(clk,Rst,key_out,Duan_date,Scan_sig);inputclk;inputRst;input[3:0]key_out;output[6:0]Duan_date;output[5:0]Scan_sig;wire[3:0]scan;wire[2:0]key_in;wire[2:0]key_mem;wirecorrect;wireerror;wiresame;wire[4:0]main_state;wire[23:0]Number_sig;wire[23:0]Inputpd;main_state_machineM1(.clk(clk),.Rst(Rst),.key_out(key_out),.correct(correct),.error(error),.same(same),.main_state(main_state),.key_mem(key_mem));key_scanM2(.clk(clk),.Rst(Rst),.key_in(key_in),.scan(scan),.key_out(key_out),.key_mem(key_mem));In_putM3(.clk(clk),.Rst(Rst),.key_out(key_out),.key_mem(key_mem),.correct(correct),.error(error),.main_state(main_state),.Number_sig(Number_sig),.Inputpd(Inputpd));passwdcomM4(.clk(clk),.Rst(Rst),.key_out(key_out),.Inputpd(Inputpd),.main_state(main_state),.key_mem(key_mem),.correct(correct),.error(error),.same(same)
本文标题:数电课程设计电子密码锁
链接地址:https://www.777doc.com/doc-71431 .html