-- The Electronic Gardener -- -- Mark Kudryk, Kim Ellis -- -- Module Name: memcntrl.vhd -- Author COPYRIGHT: Kim Ellis -- Date: October 28, 1998 ---------------------------------------------------------------------------- -- Description: -- Moore state machine to arbitrate RAM access between two modules. -- Priority is given to the second module in this instance. Request lines -- and acknowledge lines are used to communicate between the memory -- controller and the modules ---------------------------------------------------------------------------- library ieee; use ieee.std_logic_1164.all; ENTITY memcntrl IS PORT( Clk : IN STD_LOGIC; Reset : IN STD_LOGIC; req1, req2, r_w_1, r_w_2 : IN STD_LOGIC; code_1, code_2 : IN STD_LOGIC_VECTOR( 3 downto 0 ); ack1, ack2 : OUT STD_LOGIC; we : OUT STD_LOGIC; address : OUT STD_LOGIC_VECTOR( 3 downto 0 )); END memcntrl; ARCHITECTURE a OF memcntrl IS TYPE STATE_TYPE IS (start, Ackn2, Wait2, Ackn1, Wait1); SIGNAL state: STATE_TYPE; BEGIN PROCESS (clk) BEGIN IF reset = '1' THEN state <= start; ELSIF clk'EVENT AND clk = '1' THEN CASE state IS WHEN start => IF req2 = '1' THEN state <= Ackn2; ELSIF req1 = '1' THEN state <= Ackn1; END IF; WHEN Ackn2 => state <= Wait2; WHEN Wait2 => IF req1 = '1' THEN state <= Ackn1; ELSE state <= start; END IF; WHEN Ackn1 => state <= Wait1; WHEN Wait1 => state <= start; END CASE; END IF; END PROCESS; WITH state SELECT we <= r_w_2 WHEN Ackn2, r_w_1 WHEN Ackn1, '0' WHEN others; WITH state SELECT Address <= code_2 WHEN Ackn2, code_1 WHEN Ackn1, (others=>'0') WHEN others; WITH state SELECT ack2 <= '1' WHEN Ackn2, '0' WHEN others; WITH state SELECT ack1 <= '1' WHEN Ackn1, '0' WHEN others; END a;