数电试验报告_第1页
数电试验报告_第2页
数电试验报告_第3页
数电试验报告_第4页
数电试验报告_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

1、数字电路与逻辑设计实验报告一、设计课题的任务要求题目六 简易智能密码锁设计并实现一个数字密码锁,密码锁有四位数字密码和一个确认 开锁按键,密码输入正确,密码锁打开,密码输入错误进行警示。基本要求:1、密码设置: 通过键盘进行 4 位数字密码设定输入 ,在数码管上显示 所输入数字。通过密码设置确定键( BTN 键)进行锁定。2、开锁:在闭锁状态下,可以输入密码开锁,且每输入一位密码, 在数码管上显示 “-”,提示已输入密码的位数。 输入四位核对密码后, 按“开锁”键,若密码正确则系统开锁,若密码错误系统仍然处于闭 锁状态,并用蜂鸣器或 led 闪烁报警。3、在开锁状态下,可以通过密码复位键( B

2、TN 键)来清除密码,恢 复初始密码“ 0000”。闭锁状态下不能清除密码。4、用点阵显示开锁和闭锁状态。提高要求:1、输入密码数字由右向左依次显示,即:每输入一数字显示在最右 边的数码管上 ,同时将先前输入的所有数字向左移动一位。2、密码锁的密码位数( 46 位)可调。3、自拟其它功能出于对于此密码锁安全性、 可控性及便利性的优化, 本人对于题 目要求做了如下调整:1、通过一个拨码开关VISIBLE (可视化),来实现对数码管输入数字 是否可见的控制:开时,输入密码数字由右向左依次显示,即每输入 一数字显示在最右边的数码管上, 同时将先前输入的所有数字向左移 动一位;关时,数码管显示 “-

3、”提示输入密码的位数,并有四个 LED 灯用 8421 码提示输入密码的键值。2、 将密码复位键在功能上优化成密码更改键CHGP(Wchangepassword 的缩写),当处于开锁状态时,按下此键即在开锁状态下获 得设置密码的权限, 点阵显示为不同颜色的开锁图案。 因为原要求中 相当于设定过一次密码后只能通过密码复位键将密码设置为0000,这既不合理又不方便。3、对于提高要求的取舍:(1)将移位显示结合在了开关 VISIBLE中,并拓展了四个LED的键 值显示。( 2)舍弃了对于密码位数可调的扩展性。(3)自拟了输入时的退格键 DEL以及全清键CLR用以避免在输入时误操作导致报警,一定程度上

4、增强了密码锁的可控性和实用性。二、系统设计1.设计思路整体思路上用有限状态机实现该课题( set,unlocked,locked)。具体需要如下模块:分频模块、键值读取模块、状态机主控制模 块、点阵显示模块、数码管显示模块以及报警模块。2.对外界口说明(1)输入: CLK :时钟信号。VISIBLE (SWO):控制密码可视化的拨码开关。RST (SW7):重置密码锁内部很多进程,但并不重置密码锁本身。LOCK(BTN1):由开锁状态转换为闭锁状态的闭锁键。CHGPW( BTN4 ):在开锁状态下跳至开锁并设置密码状 态。OK( BTN0):设置或输入密码后的确认键。DEL(BTN2) 在设置

5、或输入密码时清除一位的退格键。CLR( BTN3):在设置或输入密码时清除全部的全清键。 KEYROW 四位输入行信号。( 2)输出 KEYCOL 四位输出列扫描信号。DISP 六位输出数码管位数显示信号。SHOWAN 8位输出数码管内容显示信号。CODE :四位LED输出用8421码表示键值DISROW :点阵行输出信号。DISCOLR :点阵红列输出信号DISCOLG :点阵绿列输出信号SOUND:报警声音输出信号。LIGHTS :报警闪灯输出信号。3总体框图设置密码时钟上升沿N确定?正确? A|开锁NY时钟上升沿时钟上升沿i_ *F- 闭锁Y一锁住?YYN修改?4. 分块设计块间信号说明

