基于VHDL的电子密码锁_第1页
基于VHDL的电子密码锁_第2页
基于VHDL的电子密码锁_第3页
基于VHDL的电子密码锁_第4页
基于VHDL的电子密码锁_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

..华南师大学课程设计实验报告课程名称:可编程数字系统设计课程设计题目:电子密码锁XX:程硕学院:物理与电信工程学院专业:理综一班年级:2011学号:一、设计原理用VHDL设计电子密码锁方案:作为通用电子密码锁,主要由3个局部组成:数字密码按键输入电路、密码锁控制电路和密码锁显示电路,作为电子密码锁的输入电路。可供选择的方案有数字机械式键盘和触摸式数字键盘等多种。〔1〕密码锁输入电路包括时序产生电路、键盘检测电路、键盘消抖电路等几个小的功能电路。〔2〕密码锁控制电路包括按键数据存储电路,恢复出厂密码、两次正确输入后可修改密码、密码核对,屡次错误报警,清屏等几个小的功能电路。〔3〕八段数码管显示电路主要将待显示数据的BCD码转换成数码器的八段显示驱动编码。二、系统分析本次课程设计成功地设计了一个简单的数字电子密码锁,密码为4位。将电子密码锁分为以下几个模块:按键消抖模块、密码锁逻辑控制模块和密码锁显示模块,实现了以下功能:(1)密码输入:KEY1按下一次,数码管上显示数字加一,相应位置输入密码加一(2)位置选择:KEY2按下一次,数码管选择位左移一位(3)密码确认:KEY3按下一次,比拟外部输入密码与原密码,正确LED长亮,错误LED变暗,同时显示密码置0;(4)密码修改:正确输入两次密码后,按下KEY4一次,将当前输入设为新的密码;(5)清屏:KEY5按下一次,外部输入置0;(6)恢复出厂设置:连续按下KEY5三次后恢复出厂密码"1234〞;三、程序设计由于程序稍显庞大,故采取分层次设计的方法,顶层采用画图法设计,底层采用VHDL语言进展设计。顶层电路图如图1所示图1Xiao_dou模块为按键消抖模块,main为密码锁控制模块,yima为数码管显示译码模块。Set_shuma端口为数码管段选端口,用于选择数码管。Led端口为led灯端口,key1,key2,key3,key4,key5为五个按键接口,show_shuma端口为数码管位选选择端口。底层设计由于按键为机械按键,故按下一次会产生屡次脉冲,当产生第一次下降沿的时候延时一段时间后,再继续检测是否有下降沿产生。主体程序如下:数码管译码显示进程:将0至9的4位矢量型数字转化为相应8位数码管显示数字电子密码锁控制电路:数码管位置选择进程:当数码管位置选择时钟到来时,数码管显示位左移一位,利用人眼的视觉余辉效果,产生4位数码管同时点亮的效果。数码管位置选择时钟信号发生进程:将系统时钟分频,产生500HZ占空比为1:1的方波,用于控制数码管位置选择。整型密码转化为矢量型密码,位选选择进程:利用CASE语句将不同位置的密码值显示在相应的数码管上。外部输入密码变更进程:当KEY1按下时外部输入密码加1,并在数码管上显示出来,数字从1至9循环;后半局部为当清屏信号到来时,外部输入密码置0。按键位置选择进程:KEY2按下时数码管位置选择端左移一位,后半局部为当清屏信号到来时,位置置0。密码设置,重置进程:当密码连续正确两次后,按下KEY4键,将现在显示的密码置为新密码。后半局部为恢复出厂设置密码。清屏,恢复出厂设置进程:当KEY5按下时产生清屏信号,当KEY5连续按下三次后产生恢复出厂设置信号。后半局部为清屏与恢复出厂设置信号的去除程序,用于去除产生的清屏与恢复出厂设置信号。密码比拟进程:比拟当前输入密码与部密码的值,如一样那么LED长亮,如不同那么LED暗,如连续3次输入错误密码那么LED闪烁报警。LED闪烁脉冲发生进程:用于产生LED闪烁所需方波脉冲四、仿真/实验结果密码正确:密码错误:清屏:五、结论或分析各项实验结果均成功,能够很好的实现,密码比拟,设置密码,清屏,恢复出厂设置等各项功能。六、使用说明S5:KEY1按下后外部输入密码加1;S4:KEY2按下后输入选择位置左移一位;S3:KEY3按下后比拟输入密码与部密码;S4:KEY4连续输入两次正确密码后按下,将当前显示密码设为新密码;S5:KEY5按下一次清屏,连续按下三次后恢复出厂设置。七、源程序控制电路源程序libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;entitymainisport(key1,key2,key3,key4,key5:instd_logic; clk:instd_logic; num_shuma:outstd_logic_vector(3downto0); set_shuma:outstd_logic_vector(3downto0); led:outstd_logic:='0'; sel:outstd_logic);endentitymain;architecturelockofmainissignaltemp_1,temp_led,temp_shuma,reset_all,reset_mima,temp_reset,key1_clear,key2_clear,key3_clear,key4_clear:std_logic;signalbit_one_in:integerrange0to9:=1; --insideofnumbersignalbit_two_in:integerrange0to9:=2;signalbit_three_in:integerrange0to9:=3;signalbit_four_in:integerrange0to9:=4;signalshow_shuma_location:std_logic_vector(1downto0); --locationofshumasignalbit_one_out,bit_two_out,bit_three_out,bit_four_out:integerrange0to9; --outsideofnumbersignallocation:std_logic_vector(1downto0); --insidelocationofnumbersignalnumber_led:integerrange0to5000000;signalnumber_shuma:integerrange0to50000;signalnumber_error:integerrange0to3;signaltwice:integerrange0to2;signalclear_num:integerrange0to3;beginshow_location_set:process(temp_shuma) --thelocationofshuma_guanbeginif(temp_shuma'eventandtemp_shuma='1')then show_shuma_location<=show_shuma_location+1;endif;endprocess;show_shuma:process(clk) --thenumberofshuma_guanbegin caseshow_shuma_locationis when"00"=> num_shuma<=conv_std_logic_vector(bit_one_out,4); set_shuma<="1110"; when"01"=> num_shuma<=conv_std_logic_vector(bit_two_out,4); set_shuma<="1101"; when"10"=> num_shuma<=conv_std_logic_vector(bit_three_out,4); set_shuma<="1011"; when"11"=> num_shuma<=conv_std_logic_vector(bit_four_out,4); set_shuma<="0111"; endcase; if(reset_all='1')then num_shuma<="0000"; --xianshizhi0 endif;endprocess;shuma_200:process(clk) --usetodelaylocationsetbeginif(clk'eventandclk='1')then if(number_shuma=50000)then number_shuma<=0; temp_shuma<=nottemp_shuma; elsenumber_shuma<=number_shuma+1; endif;endif;endprocessshuma_200;add_outside:process(clk,reset_all) --key1addnumbeginif(key1'eventandkey1='0')thenkey1_clear<='1';caselocationis when"00"=>bit_one_out<=bit_one_out+1; if(bit_one_out=9)thenbit_one_out<=0; endif; when"01"=>bit_two_out<=bit_two_out+1; if(bit_two_out=9)thenbit_two_out<=0; endif; when"10"=>bit_three_out<=bit_three_out+1; if(bit_three_out=9)thenbit_three_out<=0; endif; when"11"=>bit_four_out<=bit_four_out+1; if(bit_four_out=9)thenbit_four_out<=0; endif;endcase;endif;if(clear_num=0)then key1_clear<='0';endif;if(reset_all='1')then bit_one_out<=0; bit_two_out<=0; bit_three_out<=0; bit_four_out<=0;endif;endprocessadd_outside;location_set:process(clk,reset_all) --key2location_setbegin if(key2'eventandkey2='0')then --led<='0'; key2_clear<='1'; location<=location+1; endif; if(reset_all='1')then location<="00"; endif;if(clear_num=0)then key2_clear<='0';endif;endprocess;set_mima:process(clk,clear_num) --key4setmimabeginif(twice=2)then if(key4'eventandkey4='0')then --led<='0'; key4_clear<='1'; bit_one_in<=bit_one_out; bit_two_in<=bit_two_out; bit_three_in<=bit_three_out; bit_four_in<=bit_four_out; endif;endif;if(clear_num=0)then key4_clear<='0';endif;if(clear_num=3)then bit_one_in<=1; bit_two_in<=2; bit_three_in<=3; bit_four_in<=4;endif;endprocess;reset:process(clk,temp_reset,key1_clear,key2_clear,key3_clear,key4_clear) --key5clearandresetbeginif(key5'eventandkey5='0')then --led<='0'; reset_all<='1'; if(clear_num=3)then clear_num<=0; elseclear_num<=clear_num+1; endif;endif;if(location="00"andbit_one_out=0andbit_two_out=0andbit_three_out=0andbit_four_out=0)then reset_all<='0';endif;if(temp_reset='1')then reset_all<='1';endif;if(key1_clear='1'orkey2_clear='1'orkey3_clear='1'orkey4_clear='1')then --ifotherkeyclearnum clear_num<=0;endif;endprocess;pare:process(clk,reset_all) --key3parebeginif(key3'eventandkey3='0')then key3_clear<='1'; if(bit_one_in=bit_one_outandbit_two_in=bit_two_outand bit_three_in=bit_three_outandbit_four_in=bit_four_out)then led<='1'; temp_1<='0'; temp_reset<='1'; number_error<=0; if(twice=2)then twice<=twice; else twice<=twice+1; endif; else twice<=0; if(number_error=3)then number_error<=1; temp_1<='1'; else number_error<=number_error+1; led<='0'; temp_1<='0'; endif; endif;endif;if(clear_num=0)then key3_clear<='0';endif;if(location="00"andbit_one_out=0andbit_two_out=0andbit_three_out=0andbit_four_out=0)then --cleartongxin temp_reset<='0';endif; if(temp_1='1')then led<=temp_led;endif; endprocesspare;one_second:process(clk)beginif(clk'eventandclk='1')then if(number_led=5000000)then number_led<=0; temp_led<=nottemp_led; elsenumber_led<=number_led+1; endif;endif;endprocessone_second; endarchitecturelock;消抖源程序libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityxiao_douisport(clk:instd_logic; din:instd_logic; dout:outstd_logic);endentityxiao_dou;architectureaofxiao_douissignalnum:integerrange0to1000000;signaltemp_10,temp,temp1:std_logic;beginprocess(clk)beginif(clk'eventandclk='1')then if(din='0')then if(num=1000000)thennum<=num; else

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论