数电课程设计电子密码锁.docx

上传人:小飞机 文档编号:2061071 上传时间:2023-01-05 格式:DOCX 页数:36 大小:558.07KB
返回 下载 相关 举报
数电课程设计电子密码锁.docx_第1页
第1页 / 共36页
数电课程设计电子密码锁.docx_第2页
第2页 / 共36页
数电课程设计电子密码锁.docx_第3页
第3页 / 共36页
数电课程设计电子密码锁.docx_第4页
第4页 / 共36页
数电课程设计电子密码锁.docx_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《数电课程设计电子密码锁.docx》由会员分享,可在线阅读,更多相关《数电课程设计电子密码锁.docx(36页珍藏版)》请在三一办公上搜索。

1、数字逻辑设计课程设计报告书题目名称:电子密码锁学 院:光 电 信 息 学 院小组成员:钟永捷2011059080024 侯晨涛2011059170003徐 昊2011059060029指导教师:李 力日 期: 2013年6月28日一、 小组成员分工情况侯晨涛:所有编程工作、资料查找 工作量:60%钟永捷:辅助编程、图表制作、资料查找 工作量:20%徐 昊:论文写作、图表制作、资料查找 工作量:20%二、 题目分析1. 输入信号通过扫描键盘的行与检测键盘的列得到输入信号。2. 输出信号通过译码器得到的显示器显示信息,开关锁动作。三、 设计总框图四、 各模块说明(一) 键盘扫描模块1. 原理通过时

2、序信号产生脉冲,不间断地向矩阵键盘的行输入1110-1101-1011-0111的循环序列。同时将各列的电平置高,检测矩阵键盘各列的电平变化。若在一定时间内,扫描到第列电平为零时恰好第行的输入电平也为零,则判断键盘上位置上键被按下。2. 模块框图时序信号4*3键盘寄存器 比较行列行3. 状态表此模块只需要通过编码器实现即可,假定前四位表示各行扫描结果,后三位表示各列扫描的结果。动作行输入列输入状态命名编码输出按下“0”键0111101S00000按下“1”键1110110S10001按下“2”键1110101S20010按下“3”键1110011S30011按下“4”键1101110S4010

3、0按下“5”键1101101S50101按下“6”键1101011S60110按下“7”键1011110S70111按下“8”键1011101S81000按下“9”键1011011S91001按下“#”键0111011S101010按下“*”键0111110S1110114. 仿真结果Key_in代表按键按下与否情况,Key_mem将其记录并输出,scan为行扫描信号,Key_out为按键输出值。如上仿真结果所示,当scan为1110时,扫描第一行。按下第一个键,即Key_in为110,此时Key_out为0001,即输出值为1。其它状态依此类推。(二) 输入模块1. 原理设置两个寄存器,一个

4、作为用户所想设置密码的密码寄存器。另一个寄存器则是将键盘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,即

5、实现了删除功能。2) 密码输入正确Correct=1说明密码输入正确,Number_sig的值为000011001101111000000000,Number_sig的值通过七段显示译码器之后将使数码管显示OPEn00。3) 密码输入错误Correct=1说明密码输入正确,Number_sig的值为110111111111000011110000,Number_sig的值通过七段显示译码器之后将使数码管显示ERROR0。(三) 密码判断及更改1. 原理密码判断模块:通过比较器将输入寄存器与存储寄存器中的数据进行比较,如果数据相同,则判断密码正确。如果数据不同,则返回输入等待状态,并对输入寄存器

6、中的数据清零。密码更改模块:将第一次与第二次输入寄存器中的数据输入比较器比较,如果数据相同则将该数据输入进密码存储寄存器中。如果数据不同,则返回数据输入前的数据等待状态。2. 模块框图比较器相同不同存 储寄存器返回输入前状态第一次输入寄存器第二次输入寄存器输入输入比较器输入寄存器存储寄存器输入输入不同相同判断密码正确3. 仿真结果main_state为10000即update状态,按键六次输入值为0110,0110,0110,0110,0110,0010,第二次输入相同。即将密码由666666改为266666。第二次输入完成same为1,说明两次输入相同。按“#”键确认后。当状态变为01000

7、时,即in_put输入密码Inputpd为001001100110011001100110即266666,correct为1说明密码修改成功并开锁。(四) 主状态机1. 原理 状态分五个状态:Waits,Input,Pass,Update,Forbid。在Waits状态下,摁下“#”进入密码“Input”状态,在“Input”状态下摁“*”可删除当前Input的字符。若密码输入正确则进去“Pass”状态,否则进入“Forbid”状态,这时若摁下“#”键,则重新返回“Waits”状态。摁下“*”键进入“Update”状态,输入两次密码然后摁“#”键进行确定,若两次密码不相同则Update失败,重

