⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 a_fsm2.vhd

📁 Workshop vhdl code from Esperan
💻 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 + -