6、type state_type is(set,unlocked,locked); -定义状态机状态类型 signal state:state_type:=set;-状态机的状态signal pwed,pwing:std_logic_vector(15 downto 0); - 已设定的密码和 正在输入的密码signal count:integer range 0 to 4:=0; -输入密码位数计数器signal div:std_logic_vector(29 downto 0); -30 位分频器signal keycode:std_logic_vector(3 downto 0); -键值

7、signal keyscan:std_logic_vector(3 downto 0); -键盘列扫描信号signal keyrow:std_logic_vector(3 downto 0); -键盘行信号signal keyloc:std_logic_vector(7 downto 0); -键位信号signal alarm:std_logic:=0;-报警信号 及 退格键防抖辅助信号(1)分频模块process(clk,rst)-dividerbeginif(rst=1)thendivv二000000000000000000000000000000;-2八30elsif(clkevent

8、and clk=1)thendiv=div+1;end if;end process;用一个30位标准逻辑向量的div信号实现任意2的N次幕分频, 对于时间精度要求不高的系统, 无需过于准确的分频, 这种精度是完 全够用的,而避免了过多对于分频器的编程。使用该分频器时,用DIV (N)或DIV (N DOWNTON-M )就可以实现所需要的分频。如 DIV (9)为原时钟信号的 29+1约等于 1000分频。( 2 )键值读取模块keycolkeyscankeyscankeyscankeyscan=1110;end case;end process;process(keyscan,keyrow

9、,keycode,keyloc) -keycode beginkeylockeycodekeycodekeycodekeycodekeycodekeycodekeycodekeycodekeycodekeycodekeycode=1111;end case;end process;按一定频率输出列扫描, 并返回行信号, 当行列信号同时有一列为 零时,表示该键被按下, 用连接的行列信号确定按键位置进一步确定 键值,当没有按键按下时,键值为“ 1111”即 15。(3)状态机主控制模块(代码见于源代码部分)分频信号上升沿时,判断状态机状态,进入不同的处理, set 状态 设定密码, count 计

10、数输入位数,满四位后确认则设置成功进入解锁 状态,直至闭锁进入闭锁状态,可输入密码并确认,正确则开锁,错 误则继续闭锁并且报警直至输入正确进入开锁状态。 开锁状态下也可 选择更改密码选项进入设置密码状态, 设置密码状态和闭锁输入密码 状态下可通过退格键和全清键对以输入的密码进行清除。密码储存于 16位标准逻辑向量 PWING ,每四位以 8421码存储 位密码,输入时通过对密码后 12 位和新输入的键值连接,使该位密 码存入 PWING (3 DOWNTO 0),删除时通过对 1111 和密码前 12 位连接,使原来的 PWING ( 15 DOWNTO 4)移位至 PWING (11 DOW

11、NTO 0 ),密码设置成功时 PWED=PWING ,保存密码,留以 输入密码时对比。(4)点阵显示模块(代码见于源代码部分)判断三种状态分别在点阵上扫描显示不同的内容(颜色或图案) 。(5)数码管显示模块(代码见于源代码部分)判断三种状态,开锁状态时数码管不显示,闭锁输入密码或设置密 码状态下判断 VISIBLE ,不可视时判断 COUNT 值,显示不同位数的 “ -”,可视时判断 COUNT 循环扫描当前位数的几位密码。(6)报警模块(代码见于源代码部分)但密码错误时 ALARM 信号置一,直至密码正确时再置为零。另一 进程以 ALARM 为输入信号,控制 LIGHTS 和 SOUND

