реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Тестбенч FFT в Quartus8, Как запустить тестбенч fft в Q8?
Acvarif
сообщение Jan 15 2010, 14:02
Сообщение #16


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Цитата(Acvarif @ Jan 15 2010, 16:42) *
Модель Сим загрузил необходимые библиотеки, что-то откомпилировал и сейчас крутится...Жду результат...


Не получается. Вот что происходит в Q8

Info: Running Quartus II EDA Netlist Writer
Info: Command: quartus_eda --read_settings_files=off --write_settings_files=off fft -c fft
Info: Generated files "fft.vho" and "fft_vhd.sdo" in directory "D:/Altera/Quartus80/quartus/test/" for EDA simulation tool
Info: Quartus II EDA Netlist Writer was successful. 0 errors, 0 warnings
Info: Running Quartus II Shell
Info: Command: quartus_sh -t d:/altera/quartus80/quartus/common/tcl/internal/nativelink/qnativesim.tcl fft fft
Info: Quartus(args): fft fft
Info: Start Nativelink Simulation process
Info: Starting NativeLink simulation with ModelSim-Altera software
Info: Generated ModelSim script file D:/Altera/Quartus80/quartus/test/fft_run_msim_gate_vhdl.do

На этом все застряло.

Посмотел, что Модель Сим создал файл (в другой директории) D:\Altera\Quartus80\quartus\test\simulation\modelsim\fft_run_msim_gate_vhdl.do

Его содержимое:

transcript on
if {[file exists gate_work]} {
vdel -lib gate_work -all
}
vlib gate_work
vmap work gate_work

vcom -93 -work work {fft.vho}

Пробую как Вы советовали через Модель Сим (через скрипт fft.do, который разместил в папке проекта)
Пока запустить его не получается. Команду перехода (cd D:\Altera\Quartus80\quartus\test\) на директорию где он находится Model Sim выполняет.
А на команде do fft.do выдает ошибку.

Посоветуйте пожалуйста как быть
Go to the top of the page
 
+Quote Post
Stewart Little
сообщение Jan 15 2010, 15:06
Сообщение #17


Лентяй
******

Группа: Свой
Сообщений: 2 203
Регистрация: 11-10-04
Из: Санкт-Петербург
Пользователь №: 843



Цитата(Acvarif @ Jan 15 2010, 17:02) *
Посоветуйте пожалуйста как быть

А попробуйте не использовать NativeLink, если опыта маловато (т.е. не запускайте ModelSim из-под квартуса).
Запустите ModelSim отдельно и скормите ему результаты работы квартусовского нетлист райтера (они в папке <имя_проекта>_sim, если мне склероз не изменяет, находятся - там и vho, и тестбенч, и скрипты). Отокмпилируйте hdl-файлы в соответствии с иерархией, потом запускайте моделирование.
Даже если не сразу получится, то так быстрее разберетесь, имхо.


--------------------
Чтобы слова не расходились с делом, нужно молчать и ничего не делать...
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Jan 15 2010, 17:10
Сообщение #18


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Надеюсь все же добить симуляцию fft.
Буду пробовать по всякому.

Например в ISE Xilinx Модельсим запускался прямо изнутри и возвращал результат.
Я и подумал, что может и в Q8 (пока почти совсем нет опыта работы с Q8) должно быть что то похожее.

Пока много неясного. Вот например что такое NativeLink?
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Jan 16 2010, 08:35
Сообщение #19


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Помогите пожалуйста правильно составить скрипт для симуляции по Model Sim Altera

Скрипт:
Код
## Компиляция
vcom -work work -93 -explicit -quiet -source -O0 -cover s -novopt D:/altera/work/fft/fft_tb.vhd
vcom -work work -93 -explicit -quiet -source -O0 -cover s -novopt D:/altera/work/fft/fft.vho

## Запуск проекта на моделирование
vsim -t 1ps -title FFT work.fft_tb
##
view wave


ругается на -cover s -novopt
Попробовал сделать так:

