Перейти к содержанию
    

Модель Сим загрузил необходимые библиотеки, что-то откомпилировал и сейчас крутится...Жду результат...

 

Не получается. Вот что происходит в 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 выдает ошибку.

 

Посоветуйте пожалуйста как быть

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посоветуйте пожалуйста как быть

А попробуйте не использовать NativeLink, если опыта маловато (т.е. не запускайте ModelSim из-под квартуса).

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

Даже если не сразу получится, то так быстрее разберетесь, имхо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Буду пробовать по всякому.

 

Например в ISE Xilinx Модельсим запускался прямо изнутри и возвращал результат.

Я и подумал, что может и в Q8 (пока почти совсем нет опыта работы с Q8) должно быть что то похожее.

 

Пока много неясного. Вот например что такое NativeLink?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Помогите пожалуйста правильно составить скрипт для симуляции по 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" запустились проходы с кучей варнингсов...все остановилось но результат не высветился (диаграмма так и осталась пустая)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вроде откомпилировалось все без предупреждений и появилась пустая диаграмма и сигналы.

Далее при нажатии на "run All" запустились проходы с кучей варнингсов...все остановилось но результат не высветился (диаграмма так и осталась пустая)

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Спасибо.

Все!!!

Диаграмма получилась.

 

Теперь, как предлагает толмуд по Мегафункции необходимо проделать то же но в Матлабе, который создаст те же выходные файлы мнимой и действительной частей + файл експоненты.

И я так понял, что после этого можно сравнить то, что создано Модель симом и Матлабом. Оно должно быть одинаково.

Поскольку по умолчанию входные данные мегафункция создает на базе случайного процесса, то мне ради еще одной проверки придется входные файлы мнимой и действительной частей попробовать сделать на базе гармонической функции. Далее все отсимулировать и увидеть одну гармонику. Чем сейчас и займусь..

Еще вопрос:

Как эта мегафункция роаботает непосредственно в железе? Был ли у Вас опыт? Нет ли там каких-то проблем?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо.

Все!!!

Диаграмма получилась.

Поздравляю :-)

 

Еще вопрос:

Как эта мегафункция роаботает непосредственно в железе? Был ли у Вас опыт? Нет ли там каких-то проблем?

Да, я столкнулся с проблемами и тоже хочу здесь спросить у имевших опыт общения с этой коркой форумчан:

Архитектура 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 отсчеты), конечно так не совсем честно, и для комплекс. сигнала не покатит, но в моем случае свою синусойду обратно я получил и без комплексного сигнала на выходе, на чем пока и успокоился.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На вход input_real подаю синусойду. На вход input_imag подаю 0.

 

Если можно подскажите пожалуйста как теперь создать текстовые файлы (входные) для мнимой и действительной частей гармонического сигнала (ведь сам визард по умолчанию их создает для случайного процесса).

Там еще предлагается (его тоже создает визард) какой то матлабовский файл в котором вроде можно заменить x = ..

на гармонический. Но запуск его в матлабе ничего не дает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если можно подскажите пожалуйста как теперь создать текстовые файлы (входные) для мнимой и действительной частей гармонического сигнала (ведь сам визард по умолчанию их создает для случайного процесса).

Там еще предлагается (его тоже создает визард) какой то матлабовский файл в котором вроде можно заменить 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);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо.

 

Смысл понятен. Пропустил через симулятор. (Я пока делаю на 64 точки

наверное A = 2^8; % Амлитуда синусойды)

 

Вобщем пока одной гармоники действительно не получилось.

Надо подумать...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Мегафункция в своей работе выполняет операции не в плавающем формате.

Поэтому очевидно и такие неточности.

Если пропустить то же в Матлабе то четко получается одна гармоника потому, что Матлаб работает

в операционной среде которая в свою очередь все делает в плавающем формате - отсюда и

соответствующая точность.

Для того, чтобы в ПЛИС обеспечить высокую точность необходим вычислитель (умножение, суммирование)

с плавающей точкой.

 

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

Изменено пользователем Acvarif

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Помогите разобраться. Заранее благодарен за любые ответы.

post-52845-1264355037_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Мегафункция в своей работе выполняет операции не в плавающем формате.

Поэтому очевидно и такие неточности.

Если пропустить то же в Матлабе то четко получается одна гармоника потому, что Матлаб работает

в операционной среде которая в свою очередь все делает в плавающем формате - отсюда и

соответствующая точность.

Для того, чтобы в ПЛИС обеспечить высокую точность необходим вычислитель (умножение, суммирование)

с плавающей точкой.

По информации из даташита на 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, посмотрел в даташите на кору - это минимальное значение для корки с вашими параметрами. Попробуйте увеличить уровень входного сигнала.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

novartis

Может быть проблема с входным сигналом. У вас экспонента source_exp равна 1, посмотрел в даташите на кору - это минимальное значение для корки с вашими параметрами. Попробуйте увеличить уровень входного сигнала.

 

Поменял архитектуру FFT со Streaming на Buffered Burst. На выходе появились данные. Вернулся к Streaming, подал на вход не одну посылку, а несколько. На выходе данные начали поступать начиная со второй пачки. Видимо так работает именно архитектура Streaming. До конца так и не разобрался.

Может разъяснит кто-нибудь различия между Streaming, Buffered, Burst Burst, Variable Streaming, в каких случаях и задачах ту или иную стоит применять.

Вообще задача ставится так: необходимо обрабатывать 1024 пачек по 1024 отчетов 12 разрядов (т.е. скорее всего придется сделать 24 или даже 32 разряда), в идеале плавающая точка, ПЛИС - Stratix IV GX. Вот и думаю какую архитектуру использовать. Даташит читал, английский более менее понимаю, а вот понять все равно не могу, что там написано).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...