error con VHDL CODE FOR FFT

-2

Tengo un código VHDL para implementar FFT usando mariposa. Sus 4 entradas y 8 salidas. Hay 2 archivos VHDL, uno para el paquete fft y el otro para la arquitectura, dentro del pachage fft, la mariposa se define mediante el procedimiento. Si compilo tanto el paquete fft como la arquitectura no muestran errores. Estoy intentando cambiar el procedimiento para que funcione dentro del código del paquete fft, pero cuando lo cambio para que funcione y compile el código del paquete fft, no muestra errores. Sin embargo, si compilo el archivo de arquitectura nuevamente, ¡muestra errores cerca de la mariposa! ¿Hay algún problema con mi transformación de un procedimiento a otro?

El código que funciona con el procedimiento es el siguiente: (código de paquete fft)

 library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;


package fft_package is
TYPE complex IS ARRAY(0 TO 1) OF INTEGER;
CONSTANT w0 : complex := (1, 0);  --Pre-computed constants
CONSTANT w1 : complex := (0, -1); --Pre-computed constants

PROCEDURE butterfly (
                     X1 : in complex;
                     X2 : in complex;
                     W  : in complex;
                     Y1 : out complex;
                     Y2 : out complex
                     );
END fft_package;

package body fft_package is

PROCEDURE butterfly (X1 : in complex;
                     X2 : in complex;
                     W : in complex;
                     Y1 : out complex;
                     Y2 : out complex) IS

BEGIN
-- G1 = X1 + W*X2
Y1(0) := X1(0) + ((W(0)*X2(0)) - W(1)*X2(1)); -- G1 real
Y1(1) := X1(1) + ((W(0)*X2(1)) + W(1)*X2(0)); -- G1 imaginary
-- G2 = X1 - W*X2
Y2(0) := X1(0) - ((W(0)*X2(0)) - W(1)*X2(1)); -- G2 real
Y2(1) := X1(1) - ((W(0)*X2(1)) + W(1)*X2(0)); -- G2 imaginary

END butterfly;
end fft_package;

(architecture code)
entity fft_block is
Port ( X1 : in STD_LOGIC_VECTOR (7 downto 0);
       X2 : in STD_LOGIC_VECTOR (7 downto 0);
       X3 : in STD_LOGIC_VECTOR (7 downto 0);
       X4 : in STD_LOGIC_VECTOR (7 downto 0);
       CLOCK : in STD_LOGIC;
       aY1_R, aY1_I : out STD_LOGIC_VECTOR (7 downto 0);
       aY2_R, aY2_I : out STD_LOGIC_VECTOR (7 downto 0);
       aY3_R, aY3_I : out STD_LOGIC_VECTOR (7 downto 0);
       aY4_R, aY4_I : out STD_LOGIC_VECTOR (7 downto 0));
end fft_block;

architecture Behavioral of fft_block is
begin

process (CLOCK)
VARIABLE g0_1, g0_2, g0_3, g0_4 : complex;
VARIABLE g1_1, g1_2, g1_3, g1_4 : complex;
VARIABLE g2_1, g2_2, g2_3, g2_4 : complex;

begin

if CLOCK='1' and CLOCK'event then
g0_1(0) := CONV_INTEGER(X1);
g0_1(1) := 0;
g0_2(0) := CONV_INTEGER(X3);
g0_2(1) := 0;
g0_3(0) := CONV_INTEGER(X2);
g0_3(1) := 0;
g0_4(0) := CONV_INTEGER(X4);
g0_4(1) := 0;

--G1
butterfly(g0_1, g0_2, w0, g1_1, g1_2);
butterfly(g0_3, g0_4, w0, g1_3, g1_4);

--G2
butterfly(g1_1, g1_3, w0, g2_1, g2_3);
butterfly(g1_2, g1_4, w1, g2_2, g2_4);
end if;

