子密码)。
解除键:按下此建辉检查输入的密码是否正确,若密码正确无误则解锁。 图4所示是密码锁控制模块的仿真波形
(3)密码锁译码模块:
本电子密码锁的显示模块比较简单,其作用是将控制模块的BCD码输出转换为7段显示编码,然后驱动数码管,其仿真波形如图5所示。
电子密码锁的整合和验证
要完成电子密码锁的设计,还必须将上述三个功能模块进行整合。
三、结论及心得体会
此次的设计是参考了《EDA技术实验与课程设计》里的程序,不过由于程序里面出现了不少的语法错误,使得在编译时出现了20多个错误,不过在看过书后,细心地检查过程序后方能纠正过来。在纠正的过程中获益良多。 在EDA软件平台上,用硬件描述语言VHDL完成设计文件,然后由计算机
6
自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。感觉EDA还是很有研究价值的,能大大的减少设计者的工作量。
从编写程序到完成此次课程设计,亲自操作软件起来从生硬到熟练,现在能较娴熟的运用QuartusⅡ。 附:VHDL源程序 密码锁输入模块
LIBRARY IEEE ;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY SR IS
PORT(CLK_1K: IN STD_LOGIC;
KEY_IN: IN STD_LOGIC_VECTOR(2 DOWNTO 0); DATA_N: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); DATA_F: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); FLAG_N: OUT STD_LOGIC; FLAG_F: OUT STD_LOGIC; CQD: OUT STD_LOGIC;
KSEL: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); CSR: OUT STD_LOGIC_VECTOR(1 DOWNTO 0)); END SR;
ARCHITECTURE ONE OF SR IS SIGNAL C_QD: STD_LOGIC;
SIGNAL C_SR: STD_LOGIC_VECTOR(1 DOWNTO 0); SIGNAL N,F: STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL FN,FF: STD_LOGIC;
SIGNAL SEL: STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL Q: STD_LOGIC_VECTOR(5 DOWNTO 0); SIGNAL C: STD_LOGIC_VECTOR(2 DOWNTO 0); BEGIN
DATA_N<=N; DATA_F<=F; FLAG_N<=FN; FLAG_F<=FF; CQD<=C_QD; CSR<=C_SR; KSEL<=SEL;
7
C(0)<=KEY_IN(0); C(1)<=KEY_IN(1); C(2)<=KEY_IN(2); COUNTER: BLOCK IS BEGIN
PROCESS(CLK_1K)IS BEGIN
IF(CLK_1K'EVENT AND CLK_1K='1')THEN Q<=Q+1; END IF;
C_QD<=Q(3);
C_SR<=Q(5 DOWNTO 4); END PROCESS;
SEL<=\ \ \ \ \
END BLOCK COUNTER; KEY_DECODER: BLOCK
SIGNAL Z: STD_LOGIC_VECTOR(4 DOWNTO 0); BEGIN
PROCESS(C_QD) BEGIN
Z<=C_SR&C;
IF(C_QD'EVENT AND C_QD='1') THEN CASE Z IS
WHEN\ WHEN\ WHEN\ WHEN\ WHEN\ WHEN\ WHEN\ WHEN\ WHEN\ WHEN\ WHEN OTHERS=>N<=\ END CASE; END IF;
IF C_QD'EVENT AND C_QD='1' THEN CASE Z IS
WHEN\ WHEN\ WHEN OTHERS=>F<=\ END CASE;
8
END IF;
END PROCESS;
FN<=NOT(N(3)AND N(2)AND N(1)AND N(0)); FF<=F(2) OR F(0);
END BLOCK KEY_DECODER; END ARCHITECTURE ONE;
Add0Q[5..0]A[5..0]PRE1' h0 --Equal2SEL~[5..3]A[2..0]B[5..0]6' h01 --+DQSELB[2..0]3' h1 --=DATAAOUT0CLK_1KADDERENA3' h7 --DATABKSEL[3..0]CLREQUAL1' h0 --Equal1SEL~[2..1]CSR[1..0]A[2..0]SELMUX21B[2..0]3' h2 --=DATAAOUT0DATA_F[3..0]2' h3 --DATABDATA_N[3..0]EQUAL1' h0 --Equal0A[2..0]MUX21B[2..0]3' h3 --=011EQUALSEL~01' h0 --Equal3N[3..0]A[2..0]PREDQB[2..0]FN~23' h0 --=FLAG_NEQUALMux0ENACLRKEY_IN[2..0]SEL[4..0]OUT32' hDFF79797 --DATA[31..0]F[3..0]PREFF~0DQMUXFLAG_FMux11' h0 --ENASEL[4..0]OUTCLR32' hDF9FFF97 --DATA[31..0]MUXMux2SEL[4..0]OUT32' hDF9FD7F7 --DATA[31..0]MUXMux3SEL[4..0]OUT32' hDFDFB7DF --DATA[31..0]MUXMux4SEL[4..0]OUT32' hB7FFFFFF --DATA[31..0]MUXMux5SEL[4..0]OUT32' h08000000 --DATA[31..0]MUXMux6SEL[4..0]OUT32' h40000000 --DATA[31..0]MUXCQD密码锁控制模块
LIBRARY IEEE ;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY CTRL IS
9
PORT (DATA_N: IN STD_LOGIC_VECTOR(3 DOWNTO 0); DATA_F: IN STD_LOGIC_VECTOR(3 DOWNTO 0); FLAG_N: IN STD_LOGIC; FLAG_F: IN STD_LOGIC;
MIMAIN: BUFFER STD_LOGIC; SETIN: BUFFER STD_LOGIC; OLD: BUFFER STD_LOGIC; CQD: IN STD_LOGIC;
ENLOCK: OUT STD_LOGIC;
DATA_BCD: OUT STD_LOGIC_VECTOR(15 DOWNTO 0)); END ENTITY CTRL;
ARCHITECTURE ONE OF CTRL IS
SIGNAL ACC,REG: STD_LOGIC_VECTOR(15 DOWNTO 0); BEGIN
PROCESS(CQD,FLAG_F) IS BEGIN
IF CQD'EVENT AND CQD='0' THEN IF FLAG_F='1' THEN
IF(DATA_F=\ ACC<=\
MIMAIN<='0'; SETIN<='0'; OLD<='0'; ELSIF(DATA_F=\
IF(MIMAIN='0' AND SETIN='0') THEN CASE ACC(7 DOWNTO 0) IS
WHEN\
WHEN\ WHEN\ OLD<='1'; WHEN OTHERS=>NULL; END CASE;
ELSIF(MIMAIN='1') THEN IF ACC=REG THEN ENLOCK<='0'; MIMAIN<='0'; ELSE
MIMAIN<='0'; END IF;
ELSIF(SETIN='1') THEN IF(OLD='1') THEN IF(ACC=REG) THEN OLD<='0'; ELSE
SETIN<='0'; OLD<='0'; END IF; ELSE
10