PICORV32 PicoSoc в плате MCY112

PicoSoc

На страницах нашего сайта marsohod.org я уже показывал примеры проектов системы на кристалле с процессором RISC-V. Я запускал те проекты на платах Марсоход3 и Марсоход3бис с ПЛИС Intel MAX10. Ядро микроконтроллера там было от российской компании Syntacore. Я уверен, что в какой-то мере тот процессор можно запустить и на нашей новой плате MCY112. Тем не менее, сейчас я хочу испытаь другой вариант RISC-V процессора. Это будет PICORV32, взятый мною вот здесь https://github.com/YosysHQ/picorv32

Посмотрим, что из этого получится.

Этот микропроцессор оптимизирован по размеру занимаемой логики в кристалле и реализует систему команд RV32IMC. При этом он может быть сконфигурирован как RV32E, RV32I, RV32IC, RV32IM или RV32IMC. Опционально поддерживает встроенный контроллер прерываний и возможность расширения системы команд через сопроцессор. Объем занимаемой логики в ПЛИС можно дополнительно уменьшить отключением регистров x16..x31 или отключая поддержку инструкций RDCYCLE[H], RDTIME[H], и RDINSTRET[H]. Кроме этого, регистры процессора могут быть сконфигурированы, как двухпортовое ОЗУ, и тогда процессор работает быстрее. А можно сконфигурировать процессор для работы регистров общего назначения, как однопортовое ОЗУ. Тогда процессор становится медленнее, но занимает меньше места. В общем, довольно много настроек.

Ядро процессора существует в трёх вариантах: picorv32, picorv32_axi и picorv32_wb. Вы можете использовать любой из них в зависимости от того, какую шину данных поддерживают ваши переферийные устройства, которые вы хотите добавить в систему на кристалле. Самый простой вариант, это конечно picorv32.

Проект PICORV32 имеет довольно много тестбенчей для симуляции работы процессора, тестирования исполнения инструкций. Для симуляции процессора используйте Icarus Verilog и GtkWave. Я должен сказать, что удобнее всего работать с проектов в среде Linux, так как выполнение многих задач в проекте, как-то симуляция, компиляция выполняется через команды make а сами задачи описаны через Makefile. Поскольку мы работаем с микросхемой Cyclone и САПР Quartus II Web Edition 9.1 для него существует только для Windows, то придется в Windows добавить какой ни будь минимальный bash. Я советую в Windows установить программу GitBash. Тогда в консоли GitBash можно запускать очень многие привычные в Линукс команды, в том числе и make. Это самый правильный и удобный путь.

В проекте PICORV32 есть папка picosoc и там внутри есть готовые проекты для двух FPGA плат построенных на FPGA компании Lattice: iCE40-HX8K Breakout Board и iCEBreaker Board. Естественно, что нам не нужны проекты для этих плат. Однако, тут есть довольно подробное описание системы на кристалле, реализованной для этих плат. Это файл README.md Это довольно толковое описание, правда на английском языке. Сама система довольно примитивная. В начале этой статьи как раз блок схема. У нас есть соственно процессор, к нему подключен модуль последовательного порта, модуль контроллера SPI Flash и модуль статической памяти. Статическая память как бы накрывает адресное пространство флэш памяти, кешируя доступ к ней. В моем проекте для платы MCY112 размер статического ОЗУ 4 килобайта. Дополнительно пользователи, то есть мы с вами можем добавить сюда какие-то еще свои custom controller типа светодиодов, GPIO или еще что-то.

Адресное пространство в системе на кристалле выглядит вот так:
Memory map:
Address Range Description
0x00000000 .. 0x00FFFFFF Internal SRAM
0x01000000 .. 0x01FFFFFF External Serial Flash
0x02000000 .. 0x02000003 SPI Flash Controller Config Register
0x02000004 .. 0x02000007 UART Clock Divider Register
0x02000008 .. 0x0200000B UART Send/Recv Data Register
0x03000000 .. 0xFFFFFFFF Memory mapped user peripherals

Как я уже говорил, весь мой проект для платы MCY112 находится на github https://github.com/marsohod4you/MCY112 
Там я создал свою папку picorv32/picosoc-altera и там мой проект системы на кристалле picosoc для Quartus для платы MCY112.

Я надеюсь, что с компиляцией проекта в среде САПР Quartus не возникнет вопросов, это обычный проект квартуса. Другое дело, что у проекта появляется дополнительный уровень сложности - это firmware, программа, запускаемая в процессоре. Её нужно еще и скомпилировать. Нам нужен компилятор RISC-V для Windows. Я для этих экспериментов взял вот здесь https://gnu-mcu-eclipse.github.io/blog/2019/04/25/riscv-none-gcc-v8-2-0-2-1-20190425-released/#binaries архив gnu-mcu-eclipse-riscv-none-gcc-8.2.0-2.1-20190425-1021-win64.zip

и распаковал его у себя на диске.

Чтобы скомпилировать firmware нужно в консоли программы GitBash выполнить команды
$ export PATH=/D/opt/gnu-mcu-eclipse-riscv-none-gcc-8.2.0-2.1-20190425-1021-win64/GNU-MCU-Eclipse/RISC-V-Embedded-GCC/8.2.0-2.1-20190425-1021/bin:$PATH
$ make mcy112demo_fw.bin

