Кого заинтересовала тема — добро пожаловать под кат! =)
❯ Что это такое и зачем оно?
Tang Primer 20K — это SoM-модуль в формате SO-DIMM, с ПЛИС Gowin GW2A-LV18PG256C8/I7 в качестве центрального элемента, который поставляется (на выбор) с двумя интерфейсными платами, побогаче и попроще. В моем обзоре я расскажу про ту, что побогаче — Dock ext-board.
Перечислю основные характеристики SoM:
- Gowin GW2A-LV18PG256C8/I7;
- 128M DDR3 на SoM;
- 32 Mbits NOR Flash;
- JTAG + UART порт для программатора;
- Слот для установки SD-Card;
- 8-пиновый разъем для SPI-дисплея;
- Доступное количество I/O-пинов — 177 шт.
Основные характеристики Dock-ext board:
- RGB565 40P FPC Connector для подключения дисплея с RGB-интерфейсом, например такого;
- 24P FPC Connector для подключения CMOS камеры с интерфейсом DVP;
- 10P FPC разъем для подключения микрофонов;
- 4P FPC разъем для подключения тач-сенсора;
- 4 интерфейса PMOD;
- 3.5mm headphone Jack с драйвером LPA4809MSF;
- 5-пиновый DIP switch;
- 2-позиционный переключатель для определения функции USB (Host/Device);
- USB type-C разъем для соединения JTAG-отладчика c ПК;
- USB type-C разъем с USB3317 в качестве USB PHY-контроллера;
- Антенна на 2.4ГГц диапазон;
- 6 кнопок;
- 6 LED;
- 1 RGB LED WS2812;
- HDMI-интерфейс;
- Ethernet-интерфейс c PHY Realtek RTL8201F.
Давайте детально рассмотрим с каким комплектом поставляется эта плата и что же там есть на плате.
К слову, всю интересующую вас информацию можете найти на официальном сайте проекта.
❯ Комплект поставки
Начнем, уже традиционно с вопроса о комплекте, как это всё было упаковано и где купить (иначе зачем бы этот обзор еще был бы нужен, верно?). С первоначальным описанием и ценой вы можете ознакомиться на сайте продавца. Для работы с данной отладкой идёт сразу все необходимое. Нет нужды докупать программаторы и провода:
- SoM в SO-DIMM форм-факторе с FGPA;
- Материнская плата с необходимым минимумом интерфейсов, кнопок, индикаторов;
- Кабель USB-A — type-C;
- Переходник с USB-A Female — type-C, для подключения к USB-Host внешних устройств;
- 8-пиновый переходник на PLS-female с платы SoM для подключения внешнего программатора;
- Две миниатюрных перемычки для включения\выключения BL702 (подробнее ниже);
- Жесткий пластиковый бокс для переноса платы.
Небольшое количество фотографий с распаковки:
Общий вид материнской платы:
SoM-модуль:
При внешнем осмотре нет ни следов флюса, ни следов пайки. Запаяно все качественно, без косяков и следов кривого монтажа.
Ну и фото мелких аксессуаров:
❯ Немного про SoM
В качестве центрального ядра, как я уже писал выше, используется ПЛИС от Gowin GW2A-LV18PG256C8/I7. Среди его ключевых характеристик можно выделить следующие:
Общий вид SoM с ключевыми элементами:
Также на SoM есть SDRAM DDR3 128MB (1Gbit) память. В моем случае это SK Hynix H5TQ1G63EFR (13 row x 10 col x 8 banks x 16 bits). SpeedGrade памяти определить не удалось по гравировке на чипе, но судя по упомянутой в Schematic на SoM DDR-памяти IMD128M16R39CG8GNF-125 — доступен режим работы DDR-1600.
Помимо DDR-памяти на SoM еще располагается SPI Flash W25Q32JVS:
В качестве дополнительных опций на SoM-е доступны две дополнительные опции. Первая — это слот для установки microSD карт:
И вторая опция — разъем для подключения SPI LCD:
Для тактирования ПЛИС — установлен 27 МГц генератор:
Если не хочется использовать программатор, который установлен на материнской плате — SoM можно прошить внешним программатором подключившись к 8-пиновому разъему через переходник, идущий в комплекте:
ВНИМАНИЕ! Тут мне следует сделать очень важное предостережение. Подключение программатора к этим пинам, переключение кабелей программатора стоит делать только при полном отключении программатора и платы от питания т.к. неоднократно замечалось, что JTAG в Gowin очень «нежный» и может выйти из строя!
Речь идет вот об этом разъеме на SoM, рядом с которым находится разъем для подключеня SPI LCD и тест-поинты:
Для проверки работоспособности DC-DC преобразователей разработчики заботливо вывели 8 тестовых поинтов. Буду надеяться, что они вам не пригодятся ????:
❯ Материнская плата Dock-ext
Перейдем к рассмотрению возможностей предоставляемых материнской платой:
❯ Питание платы
Давайте перейдем к схематику, посмотрим, что на материнской плате. Кажется, что обзор получится объемным ???? и начнем с питания.
Плата может запитываться со штыревого входа с входным напряжением 6-12 В:
Преобразованием 12В в 5В занимается DC Buck Converter EUP3458VIR1:
Есть светодиодная индикация о том, что присутствует выходное напряжение с преобразователя.
Второй вариант обеспечить плату питающим напряжением: два type-C разъема. Один предназначен для USB-OTG, второй — разъем для подключения USB-JTAG:
Также есть светодиодная индикация о том, что на плате присутствует напряжение в 5 В.
То есть при подключении питания к плате загорается один из вариантов светодиодной индикации для удобной диагностики, что всё с платой нормально или она не работает.
❯ JTAG-программатор на BL702
Ядром JTAG-программатора на плате является микроконтроллер BL702 — 32-разрядный процессор RISC-V от Bouffalo Labs. Полистав базовое описание на этот SoC, я весьма был удивлен, что у этого МК есть еще и 2.4GHz RF transceiver c поддержкой IEEE 802.15.4 MAC/PHY, Bluetooth 5.0 LE и Zigbee 3.0. Но обо всём по порядку.
Основное назначение этого чипа и идущего по умолчанию ПО в нём — обеспечить прошивку ПЛИС микропрограммой, которую по итогу генерирует IDE. Но если у вас есть внешний программатор — его можно подключить через 8-пиновый разъем на самом SoM-модуле, а этот BL702 использовать для нужных вам целей: можно хоть USB Device сделать, хоть IoT-устройство под управлением Linux, который можно завести на ПЛИС.
Для отключения BL702 даже предусмотрена соответствующая перемычка подписанная на плате как 702_EN:
Прошивка заливается по UART на BL702 через USB-порт и для ввода BL702 в режиме Firmware Update так же предусмотрена кнопка, которая расположена в аккурат над перемычкой:
Неизвестно, можно ли через UART-пины управлять в последующем из ПЛИС BL702, но кажется что теоретически это возможно:
Также у BL702 есть два пользовательских светодиода, которые можно использовать в своих целях:
Особенно приятно было увидеть, что на что на плате всё-таки имеется чип-антенна и небольшая цепь согласования для пользования BL702 в качестве радиоустройства:
❯ GPIO-пины
На плате присутствует 4 PMOD разъема для подключения внешних устройств или какой-нибудь периферии, которые прямо шелкографией подписаны на оборотной стороне платы. Так же для GPIO предусмотрен разъем, который также подходит для подключения внешних микрофонов (подписан как MIC ARRAY на плате):
❯ Кнопки и светодиоды
Тут разработчики заложили кажется вполне оптимальное количество кнопок и LED-ов. Для пользовательских операций доступно 4 из 5 кнопок:
Первая кнопка S1 отвечает за сброс ПЛИС (почему-то он у меня на плате не срабатывал), остальные можно использовать для пользовательских кейсов:
Помимо кнопок доступен 5-разрядный DIP-переключатель:
Первый переключатель используется для переключения источника загрузки ПЛИС, остальные 4 из 5 переключателей можно использовать в пользовательском сценарии:
С LED-индикаторами тоже не все так просто. На плате их установлено 6 штук, из них доступно для пользователя только 4, т. к. первые два используются для индикации FPGA_DONE и FPGA_READY:
При программировании Blink-примера, LED-светодиоды наоборот тухли при когда FPGA-прошивка была загружена и работала. С этим тоже предстоит разобраться:
В дополнение к обычным светодиодам на плату еще разместили RGB-светодиод WS2812B:
❯ HDMI интерфейс
На плате расположен HDMI-разъем, через который можно вывести изображение на внешний монитор, телевизор и прочее. Всё выглядит достаточно стандартно, линии данных, Hot Plug Detect, SDA/SCL. Т. к. я практически не работал с HDMI — тут я мало чего могу вам рассказать.
❯ USB 2.0 PHY
На плате имеется USB-контроллер Microchip USB3317 с поддержкой как USB Device так и USB Host сценариев. Для переключения между этими режимами на плате предусмотрен соответствующий переключатель. Всё выглядит достаточно стандартно и добавить тут, в целом, тоже нечего.
❯ Ethernet 10/100M
Приятным дополнением ко всему, что было перечислено выше является интерфейс Ethernet, с поддержкой 10/100 Half-Full Duplex. На плате установлен Ethernet PHY, являющийся по сути надежным и проверенным стандартом — Realtek RTL8201F-VB-CG.
На изображении ниже — линии RMII идущие в ПЛИС:
❯ Audio DAC + Headphone AMP
На плате для разнообразных сценариев, в которых нужен вывод звука, расположены несколько интересных микросхем.
Первая — двухканальный 16-битный ЦАП от Princeton Technology PT8211-S:
На правом и левом выходных аналоговых каналах установлены просты Low-Pass простые постфильтры второго порядка подавления остаточных шумов с частотой среза примерно около 40 кГц:
Вторая микросхема — стерео Headphone-усилитель от LowPowerSemi LPA4809MSF, который по заявлениям производителя может дать до 140 mW на канал с 16 Ω нагрузкой с THD 0.1% при питании от 5 В.
❯ Интерфейсы для подключения Display и DVP-камеры
Порадовало наличие на плате 40-пинового разъема для подключения внешнего RGB24 дисплея и 24-пиновый DVP-интерфейс для подключения CMOS сенсора.
Подошел дисплей, о котором я рассказывал в прошлой статье, и мне удалось запустить пример из набора Sipeed:
А вот с DVP-камерой из предыдущей статьи такое не получится т.к. гибкого шлейфа нет, и PMOD-интерфейс не подходит. Возможно закажу себе отдельный модуль с Aliexpress который совместим с этой платой.
❯ Touch Panel
На плате присутствует разъем для подключения внешнего тач-контроллера, который можно было бы использовать вместе с дисплеем:
❯ Доступная документация и примеры
Отдельно стоит отметить, что для данного отладочного набора есть всё что нужно в открытом доступе.
- После простой регистрации на сайте Gowin можно скачать IDE, любые Datasheet-ы, Reference Manual-ы и прочее: www.gowinsemi.com/en/product/detail/38
- Есть официальный Wiki со всей документацией и ЧаВо: wiki.sipeed.com/hardware/en/tang/tang-primer-20k/primer-20k.html
- Есть централизованное хранилище документации: dl.sipeed.com/shareURL/TANG/Primer_20K
- Есть Git-репозиторий с большим количеством примеров: github.com/sipeed/TangPrimer-20K-example
В дополнение к основному набору можно приобрести дополнительные модули:
- LCD-дисплей и LCD SPI дисплей: aliexpress.ru/item/1005005362093758.html
- CMOS-сенсор: aliexpress.ru/item/1005005362162552.html
- Внешний программатор (в случае если требуется занять on-board программатор BL702 чем-то другим: aliexpress.ru/item/1005002908614535.html
❯ Заключение
После подробного изучения возможностей этой отладки — хочется вскрикнуть “Ого! И это — за такие небольшие деньги!”. Оптимальное количество LUT-ов, куча интерфейсов, всякое разное на борту и даже чип с RF-интерфейсом! Учитывая общую стоимость платы — кажется это отличная альтернатива Cyclone для начала работы с ПЛИС. Вывод который напрашивается после знакомства с этой отладкой “А может Cyclone IV действительно устарел?” ????.
Жаль, конечно, что на плате нет EEPROM, которая мне необходима для построения I2C Master Controller, но кажется для этой отладки найдется куча самых разнообразных применений. Например, можно на этой плате “поднять” ядро RISC-V и на нем запустить полноценный Linux. На первый взгляд кажется, что можно собрать полноценный мини-ПК: оперативной памяти достаточно, есть USB-интерфейс для подключения клавиатуры, есть Ethernet для сетевого взаимодействия с другими элементами сети, интерфейс для дисплея. Кажется, это звучит как одна из идей для следующих статей.
Можно это добавить себе в заметки на будущее, но для начала в одной из следующих статей я познакомлю читателя с Gowin EDA, как с ним работать под Linux (да, есть поддержка), как настроить программатор, как заливать bitstream на плату и прочее.
До встречи в следующих статьях! ????
Возможно, захочется почитать и это:
- ➤ Altera Quartus Prime и ModelSim под Linux. Вводное руководство
- ➤ Обзор отладочной платы Altera Cyclone IV EP4CE6
- ➤ Не совсем бегущая строка своими руками. Симуляторы электронных схем до добра не доведут
- ➤ OLIMEX ESP32-EVB: красный квадрат
- ➤ На пол пути к конечному автомату для Arduino. Однопроходные функции и фиксация событий программы с помощью флагов
Комментарии (23)
Saa12
12.07.2023 08:24+1Спасибо за статью! Вы выше писали про "нежность" JTAG. Его защитить извне как-то можно? Есть у кого конкретный опыт этого?
megalloid Автор
12.07.2023 08:24+1Пока не ковырял в эту сторону, но если появится рецепт какой-нибудь на эту тему - я им обязательно со всеми поделюсь (в этой статье допишу).
okhsunrog
12.07.2023 08:24TVS-диоды могут помочь, в теории
megalloid Автор
12.07.2023 08:24Вероятно да, вероятно ещё опторазвязка сможет уберечь. Но для меня ситуация не то чтобы сильно актуальна, т.к. пока планирую пользоваться встроенным программатором и риск такого рода повреждения кажется сведен к минимуму.
drunkdebugger
12.07.2023 08:24+4Также на SoM есть SDRAM DDR3 128MB (1Gbit) память. В моем случае это SK Hynix H5TQ1G63EFR (13 row x 10 col x 8 banks x 16 bits). SpeedGrade памяти определить не удалось по гравировке на чипе, но судя по упомянутой в Schematic на SoM DDR-памяти IMD128M16R39CG8GNF-125 — доступен режим работы DDR-1600.
Тайминги могут и не совпадать. Сильно некрасиво вышло со стороны Sipeed. Особенно "хорошо" получилось с Litex:
https://github.com/enjoy-digital/litex/issues/1649Особенно приятно было увидеть, что на что на плате всё-таки имеется чип-антенна и небольшая цепь согласования для пользования BL702 в качестве радиоустройства:
Хех, я это упустил, попробую на днях.
Жаль, конечно, что на плате нет EEPROM, которая мне необходима для построения I2C Master Controller, но кажется для этой отладки найдется куча самых разнообразных применений.
Не совсем понятно зачем для I2C Master нужен EEPROM, если можно в HDL реализовать или даже bitbang применить из soft core. Litex I2C так работает.
Например, можно на этой плате “поднять” ядро RISC-V и на нем запустить полноценный Linux. На первый взгляд кажется, что можно собрать полноценный мини-ПК: оперативной памяти достаточно, есть USB-интерфейс для подключения клавиатуры, есть Ethernet для сетевого взаимодействия с другими элементами сети, интерфейс для дисплея.
Нет работающего DDR3 в Litex/SpinalHDL - нет Linux'а. И нет полноценного framebuffer, только текстовый терминал на HDMI/whatever. Наработчки есть (TangPrimer-20K-example, Nestang), но они не используют Wishbone или AXI(-lite).
В заключение отмечу, что рано или поздно трудности будут преодолены. Будет реально-нереальный бюджетный девкит. К сожалению, надеяться только на Sipeed означает ждать вечно.
dlinyj
Мне очень не хватает примера вхождения для работы с такими устройствами. Плата крутая, спору нет. Но вот прям бомба была бы сделать статью, как там установить ПО, сделать хелло ворд (мигание светодиодом), затем вывести на дисплей.
ПЛИС — это такой космос, но вообще недостижимый.
megalloid Автор
Этот материал уже на стадии подготовки. Примерно на следующей неделе ждите публикации!)
dlinyj
Спасибо, очень ждём!
Mogwaika
*такой же недостижимый, как и МК.
dlinyj
ПЛИС немного другого уровня железяка. Мне доводилось писать как на ассемблере, для МК, как на си, так и на verilog. Там вообще иное мышление нужно. Всё программирование — это каждая следующая инструкция выполняется за предыдущей. А для плис всё выполняется одновременно, и это взрывает мозг.
Mogwaika
У вас профдеформация, вы вероятно сначала освоили МК. Вам же не взрывают мозг аппаратные блоки или всякие dma, которые работают параллельно с основной программой или синхронизация нескольких ядер.
Если сначала освоить ПЛИС, будет больно работать с МК.
В общем случае одинаковая сложность.
dlinyj
Кто ж спорит :). Поэтому и прошу немного приоткрыть завесу тайны.
virtanen
Для МК гораздо больше инструментов, подходов, учебников, коммьюнити и т.п., соответственно, там априори легче. А плисоводы это довольно экзотические звери. И да, для меня лично теперь именно МК взрывает мозг, хотя начинал я именно с них.
Mogwaika
Возьмите какой-нибудь китайский мк и там будет всё то же самое или даже хуже, одна проприетарная ide под конкретную ОСь, никакого саппорта, ерраты и коммьюнити…
Под тот же bl702/bl808 много инструментов? megalloid сделаешь вводную статью и про них тоже?
megalloid Автор
Ковырял в их сторону, я отладку отдельно от Buffalo c Wi-Fi 6 и BR/EDR/BLE 5.3 заказал. Может аналогичный обзор сделаю с разбором инструментария, если будет о чем рассказать, конечно
drunkdebugger
А что там не так?
Там CMake/Makefiles в зависимости от SDK. Собирается из cmdline, прошивается. Win/Linux/Darwin.
Прикрутить отладку в VSCode - час-два времени (если ни разу не делал)
Mogwaika
1) Мне казалось, что там мунлайтстудио и прочая хрень (fix. спутал с ch582).
2) Есть статья для хлебушков?
MaxAkaAltmer
Чтобы мозг не взрывал verilog, лучше использовать vhdl =)
megalloid Автор
Лучше использовать System Verilog, я бы сказал :D
MaxAkaAltmer
Если похожесть с С/С++ мешает, лучше использовать VHDL. Я много пишу на плюсах, и параллельно пишу под ПЛИС, поэтому использую VHDL (когда устаешь - меньше тупишь с параллельной и последовательной логикой), Verilog только если что-то не для себя или не свое. Эти ПЛИС на удивление неплохие, хотя главное не это, а то, что на данный момент они являются самыми доступными.
MinimumLaw
Когда жареный петух в известное место клюнул пришлось освоить. Не боги горшки обжигают. В принципе все подъемно. Главная ерунда - для таких игрушек нужен проект, который не сделать другими методами. Я, правда, с Latice игрался, но учиться пришлось на Alter'ах.
Самая большая беда в ПЛИС это откровенно кривой софт. Его мало, и всякий раз садясь за ПЛИС вспоминаешь известное Грузинское блюдо - Жри-Чё-Дали. Вывод компилятора не информативен. В горе бесполезных, не отключаемых предупреждений найти важное - отдельный навык. В этом смысле что Hello world, что примеры - практически не несут смысловой нагрузки. Я долго не мог понять где с моем простейшем проекте ошибка и выяснилась классическая заморочка с пониманием где wire, а где reg. Но прежде чем мне это растолковали я готов был поломать все вокруг. Так что практический опыт очного общения с ПЛИСоводами - он очень важен. При чем даже не столь важно что конкретно используется: Xilinx, Altera, Latice или еще что. Грабли после установки и настройки ПО везде примерно одинаковые.
Но самое главное - нужен проект, который иначе не сделаешь. Как только он появляется, остальное подтягивается само собой.
mikkal
Тут соглашусь - с каждым обновлением вивады все больше несогласованности между различными частями ide. Фичи пилятся, но баги не исправляются.
Та же vivado умеет подавлять предупреждения, ограничивать количество сообщений. Гуглится по warning suppression. Например, https://docs.xilinx.com/r/2022.1-English/ug893-vivado-ide/Suppressing-Messages Но на начальных этапах не стоит этим пользоваться, тк скорее всего большинство предупреждений разумны и их следует исправлять в коде, а не подавлять. В других ide подозреваю наличие подобного функционала.
Это вопрос к пониманию языка описания аппаратуры, а не самих ПЛИС. Для быстрого старта можно почитать соответствующий раздел Харрисов - Digital Design and Computer Architecture. Для дальнейшего понимания Stuart Sutherland SystemVerilog for design. Для еще более глубокого Cliff Cummings http://www.sunburst-design.com/papers/
Нужны болванка проекта и система сборки. Такое зачастую каждый пишет себе сам, чтобы при старте нового проекта не протыкивать все в ручную. Предполагаю, что где-нибудь тоже можно найти. При этом система сборки нужна для автоматизации сборочных процессов и хранения не всего проекта, а только исходников и сборочных скриптов. Имея последнии, проект можно смело удалять и пересоздавать заново по несколько раз на дню
MinimumLaw
Про отключаемые предупреждения - наверное. Но проект в десяток строк с простейшей логической функцией выдающий 30+ предупреждений из коробки (привет Altera) или почти десяток (привет LaticeDiamond) - это впечатляет. Про Vivado не скажу - она мимо меня прошла.
Вообще удивляет количество предупреждений даже при компиляции примеров из комплекта поставки. Программистам-системщикам, привыкшим за время работы с тем же С, к тому что все должно компилироваться с ключом -Werror (т.е. требовать чистой сборки и трактовать предупреждения как ошибки) сразу становится несколько не по себе. При этом каждое конкретное предупреждение вроде бы правильное, но часть из них вообще непонятно как устранять. Ну не используем мой проект один из системных клоков. На тебе предупредеждение. По одному (минимум) на каждый неиспользуемый. Хорошо. И что мне с ними делать?
На самом деле, конечно, ПЛИСоводство это совершенно отдельный навык. Его, по хорошему, не стоит совмещать с классическим программированием. Меня именно что вынудили обстоятельства. До какой-то степени я изучил вопрос и сделал решение. Но углубляться дальше... Нет, пожалуй я лучше оставлю это профессионалам. У них получится лучше и быстрее. Меня другое кормит. Но если понадобится что-то похожее, я уже справлюсь.
P.S.
Да, я под проектом понимал не проект в IDE, а некое ТЗ, которое надо реализовать. При чем такое, что без ПЛИС не обойдешься. Тут или не браться, или учить, разбираться, жрать кактус, топтать грабли, но все равно делать (и доделывать!).