Радиоприем и радиопередача с помощью ПЛИС



7-го мая в России скромно отмечается день радио. Поскольку на easyelectronics.ru, который мне нравится читать, этот день прошел незаметно, я решил вдогонку написать вот эту статью. Здесь я расскажу о проектах, которые я делал в разное время и на разных платах с ПЛИС, но эти проекты были связаны с радио.

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

Всего в моей копилке уже четыре проекта: радиопередатчик АМ, ЧМ и ФМ, и простой SDR радиоприемник. Далее краткий обзор этих четырех экспериментальных проектов.

Для всех своих радиопередатчиков я использовал одинаковый способ отправки аудиофайла в плату с ПЛИС: передача через последовательный порт. Это просто и надежно. Я делал сырой аудиофайл в формате 8-бит, моно, 22050 выборок в секунду и передавал его в последовательный порт с параметрами 8-бит, без четности и с двумя стоп битами на скорости 230400 бод. При этом получается, что скорость последовательной передачи примерно соответствует скорости воспроизведения звука. Конечно, дальше в ПЛИС судьба этого аудио потока была различной в зависимости от типа используемой модуляции.

Взять, например, радиопередачу с амплитудной модуляцией.
Перенос спектра полезного сигнала на несущую частоту производится простым перемножением исходного сигнала на синусоидальное колебание несущей частоты. Если раньше для амплитудной модуляции использовались нелинейные элементы, такие, как транзисторы, лампы, то сейчас операцию умножения можно выполнить в цифровом виде в ПЛИС. Синусоидальный сигнал для несущей частоты можно хранить в таблице. Нет никаких проблем в коде на Verilog или VHDL написать просто символ умножения '*' и вот уже операция выполнена, спектр сигнала сдвинут на частоту несущей. Конечно, этот цифровой сигнал потом нужно подавать на цифро-аналоговый преобразователь, потом выделить полосовым фильтром и передать на антенну. Для этого проекта я использовал плату Марсоход2, ЦАП там есть только в виде R2R цепи на VGA разъеме и то всего 6 бит на «зеленом» сигнале (5R-6G-5B). Но и этих 6 бит уже достаточно, чтобы услышать свою радиопередачу в эфире.


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



Исходный код проекта АМ передатчика для Altera Quartus II можно взять на github: https://github.com/marsohod4you/FPGA_AM_transmitter

Частотную модуляцию в ПЛИС мне так же удалось сделать. Я заинтересовался этой возможностью, когда прочитал, что кто-то уже сделал FM передачу из платы Raspberry PI. Мне захотелось повторить этот проект, но уже в ПЛИС.

Метод формирования частотно-модулированного радиосигнала одновременно и сложен и прост: нужно обеспечить среднюю скорость/плотность следования цифровых импульсов в потоке пропорционально текущей амплитуде модулирующего аудио. Пусть вся схема в ПЛИС работает скажем на частоте 500МГц. Каждый пятый импульс отправляется «на антенну». Тогда радиоприемник поблизости услышит наш радиосигнал на частоте 100МГц.



Если же иногда в потоке некоторые периоды будут короче, иногда отправляется не пятый, а четвертый импульс, то в среднем частота оказывается переменной и зависящей от модулирующего сигнала. Это как раз то, что нужно для частотной модуляции. Конечно, в моем эксперименте, как и в случае с оригинальным проектом Raspberry PI, антенна — это просто кусок провода. Отсутствует выходной аналоговый фильтр, что не очень хорошо. Но я не ставил перед собой целью сделать профессиональный передатчик. Просто хочу поизучать возможность…

Вот так происходит радиопередача и прием на обычный бытовой приемник и ФМ радиоприемник в автомобиле:



Страница проекта здесь. Проект выполнен для платы Марсоход2.

Совсем недавно мне пришло в голову, что на самом деле можно попытаться сделать все иначе: я могу динамически сдвигать фазу тактовой частоты внутри PLL в ПЛИС. Таким образом, можно довольно просто сделать фазовую модуляцию! Оказывается, в PLL ПЛИС Альтеры (теперь уже Интел)предусмотрена такая возможность и есть специальный набор сигналов у PLL, которые позволяют на лету двигать фазу с высокой точностью. Шаг сдвига фазы PLL зависит от частоты Fvco внутреннего генератора PLL. При Fvco=1,3GHz фазу выходной частоты можно сдвигать на время около 100 пикосекунд! Переконфигурация PLL описана в документации Альтера: www.altera.com/en_US/pdfs/literature/hb/max-10/ug_m10_clkpll.pdf, ну или если нужно по русски, то есть хороший перевод документации третьего циклона: www.naliwator.narod.ru/CIII_01_05_3.pdf

