acvarif 0 15 января, 2010 Опубликовано 15 января, 2010 · Жалоба Модель Сим загрузил необходимые библиотеки, что-то откомпилировал и сейчас крутится...Жду результат... Не получается. Вот что происходит в 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 выдает ошибку. Посоветуйте пожалуйста как быть Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
StewartLittle 41 15 января, 2010 Опубликовано 15 января, 2010 · Жалоба Посоветуйте пожалуйста как быть А попробуйте не использовать NativeLink, если опыта маловато (т.е. не запускайте ModelSim из-под квартуса). Запустите ModelSim отдельно и скормите ему результаты работы квартусовского нетлист райтера (они в папке <имя_проекта>_sim, если мне склероз не изменяет, находятся - там и vho, и тестбенч, и скрипты). Отокмпилируйте hdl-файлы в соответствии с иерархией, потом запускайте моделирование. Даже если не сразу получится, то так быстрее разберетесь, имхо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
acvarif 0 15 января, 2010 Опубликовано 15 января, 2010 · Жалоба Надеюсь все же добить симуляцию fft. Буду пробовать по всякому. Например в ISE Xilinx Модельсим запускался прямо изнутри и возвращал результат. Я и подумал, что может и в Q8 (пока почти совсем нет опыта работы с Q8) должно быть что то похожее. Пока много неясного. Вот например что такое NativeLink? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
acvarif 0 16 января, 2010 Опубликовано 16 января, 2010 · Жалоба Помогите пожалуйста правильно составить скрипт для симуляции по 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" запустились проходы с кучей варнингсов...все остановилось но результат не высветился (диаграмма так и осталась пустая) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Prusak 0 16 января, 2010 Опубликовано 16 января, 2010 · Жалоба Вроде откомпилировалось все без предупреждений и появилась пустая диаграмма и сигналы. Далее при нажатии на "run All" запустились проходы с кучей варнингсов...все остановилось но результат не высветился (диаграмма так и осталась пустая) Вот, все так и должно быть. А на диаграмме ничего нет, потому что вы не добавили в нее сигналы из проекта. Попробуйте так: перед нажатием run -all в консоли написать add wave /fft/* или перенести мышкой из левой части, где список сигналов и процессов. Моделсима нет под рукой, не помню как окно называется... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
acvarif 0 18 января, 2010 Опубликовано 18 января, 2010 · Жалоба Вот, все так и должно быть. А на диаграмме ничего нет, потому что вы не добавили в нее сигналы из проекта. Попробуйте так: перед нажатием run -all в консоли написать add wave /fft/* или перенести мышкой из левой части, где список сигналов и процессов. Моделсима нет под рукой, не помню как окно называется... Спасибо. Все!!! Диаграмма получилась. Теперь, как предлагает толмуд по Мегафункции необходимо проделать то же но в Матлабе, который создаст те же выходные файлы мнимой и действительной частей + файл експоненты. И я так понял, что после этого можно сравнить то, что создано Модель симом и Матлабом. Оно должно быть одинаково. Поскольку по умолчанию входные данные мегафункция создает на базе случайного процесса, то мне ради еще одной проверки придется входные файлы мнимой и действительной частей попробовать сделать на базе гармонической функции. Далее все отсимулировать и увидеть одну гармонику. Чем сейчас и займусь.. Еще вопрос: Как эта мегафункция роаботает непосредственно в железе? Был ли у Вас опыт? Нет ли там каких-то проблем? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Prusak 0 18 января, 2010 Опубликовано 18 января, 2010 · Жалоба Спасибо. Все!!! Диаграмма получилась. Поздравляю :-) Еще вопрос: Как эта мегафункция роаботает непосредственно в железе? Был ли у Вас опыт? Нет ли там каких-то проблем? Да, я столкнулся с проблемами и тоже хочу здесь спросить у имевших опыт общения с этой коркой форумчан: Архитектура 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 отсчеты), конечно так не совсем честно, и для комплекс. сигнала не покатит, но в моем случае свою синусойду обратно я получил и без комплексного сигнала на выходе, на чем пока и успокоился. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
acvarif 0 18 января, 2010 Опубликовано 18 января, 2010 · Жалоба На вход input_real подаю синусойду. На вход input_imag подаю 0. Если можно подскажите пожалуйста как теперь создать текстовые файлы (входные) для мнимой и действительной частей гармонического сигнала (ведь сам визард по умолчанию их создает для случайного процесса). Там еще предлагается (его тоже создает визард) какой то матлабовский файл в котором вроде можно заменить x = .. на гармонический. Но запуск его в матлабе ничего не дает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Prusak 0 18 января, 2010 Опубликовано 18 января, 2010 · Жалоба Если можно подскажите пожалуйста как теперь создать текстовые файлы (входные) для мнимой и действительной частей гармонического сигнала (ведь сам визард по умолчанию их создает для случайного процесса). Там еще предлагается (его тоже создает визард) какой то матлабовский файл в котором вроде можно заменить 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); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
acvarif 0 18 января, 2010 Опубликовано 18 января, 2010 · Жалоба Спасибо. Смысл понятен. Пропустил через симулятор. (Я пока делаю на 64 точки наверное A = 2^8; % Амлитуда синусойды) Вобщем пока одной гармоники действительно не получилось. Надо подумать... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
acvarif 0 22 января, 2010 Опубликовано 22 января, 2010 (изменено) · Жалоба Вобщем после немного подумать пришол к выводу: Мегафункция в своей работе выполняет операции не в плавающем формате. Поэтому очевидно и такие неточности. Если пропустить то же в Матлабе то четко получается одна гармоника потому, что Матлаб работает в операционной среде которая в свою очередь все делает в плавающем формате - отсюда и соответствующая точность. Для того, чтобы в ПЛИС обеспечить высокую точность необходим вычислитель (умножение, суммирование) с плавающей точкой. Да, совсем может не кстати. Установил Quartus 90. Все работало нормально. Но после установки SP2 совсем перестал работать. Требует другой sys_cpt.dll. Получается, что лекарство от простого Q90 уже не подходит. Посоветуйте пожалуйста чего нибудь. Изменено 22 января, 2010 пользователем Acvarif Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novartis 0 24 января, 2010 Опубликовано 24 января, 2010 · Жалоба Добрый вечер, уже замучился разбираться с магафункцией 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 Помогите разобраться. Заранее благодарен за любые ответы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Prusak 0 2 февраля, 2010 Опубликовано 2 февраля, 2010 · Жалоба Вобщем после немного подумать пришол к выводу: Мегафункция в своей работе выполняет операции не в плавающем формате. Поэтому очевидно и такие неточности. Если пропустить то же в Матлабе то четко получается одна гармоника потому, что Матлаб работает в операционной среде которая в свою очередь все делает в плавающем формате - отсюда и соответствующая точность. Для того, чтобы в ПЛИС обеспечить высокую точность необходим вычислитель (умножение, суммирование) с плавающей точкой. По информации из даташита на 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 0 3 февраля, 2010 Опубликовано 3 февраля, 2010 · Жалоба novartis Может быть проблема с входным сигналом. У вас экспонента source_exp равна 1, посмотрел в даташите на кору - это минимальное значение для корки с вашими параметрами. Попробуйте увеличить уровень входного сигнала. Поменял архитектуру FFT со Streaming на Buffered Burst. На выходе появились данные. Вернулся к Streaming, подал на вход не одну посылку, а несколько. На выходе данные начали поступать начиная со второй пачки. Видимо так работает именно архитектура Streaming. До конца так и не разобрался. Может разъяснит кто-нибудь различия между Streaming, Buffered, Burst Burst, Variable Streaming, в каких случаях и задачах ту или иную стоит применять. Вообще задача ставится так: необходимо обрабатывать 1024 пачек по 1024 отчетов 12 разрядов (т.е. скорее всего придется сделать 24 или даже 32 разряда), в идеале плавающая точка, ПЛИС - Stratix IV GX. Вот и думаю какую архитектуру использовать. Даташит читал, английский более менее понимаю, а вот понять все равно не могу, что там написано). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться