电子密码锁——EDA课程设计.docx
基于Veri1.ogHD1.的FPGA的电子密码锁的设计报告摘要:基于FPGA设计的电子密码锁是一个小型的数字系统,与普通机械锁相比,具有许多独特的优点:保密性好,防盗性强,可以不用钥匙,记住密码即可开锁等。目前使用的电子密码锁大局部是基于单片机技术,以单片机为主要器件。在实际应用中,程序容易跑飞,系统的可靠性较差。本文介绍的一种基于现场可编辑门阵列FPGA器件的电子密码锁的设计方法,采用VHD1.语言对系统进行描述,并在EP3C10E144C8上实现。通过仿真调试,利用可编程逻辑器件FPGA的电子密码锁的设计根本到达了预期目的。当然,该系统在一些细节的设计上还需要不断地完善和改良,特别是对系统的扩展有很好的使用系统和设计的价值。关键词:现场可编程门阵列;VHD1.语言;电子密码锁TheReportOfE1.ectronicCode1.ockDesignAbstract:FPGA-baseddesignofthee1.ectroniccode1.ockisasma1.1.digita1.system.Ithasmanyuniqueadvantages:goodprivacyandsecurity,itdonotneedthekeybutrememberpasswordtoun1.ock,andsoonwhi1.eitcomparetoordinarymechanica1.1.ocks.Atpresent,thee1.ectroniccode1.ockismostusedofSCMtechno1.ogy.Inpractice,however,theprocesseasyruntof1.y.Sothere1.iabi1.ityofthissystemispoor.Thepaperintroducedafie1.dprogrammab1.egatearraysFPGAdevicestodesigne1.ectronicpassword1.ock.TheVHD1.1.anguageisusedtodescribethesystemandachievedinEP3C10E144C8.Thoughthesimu1.ationtests,usingFPGA-baseddesignofthee1.ectroniccode1.ockcanachievetheexpectedgoa1.Ofcourse,someofthedetai1.softhesysteminthedesignoftheneedtoconstant1.yrefinedandimproved,inparticu1.artheexpansionofthesystemhaveagooddesignandpractica1.va1.ue.Keyword:FPGA;VHD1.1.anguage;e1.ectronicpassword1.ock一、设计内容与要求1.设计一个密码锁,密码为一个4位的十进制数,密码固化在锁内2 .用户输入密码正确,那么开锁(试验箱D71.ED灯亮);假设不正确,那么报警(试验箱DO1.ED灯亮)3 .假设用户输入密码不正确,可以按复位键重新输入密码。二、设计思想2.1 系统原理框图本系统由主控芯片(FPGA),键盘,显示电路,报警电路和开/关门电路组成,而主控芯片又可分为按键处理局部,控制局部和译码显示局部。系统原理框图如图2.1所示:FFGA图2.1系统框图2.2 总体实现原理本系统有8个按键,KO,K1,K2,K3,K4,K5代表数字0-9共10个数字和1个确认键,1个复位键。密码长度为四位,并且固化在锁内,输入正确密码后,按确认键即可开门,本系统设置为1.EDD7灯亮。在输入密码的过程中,当用户键入错误密码时,报警灯1.EDDO灯亮。按下复位键,可使报警停止,同时去除所有密码显示。三、芯片主控设计3.1 FPGA有限状态机本设计是通过FPGA有限状态机来实现,设计有限状态机最开始的工作时要确定电路,包括哪些状态,比方某个电路包括四个状态,SO,S1,S2,S3<>然后对所有状态给出一个状态编码,比方为状态SO赋予编码00,为状态S1.赋予编码01,为状态S2赋予编码10,为状态S3赋予编码11。状态编码是状态的标识,保存在存放器当中,对于此编码形式,只需一个2位的存放器就可以了。FSMEncodingSty1.e主要有:BinaryEncodingOneHotEncodingGrayEncoding二进制与一位热码的特性比拟:表3.1二进制与一位热码的特性比拟状态机可以认为是组合逻辑和存放器逻辑的特殊租户,它一般包括两个局部:组合逻辑局部和存放器逻辑局部。存放器用于存储状态,组合电路用于状态译码和产生输出信号。状态机的下一个状态及输出,不仅与输入信号有关,而且还有存放器当前所处的状态有关。根据输出信号产生方法的不同,状态机可以分成两类:MeaIy型和Moore型。MoOre型状态机的输出只是当前状态的函数,而Moore型状态机的输出只是当前状态的函数,而Mea1.y型状态机的输出那么是当前状态和当前输入状态的函数。其原理如下两图:图3.IMea1.y型状态机输出原理图3.2Moore型状态机输出原理3.2 设计流程本次密码锁的设计,有限状态机应该包括以下状态:密码为输入前的等待状态、输入密码时的等待状态、输入密码正确时的通过状态、输入密码错误时的警报状态。图3.3主有效状态机的状态转换图其中当密码输入时又可包括以下状态,正常输入状态、异常输入状态(包括命令状态)、输入确认状态。下面的图(图是在程序编译后,100IS->Net1.isjVewers->RT1.Vewer得到的)表示了密码输入的时候的次状态机,表示了4个密码输入的顺序状态,以及输入完成后的等待确认状态。图3.4次有效状态机的状态转换3.3 状态编码状态编码主要有二进制编码、格雷编码和一位独热编码等方式。格雷编码时,相邻状态每次只有一个比特位产生变化,这样减少了瞬变的次数,也减少了产生毛刺和一些状态的可能。采用一位独热编码,虽然多用了触发器,当可以有效节省和简化组合电路。对于存放器数量多而逻辑相对缺乏的FPGA器件来说,采用一位独热编码可以有效提高电路的速度和可靠性,也有利于提高器件资源的利用率。将产生状态的组合逻辑电路和用于保存状态的存放器分别写在不同的a1.ways块中。其中主要包括:输出控制局部、警报计时局部、锁翻开后的计时局部、比拟密码局部、记录密码局部和记录错误次数的局部3.4 密码的输入本次密码锁的密码输入采用FPGA芯片上的8位单个按键,考虑到按键数目不够,采用了一位按键作为功能转换按键;即前5位按键输入04,同时按下功能转换按键时,按键04即转换为按键59,这就弥补了按键数目的缺乏。最后两位按键设定为确认输入按键和复位按键。密码输入完成后可以按确认键检验密码的正误,报警、输入错误或者其他情况可以按复位按键重新输入。另外由于按键的时候同时会引起状态机的转换,所以如果按键的时候对按键判断次数过多会产生状态的过快转换,记录的密码和数码管的显示就同时会出现错误,因此在按键局部参加了消除多重按键的程序,只检测一次按键的下降沿,解决了这个问题。3.5 密码记录与比拟程序设定了一个存放器用来记录输入的密码。当次有效状态机(即密码输入的状态机)发生转换并且有密码输入时,程序会记录下输入的密码在存放器的其中4位里面,最后次有效状态转换到确认密码的状态时,会将记录下的密码与固化在锁内的密码进行比照,正确即将主状态机转换到通过阶段,错误那么将状态机转换到报警阶段。其中正确错误的状态转换是通过控制相应的标志位实现的。3.6 密码的显示密码显示采用数码管动态扫描显示,初始时显示密码为4位0,当输入密码后数码管的第一位、第二位、第三位、第四位会依次显示输入的密码,错误后复位可以重新输入。密码显示采用的是记录密码的存放器的数据,显示扫描的扫描时间设置为ImS左右,这样显示不会出现闪烁或者残影。四、程序仿真下前面的输入cmd的编码:输入的数字编码09,enter,cance1.one=4'b0001.,two=4,b0010,three=4,b0011,four=4'bO1OO,five=4'bO101,six=4'b1.10,seven=4'b0111,eight=4,b1000,nine=4,b1001,zero=4,b1(XX),enter=4,b1010,cance1.=4,b1011;可以看到,在复位以后,输入第1,2,3,4个密码(依次为I1.II)后,passed变成高电平当过了一定的时间后,passed变成低电平,重新计入键盘读入值,进行下一轮的密码区分。五、程序清单modu1.epasswdjock(c1.k,passed,one1.,two1.,three1,four1.,zero1,change,yes,resetb,seg,dig);inputone1,two1,three1,four!,zero1,change;inputyes;inputinputoutputresetb;c1.k;7:0passed;regzero,one,two,three,four;输入复位信号输入时钟信号输出信号output7:0seg;/段选output7:0dig;/位选reg3:0key;regRXBuR),RXBuf1.,RXBuf2,RXBuf3,RXBuf4;/disp1.ayregc1.k0_div;reg2:0digyi;/yiwei/reg7:0dig;/weixuanreg3:0segduanxuanreg7:0seg;reg12:0CNT_R0;reg18:0CNT_R1;regc1.k1.;reg21:0CNT_R2;regc1.k2;7:0passed;*输入与输出的声明局部,其中,C1.kO为输入的时钟信号,resetb为密码舒服的输入信号,key为输入命令,需注意的时,key并不是总在表示密码,也表示密码的间隔,如当输入4位密码后需要一个确认“enter”信号,当密码输入错误时,需要取消“cance1.”信号,这些信号之间在设计中通过有限状态转换机实现。*/reg15:0PaSSWOrd;/输入数值盛放存放器输入的数字编码a1.ways(posedgec1.k1.)begin检测线路的下降沿RXBuf1.<=one1.;one<=RXBuf1.&(one1.);/RXFa1.1.K=RXFaI1.;end消除多重按键a1.ways(posedgec1.k1.)begin检测线路的下降沿RXBufO<=zero1.;zero<=-(RXBufO&(-zero1);/RXFa1.1.K=RXFa1.1.;end消除多重按键a1.ways(posedgec1.k1.)begin检测线路的下降沿RXBuf2<=two1.;two<=(RXBuf2&(two1.);/RXFa1.1.K=RXFa1.1.;end消除多重按a1.ways(posedgec1.k1.)begin检测线路的下降沿RXBuf3<=three1;three<=-(RXBuf3&(-three1);/RXFa1.1.K=RXFa1.1.;end消除多重按键a1.ways(posedgec1.k1.)begin检测线路的下降沿RXBuf4<=four1.;four<=-(RXBuf4&(-four1.);/RXFa1.1.K=RXFa1.1.;end消除多重按键reg2:0main_state;主状态reg2:0next_state;/下一个状态主有限状态转换机的三个状态:waits、pass、a1.armparameterwaits=3'b001,pass=3'b010,a1.a11n=3'b1.00;reg2:0SUb_state;reg2:0next_sub_state;/主有限状态转换机的三个状态:first、second%third>fourth>finishoparameterfirst=3'bOOO,second=3'b001,third=3rb010,fourth=3'b011,finish=3'b1.OO;通过计时存放器reg7:0pass_count;警报计时存放器reg10:0a1.arm_count;尝试次数存放器reg1.:0try_count;输入状态存放器:error和correctregerror;regcorrect;以上为中间状态的一些存放器和一些所用到的参数主机状态机局部a1.ways(posedgec1.k)beginCNT_R2<=CNT_R2+b1.;if(CNT.R2<4000000)beginc1.k1.<=1;ende1.sebeginc1.k1.<=O;endenda1.ways(main_stateorcorrectorerror)begincase(main_state)waits:if(correct=1.)由waits转换到pass的条件next_state=pass;e1.seif(error=1&&try_count=1)next_State=a1.arm;由waits转换到a1.arm的条件e1.senext-state=waits;pass:if(pass_count7=1.)由pass转换到waits的条件next-state=waits;e1.senext_state=pass;a1.arm:if(a1.arm_count10=1)/由a1.arm转换到waits的条件next-state=waits;e1.senext_state=a1.arm;defau1.t:默认状态:waitsnext_state=waits;endcaseend状态转换a1.ways(posedgec1.k1.ornegedgeresetb)beginif(!resetb)main_state<=waits;e1.semain_state<=next_state;end输出控制局部a1.ways(posedgec1.k1.ornegedgeresetb)beginif(!resetb)复位时,开锁输出与警报输出都为零beginpassed<=8'b00000000;ende1.seif(main_state=PaSS)当主机状态为pass时,开锁beginpassed<=8'b10000000;ende1.seif(main_state=a1.arm)当主机状态为a1.arm时,警报beginpassed<=8'b00000001;ende1.se/其它状态复位beginpassed<=8'bOOOOOOOO;endend/a1.arm一段时间后,自动进入WaitS状态/a1.arm定时器a1.ways(posedgec1.k1.ornegedgeresetb)beginif(!resetb)a1.arm_count<=0;e1.seif(main_state=a1.arm)/a1.arm状态计时器a1.arm定时器加1a1.ann_count<=a1.arm_count+1;e1.sea1.arm_count<=0;end锁PaSS以后计数开始,当规定的时间到达后自动上锁,并进入WaitS状态/pass定时器a1.ways(posedgec1.k1.ornegedgeresetb)beginif(!resetb)pass_count<=0;e1.seif(main_state=pass)/pass状态计时器pass定时器加1pass_count<=pass_count+1;e1.sepass_count<=0;end从状态机,用于输入4位密码a1.ways(posedgec1.k1.ornegedgeresetb)beginif(!resetb)sub-state<=first;e1.sesub_state<=next_sub_state;enda1.ways(!zero!one!two!three!four!yesorsub_state)/a1.ways(keyorsub_state)beginif(key_pressed_f1.ag|!yes)if(!yes)4个密码输完时,进行确认next_sub_state=first;/defau1.t为输入了某位密码,输入完自动将状态转入下一位e1.seif(!zero!one!two!three!four)case(sub_state)first:next_sub_state=second;second:next_sub_state=third;third:next_sub_state=fourth;fourth:next_sub_state=finish;当输入完4位密码以后状态保持不变,等待输入enter命令finish:next_sub_state=finish;defau1.t:ncxt_sub_state=sub_state;endcasee1.senext_sub_state=sub_state;end比拟密码,产生正确或者错误信息a1.ways(posedgec1.k1.ornegedgeresetb)beginif(!resetb)begincorrect<=0;error<=0;ende1.seif(!key_pressed_f1.ag&&!yes)if(password=PASSWORD)密码正确时begincorrect<=1.;error<=0;ende1.se密码错误时beginerror<=1.;correct<=0;ende1.sebegincorrect<=0;error<=0;endend记录密码a1.ways(posedgec1.k1.ornegedgeresetb)beginif(!resetb)password<=0;e1.seif(!zero!one!two!three!four)case(sub_state)first:password15:!2<=key;second:password11:8<=key;third:password7:4<=key;fourth:password3:0<=key;defau1.t:password<=password;endcasee1.sepassword<=password;end记录错误次数a1.ways(posedgec1.k1.ornegedgeresetb)beginif(!resetb)try_count<=0;e1.seif(error=1.)try_count<=try_count+1;e1.seif(main_state=pass|main_state=a1.arm)try_count<=0;endregkey_pressed_f1.ag;/键盘按下标志a1.ways(posedgec1.k1.ornegedgeresetb)beginif(!resetb)beginkey_pressed_f1.ag<=0;key=4,b0000;ende1.seif(!zero&&change)beginkey_pressed_f1.ag<=1;key<=4'b0000;ende1.seif(!one&&change)beginkey_pressed_f1.ag<=1jkey<=4'b0001;ende1.seif(!two&&change)beginkey_pressed_f1.ag<=1;key<=4'b0010;ende1.seif(!three&&change)beginkey_pressed_f1.ag<=1;key<=4'b0011;ende1.seif(!four&&change)beginkey_pressed_f1.ag<=1;key<=4'b0100;ende1.seif(!zero&&!change)beginkey_pressed_f1.ag<=hkey<=4'b0101;ende1.seif(!one&&!change)beginkey_pressed_f1.ag<=1jkey<=4'b110;ende1.seif(!two&&!change)beginkey_pressed_f1.ag<=1;key<=4'b0111;ende1.seif(!three&&!change)beginkey_pressed_f1.ag<=1;key<=4'b1000;ende1.seif(!four&&!change)beginkey_pressed_f1.ag<=1;key<=4'b1001;ende1.seif(!yes)beginkey_pressed_f1.ag<=0;key<=4'b1010;endend/Zdiap1.aya1.ways(posedgec1.k)beginCNT_R0<=CNT_R0+b1.;if(CNT.R0<4096)beginc1.kO_div<=1;ende1.sebeginc1.k-div<=0;endenda1.ways(posedgec1.kO_div)beginif(digyi=3,d3)begindigyi<=O;ende1.sebegindigyi<=digyi÷1.;endend/yima/a1.ways(digyi)begincase(digyi)3'bOOO:dig=8,b1.1111110;3'b00kdig=8,b1.1.1.1.1.1.01;3,b010:dig=8,b1.1.1.1.1.1.1.;3,b01kdig=8,b1.1.1.1.0111;endcaseend/XUanShU/a1.ways(digyi)begincase(digyi)3'bOOO:segO=password15:12;3,b001:segO=password11:8;3'b010:seg0=password7:4;3,b011:seg=password3:0;endcaseend/segyima/a1.ways(segO)begincase(seg)4,b0000seg=7'b0111111;/04'b0001:seg=7'b0000110;/14,b0010:seg=7'b1.011011;/24'b0011:seg=7'b1001111;/34,b01OO:seg=7'b1100110;/44,b0101:seg=7'b1.IO1.1.OI;/54,b0110seg=7,b1.1.1.1.1.01.;/64'b0111seg=7,b0000111;/74,b1.000seg=7'b1.1.1.1.1.1.1.;/84,b1.001:seg=7'b1.101111;/9endcaseendendmodu1.e