Jump to content

    
Sign in to follow this  
Zalman_

IP-ядро FIR II в Quartus Prime 18.0 Standard Edition

Recommended Posts

Всем доброго времени суток!

Никогда ранее не обращался на форумы, но в данной ситуации ответа на свой вопрос в Сети не смог найти.

Кратко введу в курс дела.

Использую: 
1) САПР для проектирования на ПЛИС - Quartus Prime Standart Edition 18.0.0 build 614
2) САПР для симуляции Verilog кода - ModelSim INTEL FPGA Starter Edition 10.5b Revision: 2016.10. (Данная версия поставляется вместе с Quartus на сайте https://fpgasoftware.intel.com/)
3) Для проверки результатов симуляции использую MATLAB 9.8 (2020a). В MATLAB на данный момент использую Signal Analyzer для просмотра спектра сигналов полученных в результате работы программного(-ых) модулей.

Все программные модули пишу на Verilog (начал его изучать первым, на данный момент с VHDL знаком лишь отчасти). 

Опыт. Увлекся ПЛИС на 3 курсе университета. Специальных предметов по тематике ПЛИС на моем направлении не было, поэтому изучал все по видео/статьям/книгам/форумам.
Увлечение переросло в желание написать диплом по ПЛИС. Таким образом, знаком с ПЛИС в районе 1,5 лет, из которых в учебное время не было слишком серьезных задач, а если и были, то решались они для моего уровня так, как мог их решить (костыли и тд). Вторым увлечением была ЦОС, в которой знания и опыт черпал из тех же источников, что и по тематике ПЛИС.

Сейчас же появилась задача следующего плана.
Занимаюсь QPSK демодуляцией.
Разделим данный процесс на 3 этапа
1) Использование гетеродина для переноса на более низкую частоту. Тут все как обычно. Гетеродин и два умножителя для двух каналов (синфазного и квадратурного). 
2) Децимация. Перед непосредственно реализацией дециматора окунулся в эту тематику. Знаком с статьей Hogenauer'a, а также с другой информацией на эту тему (ru.dsplib.org,  dspguru.com), а также информацией с других сайтов. Имея начальное представление решил попробовать сделать, в итоге все получилось и CIC-фильтр работает так, как и ему положено.
3) Фильтрация. Компенсация искажений АЧХ после CIC-фильтра и последующая низкочастотная фильтрация.
Так как в качестве САПР для проектирования на ПЛИС я использую Quartus, то было решено не использовать MATLAB без необходимости и решить задачу децимации и фильтрации с помощью встроенных в Quartus IP-ядер, а именно CIC и FIR II.

В процессе работы с ядром проектирования CIC фильтра, есть возможность (ядро само сделает все необходимые файлы) сделать примерный вариант CIC фильтра, учитывая имеющиеся параметры. Одним из файлов является код MATLAB, который позволяет рассчитать коэффициенты компенсирующего FIR фильтра. В процессе выполнения скрипта задается количество и "битность" коэффициентов фильтра, а также
 - "FIR filter sample rate in Hz before decimation (80e6 as default): 20e6 (я указал 20 МГц)", что говорит нам о частоте дискретизации входного сигнала ПЕРЕД децимируюшим фильтром;
 - "FIR filter cutoff frequency in Hz (4e6 as default): 1.2 МГц". Частота среза компенсирующего FIR фильтра (в моем случае 1.2 МГц).
После чего скрипт формирует текстовый файл с коэффициентами корректирующего FIR фильтра, которые загружаются позже в ядре FIR II. Исходя из коэффициентов ядро автоматически строит АЧХ,ФЧХ и ИХ получившегося фильтра.
 

И вот мы дошли до самой сути моей проблемы. 
Все идет хорошо ровно до момента с компенсирующим FIR фильтром. 
По временным диаграммам в ModelSim (скриншот прикрепил) работа NCO, CIC и FIR фильтра прекрасна, то есть они работают и никто из них не простаивает и т.д. Ввиду того, что очень долго ковыряюсь с этой проблемой была сделана простая схема (скриншот из RTL Viewer из Quartus'а прикрепил), которая подает синусоиду с частотой 1 МГц и частотой дискретизации 20 МГц на вход CIC фильтра. 
Настройки CIC ядра:
    - Filter type - Decimator;
    - Number of Stages - 5; 
    - Differential Delay - 1 cycles
    - Rate change factor - 2;
    - Input data width - 12 bit
    - Output Rounding Method - Hogenauer Pruning;
    - Output data width - 12 bit.
Имея такие настройки CIC фильтр отлично отрабатывает и не искажает спектр в требуемом 1 МГц (скриншот прикрепил). 
Далее исходя из этих настроек был сделан скрипт, в котором задавал следующее:
    - Number of filter coefficients (31 as default): *оставил default значение*;
    - FIR filter sample rate in Hz before decimation (80e6 as default): 20e6;
    - FIR filter cutoff frequency in Hz (4e6 as default): 1.2e6
    - Number of bits to represent the filter coefficients (16 as default): *оставил default значение*.
После этого были сформированы коэффициенты и теперь надо настроить ядро FIR II.
Настройки в нем задавал следующие:
    - Filter Type - Single Rate;
    - Interpolation / Decimation Factor - 1;
    - Clock Rate  - 10 MHz;
    - Input Sample Rate (MSPS) - 10;
    - Coefficient Width - 16 bits;
    - Input Width - 12 bit;
    - Output Width - 14 bit;
    - Specifies whether to truncate or saturate the MSB - Truncation (аналогично для такого же параметра, но для LSB);
    - MSB Bits to Remove - 10;
    - LSB Bits to Remove - 9.
Если не обрезать MSB и LSB, то на выходе ядро рекомендует ширину в 33 бита, что много и существенной разницы между 14 и 33 битами я не увидел (при увеличении доли MSB в сигнале растет мощность в дБ на спектре и все). Да, я пробовал 33 бита, однако желательно уходит от такой большой разрядности.
    Имея такие настройки, мы имеем следующую картину в спектроанализаторе Signal Analyzer (скриншот прикрепил). Как видно из рисунков спектр после FIR фильтра больше похож на шум, чем на что-то осмысленное. 
    Промучавшись долго с этим ядром я решил, что необходимо попробовать сделать CIC и FIR в MATLAB и сравнить результат. 
    При даже меньшей разрядности FIR фильтр выдал необходимый мне спектр и отработал так, как я и хотел (аналогично и CIC) (скриншот сравнения MATLAB'овского компенсирующего FIR и генерируемого ядром не смог прикрепить, однако и видно даже на первый взгляд, что разница имеется). 

    Таким образом, вопрос. Знает ли кто-то в чем заключается проблема с FIR II ядром и почему (вроде бы нигде не ошибаясь) я получаю такой отрицательный результат?
 

Заранее благодарю за уделенное время и оказанную помощь

Что получилось загрузить 
 

CIC_IP_FIR_IP_12bit_output.png

CIC_IP_FIR_IP_14bit_output.png

MATLAB Filter's.png

ModelSim.png

Share this post


Link to post
Share on other sites

Помню случай когда мне было лень ресет заводить на fir квартусовский и я туда 1'b1 поставил, а квартус что-то при компиляции выкинул и на выходе были одни шумы.

Share this post


Link to post
Share on other sites

Согласно документации на FIR II сигнал reset_n имеет активный ноль. То есть у меня FIR (как и CIC) находятся в состоянии сброса до тех пор, пока NCO не начнет генерировать сигнал. 
Насколько я понимаю, так фильтр и должен работать. 

Причем отмечу то, что при полной разрядности в 33 бита фильтр проявляет себя лучше (то есть спектр становится лучше). 
НО 33 бита это слишком большая разрядность. Отвечу сразу на вопрос. Да, я делал разные варианты "битности". То есть из предлагаемых мне 33 бит, выбирал отдельные куски (как в сторону LSB, так и в сторону MSB).
То, что я написал в самом начале (LSB = 9 MSB = 10 ) оказалось субъективно наиболее оптимальным вариантом.

22 минуты назад, Lmx2315 сказал:

Помню случай когда мне было лень ресет заводить на fir квартусовский и я туда 1'b1 поставил, а квартус что-то при компиляции выкинул и на выходе были одни шумы.


 

Share this post


Link to post
Share on other sites
10 минут назад, Zalman_ сказал:

 

в двух словах поясните - у вас связка NCO-CIC-FIR в моделсиме работает, а железе (буквально тоже самое!) нет? 

Share this post


Link to post
Share on other sites

Данная связка:
1) компилируется в Quartus без проблем
2) ModelSim моделирует без проблем
3) при анализе спектра в MATLAB (ModelSim записывает в .txt файл выходные значения сигналов с выхода NCO, CIC, FIR) FIR фильтр работает не так, как должен 

В железо не заливал даже
Это скорее "тестовый стенд" для того, чтобы попытаться понять почему у меня не работает FIR фильтр и как сделать так, чтобы он работал
Этот стенд никогда не попадет в железку)

 

Share this post


Link to post
Share on other sites
18 минут назад, Zalman_ сказал:

Данная связка:
1) компилируется в Quartus без проблем
2) ModelSim моделирует без проблем
3) при анализе спектра в MATLAB (ModelSim записывает в .txt файл выходные значения сигналов с выхода NCO, CIC, FIR) FIR фильтр работает не так, как должен 

т.е. он у вас уже в симуляции не работает. Сделайте тогда связку NCO-FIR и крутите её  (меняйте уровни сигналов на входе, частоту) пока не увидите что то на выходе путного.

Но если у вас на выходе ломовые шумы без сигнала на входе - то фильтр у вас уже не работает.

з.ы.

Кстати, когда в мастер FIR фильтра загружаете коэффициенты он строит АЧХ, она нормальная получилась?

Share this post


Link to post
Share on other sites
21 минуту назад, Lmx2315 сказал:

Кстати, когда в мастер FIR фильтра загружаете коэффициенты он строит АЧХ, она нормальная получилась?

И да и нет
При загрузке коэффициентов построение АЧХ, ФЧХ и ИХ действительно происходит, однако с АЧХ есть некоторый "фокус".
При проектировании фильтра в MATLAB я указываю, что "FIR filter cutoff frequency in Hz (4e6 as default): 1.2e6", однако, рассматривая АЧХ фильтра в IP ядре частота среза увеличивается в 2 раза. 
984507532_FIR_IP.thumb.png.c3a25ca893c90e0ebb3c6440ad736227.png

Вашу идею с связкой NCO-FIR сейчас тестирую (пока что результат отрицательный и на выходе нет явного пика на частоте в 1 МГц, хотя судя по АЧХ она там явно должна быть).

 

 

13 минут назад, des00 сказал:

есть же у вас коэффициенты импульсной, снимите характеристику фильтра и сравните реальное с ожидаемым

Спасибо за идею, попробую. По результатам напишу

Share this post


Link to post
Share on other sites
1 час назад, des00 сказал:

есть же у вас коэффициенты импульсной, снимите характеристику фильтра и сравните реальное с ожидаемым

Попробовал данный вариант.

Вот ИХ, которую отображается в ядре FIR II
1953595469_FIRII.thumb.png.778196e2b356b2c49ddb89b3145b059e.png


При моделировании в ModelSim получил следующее
359399376_ModelSim.thumb.png.1e220fe80796772dc5fb9b78eb3bbb7a.png
Видно, что вершина ИХ "инвертируется"

Вот с другого "ракурса" в MATLAB
1223025015_FIR.thumb.png.5d1a336a3a3b5640c9b48fd26343fd81.png


К вопросу о "Но если у вас на выходе ломовые шумы без сигнала на входе - то фильтр у вас уже не работает."
Как видно из ModelSim при отсутствии сигнала на входе, выходной сигнал равен 0
166173280_.thumb.png.448ac7124c16ad58cd67281864035a6c.png

Share this post


Link to post
Share on other sites

Выведите ещё раз ИХ фильтра.

При этом  в самом фильтре оставьте полную разрядность, чтобы быть уверенными что мы видим реальную ИХ, а не артефакты кривого обрезания разрядности по выходу.

Share this post


Link to post
Share on other sites
19 minutes ago, Zalman_ said:

Видно, что вершина ИХ "инвертируется"

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

Share this post


Link to post
Share on other sites
11 минут назад, Lmx2315 сказал:

артефакты кривого обрезания разрядности по выходу

 

6 минут назад, des00 сказал:

кто-то с разрядностью обсчитался сильно

Да, вы по всей видимости были правы с моей ошибкой в "битности" выходной шины
Вот так выглядит ИХ при полной разрядности в 33 бита
523344215_.thumb.png.e897dccb5f04ed4fe58375f607fa8824.png

Тогда напрашивается соответствующий вопрос
Где можно найти информацию о том, как не допускать таких ошибок в дальнейшем?
Точнее как правильно обрезать ненужные биты.
33 бита это хорошо, однако много на мой взгляд

 

Edited by Zalman_

Share this post


Link to post
Share on other sites
Just now, Zalman_ said:

Вот так выглядит ИХ при полной разрядности в 33 бита

вы еще наверное подали 2^InDataWidth, что дает максимальное отрицательное число, поэтому она у вас и инвертировалась) в общем, разберитесь с разрядностью и усилением фильтров.

ЗЫ. все равно у вас матлаб, систему в симулинке бы собрали и посмотрели все в сборе ;)

Share this post


Link to post
Share on other sites

Да, написал на входе FIR 12'heff
 

2 минуты назад, des00 сказал:

разберитесь с разрядностью и усилением фильтров.

Благодарю за помощь и совет

И назрел вопрос 

Имеет ли смысл так сильно гнаться за ядрами фильтров, если можно сделать фильтр в том же MATLAB?

 

Share this post


Link to post
Share on other sites
11 minutes ago, Zalman_ said:

Имеет ли смысл так сильно гнаться за ядрами фильтров, если можно сделать фильтр в том же MATLAB?

кому как, обычный фир, с нуля и без опыта пишется за пару часов разных архитектур. С опытом 15 минут. Потом уже используете свою библиотеку в проектах как хотите)

ЗЫ. Это в любом случае лучше сделать, чтобы лучше себе представлять FIR кухню)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this