Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Хочу построить КВ трансивер на ПЛИС, что для этого нужно?
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Страницы: 1, 2
Aleksandr Vihorev
Я хочу выполнить приемно-передающий тракт на ПЛИС. Использовать хочу Spartan3E XC3S500, в качестве среды разработки - ise10.1. Что-то другое я использовать не хочу - у меня старый компьютер с Windows XP, мне не нужны обновления среды разработки? BGA монтаж и все в таком духе. Это я считаю нужным написать, чтобы не было ответов вроде - "Есть лучше" "Сейчас уже используют...".
Насчет моих знаний - я работал с 8-бит AVR на Си и создавал контроллеры для самодельных радиостанций, так чтобы вам можно было судить об уровне, размер программ составлял около 20 КБ.
С аппаратной частью ПЛИС почти разобрался - самостоятельно выполнил плату с ПЛИС, флеш-памятью, которая почему-то не работает, возможно дело в напряжении питания - не нашел стабилизаторов 1,1 вольта и поставил 1,8. Сама ПЛИС прошивается, для отработки простых примеров программирования этого хватало.
Некоторые математические алгоритмы моделировал в EXEL, MATHLABом не владею. Если необходимо, дайте пожалуйста ссылку.
На ПЛИС выполнил генератор пилообразного напряжения,
генератор синусоиды с рассчетом по методу рядов, который работал не совсем правильно,
генератор синусоиды на CORDIC, который работал значительно лучше
выходной сигнал поступал на 12-бит ЦАП, и далее на вход компьютера где была установлена программа со спекторскопом.
У меня возникли следующие вопросы
Где можно недорого приобрести
- АЦП 16-бит
- Тактовый генератор на частоту более 50 МГц с высококачественным выходным сигналом, чтобы качества было достаточно для построения радиотракта, работающего на частотах до 30 МГц (охватывал весь КВ диапазон и более низкочастотные диапазоны)
- Саму ПЛИС и Flash-память, где покупал, уже нет.
- ЦАП необходимой разрядности (пока не знаю какой) для радиопередающего тракта, для приемного тракта у меня есть 12-бит ЦАП, преобразующий цифровой поток в сигнал звуковой частоты
Работаю в VHDL, изучать другой язык потому что кому-то он кажется лучше я, как можно понять не буду. Пусть даже у VHDL есть свои недостатки. Это чтобы лишних сообщений с советами не было. Спасибо за понимание.

- Как быстро освоить 32-бит Микроконтроллеры, затратив не более 4 тыс. руб, чтобы при этом иметь:
- нормальный, пусть и китайский, но работающий программатор, который видит среда разработки
- Среду разработки. Желательно на Си
- Микроконтроллеры в количестве 2-3 шт.
Пусть это будет не самое новое и продвинутое, но должно нормально запускаться и работать на старом компьютере с Windows XP.
Компьютер - частота около 2 Ггц, 2 Гб оперативной памяти, 4 ядра, возможности компьютера позволяют и Windows 7 установить, но не хочу

Пользоваться визардами я не хочу, хочу писать код самостоятельно - потому что, можно сгенерировать CORDIC в визарде, а потом тупить и думать как выполнить ячейку CIC фильтра. Или вообще интерфейс для АЦП или ЦАП или управления трактом - вот для этого уже вряд ли визард легко найти. Поэтому если есть ссылки на примеры кодов модулей генераторов на алгоритме CORDIC - можете дать ссылки. Особенно полезны разные методички, если у кого есть

Вобщем это пока все вопросы, уровень образованности у меня, как вы понимаете, любительский
count_enable
Цитата(Aleksandr Vihorev @ Oct 15 2015, 12:01) *
...
У меня возникли следующие вопросы
Где можно недорого приобрести
- АЦП 16-бит
...
В Барселоне на ул. Луначарского есть телеателье, там хозяин торгует дефицитными деталями из-под полы. Если вам далеко до Барселоны, то пожалуйста укажите свою локацию, чтобы народ понимал что советовать.

Цитата(Aleksandr Vihorev @ Oct 15 2015, 12:01) *
...
- Как быстро освоить 32-бит Микроконтроллеры, затратив не более 4 тыс. руб, чтобы при этом иметь:
- нормальный, пусть и китайский, но работающий программатор, который видит среда разработки
- Среду разработки. Желательно на Си
- Микроконтроллеры в количестве 2-3 шт.
...
За эквивалент 20-30 евро покупается плата STM32F4 Discovery, имеющая на борту весьма мощный процессор, программатор-отладчик и вполне качественный аудио ЦАП и микрофон. Ставится среда разработки CooCox, бесплатная и простая в использовании для новичков. Документации и примеров - вагон. И пожалуйста, перебросьте этот вопрос в раздел "Микроконтроллеры", он здесь неуместен.