12、的报警。三、仿真波形及波形分析对于该部分, 由于仿真存在的延时以及仿真需要的时间过长, 而控制 密码锁(设置密码闭锁输入密码等)需要的时间过长,因此对 CLK 时钟信号做一定调整并适当改变分频比,而后进行分模块的仿真。 (1)分频模块时钟信号 CLK 为 25MHz ,周期 40ns。OtGM寸*O汕7 11M 14p冷7 l5寸11* n7 KIP Liy述-tf SOE2*小7 :吗7 A9芒ivrHZ70 J如5他UM -4心 dsv(Il 灯心J -古曲叮 tJvfi.Bl I31T -Mop町 -bo(5 MH-ivCiE -m 口 I j h】l dgvCf -UtT -JavL

13、tk阳W 110即fefeEft匸.A4fci厲辗 1: felli wip呼戦aaS *1liH 5411it1 1”明”畀弁卯卯畀y 码科f卯?p卯卯卯卯畀卯叩艸杵 f! F卯卯卯!卯畀畀卵并椁挣卯卯 ijGMiM涮融血11?战diklkhkliiKWiljilih闊 Jjf 血lj【i 血hliilljil;碰制制ilji艮湖 iilii 揄 血匸皿ilii 血址1皿血IjiUMiiiGMJjjjif 血II Imbinnmnnnii ii 曲tnmmnna!fu.卜亦刑 -曲工湖;】.: -di r R_|. 电I臥】 -dlvFT. .JIvOl)-i- I -divll -dMlf

14、ll rvjT -JIv-SBl -di疔】El -dir J4-硏创口1】 VW门0】 Yl制即可实现任意2N分频(2)键值读取模块. ri I -I-IL1 JLIJD) C11I EllIL叫 * Illi |l DM】羸 *丁向“ V - I - - I- H I 为了不用过长的时间仿真,将列扫描信号的频率增大到时钟频率, 但 由于仿真延时等问题存在,所以仿真结果并不完全准确,但仍可见列 信号为扫描输出信号,行信号均为1时,键值为“ 1111即15,而当 有按键按下时,相应行信号为“ 0”,即CODEOUT出现了 09的各 种数字,其余时候没有键摁下,键值为“ 1111”。(3)点阵显

15、示模块elk卷I3 rbscelih】u-I l g4i.O aixniHJ. 0 3i320.0 nxICU D nt沁 Cl m24l. Q ns.FTlLrL. I1 , l1 . J1ICDInhDt; _!:jLUJj+1UIJIUJJII为-kublLUJ-*JU1IL111IIL111L91AiliuTlf_ LlllSlLlnt. 3110 IT i :血皿: 年 L0ILJ11LCdLllk 显示内容为橙色的开锁图标,表示设置密码OOOOHH 00001m 00001m )0000 .1 .1 .1 .1 .1 .111 1 1OOOOOOO HOOOO00011000001

16、0010000100100 00100100 - 0 0 0 001 01 0101开锁状态为绿色的开锁图标,闭锁状态为红色的闭锁图标,同理(4)报警模块Ion:Dtrielk did 帕) 11 li. gkt arnL:虜疋 一 itr x :K IT (1 才刃厂 E Mlx n r ).川H-lT.lJlMim IMW . rjunrnt.irjoiWlP严13.H m2C TO itie脏朝5 n.昭.B曲祉04xHI当报警信号为“ 1”时,两只LED灯以DIV( 18)的频率轮流闪烁,蜂鸣器以该频率作为间隔发生,而决定声音音高的频率为 DIV( 14)四、源程序library ie

