EVIA Paradigma — визуальное программирование: перетащите блоки из палитры на холст, соедините их связями и нажмите Run. Ту же программу можно превратить в код на C (C99, C11, C17) или C++ (от C++98 до C++20) и собрать с помощью Clang или GCC, а также в код для плат Arduino и ESP32. Интерфейс программы на английском, поэтому названия меню и кнопок даны так, как они выглядят на экране.
Сам интерфейс тоже бывает на английском, русском или армянском: Настройки > Язык интерфейса. Меню, кнопки, палитра и названия на блоках меняются вместе с ним; созданный код и сообщения компиляторов остаются на английском. Изменение вступает в силу при следующем запуске EVIA Paradigma.
Вид и язык. View > Theme выбирает светлую тему IntelliJ, тёмную тему Darcula или настройку вашей системы; тема меняется сразу и запоминается. Над списком разделов можно выбрать язык этого руководства: английский, русский или армянский.
| Блок | Код | Что делает |
|---|---|---|
| Start / End | - | Где главная программа начинается и заканчивается. |
| Set | x = x + 1 | Присваивает значение переменной (или полю: this.count = 0). |
| Input | n | Запрашивает значение и сохраняет его. |
"x = " + x | Печатает значение выражения. | |
| If / Else | x > 10 | Два выхода: then и else. |
| For | i = 1; i <= 10; i = i + 1 | Выход body выполняется, пока условие верно; конец тела цикла соедините обратно с блоком For. done продолжает программу после цикла. |
| While | n > 0 | Проверяет условие перед каждым проходом. |
| Do-While | n > 0 | Выполняет тело один раз, затем проверяет. |
| Enter / Exit | имя выхода | Только внутри метода класса: где он начинается и какими способами может закончиться. |
Блоки Board (Pin Mode, Digital Write, Digital Read, Analog Read, Analog Write, Delay, Millis, UART, SPI, I2C) нужны для микроконтроллеров; см. раздел Платы Arduino и ESP32.
Значения — это числа или текст. Операторы, от низшего приоритета к высшему:
|| &&== != < <= > >= (тексты сравниваются по алфавиту)+ - (+ склеивает текст, если хотя бы одна сторона — текст)* / %- и !, скобкиТекст пишется в двойных кавычках; допустимы escape-последовательности \", \\, \n.
Условие истинно, если это ненулевое число или непустой текст.
Класс объединяет поля (данные, которые хранит каждый объект) и методы (блок-программы, работающие с этими данными). Создать класс можно через Edit > New Class, кнопкой + New class в палитре или выделив блоки и нажав Ctrl+G, чтобы превратить их в класс.
this.имя.n читается как this.n.init (кнопка + Constructor). При создании объекта его поля
сначала получают начальные значения, затем один раз выполняется init.Перетащите метод из раздела Classes палитры на холст, чтобы вызвать его. Правый щелчок по блоку или двойной щелчок позволяют выбрать метод, объект и аргументы. Блоки с одинаковым именем объекта работают с одним объектом (и его полями); у блока без имени объекта объект свой собственный. Объекты создаются при первом использовании.
Модуль (*.eviam) — это файл с классами, которые могут использовать несколько программ.
File > New Project создаёт папку со всем, что нужно программе:
MyProject/ MyProject.eviaproj настройки проекта main.evia главная программа modules/ модули классов build/ сгенерированный код (не попадает в коммиты) README.md .gitignore
Откройте проект снова через File > Open Project (выберите папку или файл .eviaproj). В проекте модули
импортируются из modules/ и экспортируются в неё, а Generate code дополнительно записывает
build/<имя>.c или .cpp. Проект запоминает свой язык.
Меню Git запускает git, установленный на вашем компьютере, и использует уже настроенный вход
(Git Credential Manager, SSH-ключ или gh auth login). EVIA Paradigma никогда не запрашивает и не хранит
пароли или токены.
git init в ветке main (новые проекты делают это сами, если git установлен).владелец/репозиторий или URL для клонирования. Create repository on GitHub
открывает github.com в браузере с уже заполненным именем; создайте пустой репозиторий и нажмите OK.Установите git с git-scm.com, если в меню написано, что его нет.
Generate code (F7) превращает всю программу в один исходный файл. Три выпадающих списка на панели инструментов (и в окне кода) определяют результат; те же варианты есть в Run > Code Language and Mode. Если изменить их в окне кода, код генерируется заново.
| Список | Варианты | Что меняется |
|---|---|---|
| Language | C99, C11, C17 C++98, C++11, C++14, C++17, C++20 |
C: struct для каждого класса и функции Class_m_method(self, ...), небольшая библиотека
времени выполнения только с теми помощниками, которые нужны программе. C++: struct для каждого класса с
функциями-членами; C++98 использует обычные указатели, C++11/14 — std::unique_ptr, C++17/20 —
std::variant и std::to_chars. |
| Flow | Structured Goto |
Structured: if/else, for, while, do/while
и switch (метки только там, где связи не укладываются в блочную структуру). Goto: каждый блок — метка,
а каждая связь — переход; ближе всего к схеме. |
| Values | Safe Fast |
Safe: числа и текст со всеми проверками интерпретатора (неопределённые переменные, деление на ноль, текст, который
не является числом, бесконечная рекурсия). Fast: простые переменные и поля double, текст только в
Print, без проверок во время выполнения. Программа, которая хранит текст в переменной, не может использовать
значения Fast; Generate code укажет, какой блок мешает. |
Каждое сочетание проверено: вывод совпадает с выводом интерпретатора (для значений Fast — у программ, которые выполняются без ошибок). Правый щелчок по блоку, методу или классу → View source code показывает код, в который он превратился, с подсветкой, на выбранном вами языке.
Окно кода умеет сохранять файл, компилировать его и запускать. Для C используется подходящий компилятор C (clang, gcc),
нужные -std= и -lm. Компилятор выбирается в Settings: Clang (clang++ / clang) или
GCC (g++ / gcc, версия 13 или новее). В Windows EVIA Paradigma может установить любой из них сам: llvm-mingw
(Clang) или WinLibs (GCC, MinGW-w64). Visual Studio не нужна.
Ещё три языка создают код для микроконтроллеров. Оба используют быстрые значения (числа; текст только в Print), а Print и Input работают через последовательный порт на скорости 115200 бод.
| Язык | Платы | Чем собирается |
|---|---|---|
| Arduino | Arduino Uno, Nano, Mega 2560, Leonardo, Micro, Pro Mini; ESP32, ESP32-S2, -S3, -C3, -C6, -H2 |
Один скетч (.ino) с setup() и loop(); arduino-cli с ядрами arduino:avr
и esp32:esp32. |
| AVR C | шесть плат Arduino на AVR (ATmega328P, ATmega2560, ATmega32U4) | Bare-metal C без ядра Arduino. Пины, таймеры, ШИМ, АЦП и UART управляются через регистры микросхемы. Собирают avr-gcc и avr-libc, загружает avrdude. |
| PIC32 C | девять микросхем PIC32MX: MX1xx/2xx (PIC32MX150F128B, 250F128B, 270F256B), MX3xx/4xx (320F128H, 340F512H, 440F256H, 460F512L), MX5xx/6xx/7xx (695F512L, 795F512L) и PIC32 Ethernet Starter Kit II (LED1 на RD0) | Bare-metal C для Microchip XC32: тактирование, пины, ШИМ, АЦП, UART, SPI и I2C управляются через регистры; без Harmony и plib.
Собирает xc32-gcc, .hex создаёт xc32-bin2hex, а загружает команда на ваш выбор (по умолчанию pic32prog). |
Плату выбирают в списке Board рядом с языком (также в Settings). Build в окне кода компилирует программу для неё; Upload собирает и отправляет программу на плату через последовательный порт, указанный в Settings.
| Блок | Код | Что делает |
|---|---|---|
| Pin Mode | LED_BUILTIN, OUTPUT | OUTPUT, INPUT или INPUT_PULLUP (кнопка на землю при нажатии читается как LOW). |
| Digital Write | LED_BUILTIN, HIGH | HIGH для любого ненулевого значения, LOW для 0. |
| Digital Read | pressed = 4 | Сохраняет 1 (HIGH) или 0 (LOW). |
| Analog Read | level = A0 | 0..1023 на платах AVR, 0..4095 на ESP32. |
| Analog Write | 5, brightness | ШИМ, от 0 (выключено) до 255 (всегда включено). |
| Delay | 500 | Ждёт столько миллисекунд. |
| Millis | t | Сохраняет миллисекунды с начала работы программы. |
| UART Open | 9600 | Запускает последовательный порт для блоков UART с этой скоростью в бодах. |
| UART Write | 65 | Отправляет один байт (0..255). |
| UART Read | c | Сохраняет следующий принятый байт или -1, если ничего не пришло. |
| SPI Open | 1000000 | Запускает шину SPI как ведущий с этой частотой в Гц (режим 0, старший бит первым). |
| SPI Transfer | reply = 66 | Отправляет байт и сохраняет байт, пришедший одновременно с ним. |
| I2C Open | 100000 | Запускает шину I2C как ведущий с этой частотой в Гц. |
| I2C Write | 80, 0, 42 | Записывает значение в регистр устройства с этим 7-битным адресом: адрес, регистр, значение. |
| I2C Read | v = 80, 0 | Сохраняет значение регистра или -1, если устройство с таким адресом не отвечает. |
| MQTT Connect | "network", "password", "broker.example.com", 1883 | Подключается к сети и к брокеру MQTT. |
| MQTT Publish | "evia/temperature", t | Отправляет сообщение в тему: число или текст. |
| MQTT Subscribe | "evia/command" | Запрашивает у брокера сообщения этой темы (до четырёх тем). |
| MQTT Has Message | waiting = "evia/command" | Сохраняет 1, если сообщение этой темы ждёт, и 0, если нет. |
| MQTT Read | cmd = "evia/command" | Сохраняет число из следующего сообщения или -1, если ничего не пришло. |
MQTT. Имя сети, пароль, брокер и темы — это фиксированные тексты: они попадают в программу при сборке. PIC32 C управляет модулем ESP8266 или ESP32 с прошивкой AT через UART2 (RB5/RB1 на 28-выводных чипах, RF4/RF5 на остальных), поэтому Print остаётся на UART1. Arduino на плате ESP32 использует собственный WiFi платы. Запуск отвечает из брокера на вашем компьютере: публикация в тему, на которую вы подписаны, возвращает сообщение. Плата AVR отказывается от блоков MQTT (один последовательный порт, его занимает Print), FPGA тоже. Сообщение — это число, записанное так же, как его печатает Print; поскольку -1 означает ещё и «ничего не пришло», MQTT Has Message отличает настоящую -1. MQTT может идти и через собственный порт Ethernet чипов MX695F512L, MX795F512L и Ethernet Starter Kit II: выберите в настройках MQTT на PIC32 через → Ethernet, и сгенерированный файл становится приложением для проекта MPLAB X Harmony, который приносит с собой стек TCP/IP. Этот путь экспериментальный: он компилируется здесь с заглушками заголовков, но ни разу не собирался с настоящей Harmony и не запускался на плате, поэтому проверенным остаётся модуль WiFi.
MQTT через Ethernet (экспериментально). Для MX695F512L, MX795F512L и PIC32 Ethernet Starter Kit II пункт Настройки > PIC32 MQTT over > Ethernet делает полученный файл приложением для проекта MPLAB X Harmony: стек TCP/IP даёт Harmony, конфигурация, тактирование и main() остаются за проектом, а вы вызываете из него app_run(). Включите TCP, клиенты DHCP и DNS, драйвер Ethernet MAC и PHY платы (LAN8740 на этом наборе). Адрес выдаёт DHCP, поэтому имя сети и пароль не используются. Этот путь компилируется в проверках с заглушками заголовков, но не собирался с настоящим Harmony и не запускался на плате: проверенный путь — модуль WiFi.
Пины могут быть числами, выражениями или именами платы LED_BUILTIN, A0 ... A15;
HIGH и LOW работают в любом выражении. Эти имена нельзя использовать как переменные.
Блоки шин работают в Run и во всех трёх языках для плат. Перед использованием шину нужно открыть; адреса 7-битные, числа десятичные (80 — это 0x50). На PIC32 пины фиксированы для семейства микросхем и перечислены в начале созданного кода (встроенные UART1, SPI и I2C1). Run имитирует шины: передатчик UART соединён с его приёмником, поэтому байты из UART Write возвращаются через UART Read (и также появляются в выводе как текст), вход SPI соединён с его выходом, а по адресу 80 отвечает одно устройство I2C с 256 регистрами.
Run имитирует Arduino Uno: изменения пинов появляются в выводе в виде board [500 ms] pin 13 HIGH,
время идёт вперёд только в Delay (главное окно при этом реально ждёт, если ползунок скорости не стоит на полной
скорости), кнопка на каждом входном пине нажимается во второй половине каждых 2 секунд, а аналоговые пины читают
медленную волну 0..1023..0. Программа выполняется один раз, как будто из setup(); после этого пины
сохраняют своё состояние. В File > Open Example > Arduino and ESP32 Boards есть примеры: blink, button,
fade, analog meter, класс Led и примеры UART, SPI и I2C.
Языки для компьютера (C, C++) не могут использовать блоки Board; Generate code укажет, какой блок нужно заменить.
Ещё три языка, SystemVerilog, Verilog-2001 и VHDL (VHDL-2008), превращают ту же схему в аппаратуру. Каждый блок становится одним состоянием конечного автомата и занимает один такт. Переменные — знаковые 32-битные регистры.
| Плата | Микросхема | Частота | Доступные выводы |
|---|---|---|---|
| Digilent Nexys A7-100T | Artix-7 XC7A100T | 100 МГц | LED0-15, SW0-15, BTNC/U/L/R/D, JA-JD, USB-UART |
| Digilent Arty A7-35 / A7-100 | Artix-7 | 100 МГц | 4 светодиода, 4 переключателя, 4 кнопки, JA-JD, USB-UART |
| Digilent Basys 3 | Artix-7 XC7A35T | 100 МГц | 16 светодиодов, 16 переключателей, 5 кнопок, JA-JC, USB-UART |
| Olimex GateMateA1-EVB | GateMate CCGM1A1 | 10 МГц | LED0, BTN0, отладочный UART |
| Cologne Chip GateMate A1 evaluation board | GateMate CCGM1A1 | 10 МГц | только LED0 |
Выводы фиксируются при сборке, поэтому вывод должен быть числом или именем: LED0, SW3, BTNC, BTN0, JA1. Если на плате нет такого вывода, будет ошибка со списком имеющихся. Вывод нельзя одновременно читать и записывать.
Целые числа. Арифметика переполняется по модулю 32 бит; / и % округляют к нулю, деление на 0 даёт 0. Запуск использует числа double, поэтому 5 / 2 в Запуске равно 2.5, а на FPGA — 2. Пока не поддерживаются: классы, Input, Analog Read, SPI, I2C и текст в переменных (в Print текст работает).
Сборка и загрузка. Artix-7: Vivado в пакетном режиме или открытая цепочка (yosys, nextpnr-xilinx, Project X-Ray), выбирается в Настройках. GateMate: yosys, nextpnr-himbaechel, gmpack. Загрузка — Vivado или openFPGALoader. Ограничения выводов лежат в первом комментарии файла, а -o в командной строке также записывает файл .xdc или .ccf.
Проверено: моделирование в сравнении с Запуском и синтез открытыми средствами. Не проверено: Vivado, openXC7 и реальные платы.
Примеры: Файл > Открыть пример > FPGA Boards.
| Ctrl+N | Новая программа |
| Ctrl+Shift+N | Новый проект |
| Ctrl+O | Открыть программу |
| Ctrl+S / Ctrl+Shift+S | Сохранить / Сохранить как |
| Ctrl+A | Выделить все блоки |
| Delete | Удалить выделенные блоки |
| Ctrl+G | Сгруппировать выделенные блоки в класс |
| F5 / Shift+F5 | Запуск / Остановка |
| F7 | Сгенерировать код |
| Колесо мыши | Приблизить или отдалить схему к указателю (от 25% до 300%) |
| Shift+колесо / Ctrl+колесо | Прокрутка вбок / вверх и вниз |
| Средняя кнопка + перетаскивание | Двигать холст (можно начать и с блока) |
| Ctrl+= / Ctrl+- | Приблизить / отдалить |
| Ctrl+0 / Ctrl+9 | Реальный размер (100%) / вписать схему в окно |
| Ctrl+K | Git commit |
| F1 | Это руководство |
| Shift+щелчок, рамка выделения | Выделить несколько блоков |
| Правый щелчок по блоку | Меню блока (правка, View source code, удаление ...) |
Поля кода, окно кода и редактор сообщения коммита работают с клавишами Vim (отключаются в Settings). Текст открывается в режиме вставки; Esc переключает в нормальный режим.
h j k l, w b e, 0 ^ $, gg G, %, f ti a I A o O, x, dd, cw, yy, p, u, Ctrl+R, .v, V; поиск: /текст, n N, *:w принять/сохранить, :q закрыть, :wq, :s/a/b/g, :make скомпилировать и запустить (окно кода), :vim открыть в настоящем Vim