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.