华侨大学信息科学与工程学院通信工程系《电子设计自动化》课程设计题目:数字密码锁电路(1.1)院(系)信息科学与工程学院专业15通信工程届别班级学号姓名任课老师《电子设计自动化》课程设计2/26数字密码锁电路,难度系数1.1实验要求设计一个密码锁,有6位十进制数字密码,串行输入;能设置密码;有开锁和错误指示(LED);如果连续输错三次,则一刻钟内不能再开锁。本设计的各个模块由相应的VHDL程序具体实现,并在QuartusⅡ9.0环境下进行了整体电路的模拟仿真,最终实现“密码锁设计”的要求。实验设计要求6位串行输入,并且由于实验板输入键位的有限,还同时增加了输入密码与设置密码键位的重叠,使密码锁电路输入输出形成一个反馈,通过对输出的判断,让电路自动识别输入的数字是设置的密码还是输入的密码。在程序初始载入实验板时,还要让密码锁的初始设置密码和输入密码相同,从而达到能够初始设置密码的逻辑要求。同时因为实验板输出的LED灯有限,还要求设计的密码锁电路的显示能够在输入密码、设置密码和倒计时之间灵活智能选择,从而达到满足使用的要求。密码锁在输入三次错误密码后需要开始一个一刻钟即900秒的倒计时,则需要设计一个逻辑电路使电路能够在输入和错误倒计时之间自由变化。此为本实验设计的主要难点和创新。《电子设计自动化》课程设计3/26目录1.系统设计.....................................................................42.单元电路设计.............................................................73.软件设计...................................................................124.系统测试...................................................................235.结论...........................................................................246.参考文献.....................................................................247.附录...........................................................................258.其他...........................................................................26《电子设计自动化》课程设计4/26系统设计设计要求:设计一个密码锁,有6位十进制数字密码,串行输入;能设置密码;有开锁和错误指示(LED);如果连续输错三次,则一刻钟内不能再开锁。系统设计方案:先设计1.0难度的密码锁,此时不需要一刻钟计时模块。该电路首先需要一个输入模块,由于实验板的限制,安排两个键位作为输入,分别实现6个密码位的选择和对确定位密码的输入,所以在输入模块之前,还需要通过计数器来分别得到两个输入;之后设计一个密码合成及选择模块,将得到的6个4位的密码相加得到一个24位的密码,方便之后的比较,同时需要在输入模块添加一个选择,分别确定此时的输入信息是设置密码还是输入密码;将得到的24位设置密码和输入密码分别放到一个确认模块,起到输入确认并且使初始信息清零的作用;最后将两个24位数据放入比较模块,确定密码锁的状态,状态的显示由LED灯实现;输出显示LED模块从输入模块之前接出,显示当前电路的输入;同时,在计数器之前需要加入消抖模块,使实验板能够稳定输入;在LED模块之前需要添加译码器,以输出正确显示。下图为1.0密码锁各个模块及接线。《电子设计自动化》课程设计5/26完成1.0难度密码锁之后设计一个计数器,通过对密码输入确认和输出状态的计数,当输入错误达到三次时,开始一个一刻钟的计时,由另外一个计数器完成。该计数器的输入还需要一个50m分频模块,得到一个稳定的每秒输出一个电平跳变的输入;为了将900秒的计时显示到LED上,需要用除法器将计时的各个位拆分出来,再通过译码器显示到LED上。最后还需要一个输出选择模块,通过对3计数器的数据识别,选择当前LED输出的是900秒计时还是当前输入数据。下图为1.1难度密码锁最终的各个模块及接线。《电子设计自动化》课程设计6/26其他方案:除上述方法外,还可以将比较器放在输出选择模块之前,这样能够让程序在开发板上仿真时,位选之后不会将上一位的输入连带到本位;如果去掉输入选择模块,可以增加一个输入为设置密码输入,即将输入密码和设置密码的输入分开;倒计时模块采用的是从900倒计时到0,即“1110000110”到“0000000000”,然后输出cout为1;该程序也可以从“0000000000”累加到“1110000110”计数;《电子设计自动化》课程设计7/26单元电路设计消抖模块:消除按键难以避免的抖动,以得到稳定的输入;计数器:本实验分别用到了3进制、6进制和10进制的计数器,每计数到一定量时计数器清零并输出一个高电平;密码合成及选择模块:将得到的6个4位的密码合成一个24位的密码并输出,方便之后的密码比较,密码合成通过&完成,通过对输出状态反馈(开锁输出‘1’,锁存输出‘0’)的识别,判断当前输入的数据是设置密码还是输入密码,作两个输出;《电子设计自动化》课程设计8/26确认模块:将得到的输入密码和设置密码确认输出到比较器,同时在程序载入实验板时,还未有输入的情况下,能够默认输入密码和设置密码都是24位0,使两者初始值相等(此时比较器输出为‘1’,反馈到该模块,输入的数据为设置密码),达到能设置密码的状态;比较模块:对得到的输入密码和设置密码进行比较,输出显示当前密码锁是锁存‘0’还是开锁状态‘1’;译码器:将得到的数据读取,使其输出的数据能够显示到LED上;《电子设计自动化》课程设计9/26LED:将6位密码显示在LED上;50m分频:每秒稳定输出一个电平跳变;输出选择:通过对3进制计数器的数据读取(输入错误三次输出cout为‘1’,否则为‘0’),选择输出是当前密码输入、设置密码输入还是900秒计时;《电子设计自动化》课程设计10/26除法器:将900秒计时的百位、十位和个位拆分出来,使其能通过译码器显示到LED上。(该模块主要通过lpm_divide和lpm_constant实现,900秒的计时数据分别除常数100和10,再通过对商的后四位数据的读取得到各个位的大小)下图为除法器各模块及接线:LED第二位显示默认为0模块:将实验没有用到的led第二位显示输出默认为不显示;《电子设计自动化》课程设计11/26LED输出选择模块:选择led是显示倒计时还是此时输入密码《电子设计自动化》课程设计12/26软件设计软件:QuartusⅡ9.0(CycloneⅡEP2C5T144C8);硬件:对应的FPGA开发板程序清单1.消抖模块LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYxiaodouISPORT(K_IN,CLK:INSTD_LOGIC;K_OUT:OUTSTD_LOGIC);END;ARCHITECTUREoneOFxiaodouISSIGNALK_PRE:STD_LOGIC;SIGNALCOUNT:INTEGERRANGE0TO3999999;BEGINPROCESS(CLK,K_IN)BEGINIFCLK'EVENTANDCLK='1'THENIFK_IN=K_PRETHENIFCOUNT3999999THENCOUNT=COUNT+1;ELSECOUNT=3999999;ENDIF;ELSECOUNT=0;ENDIF;K_PRE=K_IN;ENDIF;IFCOUNT=3999999THENK_OUT=K_IN;ENDIF;ENDPROCESS;END;《电子设计自动化》课程设计13/262.十进制计数器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYcnt10ISPORT(CLK,RST,EN:INSTD_LOGIC;CQ:OUTSTD_LOGIC_VECTOR(3DOWNTO0);COUT:OUTSTD_LOGIC);ENDcnt10;ARCHITECTUREbehavOFcnt10ISBEGINPROCESS(CLK,RST,EN)VARIABLECQI:STD_LOGIC_VECTOR(3DOWNTO0);BEGINIFRST='0'THENCQI:=(OTHERS='0');--计数器异步复位ELSIFCLK'EVENTANDCLK='1'THEN--检测时钟上升沿IFEN='1'THEN--检测是否允许计数(同步使能)IFCQI9THENCQI:=CQI+1;--允许计数,检测是否小于9ELSECQI:=(OTHERS='0');--大于9,计数值清零ENDIF;ENDIF;ENDIF;IFCQI=9THENCOUT='1';--计数大于9,输出进位信号ELSECOUT='0';ENDIF;CQ=CQI;--将计数值向端口输出ENDPROCESS;ENDbehav;3.六进制计数器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCNT6ISPORT(CLK,RST,EN:INSTD_LOGIC;CQ:OUTSTD_LOGIC_VECTOR(3DOWNTO0);COUT:OUTSTD_LOGIC);ENDCNT6;ARCHITECTUREbehavOFCNT6ISBEGINPROCESS(CLK,RST,EN)VARIABLECQI:STD_LOGIC_VECTOR(3DOWNTO0);BEGIN《电子设计自动化》课程设计14/26IFRST='0'THENCQI:=(OTHERS='0');--计数器异步复位ELSIFCLK'EVENTANDCLK='1'THEN--检测时钟上升沿IFEN='1'THEN--检测是否允许计数(同步使能)IFCQI5THENCQI:=CQI+1;--允许计数,检测是否小于9ELSECQI:=(OTHERS='0');--大于9,计数值清零ENDIF;ENDIF;ENDIF;IFCQI=5THENCOUT='1';--计数大于9,输出进位信号ELSECOUT='0';ENDIF;CQ=CQI;--将计数值向端口输出ENDPROCESS;ENDbehav;4.倒计时的三进制计数器libraryieee;useieee.std_logic_1164.all;USEIEEE.STD_LOGIC_UNSIGNED.ALL;entitycnt3isport(c,clk,rst:instd_logic;y:outstd_logic);endcnt3;architectureoneofcnt3isbeginprocess(clk,c)variableb:std_logic_vector(1downto0);beginIF(c='1'orrst='1')THENb:=(OTHERS='0');ELSIFCLK'EVENTANDCLK='0'THENIFb3THENb:=b+1;ELSEb:=(OTHERS='0');ENDIF;ENDIF;IFb=3THENy='1';ELSEy='0';ENDIF;ENDPROCESS;endone;《电子设计自动化》