На страницах нашего сайта 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 мы видим:
Процессор запустился и даже предлагает нам выполнить какие-то команды в своей мини консоли.
Даже если у вас пока нет FPGA платы, вы можете просимулировать работу процессора PICORV32 в Icarus Verilog. Для этого в консоли GitBash запустите:
$ make mcy112sim
Эта команда запустит Icarus Verilog, скомпилирует проект для симуляции, запустит симулятор. При этом в консоли будут отображаться как бы принятые из последовательного порта байты, которые firmware посылает в консоль:
Кроме того, симулятор создаст файл testbench.vcd, который можно открыть в программу GtkWave и рассматривать все внутренние сигналы проекта.
В общем, мы портировали проект PICORV32 на нашу плату MCY112 и он работает. На самом деле в такой короткой статье конечно невозможно осветить все аспекты этой системы на кристалле, Тут есть что поизучать. Проект несомненно достоин изучения.
Подробнее...