1、数字电路设计实验简易密码锁 数字电路设计实验报告 简易密码锁学院:班级:学号: 姓名:目录 任务要求 系统设计 设计思路 总体框图 分块设计 波形仿真及波形分析 源代码 功能分析 故障分析及问题解决 总结及结论 任务要求 设计并实现一个数字密码锁,密码锁有四位数字密码和一个确认开锁按键,密码输入正确,密码锁打开,密码输入错误进行警示。基本要求: 1、密码设置:通过键盘进行4 位数字密码设定输入,在数码管上显示所输入数字。通过密码设置确定键(BTN 键)进行锁定。 2、开锁:在闭锁状态下,可以输入密码开锁,且每输入一位密码,在数码管上显示“-”,提示已输入密码的位数。输入四位核对密码后,按“开锁
2、”键,若密码正确则系统开锁,若密码错误系统仍然处于闭锁状态,并用蜂鸣器或led 闪烁报警。 3、在开锁状态下,可以通过密码复位键(BTN 键)来清除密码,恢复初始密码“0000”。闭锁状态下不能清除密码。 4、用点阵显示开锁和闭锁状态。提高要求: 1、输入密码数字由右向左依次显示,即:每输入一数字显示在最右边的数码管上,同时将先前输入的所有数字向左移动一位。 2、密码锁的密码位数(46 位)可调。 3、自拟其它功能。 系统设计 设计思路 将电子密码锁系统分为三个部分来进行设计,数字密码输入部分、密码锁控制电路和密码锁显示电路。密码锁输入电路包括时序产生电路,键盘扫描电路,键盘译码电路等,将用户
3、手动输入的相关密码信息转换为软件所能识别的编码,作为整个电路的输入。密码锁控制电路包括相应的数据存储电路,密码核对电路,能够进行数值的比较,进行电路解锁,开锁,密码的重新设置等。密码锁显示电路包括将待显示数据的BCD码转换成数码管的七段显示驱动编码,密码锁在相应的状态下的点阵输出以及蜂鸣器的报警输出。 总体框图按复位键键入初始密码0000密码错误密码正确按确认键按复位键按确认键 分块设计 键盘扫描电路 首先,向列扫描地址逐列输出低电平,然后从行码地址读回,如果有键摁下,则相应行的值应为低,如果没有按键按下,由于上拉的作用,行码为高。这样就可以通过输出列码和读取的行码来判断按下的是什么键。在判断
4、有按键的按下后,要有一定的延时,防止键盘抖动。entity keyboard is port( row:in std_logic_vector(3 downto 0); col:out std_logic_vector(3 downto 0); keyout:out std_logic_vector(3 downto 0); q:out std_logic; clk:in std_logic );end keyboard;architecture struct of keyboard issignal col_buffer1:std_logic_vector(3 downto 0);signa
5、l col_buffer2:std_logic_vector(3 downto 0);signal key :std_logic_vector(7 downto 0);signal counter:integer range 0 to 3;signal delay:integer range 0 to 10;signal stop:std_logic;begin col = col_buffer2; q = stop; process(CLK,row,stop) begin if clkevent and clk = 1 then if counter = 3 then counter = 0
6、; else counter col_buffer1 col_buffer1 col_buffer1 col_buffer1 = 0111; end case; end if; end process; key stop=1;keyout stop=1;keyout stop=1;keyout stop=1;keyout stop=1;keyout stop=1;keyout stop=1;keyout stop=1;keyout stop=1;keyout stop=1;keyout stop = 0;/仅仅在摁09的时候会有显示,在摁除了这十个键之外的键的时候是不会有反应的,将keyout
7、的值转换为相应的数码管值,来控制数码管的显示 end case ; end if; end process; process(clk,stop) begin if clkevent and clk = 1then if stop = 0 then col_buffer2 = col_buffer1; end if; end if; end process;end struct; 点阵显示电路 采用行扫描的方式,每经过一段时间,给一行一个低电平。则若在列的方向上如果接入高电平,则会使相应的二极管发光。由于人眼的的暂留效应就回使我们看到我们想要的图案。library ieee;use ieee.s
8、td_logic_1164.all;entity led isport( row:out std_logic_vector(7 downto 0); num:in std_logic_vector(1 downto 0); clk:in std_logic; col:out std_logic_vector(7 downto 0); end entity;architecture struct of led issignal counter : integer range 0 to 7;beginprocess(clk)begin if clkevent and clk = 1 then if
9、 counter = 7 then counter = 0; else counter = counter +1; end if; end if;end process;process(clk,counter)begin if clkevent and clk = 0 then if num row = 11111110; col row = 11111101; col row = 11111011; col row = 11110111; col row = 11101111; col row = 11011111; col row = 10111111; col row = 0111111
10、1; col row = 11111110; col row = 11111101; col row = 11111011; col row = 11110111; col row = 11101111; col row = 11011111; col row = 10111111; col row = 01111111; col row = 11111110; col row = 11111101; col row = 11111011; col row = 11110111; col row = 11101111; col row = 11011111; col row = 1011111
11、1; col row = 01111111; col row = 11111110; col row = 11111101; col row = 11111011; col row = 11110111; col row = 11101111; col row = 11011111; col row = 10111111; col row = 01111111; col cat = 111110;ao cat = 111101;ao cat = 111011;ao cat = 110111;ao cat = 101111;ao cat = 011111;ao a a a a a a a a a
12、 a a aled_row,num=num,clk=clk_1000,col=led_col);IC4:seg port map(r=r,clk=clk_1000,cat=cat,a=a,w=w,input=input,num=seg_num);-statusprocess(s,rr,status)begin if rr = 1 then if status = 2 then status = 0; elsif status = 3 then status = 1; end if; elsif sevent and s = 1 then if status = 0 then status =
13、1; password = p1&p2&p3&p4; elsif status = 1 then if password = p1&p2&p3&p4 then status = 2; else status = 3; end if; else status = 1; end if; end if;end process;/statue 0代表的是输入状态,statue 1是闭锁状态,statue 2 是开锁状态,statue 3 是报警状态,状态转移图在前面已经画出process(s,rr,clk_1000)begin if rr = 1 then r = 1; elsif s = 1 then r = 1; elsif clk_1000event and clk_1000 = 0 then r = 0; end if;end process;-num_counterprocess(s,rr,q,clk_1000)begin if s = 1 then num_counter = 0; elsif rr = 1 then num_counter = 0; elsif qevent and q = 0 then if status = 0 or status = 1 then i
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1