Jump to content

    

Kluwer

Участник
  • Content Count

    289
  • Joined

  • Last visited

Posts posted by Kluwer


  1. 19 hours ago, _sda said:

    Спасибо! А что за функция bi_cmplx_satu?

    Просто ограничение квадратур комплексного числа, в данном случае до DATA_PREC бит.

    Кстати, я почитал как работает БПФ-кора в режиме с плавающей запятой и выяснил, что после каждой стадии конвейера он ещё более лихо начинает масштабировать результаты (разработчки, видимо, тоже решили: а чего, плавающая запятая, ни о чём думать не надо :( ). Ну и результат по мантиссе в том, что даже тех теоретических 72дБ, что я вам выше насчитал по целочисленном ядру, может не быть (что, кстати и видно по вашим графикам). У вас там вообще, похоже, "шумовой" уровень начинается в районе -60дБ. Я не в точности понял, что у вас за задача. Но у нас, например, то же сажтие сигнала для радиолокационных задач динамика хуже 85-90дБ - это вообще не серъёзный разговор.

  2. 3 minutes ago, petrov said:

    _sda

    Целочисленный режим возможен только для

    В симулинке есть целочисленный "Burst" FFT, там же можно всю схему отладить, выявить переполнения и т. п.

    Я уже писал об этом автору. Но и симулинк не нужен: Мегавизард генерит матлабовский обёртку-скрипт, к-рый вызывает альтеровский .dll Sfftmodel. Он с точностью до бита моделирует поведение альтеровской мегакоры.

    Скрипт выглядит так:

    % function [y, exp_out] = Custom_FFT_model(x,DATA_PREC,TWIDDLE_PREC,INVERSE)
    %
    % calculates the complex block-floating point FFT/IFFT of length N of a                  
    %   complex input vector x                                                                   
    %                                                                                            
    %   Inputs:   x          : Input complex vector of length N. 
    %                        : If the length of the vector doesn't fit                     
    %                          N, error is generated.                               
    %             N          : Transform Length                                                  
    %             INVERSE    : FFT direction                                                     
    %                          0 => FFT                                                          
    %                          1 => IFFT                                                          
    %                                                                                          
    %   Outputs   y          : The transform-domain complex vector output                        
    %             exp_out    : Block exponent value                                               
    %                                                                                            
    %   2001-2009 Altera Corporation, All Rights Reserved 
    %                                                                                                  
    %   Automatically Generated: FFT MegaCore Function 13.0 Build 232 July, 2013                                                                                                   
    %
    function [y, exp_out] = Custom_FFT_model(x,DATA_PREC,TWIDDLE_PREC,INVERSE,N) 
    addpath(strcat(getenv('QUARTUS_ROOTDIR'),'/../ip/altera/fft/lib/'));
    % Parameterization Space   
    THROUGHPUT=4;
    ARCH=1;
    % DATA_PREC=23;
    % TWIDDLE_PREC=23;
    input_vector_length = length(x); 
    if input_vector_length ~= N,
        error('Length of input vector doesn''t fit FFT size.');
    end
    
    rin = real(x);
    iin = imag(x);
    [roc,ioc,exp_out] = Sfftmodel(rin,iin,N,THROUGHPUT,ARCH,DATA_PREC,TWIDDLE_PREC,INVERSE);
    y = roc+1j*ioc;
    end                                                                          

    Затягиваете в Матлаб и играетесь до посинения, пока не подберёте устраивающие параметры, не прикасаясь даже к Квартусу.

    Вот, например, фрагмент кода - соглассованный фильтр на базе БПФ, сначала на матлабовских БПФ, потом - на Алтере:

    % ---- First, Matlab's fft-based method ---------------------
    rfft = fft(Input_IQ, Nfft);
    Rfft = (2^(-Ntemplate))*ifft(rfft.*Sorig, Nfft); 
    
    % ---- Second, Matlab's fft-based method ----------------------
    % Do not forget to add '.\DSPBuilder_MatchingFilter_import' folder to the paths list
    
    % Direct FFT
    [X, exp_out_in] = Custom_FFT_model(Input_IQ, DATA_PREC, TWIDDLE_PREC, 0, Nfft); 
    X = fix(X(1:Nfft));
    
    % <=== MIDDLE_SCALE (shift on exp_out_in(1)+sbits_after) =========--============
    Y = X.*Sorig; % Multiplication
    
    % Scaling after the multiplication
    Y = fix(Y.*2^(-(Ntemplate)));
    Y = bi_cmplx_satu(Y, 0, DATA_PREC, Y); 
    
    % Inverse FFT
    [y, exp_out_out] = Custom_FFT_model(Y, DATA_PREC, TWIDDLE_PREC, 1, Nfft);
    
    % Get rid of the tail
    y = y.*[ones(1,Nw) zeros(1,Nfft-Nw)];
    
    % <=== OUT_SCALE_stageI ========================================================
    y = 2.^(-exp_out_out(1)-exp_out_in(1)-log2(Nfft)-sbits_before+sbits_after).*y; % 
    

     

  3. 8 minutes ago, _sda said:

    А какой вообще смысл загружать в плиску проект с невыполненными констрейнами?

    Вот я подключил NCO на вход FFT, результат на видео. Ну не хочет моя корка работать как надо.

    Video_2019-09-11_145538.wmv

    В моём случае БПФ с плавучкой.

    Уже и шину данных БПФ менял от 12 до 24 бит - не помогает.

    Мне до этого всегда хватало БПФ или 1К или 2К, это первый раз делаю 4К.

    Если никаких версий больше нет, придётся переходить на 8К, может там повезёт.

    Не повезёт. Если даже с плавающей запятой (почему-то все считают, что п.з. - это панацея от всех бед, ничего подобного, ибо главное - это разрядность мантиссы: у вас 24 бита) - это 144дБ. Но БПФ - интегральное преобразование, значит - вычитаем из этого размер БПФ. 4К - это 72дБ. Итого, всё, чем вы располагаетет - это 144-72 ~ 72дБ. А дальше - начинаются свистопляски с округлением. Переходом на 8К вы просто отрежете из своей динамики ещё 6дБ и всё.

     

    Попробуйте уж лучше уйти на 4К целочисленные, влупив ему 32 разряда. И попробуйте, всё-таки, сделать то, что я вам выше рекомендовал: сдвиньте вход хотя бы на 2 разряда влево (<< 2).

  4. 1 hour ago, _sda said:

    Это сигнал на корку подаю с АЦП. На выходе непосредственно корки БПФ шумовую дорожку колбасит(самый нижний сигнал). Также её колбасит и после вычисления модуля. Обратите так же внимание на сигнал source_error, он всегда в нуле.

    Диаграмму формируют sop,eop и valid, они формируется верно,иначе бы source_error ругался..

    Video_2019-09-11_121229_out_fft.wmv

    Я же выше описал ситуацию, не заставляйте меня повторять снова. Сигнал сейчас подаю прям на АЦП с генератора, о каком перегрузе речь?

    На мой взгляд это очень похоже на правду. Но сомнения есть - почему это проявляется только при сильных сигналах? И я пробовал уменьшить ширину данных FFT (перекомпиливал корку) - результат не изменился.

    В Матлабе есть возможность вызвать точную модель FFT-шной альтеровской корки, называется она Sfftmodel, а обёртку-скрипт для неё генерит Мегавиззард. Она даёт в точности то, что даст альтеровская корка до бита, только Мигавиззард дёргать не надо - параметры прямо в Матлабе меняются. Если есть DSPbuilder, то можно ещё и в Симулинке с точностью до управляющих сигналов проиграть и всё увидеть.

     

    А вообще, мы на это натыкались, из-за того, что корка целочисленная (в отличии от Матлабовской функции) и если динамика ожидается на уровне хотя бы 40-50дБ, то отсчёты входного сигнала стоит на 2-4 разряда влево сдвиагть перед почачей на БПФ-корку, иначе рез-ты альтеровской корки и матлаба начинают заметно различаться. Это потому что, если вы внимательно прочитаете описание БПФ-мегакоры, то это не "тупое" БПФ, а там ещё после каждого блока "бабочек" стоит блок автомасштабирования, сигнал по мере прокатывания по каскадам, постоянно двигается влево-вправо, что бы уложиться в сетку (для этого там и выход блочного порядка имеется exp_out). И если у вас слишком велика динамика, то ошибки округления начинают накапливаться, даже если вы предельные 32 разряда поставили.

     

  5. On 8/9/2019 at 1:13 PM, FatRobot said:

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

    в качестве отправной точки посмотрите, как реализован cbrm в lte

     

    Выкалывание уменьшает сразу кодовое расстояние и, следовательно, корректирующую возможность кода скачком. Также как и использование созвездия пониженного размера, как предлагал des00. Но это всё, очевидно, подоптимальные, скачковые, аппроксимации, к-рые явно не будут оптимальными.

     

    А оптимальная постановка задачи тут интересна и решение, наверняка, будет не тривиальным. Возможно, придётся вводить понятие "веса кода" или переход к построению, например, кодов над нециклическими конечными группами.

  6. 2 hours ago, _sda said:

    Вот только не ясно как увеличение уровня может влиять на шумовую дорожку...

    Резкий рост шума - это 100% перегруз по входу. Вот только что на на приёмнике радиолокационном поразвлекался: заварачивается НЧМ-сигнал с передатчика на приёмник, у нас есть возможность управлять цифровым аттенюатором. Пока динамики тракта хватает, "шумовая дорожка" - 3-4 разряда на АЦП, как и должно быть, заканчивается динамика - скачком дорожка шумовая увеличивается. Перегруз у вас, но внеполосные составляющие из-за нелинейностей срезаются, скорее всего, входными фильтрами и возникакет ощущение, что с синалом "всё в порядке".

  7. Там, возьмите поиском, какой-то товарищЧ выложил в вике вопрос про настройку PHY и, заодно, архив проекта с 10Гб-PHY-ядром под терссиковский мезонин на базе Броадкомовскмх физик. Архив называется AN638_10GMAC_XAUI_HSMC_SV_GX_ACDS-12.0sp2.qar. Он под Стратикс 3, но его не сложно портировать под Циклон V. Я бы приложил, но он, собака, больше 5Мб занимает.

    А вообще, да, ситуация странная. Можно купить терасиковский мезонин под "десятку" на bcm8727, но от него невозможно получить ничего. Террасик пишет, что нужно подписать NDA, отправляют к местному представителю "Броадкома", тот узнаёт что нужно десяток микросхем в год и посылает нафиг :( А примеры, указанные в том же an638, давно выпелены отовсюду.

    Мой вам совет, если вам реально нужны высокие скорости, обратите внимание, как сейчас многие делают, на семейство Циклон 10. Там уже встроенная в кристалл физика (можно sfp+ - приёмники на прямую подключать), полный документэйшн с примерами и никаких идиотских nda.

  8. Кстати, и ещё проще :)

    Можно даже кода почти не писать, есть готовые оболочки по типу Delphi, только, я бы сказал, ещё даже проще и интуитивные, к-рые позволяют графические мордочки раскладывать и код генерить. Например, tkBuilder. Так что вполне юзАбельный инструментарий.

  9. On 7/30/2019 at 8:51 PM, MrGalaxy said:

    А где она находится?

    Виноват, не заметил, что вы на VHDL пишите. Это верилоговский макрос, означает, что нельзя использовать заранее не объявленные провода. Теоретически, вы можете верилоговскую шапку над своим VHDL-модулем сгенерить в к-ром поставить

    `default_nettype none

    Кривоватое, конечно, решение, но может быть поможет ...

  10. On 7/30/2019 at 2:34 PM, MaratZuev said:

    А их по-разному обозвать нельзя, например Module1.sv и Module1qip.qip?

    Можно и это будет работать, но это дико не удобно.

    On 7/31/2019 at 7:33 PM, pavlovconst said:

    QIP обычно описывает исходники стандартных IP из каталога. Подпроекты я бы объединял с помощью дочерних QSF-ов. Это, по крайней мере, более логично.

    
    set_global_assignment -name SOURCE_TCL_SCRIPT_FILE my_subproject_1_settings.qsf
    set_global_assignment -name SOURCE_TCL_SCRIPT_FILE my_subproject_2_settings.qsf

     

    Нет, смена разрешения файла ничего не даёт. Хоть .sip, хоть .qsf, хоть что угодно (хотя, ваша мысль про связь .qip и IP-кор интересна: возможно он изначально мой .qip рассматривает как результат работы мегавизарда, а стандартной шапки в коде модуля не находит и ему малость плохеет). Изменение имени - да, как MaratZuev выше предлагал, но по мне это дико не удобно.

    Кроме того, ещё одна проблема есть, не стал сразу в первом сообщение писать. Вот, например, вы перегенерили графический символ для блока Module1 (Module1.bsf) и хотите его обновить. Причём, хотелось бы это сделать из меню "Update Symbol or Block ...". Но, даже если вы любитель всё руками делать (один удалить, второй вставить, inst руками поменять) он должен быть прицеплен к проекту. Для этого его нужно прицепить к проекту через тот же скриптовик (.qip, ну или, пожалуйста, с другим расширением).

    Если вы его цепляете как

    set_global_assignment -name "BSF_FILE" [file join $::quartus(qip_path)  "Module1.bsf"]

    то при щелчке на графическом элементе в схем ещё и он будет в списке выдаваться! Т.е помимо "Module1.sv" и "Module1.qip" он вам любезно ещё и Module1.bsf" предолжит :(

    А если его вообще не прописывать, или прописать как "прочий" файл

    set_global_assignment -name "MISC_FILE" [file join $::quartus(qip_path)  "Module1.bsf"]

    то тут вообще какой-то вынос мозга начнётся, потому что Квартус, в зависимости от ваших действий (например, вы файл вообще из другого проекта открыли в другом каталоге) переодически вообще перестаёт графический символ видеть. Проблему полностью решает, как ни странно, прописывание абсолютных путей. Но при работе командой (разбросанной в нескольких странах, тем более) за абсолютные пути расстреливать надо.

    А прописывание относительных путей, типа

    set_global_assignment -name SEARCH_PATH [file join $::quartus(qip_path) "." ]

    помогает Квартусу всё что надо видеть во время сборки (вот при сборке и сразу после неё, странное дело, он всё прекрасно находит, если пути поиска прописаны). Но стоит даже во вне Квартуса (!!!) открыть какой-то каталог другой, Квартус моментально перестаёт видеть графические символы. Короче, заколдованный круг какой-то: либо каждый раз список из трёх файлов, либо постоянный геморр с путями :(

  11. On 7/31/2019 at 7:54 PM, pavlovconst said:

    В систем консоли открывается встроенный интерпретатор TCL. Поэтому эксперименты с GUI я бы начинал без квартуса, на чистом TCL.

    Да, оказалось всё ещё проще: в Квартусе уже есть подгруженный Tk. Подгружается к скрипту командой "package require Tk <версия>".

     

    В подкаталоге \quartus\bin<32 или 64>\tk<версия>\demos уже лежат готовые примеры. Например, hello (почему-то без расширения, я добавил для удобства .tcl). После этого в той же "Систем консоли", wish'е, или в рукопашную из DOS-строки "quartus_sh ..." запускаем, получаем такую картинку. Там есть более навароченная версия widget, она демонстрирует работу вообще со всеми доступными управлениями (менюшки, списки и т.д.). Но у меня она работает частично, как всегда начинается рубилово с путями (скрипт умудряется не найти каталог из которого его запустили :( )

     

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

     

    Hello.png

  12. 8 minutes ago, MaratZuev said:

    А зачем, стесняюсь спросить, вам вообще этот qip нужен? В чём его суть?

    Ну, например, сейчас над одним проектом работает сразу три плисовода, в т.ч. и я. У меня большой модуль, к-рый ведёт обработку сигналов и обеспечивает передачу данных по сети. Он лежит в отдельном подкаталоге, внутри всё тоже по подкаталогам разложено. Мы пробовали всякие CVS'ы, но переплевались и по старинке, просто кидаем друг другу обновлённые версии своих модулей.

    Все эти подпроекты, есс-но, подключаются с помощью головных .qip-файлов (а как ещё?), в к-рых всё досконально прописывается. И есть одна большая накрывающая графика, где просто глобально соеденены наши модули. В рез-те, если у меня появилась новая версия, то я просто тупо бросаю один-два файла коллегам и всё. В особо запущенных случаях (например, я что-то глобально переделал в своём подпроекте) архивируется и кидается весь каталог под замену. Но коллеги ни о чём не думает, ибо .qip-файл прописан уже в списке файлов: заменили или добавили то, что я присла и понеслась.

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

  13. Всем доброго дня!

    Вопрос такой. Интенсивно использую "Систем Консоль" в Квартусе для всяких мелких настроек в проекте. Но рулить tcl-скриптами текстовыми командами типа "SAVEREG 12 0011" уже поднадоело - хочется графики. Встроенные средства типа "Контент едитора", на мой взгляд, убоги. Хочется User-defined-возможностей. Но в описании на 13ю версию Квартуса в разделе №9 "System Debugging Tools Overview" на стр. 9-12 в подразделе "Push Button Functionality" читаю: "When used with the Tk toolkit, you can build your own graphical interface" и всё, больше никаких подробностей. Как я понял, Tk - это графическая надстройка/библиотека над Tcl. Но никакой вменяемой инфы не в Инете, не на сайте Альтеры не могу найти где её взять, как подключить, как проверить и т.д.?

    Если кто знает, поделитесь инфой, плиз!

  14. On 6/27/2019 at 5:03 PM, MaratZuev said:

    При клике в bdf на графическом изображении модуля, сформированного MegaWizard-om открывается окно MegaWizard-а. Уточните вопрос.

    Ну смотрите. Я сделал модуль на HDL, условно Module1.sv сгенерил по нему графику. Оба файла подключаю к проекту с помощью .qip-файла, в к-ром пишу, типа:

     

    set_global_assignment -name "SYSTEMVERILOG_FILE" [file join $::quartus(qip_path) "Module1.sv"  ]

    set_global_assignment -name "MISC_FILE"                   [file join $::quartus(qip_path) "Module1.bsf"]

     

    Далее вставляю графический символ Module1 в некий .bdf-файл верхнего уровня. Всё замечательно.

    Теперь, мне понадобилось отредактировать Module1. Я щёлкаю два раза (ну или вываливаю меню "Open design file") по графическому символу, но вместо того, что бы просто открыть мне Module1.sv в редакторе, он мне сначала вываливает окно "Что вы хотите открыть Module1.sv или Module1.qip?". Вот можно как-то Квартусу объяснить, что бы он по умолчанию открывал именно HDL-код, не задавая вопросов?

     

  15. А зачем вам это всё, да ещё крепко заточенное под "Латтайс"? Берёте любой подходящий тулбокс, коих тучи, для задания и обучения НС (да хоть тот же Матлабовский), задаёте кол-во слоёв и "нейронов", обучаете, получаете коэффициенты. Дальше слепить НС с любым кол-вом слоёв руками - как два пальца обсасать, лишь бы влезло по скорости и ёмкости. В чём проблема-то?

    P.S. И, кстати, если у вас задача распознования лиц на изображении, то она гораздо эффективнее и проще решается без идиотских "нейронных сеточек". Например, тот же метод Виолы-Джонса.

  16. Если честно, никогда не мог понять ценности подобных опросов. На вкус и цвет ... как известно. Разве только очередной пустопорожний холивар устроить на тему "настоящие плисоводы пишут ручками или рисуют в графике". Пустое ...

  17. Коллеги,

    как сделать так, что в Quartus'е при щелчке на графическом изображении модуля, добавленного в проект с помощью .qip-файла открывался именно исходник, а не выпадало постоянно окошко с выбором "вам .qip-файл, или исходник?"?

  18. 1 hour ago, RobFPGA said:

    Приветствую!

    IMHO тупиковый путь - не синтезируемые конструкции на то и НЕ синтезируемые что нет однозначного способа отобразить эту конструкцию в железо. Поэтому препроцессор будет всегда требовать специфичного синтаксиса/ограничений для использования этих конструкций.  В чем тогда будет выгода?

    Удачи! Rob. 

     

    Коллега, я извиняюсь, но мой пост был не с целью обсудить "выгоду". Я просто написал, что существует такой способ, точка. И хотелось бы понять есть ли какие-то инструменты для реализации данного способа. Если у вас есть что на примете - буду благодарен, а обсуждать "да зачем оно нужно..." я не намерен.

  19. 7 minutes ago, alexadmin said:

     

    Был у меня буфер для сохранения вэйвформ и вычитывания процессором. Двухпортовая память, разные разрядности все дела. Сгенерил IP. Потом понадобился буфер под другую разрядность. Сгенерил IP. Потом еще. Потом доза все больше и больше. Наконец плюнул на это дело, переписал на чистом HDL с параметрами. Жизнь стала чуть светлее...

    А кто мешал вам, простите, параметры прямо в корке менять? Корка чем и хороша, что она генерит, в т.ч. на указанном вами языке "шапку". Копируйте эту шапку себе в проект и параметризуйте как вам угодно.

    Вот, например, подмодуль стэка с переменной глубиной и разрядностью, первоначально сгенерённый в gui мегавизарда

     

    module FIFO_template #( parameter WIDTH_U = 14, parameter WIDTH_D = 16 )
    (
    	input                 aclr,
    	input	  	          clock,
    	input [(WIDTH_D-1):0] data,
    	input	  	          rdreq,
    	input	              wrreq,
    // -----------------------------------
    	output [(WIDTH_D-1):0] q,
    	output [(WIDTH_U-1):0] usedw
    );
    
    	scfifo scfifo_component (.aclr (aclr),	.clock (clock),	.data (data), .rdreq (rdreq), .wrreq (wrreq), .usedw (usedw), .q (q), .almost_empty (),	.almost_full (), .empty (), .full (), .sclr ());
    	
    	defparam
    		scfifo_component.add_ram_output_register = "OFF",
    		scfifo_component.intended_device_family  = "Stratix III",
    		scfifo_component.lpm_numwords            = 2**WIDTH_U,
    		scfifo_component.lpm_showahead           = "OFF",
    		scfifo_component.lpm_type                = "scfifo",
    		scfifo_component.lpm_width               = WIDTH_D,
    		scfifo_component.lpm_widthu              = WIDTH_U,
    		scfifo_component.overflow_checking       = "ON",
    		scfifo_component.underflow_checking      = "ON",
    		scfifo_component.use_eab                 = "ON";
    
    endmodule
     
  20. 14 minutes ago, RobFPGA said:

    Приветствую!

    Ах, наивная молодежжжжж.  Вылизанные IP-коры ... :cray2:,  GUI ..., генерируются...,  :bad:  А теперь  все то же самое повторить для других параметров корок (которые к тому же часто автоматом рассчитываться при синтезе),  для другого чипа, для другого вендора FPGA. :mega_shok:

    Удачи! Rob.

    За "молодёжь", спасибо за комплимент, но увы :(

    20 лет уже плисоводством занимаюсь и на Альтере и на Ксайлинксе и даже других вендоров успел попробовать. Много раз приходилось портировать проект с семейства на семейство, но ни разу за всю карьеру не встречался с необходимостью поменять вендора под один и тот же проект. А с семейства на семейство, например, в новых версиях Квартуса вообще автоматически происходит апдейт всех кор, проблем практически не возникает. Всю свою карьеру даже для элементарных вещей (типа сумматоров, счётчиков или постоянных) генерю корки - всё прекрасно работает.

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

    Но, в прочем, никому не навязываю - каждый ходит по своим граблям.

  21. On 5/17/2019 at 4:12 PM, Doka said:

    разве прагма (* srl_style = "block" *) не должна работать принудительно?

    https://fpgawiki.intel.com/wiki/Mapping_SRLs_to_registers,_MLABs,_or_Block_RAMs

    Никогда не мог понять желание всё подряд писать руками и обвешивать атрибутами синтеза, к-рые, на самом деле синтезатор Квартуса игнорит только в путь. Для таких задач специально сделаны удобные и вылизанные IP-коры или мегафункции.

    Всё можно настроить как из удобного gui, так и скриптом. Всё грамотно подключается и прописывается, генерятся примеры, поддержка в Моделсиме уже на готове. Зачем каждый раз велосипед изобретать?

     

    Shifter.jpg