-- Outputs
aY1_R <= std_logic_vector(to_signed(g2_1(0),aY1_R'length));
aY1_I <= std_logic_vector(to_signed(g2_1(1),aY1_R'length));
aY2_R <= std_logic_vector(to_signed(g2_2(0),aY1_R'length));
aY2_I <= std_logic_vector(to_signed(g2_2(1),aY1_R'length));
aY3_R <= std_logic_vector(to_signed(g2_3(0),aY1_R'length));
aY3_I <= std_logic_vector(to_signed(g2_3(1),aY1_R'length));
aY4_R <= std_logic_vector(to_signed(g2_4(0),aY1_R'length));
aY4_I <= std_logic_vector(to_signed(g2_4(1),aY1_R'length));
end process;
end Behavioral;

el código anterior funciona bien, pero cuando cambio el procedimiento y utilizo la función dentro del paquete, aparece el error Aquí está mi código para el paquete fft usando la función:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;


package fft_package is
TYPE complex IS ARRAY(0 TO 1) OF INTEGER;
CONSTANT w0 : complex := (1, 0);  --Pre-computed constants
CONSTANT w1 : complex := (0, -1); --Pre-computed constants

   function butterfly(X1, X2 , W : complex )return complex;


END fft_package;

package body fft_package is

function butterfly ( X1, X2 , W : complex )return complex is
  VARIABLE Y1, Y2  : complex;

BEGIN
-- G1 = X1 + W*X2
G1:Y1(0) := X1(0) + ((W(0)*X2(0)) - W(1)*X2(1)); -- G1 real
Y1(1) := X1(1) + ((W(0)*X2(1)) + W(1)*X2(0)); -- G1 imaginary

-- G2 = X1 - W*X2
Y2(0) := X1(0) - ((W(0)*X2(0)) - W(1)*X2(1)); -- G2 real
Y2(1) := X1(1) - ((W(0)*X2(1)) + W(1)*X2(0)); -- G2 imaginary
 return Y1;
 return Y2;
END butterfly;
end fft_package;

¿Alguien sabe por qué recibo errores cuando compilo el archivo de arquitectura después de cambiar el procedimiento para que funcione dentro del paquete fft?

¡Tengo los mismos cuatro errores y todos están cerca de mariposa! ¿Por qué?

Como se menciona en los comentarios a continuación [la respuesta de Martin]

No obtuve errores con el código anterior al compilarlo. Pero, el banco de pruebas no se crea como mencioné en los comentarios.

    
pregunta mahmoudlinkin

1 respuesta

1

Parece que su herramienta de síntesis / simulación no vuelve a compilar automáticamente todos los archivos VHDL dependientes después de que haya recompilado manualmente el paquete VHDL modificado. Por lo tanto, los errores se informan solo después de que haya recompilado manualmente el "archivo de arquitectura".

No nos ha mostrado el mensaje de error concreto, pero simplemente no puede reemplazar un procedure por un function . Un procedimiento puede tener varios parámetros de salida (palabra clave out ) y la llamada al procedimiento constituye (en conjunto) una declaración concurrente o secuencial como en su ejemplo:

butterfly(g0_1, g0_2, w0, g1_1, g1_2); -- sequential statement in your example

Una función solo puede tener parámetros de entrada y el valor de retorno es la única "salida". La llamada a la función puede ser parte de una expresión. Por ejemplo, puede asignar el resultado de la función a una variable:

g1_1 := butterfly_y1(g0_1, g0_2, w0); -- function which calculates Y1
g1_2 := butterfly_y2(g0_1, g0_2, w0); -- function which calculates Y2

He dividido su procedimiento aquí en dos funciones, una que calcula la parte Y1 y otra para Y2 . Otra opción sería utilizar un registro de señales para el resultado de la función como lo señaló Brian.

EDIT funciones de mariposa divididas:

function butterfly_y1 ( X1, X2 , W : complex )return complex is
  VARIABLE Y1 : complex;
BEGIN
  -- G1 = X1 + W*X2
  Y1(0) := X1(0) + ((W(0)*X2(0)) - W(1)*X2(1)); -- G1 real
  Y1(1) := X1(1) + ((W(0)*X2(1)) + W(1)*X2(0)); -- G1 imaginary
  return Y1;
END butterfly_y1;

function butterfly_y2 ( X1, X2 , W : complex )return complex is
  VARIABLE Y2 : complex;
BEGIN
  -- G2 = X1 - W*X2
  Y2(0) := X1(0) - ((W(0)*X2(0)) - W(1)*X2(1)); -- G2 real
  Y2(1) := X1(1) - ((W(0)*X2(1)) + W(1)*X2(0)); -- G2 imaginary
  return Y2;
END butterfly_y2;
    
respondido por el Martin Zabel

Lea otras preguntas en las etiquetas