Недавно ко мне в руки попала китайская ПЛИС, а именно отладочная
плата GW1N DK-START-GW1N4, на которой по факту стоит чип
GW1N-LV9LQ144C6/I5 (Flash-based FPGA, 8640 LUT4, User
flash:608Kb,B-SRAM:468Kb, S-SRAM:17280bit).
GOWIN предоставляет много разных вариантов
комплектации своих FPGA со встроенным Cortex M3, BluetothFPGA,
System-in-Package(SoC + RAM), SecureFPGA
GW1N-9 представитель базового варианта ПЛИС с наименьшим
количеством наворотов и по этому привлекательна демократичной ценой
в ~3.5$/1kQty.
Доступность отладочных плат к сожалению пока низкая, найти их для
личного пользования не помогает даже Aliexpress. На данный момент
покупка доступна юридическим лицам в
АОВосток, там же мне помогли с бесплатной на год
лицензией разработчика, да и в целом поддержка отличная!
Лицензионных файла три на каждый поставляемый продукт (Gowin EDA
YunYuan + Gowin SynplifyPro + Gowin MCU Designer), они
привязываются к NIC-ID (MAC адресу сетевой карты). Windows: Win+R
>> cmd.exe >> getmac /v /fo list вводить без кавычек.
Можно настроить сервер-лицензий Gowin License Server For
Windows
- Gowin EDA YunYuan IDE для синтеза проектов как на Gowin
Synthesis, так и
Synplify Pro. В качестве инструментов: Programmer, IP Core
Generator, Gowin Analysis Oscilloscope etc.
- Gowin SynplifyPro by Synopsys Унифицированное средство
синтеза для FPGA
- Gowin MCU Designer IDE на базе Eclipse для создания
прошивок как к синтезированным ядрам, так и для SoC. Также c Gowin
удобно работать через Keil MDK
Скачав с официального сайта всё необходимое и разобравшись
лицензиями, собираем первый пробный проект мигания светодиодами в
GOWIN EDA.
Тут впервые замечаю, что на плате хоть и написано GW1N-4, а сам чип
GW1N-9. Соответственно для GW1N-9 и качаем
blink-project с сайта. Накидал побольше базовых
примеров у себя в
GitHub .
В левом окне расположены вкладки:
- Design отвечает за редактирование и хранение файлов
проекта, конфигураций.
- Process генерирует и синтезирует выходной файл прошивки.
А ниже переход в утилиту загрузки на плату.
Не стану заострять внимание на интерфейсе, о нём достаточно
подробно описано в документации.
Важно на данном этапе обратить внимание на переключатели SW3/SW2 на
плате у разъема питания, отвечающие за выбор памяти, куда будет
загружен проект:
SW3[1]/SW2[0] SRAM mode
SW3[0]/SW2[0] Embeded flash mode
1. Открываем проект GOWIN EDA
2. Во вкладке Design проверяем, что выбранный чип соответствует
надписи на кристалле, а также содержимое файла .cst похоже на
распиновку из даташита.
3. Заходим в Process и правой клавишей мыши > Run активируем
сборку.
4. После успешной сборки переходим в Program Device, выбираем SRAM
Mode/SRAM Program и прошиваем.
На данный момент светодиоды мигают, первый шаг сделан, а дальше уже
можно плясать в сторону более крупных проектов на HDL, но меня
привлек инструмент
Tools > IP Core Generator, где лежат
два синтезированных ядра ARM Cortex M1 и picoRV32.
picoRV32 сжатая по размеру открытая
архитектура RISC-V. Интересный зверь, но уж больно
экзотический!
ARM Cortex M1 тот самый старый добрый ARM, его то мы и
потрогаем!
GOWIN свои сборки ядер зашифровал, но picoRV32 вполне можно собрать
под ПЛИС самому.
Запуск проекта с синтезированным ядром состоит из нескольких
этапов:
1. Берём за основу проект из архива, что предоставляет нам
GOWIN Arm DesignStart FPGA Program, дабы ручками не
настраивать Verilog файлы от внутренней периферии к внешней.
2. Собираем проект для MCU: из скомпилированного в Keil .bin файла
с помощью GOWIN скрипта make_hex.exe нарезаем четыре itcm файла
(itcm0, itcm1, itcm2, itcm3).
NOTE: При компиляции очень важно проверить в файле .ld или
настройках линкера: правильность конфигурации начальных адресов
RAM/ROM памяти. В документации про это не нашел где почитать, а сам
не сразу додумался в файлы линкера посмотреть.
3. Из проекта выпиливаем все файлы синтеза ядра
(src\gowin_empu_m1), дабы собрать своё.
5. Средствами GOWIN IP Core Generator собирается ядро и периферия,
с указанием path файлов itcm из 2-го пункта.
6. По завершению генерации ядра, добавляем его в проект и собираем
проект целиком.
7. Прошиваем в RAM. Видимо как побежали светодиодики. Если хочется
прошить во flash нашего ПЛИС, выставляем скорость порта
пониже(например 2.5Mhz), выбираем Embedded flash mode.
Пришлось немного помучиться, так как сначала установил Gowin EDA не
в директорию по умолчанию. Проект не увидел свои внутренние
зависимости, переустановка в C:/Gowin помогла.
ARM Cortex M1 с GPIO занимает ~4k/9k LUT. Т.е в ПЛИСе остается
место под задачи обработки данных.
Следующим шагом будет запуск периферии: UART, I2C, SPI Ну и конечно
же начну изучать RISC-V, раз уж он так ловко попал ко мне в руки.
Надеюсь, данный пост поможет кому-нибудь сэкономить пару вечеров и
перейти сразу к реализации проекта.
P.S. Данная пост родился из моего телеграмм канала
t.me/difarobot, где делюсь своими мыслями в мире
embedded. Присоединяйтесь!