¿Cómo sabe una arquitectura estructural qué entidad usar?

3

Así que estoy siguiendo este tutorial en el que explican algunos VHDL básicos mediante el uso de un sumador de cuatro bits como ejemplo:

-- Example of a four bit adder
library  ieee;
use  ieee.std_logic_1164.all;

-- definition of a full adder
entity FULLADDER is
     port (a, b, c: in std_logic;
           sum, carry: out std_logic);
     end FULLADDER;
architecture fulladder_behav of FULLADDER is
begin
sum <= (a xor b) xor c ;
carry <= (a and b) or (c and (a xor b));
     end fulladder_behav;
     -- 4-bit adder

library  ieee;
use  ieee.std_logic_1164.all;
entity FOURBITADD is
     port (a, b: in std_logic_vector(3 downto 0);
           Cin : in std_logic;
                sum: out std_logic_vector (3 downto 0);
                Cout, V: out std_logic);
     end FOURBITADD;
architecture fouradder_structure of FOURBITADD is
     signal c: std_logic_vector (4 downto 0);
component FULLADDER
           port(a, b, c: in std_logic;
sum, carry: out std_logic);
           end component;
begin
           FA0: FULLADDER
                port map (a(0), b(0), Cin, sum(0), c(1));
           FA1: FULLADDER
                port map (a(1), b(1), C(1), sum(1), c(2));
           FA2: FULLADDER
                port map (a(2), b(2), C(2), sum(2), c(3));
           FA3: FULLADDER
                port map (a(3), b(3), C(3), sum(3), c(4));
           V <= c(3) xor c(4);
           Cout <= c(4);
end fouradder_structure;

Estoy tratando de entender por qué la parte component en fouradder_structure tiene que redefinir los puertos utilizados en la entidad FULLADDER; ambos contienen las siguientes partes:

port(a, b, c: in std_logic;
sum, carry: out std_logic);

Luego leí en alguna parte que component define la interfaz que el fouradder_structure está esperando. Eso explicaría por qué tanto entity como component necesitan declarar los puertos usados, pero ¿cómo sabe fouradder_structure para usar la entidad FULLADDER que se definió anteriormente? ¿Es una convención de nomenclatura?

TL; DR , ¿cómo conoce la arquitectura fouradder_structure que tiene que usar la entidad FULLADDER ?

    
pregunta user1534664

2 respuestas

7

Si no especifica qué arquitectura utilizará la creación de instancias de una entidad, utiliza la arquitectura compilada más recientemente para esa entidad.

Personalmente usaría la instanciación directa de entidades. Para usar esto, elimine la declaración del componente ( component FULLADDER ... ), e instálela así:

FA0: entity work.FULLADDER(fulladder_behav)
port map ( ...

De esta manera, puede ver fácilmente qué arquitectura se está utilizando y se ahorra tener que mantener una declaración de componente y la creación de instancias.

Si no quieres hacer esto por alguna razón, observa el uso de configuration s.

    
respondido por el scary_jeff
1

Puede controlar qué entidad (y cuál de sus arquitecturas) está vinculada a un componente específico (siempre que tengan interfaces compatibles, es decir, listas de puertos y genéricas) utilizando una declaración configuration . Esto puede ser parte de la arquitectura (una configuración integrada) o una unidad compilada por separado, por ejemplo. en un archivo separado.

Si no te preocupas por las configuraciones, obtendrás la configuración predeterminada. O puede omitir tanto los componentes como las configuraciones con la instanciación directa de la entidad; ambos enfoques se describen en la respuesta de Jeff. (La creación de instancias de entidad directa es más simple y, a menudo, parece ser el enfoque preferido en la actualidad).

    
respondido por el Brian Drummond

Lea otras preguntas en las etiquetas