Цитата(Aleksandr Vihorev @ Oct 15 2015, 12:01) *
...
Пользоваться визардами я не хочу, хочу писать код самостоятельно - потому что, можно сгенерировать CORDIC в визарде, а потом тупить и думать как выполнить ячейку CIC фильтра. Или вообще интерфейс для АЦП или ЦАП или управления трактом - вот для этого уже вряд ли визард легко найти. Поэтому если есть ссылки на примеры кодов модулей генераторов на алгоритме CORDIC - можете дать ссылки. Особенно полезны разные методички, если у кого есть
Визардами никто и не пытается заменить мозги, но использовать уже готовые наработки/ библиотеки - правильно и похвально. Вы stdlib тоже будете свою писать?
litv
например http://habrahabr.ru/post/204310/

"все уже украдено до нас"
Maverick
Цитата(Aleksandr Vihorev @ Oct 15 2015, 11:01) *
Я хочу выполнить приемно-передающий тракт на ПЛИС.
Некоторые математические алгоритмы моделировал в EXEL, MATHLABом не владею. Если необходимо, дайте пожалуйста ссылку.
Вобщем это пока все вопросы, уровень образованности у меня, как вы понимаете, любительский

ссылка
генерит vhdl/verilog описание - пользоваться просто...
des00
Были бы в Томске я бы вам плату модема с разбора подарил. Немного правда дособрать бы пришлось sm.gif
agregat
Фраза "ПЛИС, флеш-памятью, которая почему-то не работает, возможно дело в напряжении питания - не нашел стабилизаторов 1,1 вольта и поставил 1,8" это прям перл какой то.
Походу кто то из старожилов решил народ потроллить.
Aleksandr Vihorev
Нахожусь в г. Кемерово. Насчет напряжений питания - все на полном серьезе, я вначале вообще с ними перепутал, потом начал искать ошибку и обнаружил, что использовал стабилизатор на не то напряжение, а на которое нужно, у меня все равно не было и я просто не стал ничего менять

Цитата(count_enable @ Oct 15 2015, 11:38) *
В Барселоне на ул. Луначарского есть телеателье, там хозяин торгует дефицитными деталями из-под полы. Если вам далеко до Барселоны, то пожалуйста укажите свою локацию, чтобы народ понимал что советовать.

За эквивалент 20-30 евро покупается плата STM32F4 Discovery, имеющая на борту весьма мощный процессор, программатор-отладчик и вполне качественный аудио ЦАП и микрофон. Ставится среда разработки CooCox, бесплатная и простая в использовании для новичков. Документации и примеров - вагон. И пожалуйста, перебросьте этот вопрос в раздел "Микроконтроллеры", он здесь неуместен.


Визардами никто и не пытается заменить мозги, но использовать уже готовые наработки/ библиотеки - правильно и похвально. Вы stdlib тоже будете свою писать?

Нахожусь в городе Кемерово. Насчет отладочных плат - я хочу отдельный программатор, и микроконтроллер, смонтированный на самодельной плате, плата с разнообразными обвесами и встроенным программатором мне не нужна - потом ломай голову как собирать свое устройство
count_enable
STM32F4-Discovery это и удобная отладочная плата, и фирменный программатор-отладчик (внешние мк подцепляются 4 проводками) в одном за смешные деньги. Или вы настолько суровы что изучаете новые МК прямо впаянными в собственную плату? В семействе STM32 совместимость вполне удовлетворительна, и на этой плате можно отладить алгоритмы для процессоров STM32F1-F4, начиная от младших моделей по доллару штука. Продаются они сейчас в каждом лабазе: Чип-и-Дипе, Элитане, и проч. и проч.
То же с АЦП. Определяйтесь с битностью, скоростью и типом интерфейса, потом смотрите сайты онлайн-магазинов у кого есть требуемое.
Genadi Zawidowski
Проект (исходники всего, ключая FPGA) тут: https://188.134.5.254/browser/trunk
Кидайте в личку e-mail, будет доп информация.
Проект на Альтере, 22-х тысячный циклон 4-й и STM32F4/F7
Цитата
Саму ПЛИС и Flash-память,

Я загружаю fpga при старте процессора - знаете, очень удобно в эксплуатации...

https://cloud.mail.ru/public/C4Hy/3Aqha9fcR
Aleksandr Vihorev
Цитата(Genadi Zawidowski @ Oct 15 2015, 17:39) *
Проект (исходники всего, ключая FPGA) тут: https://188.134.5.254/browser/trunk

Ссылка не открывается
Genadi Zawidowski
У меня открывается...




Только FIR сейчая 961
qwa
Просто любопытно: коэффициенты фильтров вычислять на бумажке планируете?
Aleksandr Vihorev
Цитата(qwa @ Oct 15 2015, 17:01) *
Просто любопытно: коэффициенты фильтров вычислять на бумажке планируете?