17、ee;use ieee.stdo gic_1164.all;use ieee.std logic unsigned.all;entity elecpwlock isport(clk,chgpw,lock,visible,ok,clr,rst,del:in std_logic;- 外部端口说明已在上述内容中写过keyrow:in std_logic_vector(3 downto 0);- 故此处不再赘述keycol:out std_logic_vector(3 downto 0);lights:out std_logic_vector(1 downto 0):=00;code:out std_

18、logic_vector(3 downto 0):=0000;sound:out std_logic:=0;discolr,discolg,disrow,showan:out std_logic_vector(7 downto 0);disp:out std_logic_vector(5 downto 0);end elecpwlock;architecture elecpwlock_arch of elecpwlock is- 信号功能及含义也已经写过type state_type is(set,unlocked,locked);- 亦不再赘述signal state:state_type:

19、=set;signal pwed,pwing:std_logic_vector(15 downto 0);signal count:integer range 0 to 4:=0;signal div:std_logic_vector(29 downto 0);signal keycode:std_logic_vector(3 downto 0);signal keyscan:std_logic_vector(3 downto 0);signal keyloc:std_logic_vector(7 downto 0);signal alarm:std_logic:=0;beginkeycol=

20、keyscan;process(clk,rst)-dividerbeginif(rst=1)thendiv=000000000000000000000000000000;-2A30elsif(clkevent and clk=1)thendivkeyscankeyscankeyscankeyscan=1110;end case;end process;process(keyscan,keyrow,keycode,keyloc) -keycode 由行标列标共同确定位置和键值 beginkeylockeycodekeycodekeycodekeycodekeycodekeycodekeycode

21、keycodekeycodekeycodekeycode1111if(keycode/=1111 and count4)then- 尚未输够四位切键值不为pwing=pwing(11 downto 0) & keycode; code=keycode; count=count+1;elsif(clr=1)then-全清count=0;pwing=1111111111111111;code=0000;elsif(del=1)then- 退格(清一位)pwing=0000 & pwing(15 downto 4); if(count=0)thencount=0;elsif(count=1 or c

22、ount=2 or count=3 or count=4)then count=count-1;end if;elsif(count=4 and ok=1)then-输入四位并确定state=unlocked; pwed=pwing; pwing=1111111111111111;code=0000;elsestateif(lock=0 and chgpw=0)then state=unlocked;elsif(lock=0 and chgpw=1)then state=set;count=0;elsif(lock=1 and chgpw=0)then state=locked;count=0

23、;pwing- 无操作 保持开锁-更改密码-将电子锁闭锁-对于闭锁状态输入和设置输入相同if(keycode/=1111 and count4)then pwing=pwing(11 downto 0) & keycode; count=count+1; code=keycode;elsif(clr=1)then count=0; pwing=1111111111111111;elsif(del=1)then pwing=0000 & pwing(15 downto 4); if(count=0)thencount=0; elsif(count=1 or count=2 or count=3

24、or count=4)then count=count-1;end if;end if;if(ok=1 and pwed=pwing)then- 确定时密码正确则开锁(解除报警)state=unlocked;alarm=0; code=0000;elsif(ok=1 and pwed/=pwing)then - 密码不正确则报警直至正确 state=locked;count=0; alarm=1; codecase div(12 downto 10) iswhen 000 = disrow=11111110; discolr=00011000;discolg disrow=11111101;

25、discolr=00100100;discolg disrow=11111011; discolr=00100100;discolg disrow=11110111; discolr=00100100;discolg disrow=11101111; discolr=01111110;discolg disrow=11011111; discolr=01111110;discolg disrow=10111111; discolr=01111110;discolg disrow=01111111; discolr=01111110;discolg null;end case;when unlo

26、cked =case div(12 downto 10) iswhen 000 = disrow=11111110; discolg=01100000;discolr disrow=11111101; discolg=10010000;discolr disrow=11111011; discolg=10010000;discolr disrow=11110111; discolg=10010000;discolr disrow=11101111; discolg=00111111;discolr disrow=11011111; discolg=00111111;discolr disrow

27、=10111111; discolg=00111111;discolr disrow=01111111; discolg=00111111;discolr null;end case;when set =case div(12 downto 10) iswhen 000 = disrow=11111110; discolr=01100000;discolg disrow=11111101; discolr=10010000;discolg disrow=11111011; discolr=10010000;discolg disrow=11110111; discolr=10010000;di

28、scolg disrow=11101111; discolr=00111111;discolg disrow=11011111; discolr=00111111;discolg disrow=10111111; discolr=00111111;discolg disrow=01111111; discolr=00111111;discolg null;end case;end case;end process;process(alarm,div) -alarm-LED 闪烁报警频率begin if(alarm=1)then lights(1)=div(22);lights(0)=not d

29、iv(22);if(div(22)=1)then- 此频率决定蜂鸣器发声的时间间隔sound=div(14);- 此频率决定蜂鸣器的音调elsif(div(22)=0)thensound=0;end if;elsif(alarm=0)thenlights=00;soundif(visible=1)then- 是否密码可见case count iswhen 0=disp-1 位,最后一个数码管显示最后一位密码disp showan showan showan showan showan showan showan showan showan showan showan- 多位循环扫描显示各位密码

30、case div(10) iswhen 0=disp showan showan showan showan showan showan showan showan showan showan showandisp showan showan showan showan showan showan showan showan showan showan showancase div(11 downto 10) iswhen 00= disp showan showan showan showan showan showan showan showan showan showan showan disp showan showan showan showan showan showan showan showan showan showan showan disp showan showan showan showan s

温馨提示

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

评论

0/150

提交评论