Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- librarY ieee;
- use ieee.std_logic_1164.all;
- use ieee.numeric_std.all;
- EntitY MealY_2 IS Port
- (
- clk_input : in std_logic ;
- rst_n : in std_logic ;
- pb_3 : in std_logic;
- extout : in std_logic ;
- pb_2 : in std_logic;
- XLT, XET, XGT, YLT, YET, YGT : in std_logic;
- clk_en_X, clk_en_Y, U1_D0_X, U1_D0_Y, ext_en, error : OUT std_logic
- -- ,
- );
- END ENTITY;
- Architecture SM of MealY_2 is
- TYPE STATE_NAMES IS (IN_MOTION, ERROR_STATE); -- list all the STATE_NAMES values but use more meaningful names
- SIGNAL current_state, next_state : STATE_NAMES; -- signals of tYpe STATE_NAMES
- signal input_signals : std_logic_vector(4 downto 0);
- signal pb3 : std_logic;
- signal X_ET : std_logic;
- signal X_LT : std_logic;
- signal X_GT : std_logic;
- signal pb2 : std_logic;
- signal Y_ET : std_logic;
- signal Y_LT : std_logic;
- signal Y_GT : std_logic;
- signal ext_out : std_logic;
- BEGIN
- pb3 <= NOT pb_3;
- X_LT <= XLT;
- X_ET <= XET;
- X_GT <= XGT;
- pb2 <= NOT pb_2;
- Y_LT <= YLT;
- Y_ET <= YET;
- Y_GT <= YGT;
- ext_out <= extout;
- ext_en <= X_ET AND Y_ET;
- --------------------------------------------------------------------------------
- --State Machine:
- --------------------------------------------------------------------------------
- -- REGISTER_LOGIC PROCESS:
- Register_Section: PROCESS (clk_input, rst_n) -- this process sYnchronizes the activitY to a clock
- BEGIN
- IF (rst_n = '0') THEN
- current_state <= IN_MOTION;
- ELSIF(rising_edge(clk_input)) THEN
- current_state <= next_State;
- END IF;
- END PROCESS;
- -- TRANSITION LOGIC PROCESS
- Transition_Section: PROCESS (
- pb3 ,
- X_LT ,
- X_ET ,
- X_GT ,
- pb2 ,
- Y_LT ,
- Y_ET ,
- Y_GT ,
- ext_out ,
- current_state
- )
- BEGIN
- CASE current_state IS
- WHEN IN_MOTION => --this part can have 0 and 1??
- IF( ( ((pb3 = '1') AND (X_ET = '0')) OR ((pb2 = '1') AND (Y_ET = '0')) ) AND (ext_out = '1') ) THEN -- pb is pressed, X or Y not equal to target, extended
- next_state <= ERROR_STATE;
- ELSE
- next_state <= IN_MOTION; -- staY in the same state otherwise
- END IF;
- WHEN ERROR_STATE =>
- IF(
- ext_out = '0'
- ) THEN -- the onlY waY to eXit the error state is when You toggle the extender OFF
- next_state <= IN_MOTION;
- ELSE
- next_state <= ERROR_STATE; -- otherwise staY
- END IF;
- WHEN OTHERS =>
- next_state <= IN_MOTION;
- END CASE;
- END PROCESS;
- -- DECODER SECTION PROCESS
- Decoder_Section: PROCESS (
- pb3 ,
- X_LT ,
- X_ET ,
- X_GT ,
- pb2 ,
- Y_LT ,
- Y_ET ,
- Y_GT ,
- ext_out ,
- current_state)
- BEGIN
- CASE current_state IS
- WHEN IN_MOTION => -- make sure You have code to actuallY staY in error state
- clk_en_X <= (NOT X_ET) AND pb3 AND NOT ext_out;
- clk_en_Y <= (NOT Y_ET) AND pb2 AND NOT ext_out;
- U1_D0_X <= X_LT; -- You don't care about these values unless the clock is enabled, which onlY happens when not equal
- U1_D0_Y <= Y_LT;
- --error <= (pb3 AND (X_LT OR X_GT)) OR (pb2 AND (Y_LT OR Y_GT ));
- error <= '0';
- WHEN ERROR_STATE =>
- error <= '1';
- WHEN OTHERS =>
- clk_en_X <= '0';
- clk_en_Y <= '0';
- U1_D0_X <= '0';
- U1_D0_Y <= '0';
- error <= '0';
- END CASE;
- END PROCESS;
- END ARCHITECTURE SM;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement