Tuesday, May 28, 2013

4 :1 Multiplexer

-----------------------------------------------------------------
-- File Name : mux_4to1.vhd
-----------------------------------------------------------------


LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE  IEEE.NUMERIC_STD.ALL;

ENTITY mux_4to1 IS
 GENERIC (
    BIT_WIDTH :integer       
    );
PORT (
 clk      : IN  STD_LOGIC                              ;
 reset_n  : IN  STD_LOGIC                              ;
 i_in1    : IN  STD_LOGIC_VECTOR( BIT_WIDTH-1 DOWNTO 0);
 i_in2    : IN  STD_LOGIC_VECTOR( BIT_WIDTH-1 DOWNTO 0);
 i_in3    : IN  STD_LOGIC_VECTOR( BIT_WIDTH-1 DOWNTO 0);
 i_in4    : IN  STD_LOGIC_VECTOR( BIT_WIDTH-1 DOWNTO 0);
 i_mux_sel: IN  STD_LOGIC_VECTOR( 1 DOWNTO 0)          ;
 o_mux_out: OUT STD_LOGIC_VECTOR( BIT_WIDTH-1 DOWNTO 0)
 );
END mux_4to1;

ARCHITECTURE Arch OF mux_4to1 IS

BEGIN

P_mux : PROCESS(clk)
BEGIN
    IF (reset_n = '0') THEN
       o_mux_out <= (OTHERS => '0');
    ELSIF( rising_edge(clk) ) THEN
      CASE i_mux_sel IS
            WHEN "00" =>
              o_mux_out <= i_in1;
            WHEN "01" =>
              o_mux_out <= i_in2;
            WHEN "10" =>
              o_mux_out <= i_in3;
            WHEN OTHERS =>   
              o_mux_out <= i_in4;
      END CASE;          
    END IF;
END PROCESS P_mux;

END Arch;

Test bench:

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE  IEEE.NUMERIC_STD.ALL;

ENTITY mux_4to1_tb IS
END mux_4to1_tb;

ARCHITECTURE tb OF mux_4to1_tb IS
CONSTANT BIT_WIDTH  : INTEGER := 18; 
SIGNAL clk          : STD_LOGIC;
SIGNAL reset_n      : STD_LOGIC;
SIGNAL i_in1        : STD_LOGIC_VECTOR( BIT_WIDTH-1 DOWNTO 0):= "00" & X"ABCD";
SIGNAL i_in2        : STD_LOGIC_VECTOR( BIT_WIDTH-1 DOWNTO 0):= "00" & X"FFFF";
SIGNAL i_in3        : STD_LOGIC_VECTOR( BIT_WIDTH-1 DOWNTO 0):= "11" & X"1000";
SIGNAL i_in4        : STD_LOGIC_VECTOR( BIT_WIDTH-1 DOWNTO 0):= "00" & X"1111";
SIGNAL i_mux_sel    : STD_LOGIC_VECTOR( 1 DOWNTO 0)          ;
SIGNAL o_mux_out    : STD_LOGIC_VECTOR( BIT_WIDTH-1 DOWNTO 0);
CONSTANT PERIOD     : TIME := 5 ns;

COMPONENT mux_4to1 IS
 GENERIC (
    BIT_WIDTH :integer       
    );
PORT (
 clk      : IN  STD_LOGIC                              ;
 reset_n  : IN  STD_LOGIC                              ;
 i_in1    : IN  STD_LOGIC_VECTOR( BIT_WIDTH-1 DOWNTO 0);
 i_in2    : IN  STD_LOGIC_VECTOR( BIT_WIDTH-1 DOWNTO 0);
 i_in3    : IN  STD_LOGIC_VECTOR( BIT_WIDTH-1 DOWNTO 0);
 i_in4    : IN  STD_LOGIC_VECTOR( BIT_WIDTH-1 DOWNTO 0);
 i_mux_sel: IN  STD_LOGIC_VECTOR( 1 DOWNTO 0)          ;
 o_mux_out: OUT STD_LOGIC_VECTOR( BIT_WIDTH-1 DOWNTO 0)
 );
END COMPONENT;
BEGIN

inst_mux_4to1 : mux_4to1
 GENERIC MAP(
    BIT_WIDTH => BIT_WIDTH
    )
PORT MAP (
 clk      => clk      ,
 reset_n  => reset_n  ,
 i_in1    => i_in1    ,
 i_in2    => i_in2    ,
 i_in3    => i_in3    ,
 i_in4    => i_in4    ,
 i_mux_sel=> i_mux_sel,
 o_mux_out=> o_mux_out
 );

  
clk_process :process
  begin
    clk <= '0';
    wait for PERIOD/2;
    clk <= '1';
    wait for PERIOD/2;
  end process;
  
  -------------------------------------------
  -- Stimulus generation
  --------------------------------------------
  stimulus: process
  begin  
    -- Put initialisation code here
    reset_n <= '0';
    wait for PERIOD;
    reset_n <= '1';
    wait for PERIOD;
    wait;
  end process; 


  -------------------------------------------
  -- mux_sel stimulus generation
  --------------------------------------------
   process
  begin  
    -- Put initialisation code here
    i_mux_sel <= "01";
    wait for PERIOD * 30;
    i_mux_sel <= "00";
    wait for PERIOD * 10;
    i_mux_sel <= "11";
    wait;
  end process; 


END tb;

Simulation waveform :



1 comment:

  1. Titanium Fidget Spinner | Titsanium Arts
    Titanium titanium wood stoves Fidget Spinner · titanium max Classic Plastic Spinner edc titanium · Classic Titsanium Spinner ion chrome vs titanium · Classic Titsanium Spinner tube supplier · Classic Titsanium Spinner · Classic Titsanium Spinner · Classic Titsanium Spinner.

    ReplyDelete