А я вообще про это еще ничего не читал, мне это даже не говорит ни о чем - я же писал, что начал только изучать ПЛИС. Если Матлаб обязательно нужен, то буду использовать Матлаб
Genadi Zawidowski
у когонибудь открывается ссылка?
Судя по сообщениям "в контакте", топикстартер уже год с идеей носится, примерно сколько и я...
Вот чтобыло у меня год назад (почти на синей изоленте собрано, STM32F429+QS1R, я начал с DSP работать три месчца до того):
qwa
Цитата(Genadi Zawidowski @ Oct 15 2015, 20:16) *
у когонибудь открывается ссылка?

Открывается
Genadi Zawidowski
Кто бы присоединился к разработке? Из животрепещущих проблем - разработать FIR фильтр для разрядностей больше чем 32.
to Aleksandr Vihorev: письмо отправил
Timmy
Цитата(Genadi Zawidowski @ Oct 15 2015, 21:23) *
Кто бы присоединился к разработке? Из животрепещущих проблем - разработать FIR фильтр для разрядностей больше чем 32.
to Aleksandr Vihorev: письмо отправил
Интересно, для понадобился такой точный фильтр?
Genadi Zawidowski
Сейчас фильтр со входной разрядностью 32 бита (ограничено используемой IP FIR COMPILER).
1) АРУ сделано за фильтром, приблизительно 90 дБ. Хотелось чуть-чуть больше.
2) хотелось отодвинуть шумы округления подальше. Хоть на 4 разряда.

Для обработки таких данных возможно будет уже использоваться CPU с аппаратной поддержкой 64-bit плавучки. Соответственно, преобразование целочисленных в double будет перенесено в FPGA.

Это "хотелки" не моделировались.
Timmy
Цитата(Genadi Zawidowski @ Oct 16 2015, 11:30) *
Сейчас фильтр со входной разрядностью 32 бита (ограничено используемой IP FIR COMPILER).
1) АРУ сделано за фильтром, приблизительно 90 дБ. Хотелось чуть-чуть больше.
2) хотелось отодвинуть шумы округления подальше. Хоть на 4 разряда.

Для обработки таких данных возможно будет уже использоваться CPU с аппаратной поддержкой 64-bit плавучки. Соответственно, преобразование целочисленных в double будет перенесено в FPGA.

Если плясать от входных данных, например, у нас 100МГц АЦП 16 бит. Понизив частоту на CIC звене до 1КГц, мы повысим точность сигнала в sqrt(100000)->330 раз, то есть добавится примерно 8 бит - всего будет 24. 32 бита тут проходят с большим запасом точности.
soldat_shveyk
Цитата
АРУ сделано за фильтром, приблизительно 90 дБ. Хотелось чуть-чуть больше

Genadi, а какая у Вас полоса пропускания фильтра, который 32 бита и стоит перед АРУ?
Что-то 90 дБ уж очень маленькая цифра, должно быть 110..120 дБ.
Genadi Zawidowski
ФНЧ сформирован в FPGA, меняет полосу от 50 до 6000 герц. При 48 кГц sample rate от CIC и 961 порядке нормально получается частота среза ФНЧ от 100 герц.
soldat_shveyk
Цитата
нормально получается частота среза ФНЧ от 100 герц.

Значит полоса приема для комплексного сигнала будет 200 Гц.
Допустим, у Вас частота дискретизации 100 МГц (кстати, сколько на самом деле?) и АЦП имеет SNR=80 дБ.
Тогда SNR на выходе фильтра будет 80 + 10*Log(50000/0.2) = 134 дБ.
Для такого динамического диапазона будет достаточно (134/6) + 2 = 24 разряда.
Если не хватает 32-х разрядов, значит проблема лежит не там где Вы ее ищите.
soldat_shveyk
У меня в одном старом приемнике для полосы 3.1 кГц было сделано АРУ на диапазон 111 дБ при отклонении амплитуды на выходе не более чем на 0.2 дБ.
На вход АРУ поступал 26-битный комплексный сигнал. Никаких 32-х бит и тем более float, double не было и в помине.
diwil
Я тоже пробовал и сделал.

НО! дешево _не_ _получится_.

У меня на то, что на картинке ушло сильно больше денег - раз в 10 больше, чем изначально планирует автор.
При этом весь код написан самостоятельно.
И АЦП (2208 известного производителя) куплено за 800рэ.
и изернета нет (ибо автомобильный вариант)

Так что рассчитывать, по моему опыту, надо на примерно $700-800 , при условии, что все получится с первого раза.



Genadi Zawidowski
АЦП тактируется 122.88 МГц или 100 МГц. CIC на 2560 - до 48 кГц.
Цитата
У меня в одном старом приемнике для полосы 3.1 кГц было сделано АРУ на диапазон 111 дБ при отклонении амплитуды на выходе не более чем на 0.2 дБ.
На вход АРУ поступал 26-битный комплексный сигнал. Никаких 32-х бит и тем более float, double не было и в помине.

