Componente no encontrado VHDL XILINX ISE

1

Sé que esta podría ser una pregunta muy simple. Tengo que simular algunos retrasos para varios agregadores en ISE Suite. (Estoy un poco familiarizado con los conceptos de vhdl pero ISE Environment, en absoluto!)

este es el vhdl Code for Carry select adder:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
use work.all ; 

library UNISIM;
use UNISIM.VComponents.all;

entity csa is
  generic (
    WIDTH : natural := 32 -- adder will add WIDTH bits, should be a power of 2
  );
-- some port mappings .. 
end csa;

architecture csa_arch of csa is

  component csa is
    generic (
      WIDTH : natural
    );
    port (
      op_1  : in std_logic_vector(WIDTH-1 downto 0);
      op_2  : in std_logic_vector(WIDTH-1 downto 0);
      c_in  : in std_logic;
      sum   : out std_logic_vector(WIDTH-1 downto 0);
      c_out : out std_logic
    );
  end component;

  signal sum_loc_0   : std_logic_vector(WIDTH-1 downto 0);
  signal sum_loc_1   : std_logic_vector(WIDTH-1 downto 0);
  signal c_out_loc_0 : std_logic_vector(1 downto 0);
  signal c_out_loc_1 : std_logic_vector(1 downto 0);
begin

  base_case : if (WIDTH = 1) generate
   full_adder_0 : full_adder -- GENERATES ERROR -- 
      port map (
        op_1  => op_1(0),
        op_2  => op_2(0),
        c_in  => '0',
        sum   => sum_loc_0(0),
        c_out => c_out_loc_0(1)
      );
  end generate;

y la línea que crea un componente de la entidad sumadora completa aumenta el error:

Line 44: full_adder is not a component

el sumador completo se define en un archivo seprate: (en el mismo proyecto que otro módulo vhdl)

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
library work ;

library UNISIM;
use UNISIM.VComponents.all;

entity full_adder is
port (
    op_1  : in std_logic;
    op_2  : in std_logic;
    c_in  : in std_logic;
    sum   : out std_logic;
    c_out : out std_logic
);
end full_adder;

architecture full_adder_arch of full_adder is

begin

    sum   <= op_1 xor op_2 xor c_in;
    c_out <= (op_1 and c_in) or (op_2 and c_in) or (op_1 and op_2);

end full_adder_arch;
    
pregunta KianP

2 respuestas

1

Hay tres formas de crear una instancia de los componentes en VHDL, mediante el uso de la instanciación directa de la entidad, la creación de una instancia de un componente declarado y la creación de una configuración de una entidad.

Los primeros dos de estos se muestran a continuación:

library ieee;
use ieee.std_logic_1164.all;
-- use IEEE.NUMERIC_STD.ALL;
-- library work ;
--
-- library UNISIM;
-- use UNISIM.VComponents.all;

entity full_adder is
    port (
        op_1:   in  std_logic;
        op_2:   in  std_logic;
        c_in:   in  std_logic;
        sum:    out std_logic;
        c_out:  out std_logic
    );
end full_adder;

architecture full_adder_arch of full_adder is

begin

    sum   <= op_1 xor op_2 xor c_in;
    c_out <= (op_1 and c_in) or (op_2 and c_in) or (op_1 and op_2);

end full_adder_arch;

library ieee;
use ieee.std_logic_1164.all;
-- use IEEE.NUMERIC_STD.ALL;
-- use work.all ; 

-- library UNISIM;
-- use UNISIM.VComponents.all;

entity csa is
    generic (
        WIDTH:  natural := 32 -- adder will add WIDTH bits, should be a power of 2
    );
    port (
        op_1:   in  std_logic_vector(WIDTH-1 downto 0);
        op_2:   in  std_logic_vector(WIDTH-1 downto 0);
        c_in:   in  std_logic;
        sum:    out std_logic_vector(WIDTH-1 downto 0);
        c_out:  out std_logic
    );
end entity csa;

