--ZTQ.VHD
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ZTQ IS
PORT(DATA_N:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
DATA_F:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
FLAG_N:IN STD_LOGIC;
CLK_CTR:IN STD_LOGIC;
CLK_1K:IN STD_LOGIC;
SPEAKER:OUT STD_LOGIC;
KAI:OUT STD_LOGIC;
WARN:OUT STD_LOGIC;
DATA:OUT STD_LOGIC_VECTOR(15 DOWNTO 0));
END ENTITY ZTQ;
ARCHITECTURE ART OF ZTQ IS
SIGNAL ACC,REE,MIMA:STD_LOGIC_VECTOR(15 DOWNTO 0);
SIGNAL NC,DIR:STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL CUO:STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL SC,QR,SZ,GB,GAI,ZHENQUE,ENLOCK,TWICE,LABA,JB,JC,XIU,DUAN,CHANG,SHANCHU,KAISUO:STD_LOGIC;
TYPE STATE_TYPE IS (S0,S1,S2,S3,S4);
SIGNAL NEXT_STATE,STATE:STATE_TYPE;
BEGIN
PROCESS(CLK_CTR,GB)IS
BEGIN
IF GB='1' THEN
STATE<=S0;
ELSIF CLK_CTR'EVENT AND CLK_CTR='1' THEN
STATE<=NEXT_STATE;
END IF;
END PROCESS;
PROCESS(STATE)IS
BEGIN
NEXT_STATE<=S0;
SHANCHU<='0';
TWICE<='0';
JC<='0';
GAI<='0';
CASE STATE IS
WHEN S0=>
IF SC='1' THEN
SHANCHU<='1';
NEXT_STATE<=S0;
ELSIF QR='1' THEN
NEXT_STATE<=S1;
ELSIF SHANCHU='1' THEN
NEXT_STATE<=S0;
SHANCHU<='0';
END IF;
WHEN S1=>
IF NC<4 THEN
NEXT_STATE<=S3;
ELSIF ZHENQUE='1' THEN
NEXT_STATE<=S2;
ELSIF GAI='1' THEN
NEXT_STATE<=S4;
ELSE
NEXT_STATE<=S3;
END IF;
WHEN S2=>ENLOCK<='1';
IF SZ='1' THEN
NEXT_STATE<=S0;
GAI<='1';
END IF;
WHEN S3=>JB<='1';
IF DUAN='1' THEN
SHANCHU<='1';JB<='0';
NEXT_STATE<=S0;
ELSIF CHANG='1' THEN
SHANCHU<='1';JB<='0';
NEXT_STATE<=S0;
END IF;
WHEN S4=> JC<='1';
IF TWICE='0' THEN
NEXT_STATE<=S0;TWICE<='1';JC<='0';SHANCHU<='1';
ELSIF TWICE='1' THEN
NEXT_STATE<=S0;GAI<='0';JC<='0';TWICE<='0';SHANCHU<='1';
END IF;
END CASE;
END PROCESS;
PROCESS(DATA_F)IS
BEGIN
IF (DATA_F="0100") THEN --删除键;
SC<='1';
ELSIF (DATA_F="0001")THEN --确认键;
QR<='1';
ELSIF (DATA_F="0010")THEN --密码设置键;
SZ<='1';
ELSIF (DATA_F="1000")THEN ---关锁;
GB<='1';
END IF;
END PROCESS;
PROCESS(JB,CUO,XIU)IS
BEGIN
IF JB='1' THEN
IF CUO<2 THEN ---短报警;
DUAN<='1';CUO<=CUO+1;
ELSIF CUO=2 THEN ---长报警;
CHANG<='1'; CUO<="00";
END IF;
ELSIF XIU<='1' THEN
CHANG<='0'; DUAN<='0';XIU<='0';
END IF;
END PROCESS;
PROCESS(CLK_CTR,KAISUO,DUAN,CHANG)IS
BEGIN
IF CLK_CTR'EVENT AND CLK_CTR='1' THEN --1S时钟;
IF DUAN='1' THEN LABA<='1';DIR<=DIR+1; --1S到了消除短报警信号
IF(DIR="001") THEN XIU<='1';LABA<='0';DIR<="000";
END IF;
ELSIF CHANG='1' THEN LABA<='1';DIR<=DIR+1; ---5S到了消除长报警信号
IF(DIR="101") THEN XIU<='1';LABA<='0';DIR<="000";
END IF;
ELSIF KAISUO='1' THEN DIR<=DIR+1; --开锁显示
IF(DIR="001")THEN DIR<="000";KAISUO<='0';
END IF;
END IF;
END IF;
END PROCESS;
PROCESS(FLAG_N,SHANCHU)IS
BEGIN
IF SHANCHU='1' THEN --删除键;
NC<="000";ACC<="0000000000000000";
ELSE
IF FLAG_N'EVENT AND FLAG_N='1' THEN --判断数字按键;
IF NC<4 THEN
ACC<=ACC(11 DOWNTO 0)&DATA_N;
NC<=NC+1;
END IF;
END IF;
END IF;
END PROCESS;
PROCESS(GAI,TWICE,JC,NC)IS
BEGIN
IF GAI='1' THEN
IF JC='1' THEN
IF NC=4 THEN
IF(TWICE='0')THEN --第一次输入密码;
REE<=ACC;
ELSIF (TWICE='1') THEN --确认密码;
IF(REE=ACC)THEN
MIMA<=REE;
ZHENQUE<='1';
END IF;
END IF;
END IF;
END IF;
ELSIF GAI='0' THEN
IF ACC=MIMA THEN
ZHENQUE<='1'; --密码符合;
ELSIF ACC="0000100100100011" THEN --万用密码;
ZHENQUE<='1';
END IF;
END IF;
END PROCESS;
DATA<=ACC;
KAI<=KAISUO;
SPEAKER<=LABA AND CLK_1K;
WARN<=LABA;
END ARCHITECTURE ART;
评论0