Использую два режима АРУ - описанный Вами "плоский" и"спортивный" - с нормированным приращением выходного сигнала на изменение входного - на 10 дБ изменения с антенны - 1 дБ изменения выходного.
В основном канале - спортивный, в дополнительном - плоский. Для АМ - всегда плоский.
Обработка сигнала (перенос на звуковую частоту) делается целочисленными операциями, АРУ использует float.

зы: вот оказыается сколько нас - тех, которые хотят построить трансивер (или приёмник) на ПЛИС!

Вот вопрос - а где я ошибаюсь, пркидывая возможный диапазон регулировки как разность разрядности выхода FIR фильтра и разрядности аудикодека?
И по комплектующим - сейчас использую кодек TLV320AIC23, кто что скажет про NAU8822L (NAU8822A)?
One
Цитата(Genadi Zawidowski @ Oct 16 2015, 23:54) *
... вот оказыается сколько нас - тех, которые хотят построить трансивер (или приёмник) на ПЛИС!
...

bb-offtopic.gif а сколько еще только просматривает тему ...
diwil
Цитата(Genadi Zawidowski @ Oct 16 2015, 23:54) *
Вот вопрос - а где я ошибаюсь, пркидывая возможный диапазон регулировки как разность разрядности выхода FIR фильтра и разрядности аудикодека?
И по комплектующим - сейчас использую кодек TLV320AIC23, кто что скажет про NAU8822L (NAU8822A)?


скорее всего в том, что разрядность ЦАП звукового кодека и фильтра не имееют ничего общего.
далее вопрос - с какой целью делать АРу?
облегчить жизнь детектору? ему в цифре легче не станет.
Лучше слышать? тогда АРУ дОлжно быть после детектора, включающего шумодав и воис активити детектор.
Т.е. глубина АРУ может быть любой, но легче в смысле S/N не станет. Главно чтобы слышно было. Т.е. делать продетектированный сигнал в полный размах аудио ЦАПа.

и еще - бит эдак 20и хватит для всего. Не надо думать о 32х. Ибо, даже 24 бита, при макс размахе на входе ацп 2В дадут -182дБм на 50 Ом на 1Гц. дальше, думаю, понятно...

Aleksandr Vihorev
Цитата(Genadi Zawidowski @ Oct 15 2015, 19:23) *
Кто бы присоединился к разработке? Из животрепещущих проблем - разработать FIR фильтр для разрядностей больше чем 32.
to Aleksandr Vihorev: письмо отправил

Письмо пришло, ссылка тоже открылась. Только я пока еще только разбираюсь в приемах работы с ПЛИС, для меня важен не столько сам радиотракт, сколько разобраться и научиться выполнять на ПЛИС хоть какие-нибудь устройства. Хотя бы низкочастотный сигнальный процессор радиотракта - поэтому стараюсь обходиься без визардов и писать код самостоятельно. Я, правда выбрал Xilinx - приобрел программатор и сами микросхемы

Насколько я понимаю, исходя из поих познаний - разработать модуль на разрядность более 32 - это "собрать"его составляющие - умножители, сумматоры и т.д. из отдельных логических элементов. Я приобрел книгу по VHDL - там примеры разбирались именно в таком ключе. Автор - Бибило. Правда, такое построение громоздко, наверно. Ну и конечно я немного охренел, увидев, что то, что описано в книге отличается от приемов работы в ise, но это, наверно обычное дело. Хотя бы то, что нужно преобразовывать векторы в переменные, а библиотеки для этого по умолчанию подключаются не те. Занятие оказалось трудоемким. Пока нужный ответ в интернете найдешь
Genadi Zawidowski
На мой взгляд, если знаете чего хотите получить от визарда - вполне можно пользоваться.
Хотите писать на VHDL - соединяйте сгенерированные визардами блоки в обрабатывающий тракт.
Да хоть SPI SLAVE напишите... А написание триггера (или сдвигового регистра) из логических элементов просто перегрузит разработчика - это ответ про громоздкость. Тем более что тут триггер это уже существующий базовый элемент.
Golikov A.
VHDL и библиотеки - это известный дракон... И он многоглавый, потом еще конфликты между библиотеками пойдут и прочееsm.gif.... как то реально не с того конца вы начали, ну да ладно... все же лучше чем водку питьwink.gif
Aleksandr Vihorev
Цитата(Golikov A. @ Oct 17 2015, 22:31) *
VHDL и библиотеки - это известный дракон... И он многоглавый, потом еще конфликты между библиотеками пойдут и прочееsm.gif.... как то реально не с того конца вы начали, ну да ладно... все же лучше чем водку питьwink.gif

Почему не с того конца? Я нашел формулы итераций CORDIC, промоделировал его в Exel, начал писать код модуля в VHDL и появились вопросы, как преобразовать integer в вектор и наоборот, на поиски ответа на которые я потратил много времени и моих экспериментов. Была бы литература именно по теме построения радиотрактов - было бы легче. С чего начинать-то тогда? Светодиодами я уже помигал
soldat_shveyk
Цитата
Вот вопрос - а где я ошибаюсь, пркидывая возможный диапазон регулировки как разность разрядности выхода FIR фильтра и разрядности аудикодека?


