FPGA & Verilog БлогFPGA chips

САПР Altera Quartus II / Intel Quartus Prime, язык Verilog HDL и кое-что про VHDL, FPGA Cyclone III, Cyclone IV, MAX II, MAX10. Платы разработчика серии Марсоход, Марсоход2, Марсоход3.


Это демонстрация SDR-Radio реализованного в FPGA плате Марсоход3GW2.

Здесь почти 20 минут записи на которой я сканирую эфир от 800КГц до 10МГц. Мной было найдено довольно много радиостанций (частоты в КГц):

855 (музыка), 864, 999 (русский), 1026, 1035 (русский), 1071, 1188, 1377, 1413 (русский), 6015, 6040, 6070, 6145, 6165 (английский), 7220, 7255 (английский), 7265 (музыка, китайский на русском), 7300 (музыка), 7350 (музыка), 7420, 7445 (китайский), 9370, 9485, 9630 (музыка), 9760, 9820, 9860.

Иногда я слышал французскую речь, иногда итальянскую или арабскую (но тут могу ошибаться). Многое зависит от времени прослушивания эфира и даже от погоды. Я заметил, что для меня появляется довольно много станций именно в вечернее время, где-то после 20:00 по московскому времени. В то же время днём или утром или днём не слышно почти ничего.

Конечно, я должен признать, что качество звука неудовлетворительное. Многие передачи только слышно, что есть какое-то вещание, но даже слов не разобрать. Некоторые передачи более четкие. Зависит от мощности передатчика. К примеру, в моем регионе 999КГц вещает довольно сильно. Да и китайские станции вроде 7445 довольно мощные.

Однако, я думаю, что причин неуверенного и некачественного приёма есть несколько:

  • я использую в качестве антенны просто кусок провода 5 метров, свисающий с балкона, это заведомо плохая антенна;
  • у меня нет ни антенного усилителя ни даже входного фильтра, а антиалиасинговый фильтр, скажем прямо, обязательно должен стоять перед АЦП.

Это основные причины.

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

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

Далее расскажу подробнее о приёмнике и его реализации в FPGA.

Я продолжаю работать над проектом SDR-Radio на FPGA плате Марсоход3GW2. Напомню, что здесь на плате у нас стоит микросхема ПЛИС от компании Gowin. Это значит, что если придется использовать IP Core, то это будут коры от говин.

В проекте SDR-Radio мне нужны следующие базовые компоненты:

  • NCO - Numerically Controlled Oscilator, перестраиваемый генератор синусоидальных колебаний:
  • модуль приема команд от ПК и данных к ПК, например, можно использовать последовательный порт;
  • умножители для переноса спектра сигнала;
  • цифровые фильтры нижних частот CIC и FIR.

Первые два пункта у меня практически уже есть реализованные в предыдущем проекте. Теперь мне нужно сделать цифровые фильтры.

Сказать по правде, я не большой специалист в цифровых фильтрах, хотя общее представление, как это всё работает у меня конечно есть. Я считаю, что самый правильный способ разобраться с работой какого либо устройства или модуля - это либо заглянуть внутрь и рассмотреть его детали, либо попытаться измерить его внешние характеристики. В случае с цифровым фильтром его основная характеристика это АЧХ - амплитудно частотная характеристика. Она показывает сигналы каких частот пропускает или подавляет фильтр. Попробуем провести эксперименты по измерению частотных характеристик цифровых фильтров.

waves

Возникла идея повторить один из наших давних FPGA проектов: SDR радиоприёмник. Когда-то он был выполнен на плате Марсоход2 с Cyclone III, но сейчас у нас уже другая плата Марсоход3GW совсем другая FPGA от Gowin. Но, по прежнему, на плате есть АЦП 8 бит и даже на последних платах этот АЦП работает на частоте 50МГц.

Для реализации проекта SDR приёмника нужны будут несколько компонентов: NCO, CIC фильтр и FIR фильтр.

К сожалению, в библиотеке компонентов среды проектирования Gowin FPGA Designer нет компонента NCO. NCO - это Numerically Controlled Oscilator. Управляемый генератор синусоидального сигнала. Его придется сделать самим. Эта статья как раз про "промежуточный проект" - NCO в FPGA.

Хоть готового компонента NCO в среде проектирования я не нашёл, за то тут есть другие компоненты, которые мне могут помочь. Это Gowin компоненты CORDIC и DDS.

DDS - Direct Digital Frequency Synthesizer. Этот компонент позволяет синтезировать синусоиды или сигналы другой формы. Как я понял компонент использует таблицы отсчётов сигнала в BSRAM. Его вполне можно использовать для создания NCO. Это в принципе почти и есть NCO. Я не стал идти этим путём, так как мне не понравилось, что конфигурация компонента DDS должна происходить путём записи в его управляющие регистры. Кроме этого, мне нужен NCO с двумя выходами: синус и косинус одновременно. И тогда возникает вопрос: либо ставить два экземпляра DDS либо разбираться, как работают каналы DDS. Возможно применение двух каналов в одном экземпляре модуля DDS это подходящий вариант. Однако, как я уже сказал, я пошёл другим путём.

Второй кандидат это компонент Gowin CORDIC. Далее я расскажу подробнее про использование CORDIC  в составе модуля NCO.

mcy316 rpi5

Что-то похожее я уже когда-то делал с нашей платой Марсоход2RPI и Распбери Пи3. Но теперь у нас другая FPGA плата на Cyclone III и другой микрокомпьютер Raspberry Pi5. И даже современная ОС теперь уже будет 64-bit Bookworm.

Смогу ли я загружать FPGA из микрокомпьютера и сделать взаимодействие между CPU микрокомпьютера и платой FPGA?

(Для лиги лени сразу напишу ответ: да, смогу).

Подробнее можно прочитать далее в этой статье.