硬件描述语言与EDA技术实践

上传人:daj****de 文档编号:162493601 上传时间:2022-10-18 格式:DOCX 页数:27 大小:370.23KB
返回 下载 相关 举报
硬件描述语言与EDA技术实践_第1页
第1页 / 共27页
硬件描述语言与EDA技术实践_第2页
第2页 / 共27页
硬件描述语言与EDA技术实践_第3页
第3页 / 共27页
点击查看更多>>
资源描述
课程设计课程名称硬件描述语言与EDA技术实践题目名称数字密码锁学生学院专业班级学 号学生姓名指导教师目录1. 引言11.2 、电子密码锁的介绍21.3、本设计所要实现的基本要求22. 密码锁总体设计32.1 、基本工作原理32.2、实现方式32.3、功能电路设计32.3.1、总体设计32.3.2、密码储存42.3.3、键盘消抖及扫描42.3.4、主状态机62.3.5 输入密码从状态机 72.3.6、整体 RTL 视图123. 外部电路134. 管脚分配145. 结束语156. 参考文献157. 附录16采用EDA实现数字密码锁1. 引言随着科技的不断发展,人们越来越重视对具有私密、重要物质的场所的安全 性,所以具有报警功能的电子密码锁在日常生活中用的越来越多,因此研究与设 计单片机为主要控制器的电子密码锁具有工程意义和解决日常应用需求的价值。 1.1 、电子密码锁的背景与发展趋势随着人们生活水平的提高和安全意识的加强,对安全的要求也就越来越高。 锁自古以来就是把守护门的铁将军,人们对它要求甚高,既要安全可靠的防盗, 又要使用方便,这也是制锁者长期以来研制的主题。随着电子技术的发展,各类 电子产品应运而生,电子密码锁就是其中之一。据有关资料介绍,电子密码锁的 研究从20 世纪 30 年代就开始了,在一些特殊场所早就有所应用。这种锁是通过 键盘输入一组密码完成开锁过程。研究这种锁的初衷,就是为提高锁的安全性。 由于电子锁的密钥量(密码量)极大,可以与机械锁配合使用,并且可以避免因 钥匙被仿制而留下安全隐患。电子锁只需记住一组密码,无需携带金属钥匙,免 除了人们携带金属钥匙的烦恼,而被越来越多的人所欣赏。电子锁的种类繁多, 例如数码锁,指纹锁,磁卡锁,ic卡锁,生物锁等。但较实用的还是按键式电 子密码锁。20 世纪80 年代后,随着电子锁专用集成电路的出现,电子锁的体积缩小, 可靠性提高,成本较高,是适合使用在安全性要求较高的场合,且需要有电源提 供能量,使用还局限在一定范围,难以普及,所以对它的研究一直没有明显进展。目前,在西方发达国家,电子密码锁技术相对先进,种类齐全,电子密码锁 已被广泛应用于智能门禁系统中,通过多种更加安全,更加可靠的技术实现大门 的管理。在我国电子锁整体水平尚处于国际上70 年代左右,电子密码锁的成本 还很高,市场上仍以按键电子锁为主,按键式和卡片钥匙式电子锁已引进国际先 进水平,现国内有几个厂生产供应市场。但国内自行研制开发的电子锁,其市场 结构尚未形成,应用还不广泛。国内的不少企业也引进了世界上先进的技术,发 展前景非常可观。希望通过不断的努力,使电子密码锁在我国也能得到广泛应用。目前使用的电子密码锁大部分是基于单片机技术,以单片机为主要器件,其 编码器与解码器的生成为软件方式。在实际应用中,由于程序容易跑飞,系统的 可靠性能较差。基于现场可编程逻辑门阵列 FPGA 器件的电子密码锁,用 FPGA 器件构造系统,所有算法完全由硬件电路来实现,使得系统的工作可靠性大为提 高。由于 FPGA 具有现场可编程功能,当设计需要更改时,只需更改 FPGA 中的控 制和接口电路,利用 EDA 工具将更新后的设计下载到 FPGA 中即可,无需更改外 部电路的设计,大大提高了设计的效率。1.2 、电子密码锁的介绍电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开 关的闭合,完成开锁、闭锁任务的电子产品。它的种类很多,有简易的电路产品, 也有基于芯片的性价比较高的产品。应用较广的电子密码锁是以芯片为核心,通 过编程来实现的。电子密码锁有以下性能特点:1. 保密性好,编码量多,远远大于弹子锁。随机开锁成功率几乎为零。2. 密码可变。用户可以经常更改密码,防止密码被盗,同时也可以避免因人员的 更替而使锁的密级下降。3. 误码输入保护。当输入密码多次错误时,报警系统自动启动。4. 电子密码锁操作简单易行,一学即会。5. 干扰码功能。在输入正确密码前可输入任意码。6. 安保功能。密码出错过多时,将锁定键盘。7. 操作方便。1.3、本设计所要实现的基本要求(1) 采用 4 位二进制密码,密码通过键盘输入,若密码正确,则将锁打开。(2) 报警、锁定键盘功能。密码输入错误LED会出现错误提示,若密码输入错误次数超过 3 次,蜂鸣器报警并且锁定键盘。(3) 修改密码,通过修改密码增强密码锁可靠性。(4) 系统具有一键还原出厂密码功能,如果对密码管理不善可以使用本功能进行 密码还原。(5) 成功开锁后,通过关锁键关锁。(6) 报警及锁定键盘后可通过解锁报警键取消报警。2. 密码锁总体设计2.1 、基本工作原理电子密码锁结构如图 2-1。密:码=密码储存处理报警图 2-1. 电子密码锁结构图2.2、实现方式本次电子密码锁的设计采用现场可编程逻辑门阵列 FPGA 器件。利用硬件描 述语言Verilog描述功能电路,下载到FPGA器件里,利用FPGA及其所需外设实 现本次设计所要求的功能。2.3、功能电路设计2.3.1、总体设计lockelk,num 3:0, wain,led3:0” ledl,led2/Ife时钟功能及密码按锂4个匸ED提示灯Z/llit用 LED灯|inpat rst n;input elk;iTLfJt 3:0 nun;c jtpjt wain,ledl f 2ed2 ; catpa 七: led./V键盘输入TV输出善告LED辅出整个电路的输入输出接口。2.3.2、密码储存parameter FAS5H0RD=41 bllll;77初始密码祐存|reg 3:0 pesswordpassword!Fpas5WQid_cneck; FF塩码寄存器将初始密码作为常量储存在PASSWORD,初始密码为1111。password_check 作为现有密码寄存器, password 作为输入密码寄存器和第 一次输入的修改密码的寄存器。 password1 作为检测用的第二次输入的修改密码 的寄存器。2.3.3、键盘消抖及扫描3module key (elk,rst_nk皂y_in,key_out卄input:elk;/主日寸钟信号,50MHzinputrst_n; /亘位信号!1低有敖input 3:0 key_in; /四牛独立按谨,低克示按下 output 3:0 key_out; 作芮输出扫描按健是習扭F/reg3:0 key_rst;always (posedge elk or 口皂g皂dg皂 rst_nif ( ! rst_n k:已y_rst: = 4 bllll;else k:皂y_rst = key_in3 : 0;reg3:0 key_rst_r;/每,卜时钟周期的上升沿将1 吋_旳信号谡存到1 ow_3w_r中always ( posedge elk or 11 皂gedge rst;_n if ( ! rst_n key_rst:_r = 4 bllll;else key_rst_r = key_rst: 3:0;/V当寄存器由工变为0时,key_an的值麥为高,维持一个时钟周期wire 3:0 k?ey_an = k?ey_rst_r & (key_rst;rec 19:0 ent; /V计数寄存器reg 13: 3; ent;八:+颤寄存器 (pasedge elk or negedge zst n)if (!rst_n) emt = 20dO;即爭else it(ke7_ai: ent =zo do;else cut: l?reg3:0 low_sw;alwavs (rosedae clfc or neaedare rst_n|iir (!rs匸_n) low_sw = pbllll;else if ( ent = 20 hf f f f/ffi20iLS 将抿键值锁存到寄 W tilo-w_sw4lant = 20 hfzff flaw_sw = key_m 3: D;reg |3:a|丄ow_sw_r:母十刖丼周朗旳二升汩底丄w信号锁与到_ow_吕always ( posedge elk or- snegedge rst n it ( ! rst_n) lQW_sw_r =1 bllll;else low_aw_T = lowaw 13 : 0 ?wire 3: D ke oul = low sw x3: 石(-lew sw3 :0 );/V每出按锻枝摆弋,部恪左土二-何寸铀园朗加咼腑冲sndiDcdule如图为按键消抖及扫描模块。一般按键的抖动时间为5ms到10ms。模块中在 检测到按键按下后使用计数器计时满20ms,然后再按键值锁存到寄存器中。而按键扫描则是用寄存器中本次时钟脉冲锁存的值的取反和下次时钟脉冲 所所存的值相与来的得到按键被按下的一个时钟的高脉冲。always (nurabuf 3:0)TV判断镇盘是否按Fbe gin.if(nurabuf=41bODOO)key en=0 jels亡k:亡犷_亡n=l;end.key kl(按谨消抖扫描| elk (elk),.rst_n(r5t_n)”.key_in(num3:0.key oJit (numtouf 3:0)wire 3:0 rLuntouf:/.-j/7输入谑盘连线n5bM【3=输入或确定或关锁/YnjirisjiE E=幄改 或侮止鞭警 7l Jiri at 1 =1 n jirJ3 j.f 0 =0例化按键消抖及扫描模块和判断按键是否被按下(4 个按键为按下为 1111有按键被按下相应位变为 0)。2.3.4、主状态机reg 4:0 estate;/V状态机现在状态reg 4:0 nstate;77状态机下个状态reg correct, ch_correct r ch_error, alarmed; 密码正确,幔改虧码正确,错误,善告标志 reg 1:0 try_error; |/V 密码错误次数paraine匸已2 idle=5 o0ooaif m_pu匸二3 1 loco010r pass=51 bo01 0, csiange=51 b01 oa r alarin=5 DIOOCQ; always (dos皂日口皂 sys_clk or 匸皂aeda皂 Z3t_n)# f 状态机beginif (!rst_n) begincscate=id.le;endelse cstate=rstate:endalways( estate or iey_enlLeg incase I estate *idle zfceain led.=j31 bOOOO;If (nunibuE 3 beginn s tat er=in_pu t:endelse natQtE,icile;endin_puL: beginledD=1;if (coriectjnslarecpass;elae if (tz?7 6110=3)-nstate=alarm;else ns tatixi_p u t;end口且已s :J皂ginled3;0=4bOOlO;if (nunitoul 3) rL5tate=idle;else 11 (nunibuf 2 ) rL5tate=c?iaiige;else rLBtate=pas3;endchange:bEgin led3i0=4b0100;i (ch conec七)nBtate=ldle; else ii(ch eiioi) nBtate=ldle; else nstate=change;endalaim:begin led3:0=4LIOOO;if (nunibul 2 )rLBtate=idle; else rLBtate=a2aira;-enddefault nstate=idle;endaBSend主状态机包括5个状态,分别为初始态(idle)、输入(in_put)、开锁(pass)、 修改密码(change)、警告(alarm)。如图为状态机的状态图。初始开机处于初始态,等待输入标志的到来,当输 入标志到来后进入输入状态。处于输入状态时等待密码输入判断位的到来。当判 断密码正确时进入开锁态,而当输入密码错误次数达到三次时,进入警告状态。 处于开锁态是等待修改密码或者关锁,关锁返回初始态,修改密码进入修改密码 状态。进入修改密码状态后等待修改密码完成(无论成功或者失败)返回初始态。 处于警告状态后锁定按键,等待取消警告标志到来,取消警告标志到来后返回初 始态。2.3.5 输入密码从状态机pararreLer numD= 1booooir numll=4 uaodirrmiu2=41DOO1 onunil3= boon,numl bOlOO, nuni2 O=!bOiai, nun? 1=40110, num? 2=40111, num2 3=4!bl0ao, nun? 4=41001; pararreter num0=4baOOO, nunil=4 b0001f non2=4 bDD10f mm3=4 1 bDOll.血皿4=4 baiOOf nura5=4 b0101; reg ke_cv;密码松/_完虛标志zs=g ch_cv;密码隆枚输八予成标志re a 3:0 psraice, asLaxe:密码囁、位数状态alwaysg- (posedge ss_elfc or negedge rBt_n)ff 榆八.密田状态机|fceginif ( !xat nJ begin pc33waEd&j3 bOOOO; passwarll= bOOOD; /key ov=iO /l/|ch_QV=DjF ps tate -numO ; qatat e-nunilQ ; g SWO : 1_CL EC: k =?A55WCED ;/ / 丄厂 亦召alaTmed=3: cczxect=D; tzrrorO; ch_ca 匚 i: E3-t*0 ; ch_error=Q: led2-=0 led2=0;end已lse if (cscace=ldl已、 beginled2=0;led2=0.?alaxmed=0;correct=0; 匸:r邑 error=0 ; ch cor工皂ct=0; ch Error=0; p s t a.t e =naQ ;qstat 已 C=rr(tl 0; 皂ndelse if (cstat皂=:in put;/V输入殛判断密码begincase (pstatenumO: beginledl=0;if (nuiibuf 1:0) beginpas sword 3 1 & (nuiWuf 0 J;psta 匸亡 cnunil;endelse pstate=ntiQ; endnunil: fc egi:nif (nuimbuf 1:0 b 皂 ginpdsswQxd 2 =numliuf 1 & (-nunLbuf 0 ; pst ate=nuin2rend.else psta.匸皂=numil; endnjni2:匕亡ginif (nuiibuf 1:0)num2: tegiTiif(numbufl:0)beginpessword 1 =nwiibxif 1 & (-nunitjuf D) psCdte=rLjn.3;亡ndelse pstate=rLJHii ; endnair.3: tegiTiif(numbuf1:O)beginpassword O =nwiibxif 1 & (nunituf D) psCfite=rLuni4;eidelse pstate=rLJir.3; endntmi马: tegiTiif(nwibuf 3)teglTi/key_ov=l; pBCate=rLJiu5;endelse pscate=nucii4j endnuinS: / / if (key_ov=l beginif (password 吕:0环cdEck: 3:0)begincorrect=lr/key_QV=0;FBtate=rLuniO;pstate =ziwiOrledl=l;led2=0;else if (try_euor=3) beginalaxiu.ed- =丄;try erroi=0;/ke y qv=0; psta.te=nuniO;endelsebegintry_erroi=try_error+l; / / k:&y_ChV=0;p3tate=rLjm0;丄亡d2=l;eid/else pstate=nurift5;eddefaalt ps七ate=nam0 r endcaseendelse i (CBtate=cnange)/Ff啦 改密码tegiicase (estate)else if ate=ch.ange)F/f彥改瓷玛begi ncase (gstats)nunlO : t:亡gini (niirabuf 1: O)beginpasBwozrd 3 uf 1 & tnunib-uf 0);qst ate=njittll;end else qstate =njini20 jendnunll:b亡gizi lEd2=J; 1 亡i (niirabuf 1:0)be ginpassword 2 =nuiabuf 1 & (-numbu 0); qstate =nunL12 ;endel se qsta.te=n jiall; end numlS : begin. lEdl=l;led2=0;i (niirabuf 1:0)be gin password1=numbuf1&(numbu0); qstate =nunil3;endel se qsta.te=n jial2 ; end numl3 : begin. ledl=l; led2=l;i (nrnuhuf 1:0)beginpasBWQrd O =numibuf 1 & (nurabuf 0); minL13 : tegin. led.lc=l; led2 c=lrif (mnab-uf 1:0)beginpasbwqrd. 0 =Tiumibu 1 : -nuraibuf O )i ; qst at e=n.aittl4;/led3=l;endelse qstate=n.uinkl3;erid:上已九ledl=3; 1&12 =0rif (ntrnibiif 3 ) beg-in ledl=l;gst at e=n. jm20 ;endelse qst a. t己丈=mnil 也;e ndnuiU-S 0 :begin.i f (imiab-uf 1:0)begin.卫己sswordl 3 =umbuf 1 & -nuiobuf 0) qs ta.te =ama21;endslss cjstate =uia2 0; sndn-um21 :segin. led.l=0; led2 =1;if (nimbuf 1:0)begin卫己s3-wqrd.1 2 ; qst at 11112 2 ;endelse qsta.t-eeg-in ledl=l; led2=0;i (n-uiabiif 1: D)beginpasswardl 1 =umti口土 1 & (numtou 0 ); q吕匸吐匸亡=num2 3;endelse qsta.t-eeg-in ledl=l: led2=l;i (n-uiabiif 1: D)beginpasswardl 0 =umti口土 1 & (numtou 0); q吕匸a匸亡=num2 4;/led3=l;endelse qstat-ziuia 4 ibeg-inledl=l; led2=l;i (nuniLti-u.f 3 )beginif(password3:0=paBBWQrdl3:0J beginpaBSWQrcl_cnECc:3:0 =paBBWQid 3:0: c?i_correct=lr/C51_QV=0;led.l=D;tjs t at-e=nuiulOrendslss/C51_QV=0 ; qstatE=nuiulO;endendelse qBtate=rLUiu24;end def a nl 匸 qBtate=nuiulO; edcase end else if (CBtatE=a2ai?ra0Egizi alarmed=l;endendassign warL=alarnied endiriod 口1 已密码输入状态机分为输入密码和修改密码两部分。如图为输入密码的状态图numO为等待第1位密码输入,输入完成进入numl。 numl为等待第2位密码输入,输入完成进入num2num2为等待第3位密码输入, 输入完成进入num3。num3为等待第4位密码输入,输入完成进入num4。num4 为等待确认输入,输入完成进入num5。num5为判断密码输入是否正确。正确的 话密码输入标志位correct置一,返回到numO,否则密码错误输入标志位try- _error 自加一, 返回到 num0。其他情况返回到 numO。如图为修改密码的状态图。numlO为等待第1位修改密码输入,输入完成进 入numll。numll为等待第2位修改密码输入,输入完成进入num12o num12为等 待第3位修改密码输入,输入完成进入num13。num13为等待第4位修改密码输 入,输入完成进入num14。num14为等待第1次修改密码确认输入,输入完成进 入num20。num20为等待再次输入第1为修改密码,输入完成进入num21。num21 为等待再次输入第 2 为修改密码,输入完成进入 num22。 num22 为等待再 次输入第3为修改密码,输入完成进入num23。num23为等待再次输入第4为修 改密码,输入完成进入 num24。 num24 为等待再次输入修改密码确认输入,输入 完成进行判断,正确则修改密码正确标志位 ch_correct 置一,否则修改密码错 误标志位 ch_error 置一,无论正确错误,都返回 num10。2.3.6、整体 RTL 视图如图为整体RTL视图。3. 外部电路外部电路包括一个产生时钟的时钟电路,4*1键盘,复位按键,蜂鸣器,* 1LED指示电路。如图为时钟电路。如图为蜂鸣器电路。LE31nip 40LED二mp 27如图为LED指示电路。RH10KKEY111KEY1CLK2 KEY?CI.K1KEY4O CSW-PSo c SW-PB KEY?如图为 4*1 键盘电路。如图为复位按键电路。4.管脚分配如图为管脚分配图。不同的 FPGA 实验开发板所使用的管脚不同。5. 结束语此次设计的基于 FPGA 的电子密码锁实现了密码锁的常用功能和技术指标。课程设计是培养学生综合运用所学知识发现、提出、分析和解决实际问题, 锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。随着 科学技术发展的日新月异,EDA设计和FPGA的应用已经成为当今计算机应用中 空前活跃的领域,在生活中可以说是无处不在。因此作为二十一世纪的大学生来 说掌握EDA设计的开发技术是十分重要的。对我而言,知识上的收获重要,精神上的丰收更加可喜。让我知道了学无止 境的道理。我们每一个人永远不能满足于现有的成就,人生就像在爬山,一座山 峰的后面还有更高的山峰在等着你。挫折是一份财富,经历是一份拥有。6. 参考文献1 徐志军等编著,EDA技术与VHDL设计,电子工业出版社,2010年5月;2 曹昕燕等编著,EDA技术实践与课程设计,清华大学出版社,2006年5月;3 刘欲晓等编著,EDA技术与VHDL电路开发应用实践,电子工业出版社,2009年4月;4 刘昌华等编著,数字逻辑EDA设计与实践:MAX+plusII与Quartusll双剑合璧,国防工 业出版社, 2009年;5 刘江海主编,EDA技术课程设计,华中科技大学出版社,2009年1月,6 王掁红主编,VHDL数字电路设计与应用实践教程;机械工业出版社,2003年6月。7. 附录module lock(rst_n,clk,num3:0, warn, led3:0,led1,led2);parameter PASSWORD=4b1111;input rst_n; input clk;input 3:0 num;/键盘输入output warn,led1,led2;/输出警告output 3:0 led;/LED 输出reg 3:0 password,password1,password_check; /密码寄存器 wire 3:0 numbuf;/输入键盘连线 numbuf3=enter/numbuf2=ch numbuf1=1 numbuf0=0 reg 3:0 led; /LED 控制寄存器 reg key_en;/键盘是否按下wire warn;wire sys_clk=clk;key k1(/按键消抖.clk(clk),.rst_n(rst_n), .key_in(num3:0), .key_out(numbuf3:0);reg 4:0 cstate;/状态机现在状态reg 4:0 nstate;/状态机下个状态reg correct,error,ch_correct,ch_error,alarmed; /密码正确,错误,修改密码正确,错误,警告标志reg 1:0 try_error;/密码错误次数always(numbuf3:0)/判断键盘是否按下beginif(numbuf=4b0000)key_en=0;else key_en=1;endparameter idle=5b00001,in_put=5b00010,pass=5b00100, change=5b01000,alarm=5b10000;always(posedge sys_clk or negedge rst_n) /状态机 beginif (!rst_n) begin cstate=idle;endelse cstate=nstate;endalways( cstate or key_en)begincase(cstate) idle:begin led=4b0000; if(numbuf3) begin nstate=in_put; endelse nstate=idle;end in_put:begin led0=1; if(correct) nstate=pass;else if(try_error=3)nstate=alarm;else nstate=in_put;endpass:begin led3:0=4b0010;if(numbuf3)nstate=idle;else if(numbuf2)nstate=change;elsenstate=pass;endchange:begin led3:0=4b0100;if(ch_correct)nstate=idle;else if(ch_error)nstate=idle;else nstate=change;endalarm:begin led3:0=4b1000;if(numbuf2)nstate=idle;elsenstate=alarm;enddefault nstate=idle;endcaseendreg led1,led2;/测试用 LEDparameter num10=4b0000,num11=4b0001,num12=4b0010, num13=4b0011,num14=4b0100,num20=4b0101,num21=4b0110, num22=4b0111,num23=4b1000,num24=4b1001;parameter num0=4b0000,num1=4b0001,num2=4b0010, num3=4b0011,num4=4b0100,num5=4b0101;reg 3:0 pstate,qstate;/ 密码输入位数状态always(posedge sys_clk or negedge rst_n)/输入密码状态机beginif(!rst_n) beginpassword=4b0000;password1=4b0000;pstate=num0;qstate=num10;password_check=PASSWORD;/出厂密码alarmed=0;correct=0;try_error=0;ch_correct=0;ch_error=0;led1=0;led2=0;else if(cstate=idle) beginled1=0;led2=0;alarmed=0;correct=0; try_error=0; ch_correct=0; ch_error=0; pstate=num0; qstate=num10;end/输入及判断密码else if(cstate=i begincase (pstate)num0: begin led1=0; if(numbuf1:0)begin password3=numbuf1&(numbuf0); pstate=num1;endelse pstate=num0;endnum1:begin if(numbuf1:0)begin password2=numbuf1&(numbuf0); pstate=num2;endelse pstate=num1;endnum2: begin if(numbuf1:0)begin password1=numbuf1&(numbuf0); pstate=num3;endelse pstate=num2;endnum3: begin if(numbuf1:0)begin password0=numbuf1&(numbuf0); pstate=num4;endelse pstate=num3;endnum4: begin if(key_en&(numbuf3) begin pstate=num5;endelse pstate=num4;endnum5:beginif(password3:0=password_check3:0)begincorrect=1;pstate=num0;led1=1;led2=0;endelse if(try_error=3)beginalarmed=1;try_error=0;pstate=num0;endelsebegintry_error=try_error+1;pstate=num0;led2=1;endenddefault pstate=num0;endcaseendelse if(cstate=change)/修改密码begincase (qstate)num10:begin if(numbuf1:0)beginpassword3=numbuf1&(numbuf0); qstate=num11;endelse qstate=num10;endnum11:begin led1=0;led2=1;if(numbuf1:0)begin password2=numbuf1&(numbuf0); qstate=num12;endelse qstate=num11;end num12: begin led1=1;led2=0; if(numbuf1:0)begin password1=numbuf1&(numbuf0); qstate=num13;endelse qstate=num12;end num13: begin led1=1;led2=1; if(numbuf1:0)begin password0=numbuf1&(numbuf0); qstate=num14;endelse qstate=num13;end num14:begin led1=0;led2=0;if(numbuf3)beginled1=1; qstate=num20;endelse qstate=num14;end num20:begin if(numbuf1:0) begin password13=numbuf1&(numbuf0); qstate=num21;endelse qstate=num20;end num21:begin led1=0;led2=1; if(numbuf1:0)begin password12=numbuf1&(numbuf0); qstate=num22;endelse qstate=num21;end num22: begin led1=1;led2=0; if(numbuf1:0)begin password11=numbuf1&(numbuf0);qstate=num23;endelse qstate=num22;endnum23: begin led1=1;led2=1; if(numbuf1:0)begin password10=numbuf1&(numbuf0); qstate=num24;endelse qstate=num23;end num24:begin led1=1;led2=1; if(numbuf3)beginif(password3:0=password13:0)beginpassword_check3:0=password3:0;ch_correct=1;led1=0;qstate=num10;endelsebeginch_error=1;qstate=num10;endendelse qstate=num24;enddefault qstate=num10;endcaseendelse if(cstate=alarm)beginalarmed=1;endendassign warn=alarmed;endmodulemodule key(elk,rst_n, key_in, key_out);input input input outputelk;/主时钟信号, 50MHzrst_n; /复位信号,低有效3:0 key_in; /四个独立按键,低表示按下3:0 key_out; /作为输出扫描按键是否按下/reg3:0 key_rst;always (posedge clk or negedge rst_n)if (!rst_n) key_rst = 4b1111; else key_rst = key_in3:0;reg3:0 key_rst_r;/每个时钟周期的上升沿将 low_sw 信号锁存到 low_sw_r 中always ( posedge clk or negedge rst_n )if (!rst_n) key_rst_r = 4b1111;else key_rst_r = key_rst3:0;/当寄存器key_rst由1变为0时,key_an的值变为高,维持一个时钟周期 wire3:0 key_an = key_rst_r & (key_rst);reg19:0 cnt; /计数寄存器 always (posedge clk or negedge rst_n)(posedge clk if (!rst_n) cnt else elsealways if(key_an) cnt = cntor negedge rst_n) = 20d0;/异步复位cnt =20d0;+ 1b1;reg3:0low_sw;if (!rst_n) low_sw = 4b1111;else if (ent = 20hfffff) /满20ms,将按键值锁存到寄存器low_sw中 cnt = 20hffffflow_sw = key_in3:0;/reg 3:0 low_sw_r;/每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中 always ( posedge clk or negedge rst_n )if (!rst_n) low_sw_r = 4b1111; else low_sw_r = low_sw3:0;wire3:0 key_out = low_sw_r3:0 & ( low_sw3:0); /每当按键被按下,都将产生一个时钟周期的高脉冲。endmodule
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸设计 > 毕设全套


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!