Если не вдаваться в тонкости, то АРУ нужна чтобы любой сигнал на входе приемника привести к номинальной громкости.
Минимально возможный сигнал - это уровень собственного шума приемника в полосе выбранного фильтра.
Для слухового приема в полосе 3.1 кГц, если АЦП 122.8 МГц дает SNR 80 дБ, то уровень собственного шума будет
-80-10Log(61400/3.1) = -123 дБ. Значит для режима 3.1 кГц потребуется усиление не больше 123 дБ.
Разрядность и тип кодека значение не имеет. Будет нормально работать и на 12 битах.
Разрядность АЦП/ЦАП кодека больше 16 бит явно избыточна для этой задачи.

Геннадий, а в чем "фишка" спортивного АРУ по сравнению с "плоской"?
Genadi Zawidowski
Для радиолюбительского приёма не "плоское" АРУ считаетсяя предпочтительным.
Попытаюсь объяснить тем, что меньше меняется фоновый шум эфира - так как усиление меняется на меньшие значения - меньше утомляет оператора,
при необходимости можно оценить мощность сигнала на слух (и именно по сигналу, а не по степени пропадания шумов или по показаниям индикатора).
Всё сказанное - про телеграф (амплитрудная манипуляция) и однополосную модуляцию. В AM АРУ плоское, а для ЧМ вычисления делаются над квадратурами после FIR без какого-либо нормирования. И в BPSK тоже...
dm.pogrebnoy
Цитата(Aleksandr Vihorev @ Oct 18 2015, 01:40) *
появились вопросы, как преобразовать integer в вектор и наоборот, .


Оставлю эту ссылку здесь. https://www.doulos.com/knowhow/vhdl_designe...de/numeric_std/
Может кому-нибудь пригодится.
Шаманъ
Цитата(Genadi Zawidowski @ Oct 16 2015, 11:30) *
Сейчас фильтр со входной разрядностью 32 бита (ограничено используемой IP FIR COMPILER).
1) АРУ сделано за фильтром, приблизительно 90 дБ. Хотелось чуть-чуть больше.
2) хотелось отодвинуть шумы округления подальше. Хоть на 4 разряда.


У меня коэффициенты 24бита, данные 48бит, диапазон АРУ более 130дБ. Правда это не на ПЛИС и не с DDC, но разницы применительно к данному вопросу не вижу. 24бита для наших применений было однозначно мало, 32 по идее должно хватать. У меня выбор был 24 или 48, т.к. процессор 24битный.

Цитата(Genadi Zawidowski @ Oct 16 2015, 13:24) *
ФНЧ сформирован в FPGA, меняет полосу от 50 до 6000 герц. При 48 кГц sample rate от CIC и 961 порядке нормально получается частота среза ФНЧ от 100 герц.

А почему не хотите сделать фильтрацию на более низкой частоте дискретизации? При такой структурной схеме вообще логично по мере сужения полосы понижать частоту дискретизации. У меня на 12кГц и 50Гц с красивой АЧХ получается.
~Elrond~
У нас в КВ-радиостанции используется 16-битная АЦП на тактовой 80 МГц. Написанный мной (к слову, вообще без применения всяких корегенераторов) в ПЛИС DDC имеет следующие ступени:
1) HPF(high-pass filter) - удаляет постоянку. На выходе 18 бит.
2) Генератор комплексной синусоиды на основе LUT+коррекция разложением в ряд Тейлора 1 порядка (теория подробно описана у xilinx). SFDR 112dB, выход 18 бит. CORDIC в этом месте не рекомендую, так как его конвейерная реализация для достижения аналогичного SFDR потребует примерно в 20 раз больше логических ячеек. Мой вариант на cyclone III занимает 180 ячеек, 3 умножителя 18х18 и один блок памяти.
3) Перенос на нулевую частоту. Результат комплексного умножения обрезается с 36 до 24 бит.
4) CIC 6 ступеней, понижает частоту дискретизации в 125 раз до 640 кГц. Вход 24-битный, выход 32. CIC изначально генерился из матлаба, потом я его переписал в виде красивого параметризованного модуля.
Вся дальнейшая обработка только в 32-битной разрядности.
5) Полифазный FIR дециматор x3/10 240 порядка. Понижает частоту дискретизации до 192 кГц. Полоса +-60 кГц. Вам столько вряд ли понадобится, но нам нужно для линеаризации усилителя. sm.gif Кстати сказать, этот модуль я на форуме выкладывал. Он имеет кучу параметров, поэтому я его применяю повсеместно, циферки только при инстанциировании меняю. Единственное что - он написан на SystemVerilog с использованием почти всех его новых-удобных фишек. sm.gif
6) FIR дециматор /4 100-го порядка. Понижает частоту дискретизации до 48 кГц. Полоса +-20 кГц. Вам опять же вряд ли понадобится многоканальность, поэтому тоже так много ни к чему.
7) "Расканаливание" на 4 канала.
8) 4-хканальный FIR дециматор /5. 90-го порядка. Понижает частоту дискретизации до 9.6 кГц.
9) 4-хканальный FIR селектор до 128-го порядка. Вырезает нужную полосу.
Дальше проц Blackfin забирает 32-битные данные каналов из ПЛИС, пропускает через АРУ (она сделана во float), и преобразует в fract_16.
Чувствительность приёмника в итоге получилась на уровне ~100 нановольт.