Этот проект ФМ радиопередатчика с использованием сдвига фазы в PLL я сделал для платы с ПЛИС MAX10. Исходный код проекта на гитхабе. Радиопередача с фазовой модуляцией:



Это действительно интересно, я модулирую несущую частоту 100МГц по фазе, а сигнал принимаю обычным FM-радиоприемником из сотового телефона. Фазовая модуляция связана с частотной, ведь меняя фазу колебания я меняю и положение фронта или спада сигнала. Значит тут же меняется и частота.

Что касается радиоприемника в ПЛИС, то тут мне несомненно помогли статьи c хабра
Теперь у меня есть и такой проект, проект радиоприемника, исходный код: github.com/marsohod4you/FPGA_SDR, страница проекта. Правда на используемой плате Марсоход2 слабоватое АЦП: 20МГц и всего 8 бит, но даже с такими характеристиками удается кое-что принимать:



Таким образом, имея в распоряжении даже не дорогие платы с ПЛИС, я могу поизучать различные типы модуляции и принципы построения Software Defined Radio.
  • +5
  • 08 мая 2017, 17:02
  • privet

Комментарии (14)

RSS свернуть / развернуть
Не впечатлен, нет изюминки, при желании можно было бы попробовать это сделать на Марсоход1, или на предлагаемой DI HALT мезонинке на Altera MAX II.
-3
Сказать по правде не представляю, как можно сделать хоть какой-то из этих проектов на MAX II. Например, для АМ передатчика в ПЛИС нужна синусоида для несущей частоты. Синусоиду можно либо хранить в таблице либо использовать NCO. NCO это довольно сложно, нужно много логики, и для таблицы нужно много места, ведь RAM блоков в максе2 нет.
В проекте FM передатчика так же используется таблица в которой заранее вычислены интервалы меж импульсами для разных значений аудио сигнала — для таблицы нужно место, в максах с этим не просто.
Проект PM передатчика — нужен PLL, в максе2 его нет.
SDR в максе2 так же не построить, для цифровых фильтров нужно иметь умножители. Ну и там так же проект занимает много места в ПЛИС…
+3
Совсем не обязательно. Есть, например, рекурсивный алгоритм Гертцеля. Для генерации синусоиды нужен умножитель, сумматор и три ячейки памяти. МАС модуль, короче. Всего этого в МАХе можно. В своё время я для DTMF на этом алгоритме пилил, оч бодро крутится.
Вот здесь на пальцах теория и пример показаны.
С частотной модуляцией несколько сложней, но тоже есть не сильно ресурсоемкие пути.
0
Может статейку напишите? Особенно любопытно посмотреть на реализацию на MAX II. Так чтоб влезло. Или Вы «чисто теоретик»?
+1
Ага, «теоретик». Не влезет, однозначно. В МАХе босая логика, имелся в виду Циклон 2, конечно же. Сорри за зашквар.
0
Мой пост касался DDS и имел целью проиллюстрировать, что для жирная таблица синуса не обязательна. Можно найти решение и поизящнее.
0
Ну у Вас же написано, что в «МАХе можно». Вот я и подумал, как это можно, без перемножителей да еще и в маленькой CPLD? Что же касается жирной таблицы синусов, то тут надо смотреть на оптимальность испоьзования ресурса и требования к точности этого самого синуса. Иногда проще и эффективней — таблица, а когда нужно много отсчетов, то лучше CORDIC соорудить.
0
А плата от DI HALT, значит, добавит изюминки?
+1
Изюминки может добавить не плата от DI HALT, а грамотное инженерное решение с наиболее полным использованием имеющихся возможностей. Пока это больше похоже на скетч залитый в Arduino.
-1
Я на вртп выкладывал код для стереокодера вещательного ЧМ. Ну и гермесоподобные опенсорсные проекты задали «планку»: UDP/IP, дуплекс, SoftMAC. На их фоне бледновато выглядит.
-3
у меня это получилось примерно так:
EasyFM fpga inside

Первый FIR-фильтр выполняет двойную функцию: ограничение верхних частот и преемпфазис.
0
Очень интересно! Сам время от времени берусь за плисы, надо будет «по мотивам» Ваших примеров что-нибудь попробовать. Пишите есчо-)))
0
Кстати, вот ещё один вариант: github.com/dawsonjon/FPGA-TX
Но там — квадратурный выход. Можно и АМ и SSB отправить. Интерес вызывает частота дискретизации — 800МГц. Хотя сам ЦАП — работает на частоте 100 МГц. Автор этого добился используя несколько выходов с временной задержкой:
0
Очень, очень интересно!!! Большое спасибо автору!!!
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.