-- The Electronic Gardener -- -- Mark Kudryk, Kim Ellis -- -- Module Name: device.vhd -- Author: Kim Ellis -- Date: November 07, 1998 -- Status: Completed --------------------------------------------------------- -- Description: -- Device State Machine operates the watering device --------------------------------------------------------- library ieee; use ieee.std_logic_1164.all; entity device is port( clk : in std_logic; reset : in std_logic; hour : in std_logic_vector( 7 downto 0 ); minute : in std_logic_vector( 7 downto 0 ); second : in std_logic; --only using the LSB meter_moist : in std_logic_vector( 7 downto 0 ); var_moist : in std_logic_vector( 7 downto 0 ); water_session : in std_logic; moist_start_h : in std_logic_vector( 7 downto 0 ); moist_start_m : in std_logic_vector( 7 downto 0 ); moist_end_h : in std_logic_vector( 7 downto 0 ); moist_end_m : in std_logic_vector( 7 downto 0 ); water_status : out std_logic; valve_on : buffer std_logic ); end device; architecture a of device is component maintain is port( clk : in std_logic; reset : in std_logic; real_moist : in std_logic_vector( 7 downto 0 ); var_moist : in std_logic_vector( 7 downto 0 ); timer_moist : out std_logic; timeout_moist : in std_logic; over_moist : out std_logic; water_status : out std_logic; valve_on : buffer std_logic ); end component maintain; component session is port( clk : in std_logic; reset : in std_logic; hour : in std_logic_vector( 7 downto 0 ); minute : in std_logic_vector( 7 downto 0 ); water_session : in std_logic; moist_start_h : in std_logic_vector( 7 downto 0 ); moist_start_m : in std_logic_vector( 7 downto 0 ); moist_end_h : in std_logic_vector( 7 downto 0 ); moist_end_m : in std_logic_vector( 7 downto 0 ); water_status : out std_logic; valve_on : buffer std_logic ); end component session; component devtimer is port( reset : in std_logic; second : in std_logic; timer_moist : in std_logic; timeout_moist : buffer std_logic ); end component devtimer; signal sig_timer_moist, sig_to_moist, sig_over_moist : std_logic; signal main_valve_on, ses_valve_on, ses_valve_out : std_logic; signal main_water_status, ses_water_status, ses_water_out : std_logic; signal real_moist : std_logic_vector( 7 downto 0 ); begin maintain_settings : maintain port map( clk => clk, reset => reset, real_moist => real_moist, var_moist => var_moist, timer_moist => sig_timer_moist, timeout_moist => sig_to_moist, over_moist => sig_over_moist, water_status => main_water_status, valve_on => main_valve_on ); device_session : session port map( clk => clk, reset => reset, hour => hour, minute => minute, water_session => water_session, moist_start_h => moist_start_h, moist_start_m => moist_start_m, moist_end_h => moist_end_h, moist_end_m => moist_end_m, water_status => ses_water_status, valve_on => ses_valve_on ); device_timers : devtimer port map( reset => reset, second => second, timer_moist => sig_timer_moist, timeout_moist => sig_to_moist ); -- the "valve_on" output signal is driven by two modules -- the maintain module has priority when enabled process( ses_valve_on, ses_water_status, sig_over_moist) begin if sig_over_moist = '1' then ses_valve_out <= '0'; ses_water_out <= '0'; else ses_valve_out <= ses_valve_on; ses_water_out <= ses_water_status; end if; end process; valve_on <= main_valve_on or ses_valve_out; water_status <= main_water_status or ses_water_out; --read in moisture level and synchronize it process( reset,clk ) begin if reset='1' then real_moist <= "00000000"; elsif rising_edge(clk) then real_moist <= meter_moist; end if; end process; end a;