Передающий тракт в ПЛИС такой же, только наоборот. Ну, плюс авторегулировка мощности с линеаризацией на основе алгоритма NLMS. Как-то так. sm.gif
ЗЫ: крайне рекомендую бросить VHDL и изучать SystemVerilog.
diwil
Цитата(~Elrond~ @ Oct 20 2015, 18:58) *
У нас в КВ-радиостанции используется 16-битная АЦП на тактовой 80 МГц. Написанный мной (к слову, вообще без применения всяких корегенераторов) в ПЛИС DDC имеет следующие ступени:
1) HPF(high-pass filter) - удаляет постоянку. На выходе 18 бит.
2) Генератор комплексной синусоиды на основе LUT+коррекция разложением в ряд Тейлора 1 порядка (теория подробно описана у xilinx). SFDR 112dB, выход 18 бит. CORDIC в этом месте не рекомендую, так как его конвейерная реализация для достижения аналогичного SFDR потребует примерно в 20 раз больше логических ячеек. Мой вариант на cyclone III занимает 180 ячеек, 3 умножителя 18х18 и один блок памяти.
3) Перенос на нулевую частоту. Результат комплексного умножения обрезается с 36 до 24 бит.
4) CIC 6 ступеней, понижает частоту дискретизации в 125 раз до 640 кГц. Вход 24-битный, выход 32. CIC изначально генерился из матлаба, потом я его переписал в виде красивого параметризованного модуля.
Вся дальнейшая обработка только в 32-битной разрядности.
5) Полифазный FIR дециматор x3/10 240 порядка. Понижает частоту дискретизации до 192 кГц. Полоса +-60 кГц. Вам столько вряд ли понадобится, но нам нужно для линеаризации усилителя. sm.gif Кстати сказать, этот модуль я на форуме выкладывал. Он имеет кучу параметров, поэтому я его применяю повсеместно, циферки только при инстанциировании меняю. Единственное что - он написан на SystemVerilog с использованием почти всех его новых-удобных фишек. sm.gif
6) FIR дециматор /4 100-го порядка. Понижает частоту дискретизации до 48 кГц. Полоса +-20 кГц. Вам опять же вряд ли понадобится многоканальность, поэтому тоже так много ни к чему.
7) "Расканаливание" на 4 канала.
8) 4-хканальный FIR дециматор /5. 90-го порядка. Понижает частоту дискретизации до 9.6 кГц.
9) 4-хканальный FIR селектор до 128-го порядка. Вырезает нужную полосу.
Дальше проц Blackfin забирает 32-битные данные каналов из ПЛИС, пропускает через АРУ (она сделана во float), и преобразует в fract_16.
Чувствительность приёмника в итоге получилась на уровне ~100 нановольт.

Передающий тракт в ПЛИС такой же, только наоборот. Ну, плюс авторегулировка мощности с линеаризацией на основе алгоритма NLMS. Как-то так. sm.gif
ЗЫ: крайне рекомендую бросить VHDL и изучать SystemVerilog.


Я прошу прощения за вопросы, но мне интересно...

1. Нафига убирать DC на входе, если смеситель и так ее уберет?
2. По скольки точкам надо делать интерполяцию и какой степени, чтобы получить -118дБ SFDR ? Каков размер LUT?
3. Что делать с оставшимися 8ю битами в которых шум? (у меня в спектре сигнала, при наличии избыточных битов, появляется "забор", который смещает выход)
4. Что делать с 5ю битами в которых тоже непонатно какой шум? (125 раз это ~21дБ, значит реально вылезут только 3.5 информативных бита)
5. Что делать с 32я битами если:
допустим что макс размах сигнала на входе АЦП 2.25В. тогда в полосе 500Гц будет -147дБм шума, а диапазон, ограниченный шумом тогда 147+11 = 158 дБ полного размаха. А это 26 бит. Если надо слушать голос, то полоса +- 3-4кГц, а это уменьшит диапазон на 14дБ до 142дБ, а это получится 23 бита. Кстати, если сначала отфильтровать по 4кГц, а потом накапливать (для CW я полагаю), то это даже лучше чем фильтр.
6-9. ...


