VHDL: multiplexor de 4 a 1 con selección de 2 bits

VHDL multiplexor 4 a 1 son selección de 2 bits

Code-kata para generar un circuito de un multiplexor. En este caso es un multiplexor que recibe 4 señales de entrada y las encauza en una salida eligiendo con otras dos señales de entrada cuál tiene que encauzar a la salida.

Es decir, los 2 pins de entrada para seleccionar nos permiten 4 posibilidades: 00, 01, 10 y 11. Esto nos permite, suponiendo que tenemos 4 señales de entrada x0, x1, x2 y x3; que si seleccionamos 00 en la salida saldrá la señal de entrada x0, si ponemos 01 saldrá la señal x1, si ponemos 10 saldrá la señal x2 y si ponemos en selección 11 saldrá la señal de entrada x3 por la única salida que hay.

¿Sencillo verdad? A ver el código..

El código del multiplexor en VHDL

-- Multiplexor de 4 entradas a 1 con 2 señales de selección.
library IEEE;
use IEEE.std_logic_1164.all;

entity mux4to1 is
    port (
        y : out std_logic;
        sel1, sel0, x3, x2, x1, x0 : in std_logic
    );
end entity;

architecture arch of mux4to1 is

    -- Señal auxiliar para hacer más legible la selección.
    signal auxSelVect : std_logic_vector (1 downto 0);

begin

    auxSelVect(1) <= sel1;
    auxSelVect(0) <= sel0;

    -- La selección de entrada a poner en la salida..
    y <= x0 when auxSelVect = "00" else
        x1 when auxSelVect = "01" else
        x2 when auxSelVect = "10" else
        x3 when auxSelVect = "11" else
        'U';

end architecture;

Ahora el banco de pruebas

-- Multiplexor de 4 entradas a 1 con 2 señales de selección.
library IEEE;
use IEEE.std_logic_1164.all;

-- Una entity vacía.
entity mux4to1_tb is
end entity;

architecture arch of mux4to1_tb is

    -- Aquí el componente, el multiplexor en sí.
    component mux4to1 port (
        y : out std_logic;
        sel1, sel0, x3, x2, x1, x0 : in std_logic
    );
    end component;

    -- Señales para conectar con entradas y salidas del componente.
    signal auxSelVect : std_logic_vector (1 downto 0);
    signal auxInVect : std_logic_vector (3 downto 0);
    signal auxOut : std_logic;

begin

    -- Conectando todo con el port map.
    unit_under_test: component mux4to1 port map (
        y => auxOut,
        sel1 => auxSelVect(1),
        sel0 => auxSelVect(0),
        x3 => auxInVect(3),
        x2 => auxInVect(2),
        x1 => auxInVect(1),
        x0 => auxInVect(0)
    );

    generate_signals: process
    begin
        -- Tiene que dar 2 a 0 y 2 a 1 en cada grupo de 4:
        -- 0011 0011 0011 y 0011 en la salida, para ser correcto.
        auxInVect <= "0000"; auxSelVect <= "00"; wait for 10 ns;
        auxInVect <= "1110"; auxSelVect <= "00"; wait for 10 ns;
        auxInVect <= "0001"; auxSelVect <= "00"; wait for 10 ns;
        auxInVect <= "1111"; auxSelVect <= "00"; wait for 10 ns;

        auxInVect <= "0000"; auxSelVect <= "01"; wait for 10 ns;
        auxInVect <= "1101"; auxSelVect <= "01"; wait for 10 ns;
        auxInVect <= "0010"; auxSelVect <= "01"; wait for 10 ns;
        auxInVect <= "1111"; auxSelVect <= "01"; wait for 10 ns;

        auxInVect <= "0000"; auxSelVect <= "10"; wait for 10 ns;
        auxInVect <= "1011"; auxSelVect <= "10"; wait for 10 ns;
        auxInVect <= "0100"; auxSelVect <= "10"; wait for 10 ns;
        auxInVect <= "1111"; auxSelVect <= "10"; wait for 10 ns;

        auxInVect <= "0000"; auxSelVect <= "11"; wait for 10 ns;
        auxInVect <= "0111"; auxSelVect <= "11"; wait for 10 ns;
        auxInVect <= "1000"; auxSelVect <= "11"; wait for 10 ns;
        auxInVect <= "1111"; auxSelVect <= "11"; wait for 10 ns;
        wait;
    end process;

end architecture;

De nuevo, otra vez más, si todo ha ido bien tiene que verse una imagen parecida a la de inicio para ver un comportamiento correcto del multiplexor.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *