Руководство EVIA Paradigma

EVIA Paradigma — визуальное программирование: перетащите блоки из палитры на холст, соедините их связями и нажмите Run. Ту же программу можно превратить в код на C (C99, C11, C17) или C++ (от C++98 до C++20) и собрать с помощью Clang или GCC, а также в код для плат Arduino и ESP32. Интерфейс программы на английском, поэтому названия меню и кнопок даны так, как они выглядят на экране.

Сам интерфейс тоже бывает на английском, русском или армянском: Настройки > Язык интерфейса. Меню, кнопки, палитра и названия на блоках меняются вместе с ним; созданный код и сообщения компиляторов остаются на английском. Изменение вступает в силу при следующем запуске EVIA Paradigma.

  1. Перетащите на холст Start, несколько блоков и End.
  2. Потяните от маленького круга внизу блока (его выходного порта) к другому блоку, чтобы соединить их.
  3. Двойной щелчок по блоку открывает его код для редактирования.
  4. Колесо мыши над схемой приближает и отдаляет её к указателю.
  5. Нажмите Run (F5). Вывод появится в панели внизу; выполняемый блок подсвечивается.
  6. Выберите Language на панели инструментов и нажмите Generate code (F7), чтобы увидеть, сохранить, скомпилировать и запустить программу.

Вид и язык. View > Theme выбирает светлую тему IntelliJ, тёмную тему Darcula или настройку вашей системы; тема меняется сразу и запоминается. Над списком разделов можно выбрать язык этого руководства: английский, русский или армянский.

Блоки

БлокКодЧто делает
Start / End-Где главная программа начинается и заканчивается.
Setx = x + 1Присваивает значение переменной (или полю: this.count = 0).
InputnЗапрашивает значение и сохраняет его.
Print"x = " + xПечатает значение выражения.
If / Elsex > 10Два выхода: then и else.
Fori = 1; i <= 10; i = i + 1Выход body выполняется, пока условие верно; конец тела цикла соедините обратно с блоком For. done продолжает программу после цикла.
Whilen > 0Проверяет условие перед каждым проходом.
Do-Whilen > 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, чтобы превратить их в класс.

Перетащите метод из раздела 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 и GitHub

Меню Git запускает git, установленный на вашем компьютере, и использует уже настроенный вход (Git Credential Manager, SSH-ключ или gh auth login). EVIA Paradigma никогда не запрашивает и не хранит пароли или токены.

Установите git с git-scm.com, если в меню написано, что его нет.

Сгенерированный код: C и C++

Generate code (F7) превращает всю программу в один исходный файл. Три выпадающих списка на панели инструментов (и в окне кода) определяют результат; те же варианты есть в Run > Code Language and Mode. Если изменить их в окне кода, код генерируется заново.

СписокВариантыЧто меняется
LanguageC99, 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.
FlowStructured
Goto
Structured: if/else, for, while, do/while и switch (метки только там, где связи не укладываются в блочную структуру). Goto: каждый блок — метка, а каждая связь — переход; ближе всего к схеме.
ValuesSafe
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 не нужна.

Платы Arduino и ESP32

Ещё три языка создают код для микроконтроллеров. Оба используют быстрые значения (числа; текст только в Print), а Print и Input работают через последовательный порт на скорости 115200 бод.

ЯзыкПлатыЧем собирается
ArduinoArduino 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 ModeLED_BUILTIN, OUTPUTOUTPUT, INPUT или INPUT_PULLUP (кнопка на землю при нажатии читается как LOW).
Digital WriteLED_BUILTIN, HIGHHIGH для любого ненулевого значения, LOW для 0.
Digital Readpressed = 4Сохраняет 1 (HIGH) или 0 (LOW).
Analog Readlevel = A00..1023 на платах AVR, 0..4095 на ESP32.
Analog Write5, brightnessШИМ, от 0 (выключено) до 255 (всегда включено).
Delay500Ждёт столько миллисекунд.
MillistСохраняет миллисекунды с начала работы программы.
UART Open9600Запускает последовательный порт для блоков UART с этой скоростью в бодах.
UART Write65Отправляет один байт (0..255).
UART ReadcСохраняет следующий принятый байт или -1, если ничего не пришло.
SPI Open1000000Запускает шину SPI как ведущий с этой частотой в Гц (режим 0, старший бит первым).
SPI Transferreply = 66Отправляет байт и сохраняет байт, пришедший одновременно с ним.
I2C Open100000Запускает шину I2C как ведущий с этой частотой в Гц.
I2C Write80, 0, 42Записывает значение в регистр устройства с этим 7-битным адресом: адрес, регистр, значение.
I2C Readv = 80, 0Сохраняет значение регистра или -1, если устройство с таким адресом не отвечает.
MQTT Connect"network", "password", "broker.example.com", 1883Подключается к сети и к брокеру MQTT.
MQTT Publish"evia/temperature", tОтправляет сообщение в тему: число или текст.
MQTT Subscribe"evia/command"Запрашивает у брокера сообщения этой темы (до четырёх тем).
MQTT Has Messagewaiting = "evia/command"Сохраняет 1, если сообщение этой темы ждёт, и 0, если нет.
MQTT Readcmd = "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 укажет, какой блок нужно заменить.

FPGA: Artix-7 и GateMate

Ещё три языка, SystemVerilog, Verilog-2001 и VHDL (VHDL-2008), превращают ту же схему в аппаратуру. Каждый блок становится одним состоянием конечного автомата и занимает один такт. Переменные — знаковые 32-битные регистры.

ПлатаМикросхемаЧастотаДоступные выводы
Digilent Nexys A7-100TArtix-7 XC7A100T100 МГцLED0-15, SW0-15, BTNC/U/L/R/D, JA-JD, USB-UART
Digilent Arty A7-35 / A7-100Artix-7100 МГц4 светодиода, 4 переключателя, 4 кнопки, JA-JD, USB-UART
Digilent Basys 3Artix-7 XC7A35T100 МГц16 светодиодов, 16 переключателей, 5 кнопок, JA-JC, USB-UART
Olimex GateMateA1-EVBGateMate CCGM1A110 МГцLED0, BTN0, отладочный UART
Cologne Chip GateMate A1 evaluation boardGateMate CCGM1A110 МГцтолько 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+KGit commit
F1Это руководство
Shift+щелчок, рамка выделенияВыделить несколько блоков
Правый щелчок по блокуМеню блока (правка, View source code, удаление ...)

Клавиши Vim

Поля кода, окно кода и редактор сообщения коммита работают с клавишами Vim (отключаются в Settings). Текст открывается в режиме вставки; Esc переключает в нормальный режим.