Спрашиваю, ибо у меня чудеса творятся... типа шума меньше, чем должно быть...


Шаманъ
Цитата(diwil @ Oct 20 2015, 20:34) *
2. По скольки точкам надо делать интерполяцию и какой степени, чтобы получить -118дБ SFDR ? Каков размер LUT?

Это наверное тот же алгоритм, которым я генерирую cos/sin (правда в DSP а не FPGA, но какая разница). Я использую первые три члена ряда, в итоге получается так:

sin(X+x)=sin(X)+cos(X)*x-sin(X)*x*x/2=sin(X)+x*(cos(X)-x*sin(X)/2)
cos(X+x)=cos(X)-sin(X)*x-cos(X)*x*x/2=cos(X)-x*(sin(X)+x*cos(X)/2)

sin(X) и cos(X) это табличные значения, остальное думаю понятно.

Если таблица на 256 значений, то макс. ошибку можно оценить так:
Код
          (PI/256.0)^3
R(3) < ---------------- = 3.08E-7
               3!

diwil
Цитата(Шаманъ @ Oct 20 2015, 21:19) *
Это наверное тот же алгоритм, которым я генерирую cos/sin (правда в DSP а не FPGA, но какая разница). Я использую первые три члена ряда, в итоге получается так:

sin(X+x)=sin(X)+cos(X)*x-sin(X)*x*x/2=sin(X)+x*(cos(X)-x*sin(X)/2)
cos(X+x)=cos(X)-sin(X)*x-cos(X)*x*x/2=cos(X)-x*(sin(X)+x*cos(X)/2)

sin(X) и cos(X) это табличные значения, остальное думаю понятно.

Если таблица на 256 значений, то макс. ошибку можно оценить так:
Код
          (PI/256.0)^3
R(3) < ---------------- = 3.08E-7
               3!


эээ... насколько я понимаю в этом случае разрядность sin/cos должна быть сравнима с разрядностью X+x.
т.е. если, скажем аккумулятор 28 бит, sin/cos должен быть тоже около того, чтобы был эффект.

конвеерная реализация чой-то в голову тоже пока не лезет...

в любом случае спасибо. буду пробовать.
~Elrond~
Шаманъ
Нет, таблица на 512 значений, и содержится в ней четверть круга [0..pi/2]. Остальные три четверти получаются путём нехитрых манипуляций с адресом и выходом, что даёт нам фактический размер в 2048 значений, то есть 11 бит от аккумулятора фазы. Ещё 18 бит используются для тейлоровской коррекции, три оставшихся игнорятся. Формулы следующие:
sin(X+x) = sin(X) + (x * PHASE_UNIT * cos(X));
cos(X+x) = cos(X) - (x * PHASE_UNIT * sin(X));
где PHASE_UNIT = (2 * pi / 2^11) * (2^25);
Здесь 11 - это разрядность X, а 25 - это расширение разрядности для того чтобы умножить fract18xfract18.
diwil
Цитата
1. Нафига убирать DC на входе, если смеситель и так ее уберет?
У нас нет аналогового смесителя, сигнал на несущей частоте подаётся на АЦП.
Цитата
2. По скольки точкам надо делать интерполяцию и какой степени, чтобы получить -118дБ SFDR ? Каков размер LUT?
Написал выше. У меня 112 dB, но этого вполне достаточно. Очень просто конвейеризуется, всего 4 ступени.
В дальнейших вопросы не понял, какие "лишние" биты вы имеете ввиду. У CIC-фильтра огромный коэффициент усиления, там на выходе, если его не обрезать, получается вообще 60+ бит.
Golikov A.
Я ошибаюсь или разложения в ряд Тейлора предполагает точку в окрестности которой мы имеем разложение, и один и тот же ряд зашарашить на весь диапазон не совсем корректно.
Мне больше понравилась идея с 2 таблицами, то есть четверть периода представляют кусочно линейной функцией ki*x(i) + bi, а в таблицах хранят коэффициенты к и b
~Elrond~
Golikov A.
Цитата
Я ошибаюсь или разложения в ряд Тейлора предполагает точку в окрестности которой мы имеем разложение
Точка определяется старшими битами аккумулятора фазы (в моём случае 11-ю). В таблице хранится четверть круга. А вторая таблица вам зачем, если суть метода как раз и заключается в уточнении табличных значений вычисленными членами ряда Тейлора?
Шаманъ
Цитата(~Elrond~ @ Oct 20 2015, 22:28) *
Шаманъ
Нет, таблица на 512 значений, и содержится в ней четверть круга [0..pi/2].

Так я просто привел пример реализации такого же алгоритма. Мне удобнее было сделать с теми размерами таблицы, как я описал (но с бОльшим числом членов ряда), но это ж все от железа зависит, но алгоритм одинаковый, и работает он очень хорошо. sm.gif
Golikov A.
Цитата
Точка определяется старшими битами аккумулятора фазы

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

