← TRAI FPGA OS · Конструктор · Эксплорер ядер

🖥 Как прошить микрокомпьютер

Устройство, собранное в конструкторе, работает не только на ПЛИС — та же схема прошивается в Raspberry Pi или Arduino. Логика бит-в-бит идентична ПЛИС-версии: каждое ядро доказано одними и теми же тест-векторами.
Гарантия эквивалентности. Си-порт каждого ядра прогнан через те же вектора, что и VHDL-RTL: одно верифицированное IP — три носителя (ПЛИС / Pi / Arduino) с доказуемо одинаковым поведением.

Шаг 1 — соберите пакет прошивки

  1. Откройте схему в конструкторе. Ядра с бейджем МК✓ или SBC✓ уже портированы.
  2. Нажмите «Прошивка МК» в тулбаре. Платформа сама определит носитель: все ядра МК-класса → скетч Arduino; есть SBC-ядро (тяжёлая математика) → пакет Raspberry Pi.
  3. Скачается zip: firmware_<имя>.c/.h (планировщик такта), hal_<имя>.h (контракт датчиков), main_pi_*.c / sketch_*.ino (оболочки), cores/*.c (верифицированные ядра), README.md.

Перед прошивкой прогоните схему в «МК-эмуляторе» (кнопка рядом) — сервер соберёт эту же Си-прошивку и покажет осциллограммы выходов. Что видите в эмуляторе — то и получите на плате.

Шаг 2A — Raspberry Pi SBC

Что нужно

Любой Raspberry Pi (Zero 2 W и выше), Raspberry Pi OS, gcc (уже в системе).

Сборка

unzip device_firmware.zip && cd firmware
# реализуйте датчики/актуаторы из hal_<имя>.h (пример каркаса — в README)
gcc -O2 -std=c99 -I. -Icores cores/*.c firmware_<имя>.c main_pi_<имя>.c hal_my.c -o device

HAL: подключите железо

Прошивка не привязана к пинам — вы отдаёте ей входы и забираете выходы. Минимальный hal_my.c:

#include "hal_<имя>.h"
#include <unistd.h>
int32_t hal_in_isen_adc_a(void){ return read_my_adc(0); }   /* ваш датчик */
void hal_out_fdir_action(int32_t v){ set_my_led(v); }        /* ваш актуатор */
void hal_tick_wait(void){ usleep(10000); }                   /* период такта, здесь 100 Гц */

GPIO/I²C/SPI — любой привычный способ: libgpiod, pigpio, /dev/i2c-*.

Автозапуск (systemd)

sudo cp device /usr/local/bin/
printf '[Unit]\nDescription=IPCosmos edge device\n[Service]\nExecStart=/usr/local/bin/device\nRestart=always\n[Install]\nWantedBy=multi-user.target\n' | sudo tee /etc/systemd/system/ipc-device.service
sudo systemctl enable --now ipc-device

Шаг 2B — Arduino / Cortex-M МК

Arduino IDE

  1. Создайте скетч, скопируйте в его папку: sketch_<имя>.ino, firmware_<имя>.c/.h, hal_<имя>.h и все cores/*.c/.h.
  2. Добавьте файл hal_my.cpp с реализацией hal_in_*/hal_out_*/hal_tick_wait:
extern "C" {
  #include "hal_<имя>.h"
}
int32_t hal_in_isen_adc_a(void){ return analogRead(A0); }
void hal_out_fdir_action(int32_t v){ digitalWrite(13, v>2); }
void hal_tick_wait(void){ delay(10); }   // 100 Гц
  1. Прошейте как обычный скетч (кнопка «Загрузить»). Готово.

PlatformIO

pio project init --board <ваша_плата>
# src/ ← sketch + firmware + cores + hal_my.cpp
pio run -t upload

Вся логика — целочисленная (int32/int64, без float): работает одинаково на AVR, Cortex-M0…M7, ESP32. Рекомендуемый класс — Cortex-M (Arduino Due/Zero/Nano 33, STM32 Nucleo): 32-битный int нативный.

Частота такта: за что отвечает hal_tick_wait()

Класс устройстваТиповой тактhal_tick_wait
Стражи/FDIR/BMS (event)10–100 Гцdelay(10…100 мс)
Контуры управления (control)100 Гц–1 кГцтаймер 1–10 мс
Тяжёлая математика на Pi (frame)по кадру данныхпо готовности кадра

Пер-сэмпловые МГц-потоки (РЧ, видео на скорости АЦП) на микрокомпьютере не работают — такие ядра помечены бейджем ПЛИС и собираются только в битстрим.

Проверка на месте

В пакете лежит plan_<имя>.json — порядок входов/выходов. Соберите прошивку с -DDEV_STANDALONE и прогоните файл стимулов — вывод должен совпасть с «МК-эмулятором» портала тик-в-тик:

gcc -O2 -std=c99 -DDEV_STANDALONE -I. -Icores cores/*.c firmware_<имя>.c -o fw_test
./fw_test stim.txt

© 2026 ООО «Технологии репликации» (techrepl.ru) · IPCosmos / TRAI FPGA OS