Код
## Компиляция
vcom -93 -work work {D:/altera/work/fft/fft_tb.vhd}
vcom -93 -work work {D:/altera/work/fft/fft.vho}

## Запуск проекта на моделирование
vsim -t 1ps -title FFT work.fft_tb
##
view wave


Вроде откомпилировалось все без предупреждений и появилась пустая диаграмма и сигналы.
Далее при нажатии на "run All" запустились проходы с кучей варнингсов...все остановилось но результат не высветился (диаграмма так и осталась пустая)
Go to the top of the page
 
+Quote Post
Prusak
сообщение Jan 16 2010, 19:17
Сообщение #20


Частый гость
**

Группа: Свой
Сообщений: 78
Регистрация: 11-08-06
Из: Москва
Пользователь №: 19 488



Цитата(Acvarif @ Jan 16 2010, 11:35) *
Вроде откомпилировалось все без предупреждений и появилась пустая диаграмма и сигналы.
Далее при нажатии на "run All" запустились проходы с кучей варнингсов...все остановилось но результат не высветился (диаграмма так и осталась пустая)
Вот, все так и должно быть. А на диаграмме ничего нет, потому что вы не добавили в нее сигналы из проекта. Попробуйте так: перед нажатием run -all в консоли написать add wave /fft/* или перенести мышкой из левой части, где список сигналов и процессов. Моделсима нет под рукой, не помню как окно называется...
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Jan 18 2010, 08:14
Сообщение #21


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Цитата(Prusak @ Jan 16 2010, 23:17) *
Вот, все так и должно быть. А на диаграмме ничего нет, потому что вы не добавили в нее сигналы из проекта. Попробуйте так: перед нажатием run -all в консоли написать add wave /fft/* или перенести мышкой из левой части, где список сигналов и процессов. Моделсима нет под рукой, не помню как окно называется...


Спасибо.
Все!!!
Диаграмма получилась.

Теперь, как предлагает толмуд по Мегафункции необходимо проделать то же но в Матлабе, который создаст те же выходные файлы мнимой и действительной частей + файл експоненты.
И я так понял, что после этого можно сравнить то, что создано Модель симом и Матлабом. Оно должно быть одинаково.
Поскольку по умолчанию входные данные мегафункция создает на базе случайного процесса, то мне ради еще одной проверки придется входные файлы мнимой и действительной частей попробовать сделать на базе гармонической функции. Далее все отсимулировать и увидеть одну гармонику. Чем сейчас и займусь..
Еще вопрос:
Как эта мегафункция роаботает непосредственно в железе? Был ли у Вас опыт? Нет ли там каких-то проблем?
Go to the top of the page
 
+Quote Post
Prusak
сообщение Jan 18 2010, 08:52
Сообщение #22


Частый гость
**

Группа: Свой
Сообщений: 78
Регистрация: 11-08-06
Из: Москва
Пользователь №: 19 488



Цитата(Acvarif @ Jan 18 2010, 11:14) *
Спасибо.
Все!!!
Диаграмма получилась.
Поздравляю :-)

Цитата(Acvarif @ Jan 18 2010, 11:14) *
Еще вопрос:
Как эта мегафункция роаботает непосредственно в железе? Был ли у Вас опыт? Нет ли там каких-то проблем?
Да, я столкнулся с проблемами и тоже хочу здесь спросить у имевших опыт общения с этой коркой форумчан:
Архитектура FFT: Burst, Quad output
Число точек N =512
Разрядность данных : 14

На вход input_real подаю синусойду. На вход input_imag подаю 0. Получаю спектр сигнала на выходе и сразу подаю его на обратное преобразование IFFT, в качестве которой вторая корка FFT, с теми же параметрами, только, вывод inverse=1.
И вижу что на выходе IFFT есть данные и на выходе real и image, т.е сигнал стал комплексным!! И даже после взятия модуля такого комплексного числа синусойда на выходе - сильно искажена.

Начинаю разбираться и ахаю. Спектр на выходе FFT оказывается несимметричный (а при реальном сигнале на входе - он всегда должен быть симметричным)!!! Нет, он конечно похож, но конкретные числа немного отличаются. Пробовал увеличить разрядность данных до 16, игрался с параметром twiddle precision, пробовал архитектуры buffered burst, ничего не помогало. Сейчас подозреваю, что проблема в округлении. В даташите написано что в архитектуре variable streamming применен более продвинутый блок floating point, но опробывать эту архитектуру не успел. Выкрутился тем, что взял тупо первую половину спектра (1-N/2 отсчетов) и зеркально отобразил, и скопировал на место второй части (N/2-N отсчеты), конечно так не совсем честно, и для комплекс. сигнала не покатит, но в моем случае свою синусойду обратно я получил и без комплексного сигнала на выходе, на чем пока и успокоился.
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Jan 18 2010, 09:19
Сообщение #23


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Цитата(Prusak @ Jan 18 2010, 12:52) *
На вход input_real подаю синусойду. На вход input_imag подаю 0.


Если можно подскажите пожалуйста как теперь создать текстовые файлы (входные) для мнимой и действительной частей гармонического сигнала (ведь сам визард по умолчанию их создает для случайного процесса).
Там еще предлагается (его тоже создает визард) какой то матлабовский файл в котором вроде можно заменить x = ..
на гармонический. Но запуск его в матлабе ничего не дает.
Go to the top of the page
 
+Quote Post
Prusak
сообщение Jan 18 2010, 10:05
Сообщение #24


Частый гость
**

Группа: Свой
Сообщений: 78
Регистрация: 11-08-06
Из: Москва
Пользователь №: 19 488



Цитата(Acvarif @ Jan 18 2010, 12:19) *
Если можно подскажите пожалуйста как теперь создать текстовые файлы (входные) для мнимой и действительной частей гармонического сигнала (ведь сам визард по умолчанию их создает для случайного процесса).
Там еще предлагается (его тоже создает визард) какой то матлабовский файл в котором вроде можно заменить x = ..
на гармонический. Но запуск его в матлабе ничего не дает.
Я подавал только действительный сигнал, код следующий:
Код
Fs = 40e6;       % Частота дискретизации, Гц
Td = 1/Fs;       % период дискретизации сигнала
Tend = 1e-1;     % Конечное время наблюдения.
t=0:Td:Tend;    
Fif = 1e6;     % Частота синусойды, Гц
A = 2^12;         % Амлитуда синусойды
Ns=32000;         % Число сэмплов для записи в файл

%Генерируем Синус
S = A*sin(2*pi*Fif*t);

% Открываем выходной файл на запись
f1 = fopen('C:\sin_out.txt','w');

% Выводим данные в файл
for i=1:Ns    
    str_tmp = int2str(S(i));         % Преобразуем целое десятичное число в строку
    fprintf(f1, '%s \n', str_tmp);            % Записываем ее в файл
end;
fclose(f1);
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Jan 18 2010, 13:17
Сообщение #25


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Спасибо.

Смысл понятен. Пропустил через симулятор. (Я пока делаю на 64 точки
наверное A = 2^8; % Амлитуда синусойды)

Вобщем пока одной гармоники действительно не получилось.
Надо подумать...
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Jan 22 2010, 06:50
Сообщение #26


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Вобщем после немного подумать пришол к выводу:

Мегафункция в своей работе выполняет операции не в плавающем формате.
Поэтому очевидно и такие неточности.
Если пропустить то же в Матлабе то четко получается одна гармоника потому, что Матлаб работает
в операционной среде которая в свою очередь все делает в плавающем формате - отсюда и
соответствующая точность.
Для того, чтобы в ПЛИС обеспечить высокую точность необходим вычислитель (умножение, суммирование)
с плавающей точкой.

Да, совсем может не кстати. Установил Quartus 90. Все работало нормально. Но после установки SP2 совсем перестал работать. Требует другой sys_cpt.dll. Получается, что лекарство от простого Q90 уже не подходит. Посоветуйте пожалуйста чего нибудь.

Сообщение отредактировал Acvarif - Jan 22 2010, 06:57
Go to the top of the page
 
+Quote Post
novartis
сообщение Jan 24 2010, 17:47
Сообщение #27


Местный
***

Группа: Свой
Сообщений: 375
Регистрация: 9-10-09
Из: Свердловский регион
Пользователь №: 52 845



Добрый вечер, уже замучился разбираться с магафункцией 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

Помогите разобраться. Заранее благодарен за любые ответы.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Prusak
сообщение Feb 2 2010, 07:38
Сообщение #28


Частый гость
**

Группа: Свой
Сообщений: 78
Регистрация: 11-08-06
Из: Москва
Пользователь №: 19 488



Цитата(Acvarif @ Jan 22 2010, 09:50) *
Вобщем после немного подумать пришол к выводу:

Мегафункция в своей работе выполняет операции не в плавающем формате.
Поэтому очевидно и такие неточности.
Если пропустить то же в Матлабе то четко получается одна гармоника потому, что Матлаб работает
в операционной среде которая в свою очередь все делает в плавающем формате - отсюда и
соответствующая точность.
Для того, чтобы в ПЛИС обеспечить высокую точность необходим вычислитель (умножение, суммирование)
с плавающей точкой.
По информации из даташита на FFT кору архитектуры burst, buffered burst, streaming содержат альтеровское изобретение block floating point (BFP):
Цитата
To maintain a high signal-to-noise ratio throughout the transform computation, the FFT MegaCore function uses a block-floating-point architecture, which is a trade-off
point between fixed-point and full-floating point architectures.
In a block-floating point architecture, all of the values have an independent mantissa but share a common exponent in each data block. Data is input to the FFT function as
fixed point complex numbers (even though the exponent is effectively 0, you do not enter an exponent).
Т.е в BFP для каждого числа используется своя мантисса, но общий порядок числа (экспонента), в отличии от настоящего числа с плавающей запятой, где у каждого числа своя мантисса и экспонента.

Полная реализация floating point чисел реализована в архитектуре variable streaming. Где используются 32-битные числа с плавающей запятой. Но опробовать эту архитектуру не дошли руки.

У меня синусойда на выходе получалась нормальная (соответствующая матлабу), просто спектр был несимметричный и это все портило.


novartis
Может быть проблема с входным сигналом. У вас экспонента source_exp равна 1, посмотрел в даташите на кору - это минимальное значение для корки с вашими параметрами. Попробуйте увеличить уровень входного сигнала.
Go to the top of the page
 
+Quote Post
novartis
сообщение Feb 3 2010, 15:58
Сообщение #29


Местный
***

Группа: Свой
Сообщений: 375
Регистрация: 9-10-09
Из: Свердловский регион
Пользователь №: 52 845



Цитата(Prusak @ Feb 2 2010, 10:38) *
novartis
Может быть проблема с входным сигналом. У вас экспонента source_exp равна 1, посмотрел в даташите на кору - это минимальное значение для корки с вашими параметрами. Попробуйте увеличить уровень входного сигнала.


Поменял архитектуру FFT со Streaming на Buffered Burst. На выходе появились данные. Вернулся к Streaming, подал на вход не одну посылку, а несколько. На выходе данные начали поступать начиная со второй пачки. Видимо так работает именно архитектура Streaming. До конца так и не разобрался.
Может разъяснит кто-нибудь различия между Streaming, Buffered, Burst Burst, Variable Streaming, в каких случаях и задачах ту или иную стоит применять.
Вообще задача ставится так: необходимо обрабатывать 1024 пачек по 1024 отчетов 12 разрядов (т.е. скорее всего придется сделать 24 или даже 32 разряда), в идеале плавающая точка, ПЛИС - Stratix IV GX. Вот и думаю какую архитектуру использовать. Даташит читал, английский более менее понимаю, а вот понять все равно не могу, что там написано).
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 05:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01608 секунд с 7
ELECTRONIX ©2004-2016