architecture component_instantiation of csa is

    -- component csa is
    --     generic (
    --         WIDTH:  natural
    --     );
    --     port (
    --         op_1:   in  std_logic_vector(WIDTH-1 downto 0);
    --         op_2:   in  std_logic_vector(WIDTH-1 downto 0);
    --         c_in:   in  std_logic;
    --         sum:    out std_logic_vector(WIDTH-1 downto 0);
    --         c_out:  out std_logic
    --     );
    -- end component;

    component full_adder is
        port (
        op_1:   in  std_logic;
        op_2:   in  std_logic;
        c_in:   in  std_logic;
        sum:    out std_logic;
        c_out:  out std_logic
        );
    end component;

    signal sum_loc_0:    std_logic_vector(WIDTH-1 downto 0);
    signal sum_loc_1:    std_logic_vector(WIDTH-1 downto 0);
    signal c_out_loc_0:  std_logic_vector(1 downto 0);
    signal c_out_loc_1:  std_logic_vector(1 downto 0);
begin

base_case: 
    if (WIDTH = 1) generate
full_adder_0: 
        full_adder -- GENERATES ERROR -- 
            port map (
                op_1  => op_1(0),
                op_2  => op_2(0),
                c_in  => '0',
                sum   => sum_loc_0(0),
                c_out => c_out_loc_0(1)
            );
    end generate;
end architecture;

architecture direct_entity_instantiation of csa is

    -- component csa is
    --     generic (
    --         WIDTH:  natural
    --     );
    --     port (
    --         op_1:   in  std_logic_vector(WIDTH-1 downto 0);
    --         op_2:   in  std_logic_vector(WIDTH-1 downto 0);
    --         c_in:   in  std_logic;
    --         sum:    out std_logic_vector(WIDTH-1 downto 0);
    --         c_out:  out std_logic
    --     );
    -- end component;   

    signal sum_loc_0:    std_logic_vector(WIDTH-1 downto 0);
    signal sum_loc_1:    std_logic_vector(WIDTH-1 downto 0);
    signal c_out_loc_0:  std_logic_vector(1 downto 0);
    signal c_out_loc_1:  std_logic_vector(1 downto 0);
begin

base_case: 
    if (WIDTH = 1) generate
full_adder_0: 
        entity work.full_adder -- GENERATES ERROR -- 
            port map (
                op_1  => op_1(0),
                op_2  => op_2(0),
                c_in  => '0',
                sum   => sum_loc_0(0),
                c_out => c_out_loc_0(1)
            );
    end generate;
end architecture;

La entidad y la arquitectura para full_adder se incluyen para la segunda arquitectura csa ( direct_entity_instantiation ).

Tenga en cuenta que hay una declaración de biblioteca implícita para el nombre simple de biblioteca work en VHDL. Una cláusula de uso que especifique use work.all; haría que todas las declaraciones para unidades primarias en la biblioteca de trabajo actual estén disponibles. La arquitectura direct_entity_instantiation podría haber aprovechado eso y no haber usado un nombre seleccionado para especificar full_adder en la declaración de generación.

Analicé ambas arquitecturas y verifiqué que funcionan con el genérico WIDTH establecido en 1 . La elaboración y ejecución nos dicen que no hay problemas de conectividad para el ancho 1.

Una creación de instancias de componente con una declaración de componente no requiere el full_adder para analizar, pero requiere que se analice antes de csa para su elaboración.

Del mismo modo, la creación de instancias de entidad directa requiere que se encuentre full_adder en la biblioteca de trabajo para analizar csa con éxito.

Consulte IEEE Std 1076-2008 11.7 Sentencias de creación de componentes.

    
respondido por el user8352
2

1) Está declarando el componente csa dentro de la arquitectura de csa , que es a) ilegal, b) innecesario.

2) Debes declarar el componente full_adder dentro del encabezado de la arquitectura para instanciarlo.

    
respondido por el Eugene Sh.

Lea otras preguntas en las etiquetas