FIFO en VHDL: ERROR: HDLParsers: 3324

0

Estoy programando un Spartan 3AN utilizando ISE y me gustaría implementar un código simple que use un Fifo:

Cuando presiono un botón, se envían datos al FIFO y cuando presiono otro botón, se lee el fifo y los datos se envían a los LED ...

Desafortunadamente, tengo un error que ocurre:

  

ERROR: HDLParsers: 3324 - "D: /.../ TOP_MODULE.vhd" Línea 129. Modo IN   El dout formal de Led_out sin valor predeterminado debe estar asociado con   un valor real.

Y no sé cómo cambiarlo ... Aquí está mi módulo superior y el componente Led_out:

MÓDULO SUPERIOR:

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

entity TOP_MODULE is
port (
        M_CLK : IN STD_LOGIC;
        BUTTON_T15 : IN STD_LOGIC;
        BUTTON_T16 : IN STD_LOGIC;
        LEDS : OUT STD_LOGIC_VECTOR (7 downto 0)
        );
end TOP_MODULE;

architecture Behavioral of TOP_MODULE is

component Data_generator is
PORT (
        M_CLK : IN STD_LOGIC;
        BUTTON_T15 : IN STD_LOGIC;
        wr_en : OUT STD_LOGIC;
        full : IN STD_LOGIC;
        DATA : OUT STD_LOGIC_VECTOR (17 DOWNTO 0)
        );
end component;

component fifo_generator_v9_3 is
PORT (
        M_CLK : IN STD_LOGIC;
        rst : IN STD_LOGIC;
        din : IN STD_LOGIC_VECTOR(17 DOWNTO 0);
        wr_en : IN STD_LOGIC;
        rd_en : IN STD_LOGIC;
        dout : OUT STD_LOGIC_VECTOR(17 DOWNTO 0);
        full : OUT STD_LOGIC;
        empty : OUT STD_LOGIC
        );
end component;
signal RESET, WRITE_EN, READ_EN, FIFO_FULL, FIFO_EMPTY : STD_LOGIC;
signal DATA_IN, DATA_OUT : STD_LOGIC_VECTOR(17 downto 0)";

component Led_out is
PORT (
        M_CLK : IN STD_LOGIC;
        BUTTON_T16 : IN STD_LOGIC;
        rd_en : OUT STD_LOGIC;
        LEDS : out STD_LOGIC_VECTOR (7 downto 0);
        dout : IN STD_LOGIC_VECTOR(17 DOWNTO 0)
        );
end component;

begin

U100:Data_generator
port map(
            M_CLK,
            BUTTON_T15,
            WRITE_EN,
            FIFO_FULL,
            DATA_IN
            );

U101:fifo_generator_v9_3
port map (
            M_CLK,
            RESET,
            DATA_IN,
            WRITE_EN,
            READ_EN,
            DATA_OUT,
            FIFO_FULL,
            FIFO_EMPTY
            );

U102:Led_out
port map (
            M_CLK,
            BUTTON_T16,
            READ_EN,
            DATA_OUT
            );
end Behavioral;

COMPONENTE LED_OUT:

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

entity Led_out is
Port (M_CLK : in  STD_LOGIC;
        BUTTON_T16 : IN STD_LOGIC;
      rd_en : out  STD_LOGIC;
        LEDS : out STD_LOGIC_VECTOR (7 downto 0);
      dout : in  STD_LOGIC_VECTOR (17 downto 0)
        );
end Led_out;

architecture Behavioral of Led_out is
signal cnt : integer range 0 to 1:=0;

begin
process (M_CLK)
begin
if rising_edge (BUTTON_T16) then
    rd_en <='1';
    cnt <=1;
    if cnt =1 then
        LEDS <=dout (17 downto 10);
    end if;
else
rd_en <='0';
end if;
end process;
end Behavioral;

Mi pregunta es: ¿Puede alguien explicar de dónde proviene este error y cómo cambiarlo?

Este es mi primer uso de FIFO en VHDL ...

