Добрый вечер, уже замучился разбираться с магафункцией fft, в quartus и vhdl новичок. Использую quartus 8.0 (нечистоплотный), пробовал запускать свой проект в Quartus 9.1 web-edition, результат аналогичный. Сгенерировал мегафункцию с параметрами 64 точки, 8 бит разрядность, Streaming.
Подаю на вход в родном симуляторе квартуса все необходимые сигналы, с выхода имеются сигналы начала кадра, конца кадра, валидности выходных данных, а сами данные нули. Пробовал и в симуляторе, и в железе (Cyclone III EP3C25F324C6, Cyclone III FPGA Starter Kit). В железе данные брал из встроенной памяти, которую инициализировал заранее подготовленным файлом .mif, выходные данные складывал в эту же память, потом просматривал это дело In System Memory Content Editor, на выходе все равно нули. Предполагаю, что всему виной мой кривой код:
Код
library IEEE;
use IEEE.std_logic_1164.all;
use ieee.numeric_std.all;
entity tmp is
generic
(
N : natural := 63
);
port
(
freq : in std_logic;
xreal : in std_logic_vector (7 downto 0);
ximag : in std_logic_vector (7 downto 0);
sinks : out std_logic;
sinke : out std_logic;
sinkv : out std_logic;
sinkr : out std_logic;
sources : out std_logic;
sourcee : out std_logic;
sourcev : out std_logic;
sourceerr : out std_logic_vector (1 downto 0);
sourceexpp : out STD_LOGIC_VECTOR (5 DOWNTO 0);
yreal : out std_logic_vector (7 downto 0);
yimag : out std_logic_vector (7 downto 0);
sstate : out std_logic_vector (1 downto 0);
scount : out std_logic_vector (31 downto 0)
);
end entity tmp;
architecture rtl of tmp is
component fft
PORT (
clk : IN STD_LOGIC;
reset_n : IN STD_LOGIC;
inverse : IN STD_LOGIC;
sink_valid : IN STD_LOGIC;
sink_sop : IN STD_LOGIC;
sink_eop : IN STD_LOGIC;
sink_real : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
sink_imag : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
sink_error : IN STD_LOGIC_VECTOR (1 DOWNTO 0);
source_ready : IN STD_LOGIC;
sink_ready : OUT STD_LOGIC;
source_error : OUT STD_LOGIC_VECTOR (1 DOWNTO 0);
source_sop : OUT STD_LOGIC;
source_eop : OUT STD_LOGIC;
source_valid : OUT STD_LOGIC;
source_exp : OUT STD_LOGIC_VECTOR (5 DOWNTO 0);
source_real : OUT STD_LOGIC_VECTOR (7 DOWNTO 0);
source_imag : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
);
end component;
type control_state is (init, stop, go, eop);
signal currentstate : control_state := init;
signal sinksop : std_logic; -- строб начала входного кадра
signal sinkeop : std_logic; -- строб конца входного кадра
signal sinkvalid : std_logic; -- сигнал верности входного кадра
signal sinkready : std_logic; -- сигнал готовности приема данных блоком БПФ
signal count : integer range 0 to N := N; -- счетчик
signal sourcesop : std_logic; -- строб начала выходного кадра
signal sourceeop : std_logic; -- строб конца выходного кадра
signal sourcevalid : std_logic; -- сигнал верности выходного кадра
signal sourceerror : std_logic_vector (1 downto 0); -- сигнал ошибки выходного кадра
signal sourceexp : STD_LOGIC_VECTOR (5 DOWNTO 0); --
signal sinkreal, sinkimag, sourcereal, sourceimag : std_logic_vector (7 downto 0);
begin
sinks <= sinksop;
sinke <= sinkeop;
sinkv <= sinkvalid;
sinkr <= sinkready;
scount <= STD_LOGIC_VECTOR(TO_UNSIGNED(count,32));
sources <= sourcesop;
sourcee <= sourceeop;
sourcev <= sourcevalid;
sourceerr <= sourceerror;
sourceexpp <= sourceexp;
sinkreal <= xreal;
sinkimag <= ximag;
yreal <= sourcereal;
yimag <= sourceimag;
process (freq)
begin
if (rising_edge(freq)) then
case (currentstate) is
when init => -- инициализация
sinksop <= '0';
sinkeop <= '0';
sinkvalid <= '0';
count <= 0;
if (sinkready='1') then
currentstate <= go;
else
currentstate <= init;
end if;
sstate <= "01";
when go => -- работа
sinkeop <= '0';
if (count=0) then
sinksop <= '1'; -- если первый отчет, выставляем начало кадра
sinkvalid <= '1'; -- выставляем, что данные на входе верны
else
sinksop <= '0'; -- если уже не первый отчет, снимаем строб начала кадра
sinkvalid <= '1'; -- данные на входе верны
end if;
if (count < N-1) then
currentstate <= go; -- обработаны еще не все отчеты
count <= count + 1;
else
currentstate <= eop; -- обработаны N-1 отчет, переходим к обработке последнего отчета
count <= count + 1;
end if;
sstate <= "10";
when eop => -- последний отсчет
sinksop <= '0'; -- строб начала кадра обнулен
sinkeop <= '1'; -- выставляем строб конца кадра
sinkvalid <= '1'; -- данные на входе верны
count <= 0;
currentstate <= stop; -- останавливаем подачу данных на вход
sstate <= "11";
when stop => -- стоп
-- данные на вход неподаются
-- программа молотит сама по себе, а на выходе должны появиться выходные данные
sinksop <= '0';
sinkvalid <= '0';
sinkeop <= '0';
count <= 0;
currentstate <= stop;
sstate <= "00";
end case;
end if;
end process;
fft_inst : fft PORT MAP
(
clk => freq,
reset_n => '1',
inverse => '0',
sink_valid => sinkvalid,
sink_sop => sinksop,
sink_eop => sinkeop,
sink_real => sinkreal,
sink_imag => sinkimag,
sink_error => "00",
source_ready => '1',
sink_ready => sinkready,
source_error => sourceerror,
source_sop => sourcesop,
source_eop => sourceeop,
source_valid => sourcevalid,
source_exp => sourceexp,
source_real => sourcereal,
source_imag => sourceimag
);
end rtl;
Вот циклограмма:
http://electronix.ru/forum/style_images/1/...e_types/gif.gifПомогите разобраться. Заранее благодарен за любые ответы.