Первая команда расширяет пути поиска команд, укажите здесь путь к компилятору, куда вы его распаковали. Вторая команда запускает компилятор gcc и затем objcopy, чтобы из elf файла сделать bin. Получившийся бинарный файл mcy112demo_fw.bin нужно записать по адресу 0x100000 в чип SPI Flash памяти платы MCY112. Для этих целей у меня есть другой проект SpiFlash и там есть питоновская программа ../../SpiFlash/python/write_flash.py, позволяющая записывать во флэшку любые данные.

После того, как firmware записано во флэшку, можно запустить на компьютере терминал (Putty) на втором последоавательном порту, который принадлежит плате MCY112 (второй канал программатора MBFTDI). Параметры последовательного порта, скорость передачи 230400 бит в секунду, 8 бит, один стоп бит.

И вот теперь уже из программатора Quartus загружаем в FPGA собранный SOF файл нашей системы на кристалле. Урра!! В терминале Putty мы видим:

picosic

Процессор запустился и даже предлагает нам выполнить какие-то команды в своей мини консоли.

Даже если у вас пока нет FPGA платы, вы можете просимулировать работу процессора PICORV32 в Icarus Verilog. Для этого в консоли GitBash запустите:

$ make mcy112sim

Эта команда запустит Icarus Verilog, скомпилирует проект для симуляции, запустит симулятор. При этом в консоли будут отображаться как бы принятые из последовательного порта байты, которые firmware посылает в консоль:

simulation

Кроме того, симулятор создаст файл testbench.vcd, который можно открыть в программу GtkWave и рассматривать все внутренние сигналы проекта.

В общем, мы портировали проект PICORV32 на нашу плату MCY112 и он работает. На самом деле в такой короткой статье конечно невозможно осветить все аспекты этой системы на кристалле,  Тут есть что поизучать. Проект несомненно достоин изучения. 

 


Комментарии  
0 #10 Павел 01.02.2025 18:46
Тоже запускал picorv32 на плате waveshare с cyclone4. Я пошёл по другому пути - создал в квартусе два ip памяти - один для ram второй для rom. Megawizard в квартусе позволяет для rom выбрать файл, который будет загружен туда после запуска. Я выбирал файл прошивки и собирал проект. В итоге после сборки sof-файл уже содержит в себе и сам soc и прошивку к нему. Добавил самодельный GPIO-контроллер , чтобы мигать светодиодами и читать кнопочки. Добавил блок i2c и подключил с его помощью oled-дисплей. Плюс добавил контроллер sdram и теперь в системе ещё 32 мегабайта памяти. К минусам picorv32 я бы отнёс отсутствие возможности подключить jtag отладчик. Отлаживаться приходится либо в симуляторе, либо с помощью вывода в uart. Кстати, uart в этом проекте тоже не очень - он блокирует работу процессора на время вывода символа. Но дело своё делает, поэтому мне было лень менять его на что-то другое.
0 #9 valerysmd 19.09.2024 05:45
По поводу прерываний, в startup файле необходимо прописать процедуру запуска обработчика с сохранением 32 х регистров, с последующим их восстановлением , т.е. только на эти регистры уходит 64 такта. Возникает вопрос, почему бы не сделать это аппаратно, чтобы одним тактом можно было их сохранять/восст анавливать?
0 #8 valerysmd 09.09.2024 08:15
в моем проекте, после некоторых модификаций под себя, с добавлением модуля портов ввода/вывода и 5 модулей последовательны х интерфейсов на cycloneIII ушло 4907 LEs
0 #7 Гость 26.06.2024 02:51
А какой объём ПЛИС занимает этот проект?
0 #6 kuzya 08.04.2024 09:13
поясните пожалуйста строчки из makefile почему из одного линкер-скрипта формируется другой линкер-скрипт, а не используется один. Что означает опция -P и что делает опция -DMCY112DEMO mcy112demo_sect ions.lds: sections.lds
$(CROSS)cpp -P -DMCY112DEMO -o $@ $^
0 #5 lprmem 06.12.2023 12:13
Никак не могу найти примера использования прерываний. В irq.c как я понял обработчик прерывания, но как им пользоваться?
0 #4 valerysmd 07.11.2023 06:00
Добавлю что компилировать можно и через cmd.exe windows с помощью того же make что поставлен в Git, тем самым писать программу и компилировать в eclipse. Можно использовать и другой, например make-3.81.exe для windows, тоже работает
0 #3 valerysmd 03.11.2023 18:00
Попробовал пока что версию с готовой прошивкой bin- работает. Для удобства буду подключать компилятор к eclipse- графическому. Модуль записи/чтения флэш из прошлой сатьи попробую подключить к системе наверное по такому же принципу как сделано сейчас- переключение выводов флэш памяти.
+1 #2 Alexp 20.04.2023 18:39
Спасибо за статью. Подписан на ваш блог со времен первой платы марсоход (даже заказывал). Не хватает на мой взгляд интересных хардварных проектов от Юрия. Был очарован статьей "Марсоход начало клонирования" в свое время. Хотелось бы побольще именно таких проектов
0 #1 valerysmd 12.04.2023 06:47
Спасибо за статью. Хорошо было бы для лучшего понимания в качестве простейшего иметь проект с мигающими светодиодами, чтобы получить ответы на вопросы, связанные с созданием простейшей picosoc хотя бы с единственным портом I/O. Можно ли один раз записать в память конфигурацию (систему picosoc), и далее работать только с прошивкой, модифицируя и перезаписывая ее?
Добавить комментарий