Gracias de antemano!

    
pregunta Cabs

1 respuesta

2

Porque preguntaste de dónde viene el error.

Ver IEEE Std 1076-2008, 6.5.6.3 Cláusulas de puertos, para 9:

  

Si un puerto formal está asociado con un puerto, una señal o una expresión reales, se dice que el puerto formal está conectado . Si, en cambio, un puerto formal está asociado con la palabra reservada abierta , se dice que el formal está desconectado . Es un error si un puerto de modo en está desconectado (vea 6.5.6.3) o no está asociado (vea 6.5.7.3) a menos que su declaración incluya una expresión predeterminada (vea 6.5.2). Es un error si un puerto de cualquier modo que no sea in está desconectado o no está asociado y su tipo es un tipo compuesto sin restricciones o parcialmente restringido. Es un error si algunos de los subelementos de un puerto formal compuesto están conectados y otros están desconectados o no asociados.

Este es un problema con la lista de asociación (el mapa del puerto) en la creación de instancias de componente para Led_out:

U102:Led_out
port map (
            M_CLK,
            BUTTON_T16,
            READ_EN,
            DATA_OUT
            );

En 6.5.7 Listas de asociaciones, 6.5.7.1 para 2 vemos que la parte formal de una asociación es opcional:

association_list ::=
    association_element { , association_element }

association_element ::=
   [ formal_part => ] actual_part

Para 4:

  

Se dice que un elemento de asociación se nombra si el designador formal aparece explícitamente; de lo contrario, se dice que es posicional. Para una asociación posicional, un designador real en una posición determinada en una lista de asociaciones corresponde al elemento de interfaz en la misma posición en la lista de interfaces.

Por lo tanto, está utilizando una asociación posicional y la designación real se encuentra en la lista de la asociación (el mapa del puerto).

Sin embargo, su declaración de componente:

component Led_out is
PORT (
        M_CLK : IN STD_LOGIC;
        BUTTON_T16 : IN STD_LOGIC;
        rd_en : OUT STD_LOGIC;
        LEDS : out STD_LOGIC_VECTOR (7 downto 0);
        dout : IN STD_LOGIC_VECTOR(17 DOWNTO 0)
        );
end component;

no tiene el mismo número de formales que los datos reales que usted asocia por posición en el mapa de puertos, el mapa de puertos tiene uno menos, lo que significa que el último ( dout ) es no asociado según al párrafo 4 de 6.5.7.1 ordenamiento posicional.

El último puerto de la cláusula del puerto es el modo en y viola la regla del párrafo 9 de 6.5.6.3, un error que puede detectarse en el momento de la elaboración.

  1. Elaboración y ejecución de un modelo, 14.3 Elaboración de un bloque, paquete o encabezado de subprograma, 14.3 Elaboración de una cláusula de puerto, párrafo 4 (en parte):
  

Si un puerto dado es un puerto de modo en cuya declaración incluye una expresión predeterminada, y si ningún elemento de asociación asocia una señal o expresión con ese puerto, se evalúa la expresión predeterminada y el valor efectivo y de activación del puerto es establecer en el valor de la expresión por defecto. ...

Entonces, si hubiera una expresión predeterminada en la declaración del puerto, el no asociado formal del puerto no tendría un error.

Consulte 6.5.2 Declaraciones de objetos de interfaz, párrafo 6 (en parte):

  

Si una declaración de interfaz contiene un símbolo “: =” seguido de una expresión, se dice que la expresión es la expresión predeterminada del objeto de la interfaz. ...

(Y hay varias reglas para las expresiones predeterminadas).

Recibes un error causado por no tener LEDS cuyo id declarado como puerto de salida de modo en TOP_MODULE en la lista de asociaciones (el mapa del puerto) donde se crea una instancia de Led_out.

Y como Brian comenta, estas cosas se vuelven evidentes cuando se usa una asociación nombrada.

    
respondido por el user8352

Lea otras preguntas en las etiquetas