
library ieee ;
use ieee.std_logic_1164.all ; -- définition du type bit , bit vector , ...
use ieee.numeric_std.all ; -- opérations signées et non signées
use ieee.std_logic_arith.all ; -- opérations signées et non signées sur les vecteur

entity mux41 is port(
E0,E1,E2,E3 : in std_logic;
S0,S1          : in std_logic;
O              : out std_logic
);
end entity mux41;

---- arch flot de donnée
--architecture mux41_arch of mux41 is
-- begin
--  O <= ((not S0) and (not S1) and E0) or
--    (S0 and (not S1) and E1) or
--    (( not S0) and S1 and E2) or
--    (S0 and S1 and E3) ;
-- end architecture mux41_arch ;


-- arch structurelle
architecture mux41_arch of mux41 is
  signal  not_S0, not_S1 : std_logic ;
  signal X : std_logic_vector(3 downto 0) ;
  component My_and3
    port(A,B,C : in std_logic;
         D : out std_logic);
  end component;
  component My_or4
    port(A,B,C,D : in std_logic;
         E : out std_logic);
  end component;

begin
   not_S0 <= not(S0) ;
   not_S1 <= not(S1) ;
  gate0 : My_and3
    port map (not_S0, not_S1, E0, X(0)) ;
  gate1 : My_and3
    port map (S0, not_S1, E1, X(1)) ;
  gate2 : My_and3
    port map (not_S0,S1, E2, X(2)) ;
  gate3 : My_and3
    port map (S0,S1, E3, X(3)) ;
  gate4 : My_or4
    port map (X(0), X(1), X(2), X(3), O) ;
end architecture mux41_arch ;



----arch comportementale
--architecture mux41_arch of mux41 is
-- begin
--  pMux41: process(E0, E1, E2, E3, S0, S1)
--  begin
--    if (S0 = '0' and S1 = '0') then
--      O <= E0 ;
--    elsif (S0 = '1' and S1 = '0') then
--      O <= E1 ;
--    elsif (S0 = '0' and S1 = '1') then
--      O <= E2 ;
--    else
--      O <= E3 ;
--    end if ;
--  end process pMux41 ;
--end architecture mux41_arch ;

----arch comportementale 2
--architecture mux41_arch of mux41 is
-- begin
--  mux41: process(E0, E1, E2, E3, S0, S1)
--  begin
--    if (S1 = '0') then
--      if (S0 = '0') then
--        O <= E0 ;
--      else
--        O <= E1 ;
--      end if ;
--    else
--      if (S0 = '0') then
--        O <= E2 ;
--      else
--        O <= E3 ;
--      end if ;
--    end if ;
--  end process mux41 ;
-- end architecture mux41_arch ;
