📄 a_fsm2.vhd
字号:
-----------------------------------------------------------------------
--
-- Original Code Copyright (c) 1999 by Esperan. All rights reserved.
-- www.esperan.com
--
-- This source file may be used and distributed without restriction
-- provided that this copyright statement is not removed from the file
-- and that any derivative work contains this copyright notice.
--
-- Esperan VHDL Alarm Clock Lab Exercise Design V5.0
--
-- A_fsm2.vhd
-- Alarm Clock Controller compatible with keypad and keypad scanner
-- (Lab 12)
--
-----------------------------------------------------------------
Library IEEE;
use IEEE.Std_Logic_1164.all;
entity A_FSM2 is
port( CLK : in std_logic;
RESET : in std_logic;
KEY : in std_logic_vector(3 downto 0);
ALARM_BUTTON : in std_logic;
TIME_BUTTON : in std_logic;
ONE_SECOND : in std_logic;
LOAD_NEW_A : out std_logic;
SHOW_A : out std_logic;
SHOW_NEW_TIME : out std_logic;
LOAD_NEW_C : out std_logic;
SHIFT : out std_logic);
end A_FSM2;
architecture RTL of A_FSM2 is
type T_STATE is (SHOW_TIME, -- clock just counts
KEY_ENTRY, -- in key entry mode - waiting for key
STORE_KEY, -- key entered and shifted into buffer
KEY_HOLD, -- wait for key to be released after shifting in new value
SHOW_ALARM, -- shows time alarm is set
SET_ALARM_TIME, -- sets alarm time
SET_CURRENT_TIME); -- sets current time
signal STATE : T_STATE; -- holds the internal state of block
signal TIMEOUT : integer range 0 to 10; -- counts the keypad timeout
begin
STATE_MACHINE: process (CLK, RESET)
begin
if RESET = '1' then
STATE <= SHOW_TIME;
TIMEOUT <= 0;
elsif CLK'event AND CLK = '1' then
case STATE is
when SHOW_TIME =>
if ALARM_BUTTON = '1' then
STATE <= SHOW_ALARM;
elsif KEY /= "1010" then
STATE <= STORE_KEY;
TIMEOUT <= 10;
end if;
when KEY_ENTRY =>
if ALARM_BUTTON = '1' then
STATE <= SET_ALARM_TIME;
elsif TIME_BUTTON = '1' then
STATE <= SET_CURRENT_TIME;
elsif KEY /= "1010" then
STATE <= STORE_KEY;
TIMEOUT <= 10;
elsif TIMEOUT = 0 then
STATE <= SHOW_TIME;
elsif ONE_SECOND = '1' then -- decrement the TIMEOUT counter every second
TIMEOUT <= TIMEOUT - 1;
end if;
when STORE_KEY =>
STATE <= KEY_HOLD;
when KEY_HOLD =>
if KEY = "1010" then -- stay in this state until key is released
STATE <= KEY_ENTRY;
end if;
when SHOW_ALARM =>
if ALARM_BUTTON = '0' then
STATE <= SHOW_TIME;
end if;
when SET_ALARM_TIME =>
STATE <= SHOW_TIME;
when SET_CURRENT_TIME =>
STATE <= SHOW_TIME;
end case;
end if; -- closes asynch clock process construct
end process STATE_MACHINE;
-- Now assign outputs depending on internal state ...
SHOW_NEW_TIME <= '1' when (STATE = KEY_ENTRY) or (STATE = STORE_KEY)
or (STATE = KEY_HOLD) else '0';
SHOW_A <= '1' when STATE = SHOW_ALARM else '0';
LOAD_NEW_A <= '1' when STATE = SET_ALARM_TIME else '0';
LOAD_NEW_C <= '1' when STATE = SET_CURRENT_TIME else '0';
SHIFT <= '1' when STATE = STORE_KEY else '0';
end RTL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -