Возникла следующая проблема, над которой ”бьюсь” продолжительное время. Некорректно работает fft, реализованное на IP-ядре (ISE 10.1, fft 5.0). Для проверки подаю sin определенной частоты с генератора, пропускаю через DDC и затем I и Q ветви подаю на выход и на fft. В SystemView накладываю на сигнал DONE выход fft (с ядра). А также средствами SystemView строю fft используя I и Q ветви после DDC и тоже накладываю на DONE. Результаты следующие: fft сделанное средствами SystemView корректно реагирует на изменение частоты – ”палка” движется в нужном направлении, адекватно отображает изменение частоты. В случае fft на ядре этого не происходит. ”Палка” движется неправильно, иногда появляются боковые лепестки. Прилагаю код и скриншоты настройки ядра.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity obrabotka is
port(
clk : in std_logic; --5 МГц
data_I : in std_logic_vector(15 downto 0);
data_Q : in std_logic_vector(15 downto 0);
done : out std_logic;
data_out : out std_logic_vector(31 downto 0));
end obrabotka;
architecture Behavioral of obrabotka is
component fft is -- настройка IP-ядра в приложении
port (
fwd_inv_we : in STD_LOGIC := 'X';
rfd : out STD_LOGIC;
start : in STD_LOGIC := 'X';
fwd_inv : in STD_LOGIC := 'X';
dv : out STD_LOGIC;
done : out STD_LOGIC;
clk : in STD_LOGIC := 'X';
busy : out STD_LOGIC;
edone : out STD_LOGIC;
xn_re : in STD_LOGIC_VECTOR ( 15 downto 0 );
xk_im : out STD_LOGIC_VECTOR ( 26 downto 0 );
xn_index : out STD_LOGIC_VECTOR ( 9 downto 0 );
xk_re : out STD_LOGIC_VECTOR ( 26 downto 0 );
xn_im : in STD_LOGIC_VECTOR ( 15 downto 0 );
xk_index : out STD_LOGIC_VECTOR ( 9 downto 0 )
);
end component;
signal I_out,Q_out: std_logic_vector( 26 downto 0 );
signal flag_fft:std_logic:='0';
signal xn_index,xk_index: std_logic_vector( 9 downto 0 );
signal Data_fft_i: std_logic_vector( 15 downto 0 );
signal Data_fft_Q: std_logic_vector( 15 downto 0 );
begin
data_out<= I_out(26 downto 11)&Q_out(26 downto 11);
process(clk)-- процес инициализации работы fft с 3-го бита xn_index
begin
if( rising_edge( clk ) ) then
if xn_index="0000001" then flag_fft<='1';end if;
if flag_fft='1' then
Data_fft_i<=data_I;
Data_fft_q<=data_Q;
end if;
end if;
end process;
x_fft: fft
port map(
fwd_inv_we =>'1',
rfd =>open,
start =>'1',
fwd_inv =>'1',
dv =>open,
done =>done,
clk =>clk,
busy =>open,
edone =>open,
xn_re =>Data_fft_i,
xk_im =>I_out,
xn_index =>xn_index,
xk_re =>Q_out,
xn_im =>Data_fft_q,
xk_index =>xk_index);
end Behavioral;