Hoy os traemos un video sobre el uso de los bucles for generate en VHDL. Los bucles generate se utilizan para instanciar un número de componentes utilizando una estructura regular. Son realmente útiles para declarar matrices de componentes como el caso que os traemos.

En el ejemplo del video veremos un sumador de n bits creado a partir de sumadores de 1 bit y un bucle que los instancia y conecta. Aparte de ver el código, lo simularemos utilizando el simulador incluido en Vivado y haremos la síntesis del circuito para comprobar que efectivamente se crea la estructura que habíamos diseñado.

Este tipo de diseños se pueden utilizar tanto en FPGA de Altera, Intel o en Xilinx, es una construcción estandar del lenguaje VHDL.

Si tenéis alguna duda, los comentarios están abiertos para lo que necesitéis.

Un saludo!

library ieee;
use ieee.std_logic_1164.all;
entity add_1 is
  port (a, b, c_in: in std_logic; 
        c_mas, s: out std_logic);
end add_1;

architecture funcional of add_1 is
begin
  s <= ((not a) and (not b) and c_in) or ((not a) and b and (not c_in)) or (a and b and c_in) or (a and (not b) and (not c_in));
  c_mas <= (a and b) or (a and c_in) or (b and c_in) ; 
end funcional;

library ieee;
use ieee.std_logic_1164.all; 
use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all;

entity add_n is
  generic(n: integer:=16);
  port (a, b: in std_logic_vector(n-1 downto 0);
        c_in: in std_logic;
        s: out std_logic_vector(n-1 downto 0); 
        c_out: out std_logic);
end add_n;

architecture circuito of add_n is
  signal c: std_logic_vector(n downto 0);
begin
  c(0) <= c_in;
  sumador: for i in 0 to n-1 generate
    puertas: entity work.add_1 port map (a(i), b(i), c(i), c(i+1), s(i)); 
  end generate;
  c_out <= c(n);
end circuito;

library ieee;
use ieee.std_logic_1164.all; 
use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all;

entity test_add_n is 
end test_add_n;

architecture test of test_add_n is
  constant ancho_add: integer := 8;
  signal a, b, s: std_logic_vector(ancho_add-1 downto 0); 
  signal c_in, c_out: std_logic;
begin
  sumador: entity work.add_n(circuito) generic map(ancho_add) port map (a, b, c_in, s, c_out);
   c_in <= '0', '1' after 25 ns, '0' after 125 ns, '1' after 225 ns;
  a <= conv_std_logic_vector(15, ancho_add), conv_std_logic_vector(78, ancho_add) after 100 ns, conv_std_logic_vector(178, ancho_add) after 200 ns;
  b <= conv_std_logic_vector(21, ancho_add), conv_std_logic_vector(78, ancho_add) after 50 ns, conv_std_logic_vector(17, ancho_add) after 100 ns, conv_std_logic_vector(98, ancho_add) after 150 ns;
end test;