8、新返回到“Pass”状态。若两次密码相同,则返回到“Waits”状态。2. 模块框图#ForbidPass两次输入不同+#键 *UpdateWaitsInput#RightWrong两次输入相同+ # 键3. 状态表4. 仿真结果1) 密码输入错误按下“#”键,进行密码输入(main_state由00001变为01000),此时error为1说明密码输入错误。main_state变为forbid状态(由01000变为00100)。再按下“#”键,重新返回waits状态(由00100变为00001)。2) 密码输入正确,且修改密码成功按下“#”键,进行密码输入(main_state由00001变

9、为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位拆分为六组四位编码输入七段译码器。将译码输出与

10、扫描模块产生的扫描时序共同作用于六位数码管。得到所需显示结果。2. 模块框图数码管控制模块(24位)七段译码器扫描模块六位数码管输入扫描分六组输入四位编码开始扫描3. 仿真结果输入信号Number_sig的值为000100100011010001010110即123456,Scan_sig的值为011111时,即第一个数码管亮时Duan_date的值为0110000即数码管显示数字为1。综合以上,此时第一个数码管显示为1,之后第二个数码管显示为2,第三个数码管显示为3五、 验证方案采取自上而下的设计方案,首先将题目要求拆分成各大模块,然后通过编写Verilog语言的程序实现各模块的功能。在 中

11、仿真出时序逻辑图,并验证程序的正确性。图1.设计总框图的实现六、 课程设计心得体会通过这次数字密码锁的课程设计,我们掌握了如何通过数字逻辑知识来设计一个可应用于生产生活中的拥有实际应用功能的数字逻辑器件。首先我们要了解其具体功能要求,然后采用自上而下的设计方法,建立整体逻辑框图并将其划分为各个具体功能模块。之后,我们通过编写Verilog程序实现每一模块的功能。在编译无错误后,通过quartus 2软件自带的波形仿真功能检测模块功能是否实现。当波形达到要求,将各模块拼接,得到最终的密码锁整体逻辑结构(如图1)。在讨论课程设计时,我们最初想通过简单的逻辑门和逻辑器件来实现密码锁功能,以简化程序部

12、分。但是因为状态之间转换的复杂性,无法实现。之后我们决定每一功能模块均通过程序来实现,并自动生成状态图及逻辑图。这样工作的任务全部转移到编程上。编程的感想:对于编程,我想说从对verilog一窍不通(C也不太会)到能独立地使用其进行编程,这将近一月的时间里,我学会了很多,一开始面对这个题目,完全不知道从何下手,从图书馆借了一本书就开始慢慢看,然后就尝试着去写,有时候一个简单的错误困扰了我整整一天甚至两天都想不出来。这个题目的程序是我这将近一个月的心血,每一行都是经过思考后写下的。通过这次课程设计,我体会到了编程的乐趣,当你长时间困扰在一个问题上,突然间的一个奇思妙想就可以解决问题或者实现一个以

13、前实现不了的功能,就是这种偶尔的惊喜使得我坚持了下来。这次课程设计美中不足的是,虽然各个模块都可以实现其功能,但是将其和在一起就会有问题,虽然编译无错误,但是功能无法实现。因为时间原因,无法对其进行修正,这是我的一个遗憾。程序编写的同时我们进行状态表的绘制,不同于软件仿真出的状态表,我们将状态简化绘制表格,只体现编程时的大致思路。在这个过程中,我们熟练掌握了如何将抽象的状态变化绘制成状态转移表。以及简单状态图的绘制方法。七、 源文件(详见附件)源代码:top.v /顶层文件*module top(clk,Rst,key_out,Duan_date,Scan_sig);input clk;inp