Цитата
А вторая таблица вам зачем, если суть метода как раз и заключается в уточнении табличных значений вычисленными членами ряда Тейлора

ну собственно я говорил не про ряд тейлора,

стандартный табличный метод

sin(x) = Table1(x); из таблицы выбирается точка по координате для 10 битного Х нужна таблица на 256 значений (четверть круга)
теперь мы берем 16 битный x, 2 бита уйдут на определение четверти и остается 14 бит, так что получается нужна таблица на 16К ячеек, вместо этого можно сделать так
заводим 2 таблицы по 256 значений. Оставшиеся 14 бит мы делим на 8 старших и 6 младших. по 8 старшим из таблицы выбираем к и b, собственно b - это наша первая таблица,
а k - это коэффициент наклона между b(i) и b(i+1). И считаем sin(x) = Table1(XH) + Table2(XH)*XL/(2^6), естественно деление на 2 в 6 надо уже в таблице сохранить, чтобы надо было только умножить на XL.

Что-то мне говорит что вы делаете тоже самое, только называете это тейлоровским уточнением%)
diwil
Цитата(~Elrond~ @ Oct 20 2015, 22:28) *
Шаманъ
Нет, таблица на 512 значений, и содержится в ней четверть круга [0..pi/2]. Остальные три четверти получаются путём нехитрых манипуляций с адресом и выходом, что даёт нам фактический размер в 2048 значений, то есть 11 бит от аккумулятора фазы. Ещё 18 бит используются для тейлоровской коррекции, три оставшихся игнорятся. Формулы следующие:
sin(X+x) = sin(X) + (x * PHASE_UNIT * cos(X));
cos(X+x) = cos(X) - (x * PHASE_UNIT * sin(X));
где PHASE_UNIT = (2 * pi / 2^11) * (2^25);
Здесь 11 - это разрядность X, а 25 - это расширение разрядности для того чтобы умножить fract18xfract18.
diwil
У нас нет аналогового смесителя, сигнал на несущей частоте подаётся на АЦП.Написал выше. У меня 112 dB, но этого вполне достаточно. Очень просто конвейеризуется, всего 4 ступени.
В дальнейших вопросы не понял, какие "лишние" биты вы имеете ввиду. У CIC-фильтра огромный коэффициент усиления, там на выходе, если его не обрезать, получается вообще 60+ бит.


мне казалось, что перенос на нулевую частоту и есть смеситель...

... усиление это да... это хорошо...

в любом случае спасибо. буду пробовать.
~Elrond~
Ради интереса сделал генератор с применением ряда Тейлора 2 порядка. Результаты по сравнению с 1 порядком:
1) Выигрыш по SFDR 20 дБ (132 против 112).
2) По занимаемым LUT - в 2.5 раза больше.
3) По занимаемой памяти - в 2 раза больше.
4) По умножителям - в 3.3 раза больше.
По-моему, для большинства случаев оно того не стоит. И если занимаемую память можно сократить в 2 раза (уменьшив таблицу), то с остальным ничего не поделать.
Шаманъ
Цитата(~Elrond~ @ Oct 21 2015, 16:33) *
Ради интереса сделал генератор с применением ряда Тейлора 2 порядка. Результаты по сравнению с 1 порядком:
1) Выигрыш по SFDR 20 дБ (132 против 112).
2) По занимаемым LUT - в 2.5 раза больше.
3) По занимаемой памяти - в 2 раза больше.
4) По умножителям - в 3.3 раза больше.
По-моему, для большинства случаев оно того не стоит. И если занимаемую память можно сократить в 2 раза (уменьшив таблицу), то с остальным ничего не поделать.

А таблица какого размера была?
~Elrond~
Для 1 порядка - 512х18бит.
Для 2 порядка - 512х32бит.
В таблице четверть круга.

Уменьшил таблицу в 2 раза - потерял 18 дБ (на 2 порядке).
Шаманъ
Цитата(~Elrond~ @ Oct 21 2015, 18:51) *
Уменьшил таблицу в 2 раза - потерял 18 дБ (на 2 порядке).

18дБ ожидаемо (там будет кубическая зависимость от размера таблицы), мне не понятно почему SFDR такой маленький у Вас выходит. Ведь имея таблицу в 1024элемента на 180градусов, максимальная ошибка вычислений не должна превысить:

(pi/1024)^3/3! = 4.81e-9
Genadi Zawidowski
По совету присутствующего тут коллеги поигрался с разрядностями:
Оригинальная структура:
Сигнал 16 бит множится на 17 бит выход NCO, затем младшие 32 бита идут на CIC - выход которого (32 бит) на FIR.
Была попытка усечь на 10 бит вход CIC (ещё отбросить младшие 10 бит после умножения), с соответствующим изменением параметров данного блока в megawizard) - появилась постоянная составляющая на выходе CIC (где-то на -60 дБ от full scale, значение приблизительное).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.