VHDL: uniendo circuitos, un sumador completo de 4 bits

2019-08-08 - Categorías: VHDL
VHDL port map haciendo un sumador completo de 4 bits.

Sigo poniéndome al día en electrónica digital, diseñando circuitos digitales. Así que aquí vuelvo con otro code-kata para hacer un sumador de varios bits. Para este sumador reutilizo un componente previamente hecho, diseñando un sumador completo de 4 bits.

Es decir, en un post anterior escribí un sumador completo simple de 1 bit. Ahora con la instrucción de VHDL llamada port map, podemos enlazar tantos componentes como necesitemos en circuitos más grandes. Usando port map es la forma que tenemos de escalar tanto como queramos, todos los circuitos que queramos en sistemas digitales cada vez más grandes.

Al grano, el código fuente del sumador de 4 bits

Me remito al post anterior donde se defino uno de 1 bit. Ahora haciendo port map unimos 4 circuitos de estos para construir uno de 4 bit. Nos puede quedar tal que así:

library IEEE;
use IEEE.std_logic_1164.all;

entity fourBitsFullAdder is
    port (
        sVect : out std_logic_vector (3 downto 0);
        mainCarryOut : out std_logic;
        aVect : in std_logic_vector (3 downto 0);
        bVect : in std_logic_vector (3 downto 0);
        mainCarryIn : in std_logic
    );
end entity;

architecture arch_fourBitsFullAdder of fourBitsFullAdder is

    component oneBitFullAdder is
        port (
            sum, carryOut : out std_logic;
            a, b, carryIn : in std_logic
        );
    end component;

    signal auxCarry : std_logic_vector (4 downto 0);

begin

    auxCarry(0) <= mainCarryIn;

    bit_s0: oneBitFullAdder port map (
        sum => sVect(0),
        carryOut => auxCarry(1),
        a => aVect(0),
        b => bVect(0),
        carryIn => auxCarry(0)
    );

    bit_s1: oneBitFullAdder port map (
        sum => sVect(1),
        carryOut => auxCarry(2),
        a => aVect(1),
        b => bVect(1),
        carryIn => auxCarry(1)
    );

    bit_s2: oneBitFullAdder port map (
        sum => sVect(2),
        carryOut => auxCarry(3),
        a => aVect(2),
        b => bVect(2),
        carryIn => auxCarry(2)
    );

    bit_s3: oneBitFullAdder port map (
        sum => sVect(3),
        carryOut => auxCarry(4),
        a => aVect(3),
        b => bVect(3),
        carryIn => auxCarry(3)
    );

    mainCarryOut <= auxCarry(4);

end architecture;

El banco de pruebas para simular su funcionamiento

Simplemente va sumando 1 bit en cada prueba, no hace más comprobaciones:

library IEEE;
use IEEE.std_logic_1164.all;

entity fourBitsFullAdder_tb is
end entity;

architecture arch of fourBitsFullAdder_tb is

    component fourBitsFullAdder is
        port (
            sVect : out std_logic_vector (3 downto 0);
            mainCarryOut : out std_logic;
            aVect : in std_logic_vector (3 downto 0);
            bVect : in std_logic_vector (3 downto 0);
            mainCarryIn : in std_logic
        );
    end component;

    signal testFourBitsA, testFourBitsB, testFourBitsSum : std_logic_vector (3 downto 0);
    signal testCarryIn, testCarryOut : std_logic;

begin

    unit_under_test : fourBitsFullAdder port map (
        sVect => testFourBitsSum,
        mainCarryOut => testCarryOut,

        aVect => testFourBitsA,
        bVect => testFourBitsB,
        mainCarryIn => testCarryIn
    );

    generate_signals : process
    begin
        testCarryIn <= '0'; testFourBitsA <= "0000"; testFourBitsB <= "0001"; wait for 10 ns;
        testCarryIn <= '0'; testFourBitsA <= "0001"; testFourBitsB <= "0001"; wait for 10 ns;
        testCarryIn <= '0'; testFourBitsA <= "0010"; testFourBitsB <= "0001"; wait for 10 ns;
        testCarryIn <= '0'; testFourBitsA <= "0011"; testFourBitsB <= "0001"; wait for 10 ns;
        testCarryIn <= '0'; testFourBitsA <= "0100"; testFourBitsB <= "0001"; wait for 10 ns;
        testCarryIn <= '0'; testFourBitsA <= "0101"; testFourBitsB <= "0001"; wait for 10 ns;
        testCarryIn <= '0'; testFourBitsA <= "0110"; testFourBitsB <= "0001"; wait for 10 ns;
        testCarryIn <= '0'; testFourBitsA <= "0111"; testFourBitsB <= "0001"; wait for 10 ns;
        testCarryIn <= '0'; testFourBitsA <= "1000"; testFourBitsB <= "0001"; wait for 10 ns;
        testCarryIn <= '0'; testFourBitsA <= "1001"; testFourBitsB <= "0001"; wait for 10 ns;
        testCarryIn <= '0'; testFourBitsA <= "1010"; testFourBitsB <= "0001"; wait for 10 ns;
        testCarryIn <= '0'; testFourBitsA <= "1011"; testFourBitsB <= "0001"; wait for 10 ns;
        testCarryIn <= '0'; testFourBitsA <= "1100"; testFourBitsB <= "0001"; wait for 10 ns;
        testCarryIn <= '0'; testFourBitsA <= "1101"; testFourBitsB <= "0001"; wait for 10 ns;
        testCarryIn <= '0'; testFourBitsA <= "1110"; testFourBitsB <= "0001"; wait for 10 ns;
        testCarryIn <= '0'; testFourBitsA <= "1111"; testFourBitsB <= "0001"; wait for 10 ns;
        wait;
    end process;

end architecture;

Si todo va bien, en la simulación se tiene que ver una gráfica como la de la imagen del principio.

2 respuestas a “VHDL: uniendo circuitos, un sumador completo de 4 bits”

  1. Carlos Monroy dice:

    A que se debera este error » wait statement without UNTIL clause not supported for synthesis» porque me aparece y es el unico error para Syntetizar-XST

    • Jnj dice:

      Hola Carlos.

      Hay sentencias de programación VHDL que no son sintetizables, es decir, que no todo lo que se programe en VHDL luego se podrá sintetizar en un circuito.

      En los testbench da igual porque son pruebas para visualizar que los circuitos que diseñamos probablemente van a funcionar. Entonces los wait statement de los testbench da igual porque no se van a sintetizar. Si no es un testbench entonces no hay otra solución que modificar el código para no usar sentencias wait sin until.

Responder a Jnj Cancelar la respuesta

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

 

© 2024 JnjSite.com - MIT license

Sitio hecho con WordPress, diseño y programación del tema por Jnj.