14、ut Rst;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;wire correct;wire error;wire same;wire 4:0 main_state;wire 23:0 Number_sig;wire 23:0 Inputpd;main_state_machine M1(.clk(clk),.Rst(Rst),.key_out(key_out),.correct(correct),.error(error),.s

15、ame(same),.main_state(main_state),.key_mem(key_mem);key_scan M2(.clk(clk),.Rst(Rst),.key_in(key_in),.scan(scan),.key_out(key_out),.key_mem(key_mem);In_put M3(.clk(clk),.Rst(Rst),.key_out(key_out),.key_mem(key_mem),.correct(correct),.error(error),.main_state(main_state),.Number_sig(Number_sig),.Input

16、pd(Inputpd);passwdcom M4(.clk(clk),.Rst(Rst),.key_out(key_out),.Inputpd(Inputpd),.main_state(main_state),.key_mem(key_mem),.correct(correct),.error(error),.same(same);top_led M5(.clk(clk),.Rst(Rst),.Number_sig(Number_sig),.Duan_date(Duan_date),.Scan_sig(Scan_sig);endmodule*Key_scan.v/键盘扫描*module key

17、_scan(clk,scan,key_in,key_out,key_mem,Rst);input clk; input Rst;input 2:0 key_in;output 3:0 scan;output 3:0 key_out;output 2:0 key_mem;reg 3:0 scan;reg 3:0 key_out;reg 31:0 counter;reg _20clk;reg 1:0 Q;reg 2:0 key_mem;always (posedge clk or negedge Rst)if(!Rst)begincounter = 0;endelse begincounter =

18、 counter + 1b1;if( counter = 12500)begin counter = 0;_20clk = _20clk;end endalways ( posedge _20clk )beginQ = Q + 1b1;end always (posedge clk or negedge Rst)begin if(!Rst)key_mem = 3b111; else case(Q) 2b00: begin scan = 4b1110; case( key_in ) 3b110 : beginkey_out = 4d1;key_mem = 3b110;end 3b101 : be

19、ginkey_out = 4d2;key_mem = 3b101;end 3b011 : beginkey_out = 4d3;key_mem = 3b011;end default : key_out = 4dz; endcase end 2b01: begin scan = 4b1101; case( key_in ) 3b110 : beginkey_out = 4d4;key_mem = 3b110;end 3b101 : beginkey_out = 4d5;key_mem = 3b101;end 3b011 : beginkey_out = 4d6;key_mem = 3b011;

20、end default : key_out = 4dz; endcase end 2b10: begin scan = 4b1011; case( key_in ) 3b110 : beginkey_out = 4d7;key_mem = 3b110;end 3b101 : beginkey_out = 4d8;key_mem = 3b101;end 3b011 : beginkey_out = 4d9;key_mem = 3b011;end default : key_out = 4dz; endcase end 2b11: begin scan=4b0111; case( key_in )

21、 3b110 : key_out = 4d10; 3b101 : beginkey_out = 4d0;key_mem = 3b101;end 3b011 : key_out = 4d11; default : key_out = 4dz; endcase end endcase end endmodule*In_put.v/输入*module In_put (clk,Rst,key_mem,Number_sig,key_out,Inputpd,correct,error,main_state);input clk;input Rst;input 3:0 key_out;input 2:0 k

22、ey_mem;input correct;input error;input 4:0 main_state;output 23:0 Number_sig; /数码管显示数据output 23:0 Inputpd;reg 23:0 Number_sig;reg 23:0 Inputpd;reg 5:0 cur_state;reg 5:0 next_state;parameter first = 6b000_001, second = 6b000_010, third = 6b000_100, fourth = 6b001_000, fifth = 6b010_000, sixth = 6b100

23、_000, finish = 6b111_111; parameter 4:0 waits = 5b00001,pass = 5b00010,forbid = 5b00100,in_put = 5b01000,update = 5b10000;always (posedge clk or negedge Rst)beginif(!Rst)cur_state = first; elsecur_state = next_state;endreg KH2L_f1;/检测按键电平reg KH2L_g1;reg KH2L_f2;reg KH2L_g2;reg KH2L_f3;reg KH2L_g3;wi

24、re H2L_sig1;wire H2L_sig2;wire H2L_sig3;always (posedge clk or negedge Rst)if(!Rst)beginKH2L_f1 = 1b1;KH2L_g1 = 1b1;KH2L_f2 = 1b1;KH2L_g2 = 1b1;KH2L_f3 = 1b1;KH2L_g3 = 1b1;endelsebeginKH2L_f1 = key_mem0;KH2L_g1 = KH2L_f1;KH2L_f2 = key_mem1;KH2L_g2 = KH2L_f2;KH2L_f3 = key_mem2;KH2L_g3 = KH2L_f3;endas

25、sign H2L_sig1 = (KH2L_g1&(!KH2L_f1)? 1b1:1b0;assign H2L_sig2 = (KH2L_g2&(!KH2L_f2)? 1b1:1b0;assign H2L_sig3 = (KH2L_g3&(!KH2L_f3)? 1b1:1b0; always (posedge clk or negedge Rst)beginif(!Rst)Number_sig = 24b0000_0000_0000_0000_0000_0000;else if(main_state = in_put)beginif(correct = 1)Number_sig = 24b00

26、00_1100_1101_1110_0000_0000;else if(error = 1)Number_sig = 24b1101_1111_1111_0000_1111_0000;else if(error = 0 & correct = 0)case(cur_state)first : if(H2L_sig1|H2L_sig2|H2L_sig3) & (key_out = 4d10)next_state = first; else if(H2L_sig1|H2L_sig2|H2L_sig3) & (key_out != 4d10)beginNumber_sig3:0 = key_out;

27、next_state = second;end elsenext_state = first;second :if(H2L_sig1|H2L_sig2|H2L_sig3) & (key_out = 4d10)next_state = first;else if(H2L_sig1|H2L_sig2|H2L_sig3) & (key_out != 4d10)beginNumber_sig7:4 = key_out;next_state = third;end elsenext_state = second;third : if(H2L_sig1|H2L_sig2|H2L_sig3) & (key_

28、out = 4d10)next_state = second; else if(H2L_sig1|H2L_sig2|H2L_sig3) & (key_out != 4d10)beginNumber_sig11:8 = key_out;next_state = fourth;end elsenext_state = third;fourth : if(H2L_sig1|H2L_sig2|H2L_sig3) & (key_out = 4d10)next_state = third; else if(H2L_sig1|H2L_sig2|H2L_sig3) & (key_out != 4d10)beg

29、inNumber_sig15:12 = key_out;next_state = fifth;end else next_state = fourth;fifth : if(H2L_sig1|H2L_sig2|H2L_sig3) & (key_out = 4d10)next_state = fourth; else if(H2L_sig1|H2L_sig2|H2L_sig3) & (key_out != 4d10)beginNumber_sig19:16 = key_out;next_state = sixth;end elsenext_state = fifth;sixth : if(H2L

30、_sig1|H2L_sig2|H2L_sig3) & (key_out = 4d10)next_state = fifth; else if(H2L_sig1|H2L_sig2|H2L_sig3) & (key_out != 4d10)beginNumber_sig23:20 = key_out;next_state = finish;end elsenext_state = sixth;finish : if(H2L_sig1|H2L_sig2|H2L_sig3) & (key_out = 4d10)next_state = sixth; elsenext_state = finish;de

31、fault next_state = first;endcaseendendalways (posedge clk or negedge Rst)if(!Rst)Inputpd = 0;else if (cur_state = finish)Inputpd = Number_sig;endmodule*Led_encode.v/数码管加码*module led_encode(clk,Rst,Number_date,Duan_date);input clk;input Rst;input 3:0 Number_date;output 6:0 Duan_date;parameter _0 = 7b

32、1111_110,_1 = 7b0110_000,_2 = 7b1101_101,_3 = 7b1111_001,_4 = 7b0110_011,_5 = 7b1011_011,_6 = 7b1011_111,_7 = 7b1110_000,_8 = 7b1111_111,_9 = 7b1111_011,_p = 7b1100_111,_e = 7b1001_111,_n = 7b1110_110,_r = 7b1110_111;reg 6:0 rDuan;always (posedge clk or negedge Rst)if(!Rst)beginrDuan = 7b0000_000;en

33、delsecase(Number_date)4d0 : rDuan = _0;4d1 : rDuan = _1;4d2 : rDuan = _2;4d3 : rDuan = _3;4d4 : rDuan = _4;4d5 : rDuan = _5;4d6 : rDuan = _6;4d7 : rDuan = _7;4d8 : rDuan = _8;4d9 : rDuan = _9;4d12 : rDuan = _p;4d13 : rDuan = _e;4d14 : rDuan = _n;4d15 : rDuan = _r;endcaseassign Duan_date = rDuan;endm

34、odule*passwdcom.v/密码比较及修改*module passwdcom(clk,Rst,Inputpd,main_state,key_out,correct,error,key_mem,same);input clk;input Rst;input 3:0 key_out;input 23:0 Inputpd;input 4:0 main_state;input 2:0 key_mem;output correct;output error;output same;reg correct;reg error;reg 5:0 cur_state;reg 5:0 next_state

35、;reg one;reg same;reg 4:0 in_put ,update ;initialbeginin_put = 5b01000;update = 5b10000;endreg 23:0 Password = 24b0110_0110_0110_0110_0110_0110; /初始密码666666always (posedge clk or negedge Rst)/判断输入密码是否正确if(!Rst)begincorrect = 0;error = 0;endelse if(main_state = in_put)if(Inputpd = Password)/密码输入正确beg

36、incorrect = 1;error = 0;endelse/密码输入错误begincorrect = 0;error = 1;endparameter first = 6b000_001,/定义按键状态 second = 6b000_010, third = 6b000_100, fourth = 6b001_000, fifth = 6b010_000, sixth = 6b100_000, finish = 6b111_111, finish2 = 6b011_111; reg KH2L_f1;/检测按键电平reg KH2L_g1;reg KH2L_f2;reg KH2L_g2;reg KH2L_f3;reg KH2L_g3;wire H2L_sig1;wire H2L_sig2;wire H2L_sig3;always (posedge clk or negedge Rst)if(!Rst)beginKH2L_f1 = 1b1;KH2L_g1 = 1b1;KH2L_f2 = 1b1;KH2L_g2 = 1b1;KH2L_f3 = 1b1;KH2L_g3 = 1b1;endelsebeginKH2L_f1 = key_mem0;KH2L_g1

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号