1、VHDL密码锁6位串行输入VHDL密码锁(6位串行输入)电子设计自动化课程设计题目: 数字密码锁电路 (1.1) 院(系) 信息科学与工程学院 专 业 15通信工程 届 别 班 级 学 号 姓 名 任课老师 数字密码锁电路,难度系数1.1 实验要求设计一个密码锁,有6位十进制数字密码,串行输入;能设置密码;有开锁和错误指示(LED);如果连续输错三次,则一刻钟内不能再开锁。本设计的各个模块由相应的VHDL程序具体实现,并在Quartus9.0环境下进行了整体电路的模拟仿真,最终实现“密码锁设计”的要求。实验设计要求6位串行输入,并且由于实验板输入键位的有限,还同时增加了输入密码与设置密码键位的
2、重叠,使密码锁电路输入输出形成一个反馈,通过对输出的判断,让电路自动识别输入的数字是设置的密码还是输入的密码。在程序初始载入实验板时,还要让密码锁的初始设置密码和输入密码相同,从而达到能够初始设置密码的逻辑要求。同时因为实验板输出的LED灯有限,还要求设计的密码锁电路的显示能够在输入密码、设置密码和倒计时之间灵活智能选择,从而达到满足使用的要求。密码锁在输入三次错误密码后需要开始一个一刻钟即900秒的倒计时,则需要设计一个逻辑电路使电路能够在输入和错误倒计时之间自由变化。此为本实验设计的主要难点和创新。 1.系统设计 .42.单元电路设计 .73.软件设计 .124.系统测试 .235.结论
3、.246.参考文献 .247.附录 .258.其他 .26 系统设计设计要求:设计一个密码锁,有6位十进制数字密码,串行输入;能设置密码;有开锁和错误指示(LED);如果连续输错三次,则一刻钟内不能再开锁。系统设计方案:先设计1.0难度的密码锁,此时不需要一刻钟计时模块。该电路首先需要一个输入模块,由于实验板的限制,安排两个键位作为输入,分别实现6个密码位的选择和对确定位密码的输入,所以在输入模块之前,还需要通过计数器来分别得到两个输入;之后设计一个密码合成及选择模块,将得到的6个4位的密码相加得到一个24位的密码,方便之后的比较,同时需要在输入模块添加一个选择,分别确定此时的输入信息是设置密
4、码还是输入密码;将得到的24位设置密码和输入密码分别放到一个确认模块,起到输入确认并且使初始信息清零的作用;最后将两个24位数据放入比较模块,确定密码锁的状态,状态的显示由LED灯实现;输出显示LED模块从输入模块之前接出,显示当前电路的输入;同时,在计数器之前需要加入消抖模块,使实验板能够稳定输入;在LED模块之前需要添加译码器,以输出正确显示。下图为1.0密码锁各个模块及接线。 完成1.0难度密码锁之后设计一个计数器,通过对密码输入确认和输出状态的计数,当输入错误达到三次时,开始一个一刻钟的计时,由另外一个计数器完成。该计数器的输入还需要一个50m分频模块,得到一个稳定的每秒输出一个电平跳
5、变的输入;为了将900秒的计时显示到LED上,需要用除法器将计时的各个位拆分出来,再通过译码器显示到LED上。最后还需要一个输出选择模块,通过对3计数器的数据识别,选择当前LED输出的是900秒计时还是当前输入数据。下图为1.1难度密码锁最终的各个模块及接线。 其他方案:除上述方法外,还可以将比较器放在输出选择模块之前,这样能够让程序在开发板上仿真时,位选之后不会将上一位的输入连带到本位;如果去掉输入选择模块,可以增加一个输入为设置密码输入,即将输入密码和设置密码的输入分开;倒计时模块采用的是从900倒计时到0,即“1110000110”到“0000000000”,然后输出cout为1;该程序
6、也可以从“0000000000”累加到“1110000110”计数;单元电路设计消抖模块:消除按键难以避免的抖动,以得到稳定的输入;计数器:本实验分别用到了3进制、6进制和10进制的计数器,每计数到一定量时计数器清零并输出一个高电平; 密码合成及选择模块:将得到的6个4位的密码合成一个24位的密码并输出,方便之后的密码比较,密码合成通过&完成,通过对输出状态反馈(开锁输出1,锁存输出0)的识别,判断当前输入的数据是设置密码还是输入密码,作两个输出;确认模块:将得到的输入密码和设置密码确认输出到比较器,同时在程序载入实验板时,还未有输入的情况下,能够默认输入密码和设置密码都是24位0,使两者初始
7、值相等(此时比较器输出为1,反馈到该模块,输入的数据为设置密码),达到能设置密码的状态;比较模块:对得到的输入密码和设置密码进行比较,输出显示当前密码锁是锁存0还是开锁状态1;译码器:将得到的数据读取,使其输出的数据能够显示到LED上;LED:将6位密码显示在LED上;50m分频:每秒稳定输出一个电平跳变;输出选择:通过对3进制计数器的数据读取(输入错误三次输出cout为1,否则为0),选择输出是当前密码输入、设置密码输入还是900秒计时;除法器:将900秒计时的百位、十位和个位拆分出来,使其能通过译码器显示到LED上。(该模块主要通过lpm_divide和lpm_constant实现,900
8、秒的计时数据分别除常数100和10,再通过对商的后四位数据的读取得到各个位的大小)下图为除法器各模块及接线: LED第二位显示默认为0模块:将实验没有用到的led第二位显示输出默认为不显示;LED输出选择模块:选择led是显示倒计时还是此时输入密码软件设计软件:Quartus9.0(Cyclone EP2C5T144C8);硬件:对应的FPGA开发板程序清单1.消抖模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY xiaodou IS PORT( K_IN,CLK:IN STD_L
9、OGIC; K_OUT:OUT STD_LOGIC);END;ARCHITECTURE one OF xiaodou ISSIGNAL K_PRE:STD_LOGIC;SIGNAL COUNT:INTEGER RANGE 0 TO 3999999;BEGIN PROCESS(CLK,K_IN) BEGIN IF CLKEVENT AND CLK=1 THEN IF K_IN=K_PRE THEN IF COUNT3999999 THEN COUNT=COUNT+1; ELSE COUNT=3999999; END IF; ELSE COUNT=0; END IF; K_PRE=K_IN; EN
10、D IF; IF COUNT=3999999 THEN K_OUT0) ; -计数器异步复位 ELSIF CLKEVENT AND CLK=1 THEN -检测时钟上升沿 IF EN = 1 THEN -检测是否允许计数(同步使能) IF CQI 0); -大于9,计数值清零 END IF; END IF; END IF; IF CQI = 9 THEN COUT = 1; -计数大于9,输出进位信号 ELSE COUT = 0; END IF; CQ 0) ; -计数器异步复位 ELSIF CLKEVENT AND CLK=1 THEN -检测时钟上升沿 IF EN = 1 THEN -检测
11、是否允许计数(同步使能) IF CQI 0); -大于9,计数值清零 END IF; END IF; END IF; IF CQI = 5 THEN COUT = 1; -计数大于9,输出进位信号 ELSE COUT = 0; END IF; CQ 0) ; ELSIF CLKEVENT AND CLK=0 THEN IF b 0); END IF; END IF; IF b = 3 THEN y = 1; ELSE y = 0; END IF; END PROCESS; end one;5.输入模块LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTI
12、TY zongxuan IS PORT( D: IN STD_LOGIC_VECTOR(3 DOWNTO 0); B: IN STD_LOGIC_VECTOR(3 DOWNTO 0); code0,code1,code2,code3,code4,code5:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);END ENTITY zongxuan;ARCHITECTURE behav OF zongxuan IS BEGIN PROCESS(B) BEGIN IF B=0000 THEN code0=D; ELSIF B=0001 THEN code1=D; ELSIF B=00
13、10 THEN code2=D; ELSIF B=0011 THEN code3=D; ELSIF B=0100 THEN code4=D; ELSE code5=D; END IF;END PROCESS; END behav; 6.密码合成及选择模块LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY jicun IS PORT( P0,P1,P2,P3,P4,P5:IN STD_LOGIC_VECTOR(3 DOWNTO 0); CHANGE:IN STD_LOGIC; RCO
14、DE,ICODE:OUT STD_LOGIC_VECTOR(23 DOWNTO 0); END jicun; ARCHITECTURE bhv OF jicun IS SIGNAL CODE:STD_LOGIC_VECTOR(23 DOWNTO 0); BEGIN PROCESS(CHANGE) BEGIN CODE=p0&p1&p2&p3&p4&p5; IF CHANGE=1 THEN RCODE = CODE; ELSE ICODE = CODE; END IF;END PROCESS; END bhv;7.输出确认模块LIBRARY IEEE; USE IEEE.STD_LOGIC_11
15、64.All; ENTITY queren IS PORT( INCODE:IN STD_LOGIC_VECTOR(23 DOWNTO 0); OUTCODE:OUT STD_LOGIC_VECTOR(23 DOWNTO 0); K:IN STD_LOGIC); end queren;ARCHITECTURE bhv OF queren IS BEGIN PROCESS (k) BEGIN IF k=0 THEN OUTCODE = INCODE ; END IF; END PROCESS; END bhv;8.比较模块LIBRARY IEEE; USE IEEE.STD_LOGIC_1164
16、.All; ENTITY bijiao IS PORT( RCODE,ICODE:IN STD_LOGIC_VECTOR(23 DOWNTO 0); L:OUT STD_LOGIC); end bijiao;ARCHITECTURE bhv OF bijiao IS BEGIN PROCESS (RCODE,ICODE) BEGIN IF ICODE /= RCODE THEN L = 0; ELSE L = 1; END IF; END PROCESS; END bhv;9.译码器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY yimaqi I
17、S PORT( A :IN STD_LOGIC_VECTOR(3 DOWNTO 0); Y :OUT STD_LOGIC_VECTOR(6 DOWNTO 0);END ENTITY yimaqi;ARCHITECTURE one OF yimaqi ISBEGIN Y =1000000 WHEN A= 0000 ELSE 1111001 WHEN A= 0001 ELSE 0100100 WHEN A= 0010 ELSE 0110000 WHEN A= 0011 ELSE 0011001 WHEN A= 0100 ELSE 0010010 WHEN A= 0101 ELSE 0000010
18、WHEN A= 0110 ELSE 1111000 WHEN A= 0111 ELSE 0000000 WHEN A= 1000 ELSE 0010000 WHEN A= 1001 ELSE 0001000 WHEN A= 1010 ELSE 0000011 WHEN A= 1011 ELSE 1000110 WHEN A= 1100 ELSE 0100001 WHEN A= 1101 ELSE 0000110 WHEN A= 1110 ELSE 0001110 WHEN A= 1111 ELSE NULL;END ARCHITECTURE one;10.900秒计时library ieee;
19、use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity daojishi is port ( clk,en :in std_logic; led0 : out std_logic_vector(9 downto 0); cout: out std_logic); end daojishi;architecture behav of daojishi isbegin process(clk,en) variable led:std_logic_vector(9 downto 0); begin if en=0 then
20、 led:=1110000100;led0=1110000100; elsif clkevent and clk=1 then led:=led-1; end if; if led=0000000000 then cout=1;else cout=0;end if; led0=led; end process;end behav;11.计时除100得商取后四位library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity jiusi is port( a:in std_logic_vector(9
21、downto 0); b:out std_logic_vector(3 downto 0); end jiusi;architecture one of jiusi is begin process(a) begin b=a(3 downto 0); end process; end;12.计时除100得余数再除10得商取后四位library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity qisi is port(a:in std_logic_vector(6 downto 0); b:out s
22、td_logic_vector(3 downto 0); end qisi;architecture one of qisi is begin process(a) begin b=a(3 downto 0); end process; end;13.50m分频library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt50M is port(clk:in std_logic; cout:out std_logic); end cnt50M; architecture one of cnt
23、50M is begin process(clk) variable c:integer range 0 to 49999999; begin if clkevent and clk=1 then if c=49999999 then cout=1; c:=0; else c:=c+1; cout=0; end if; end if; end process;end;14.选择是否读取输出状态LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY xuan IS PORT ( A: IN STD_LOGIC; B:IN STD_LOGIC; Y : OUT STD_LOGIC);END ENTITY xuan;ARCHITECTURE one OF xuan ISBEGIN PROCESS (B,A) BEGIN IF B=0 THEN Y = A ; ELSE Y=1; end if; END PROCESS;END ARCHITECTURE one ;15.输出选择模块
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1