use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity code is
port( clk: in std_logic;--電路工作時的時鐘信號
clk1: in std_logic;--鬧鈴產生需要的時鐘信號
k: in std_logic;--高電平表示輸入1
led: out std_logic;--輸入正確時亮
led1: out std_logic;--輸入錯誤時亮
reset: in std_logic;-- 按下時復位
want: in std_logic;--是否修改密碼
alarm: out std_logic;--輸出鬧鈴聲
show: out std_logic_vector(3 downto 0));--提示作用
end;
architecture a of code is
signal temp: std_logic_vector(3 downto 0);--輸入壹位加1
signal code: std_logic_vector(7 downto 0);--儲存密碼
signal getcode: std_logic_vector(7 downto 0);--儲存修改後的密碼
signal counter: std_logic_vector(3 downto 0);--計數
signal allow: std_logic;--是否允許修改密碼
signal ring:std_logic;--是否接通鬧鈴
begin
process(clk)
begin
if ring='1' then
alarm<=clk1;--鬧鈴接通
else
alarm<='0';--鬧鈴截至
end if;
if reset='1' then--按下reset後,密碼歸為初始密碼
getcode<="00000000";--初始密碼
counter<="0000";--內部計數
code<="11001000";--密碼
led<='0';
led1<='0';
allow<='0';
elsif clk'event and clk='1' then--輸入clk脈沖,則接收1位密碼
getcode<=getcode(6 downto 0)&k;--將這1位密碼並入getcode中的最後壹位
if counter="1000" then--輸入為8位數碼時比較
if code=getcode then
led<='1';--正確燈亮
led1<='0';
ring<='0';
allow<='1';--允許修改密碼
elsif allow='1' and want='1' then--如果允許輸入且想輸入
code<=getcode;--輸入新密碼
led<='0';
led1<='0';
else
allow<='0';
led<='0';
led1<='1';--錯誤燈亮
ring<='1';--鬧鈴響
end if;
counter<="0000";--重新計數
else
counter<=counter+1; --累加
temp<=temp+1;--為防止泄露密碼,特別設置
end if;
end if;
show <= temp;
end process;
end;