Программно-аппаратный измерительно-управляющий комплекс «Архимед»
Оглавление
- Исходные тексты
- 1. Область применения и границы системы
- 2. Состав и функциональная архитектура
- 3. Программная среда Rust/Forth
- 4. Аппаратная платформа и тактирование
- 5. Восьмиканальный генератор
- 6. Оконный компаратор и управление зарядом/разрядом
- 7. Измерительный тракт AD7401A
- 8. Масштабирование, заряд и энергетический баланс
- 9. Аппаратная безопасность и управление доступом
- 10. Аппаратный секвенсор заряда и разряда
- 11. Протокол эксперимента и воспроизводимость
- 12. План верификации и критерии приёмки
- AI-Assisted Scientific Research — исследования на естественном языке
- 13. Заключение
- Справочная документация
Исходные тексты
Архив исходных текстов Rust/Forth (forth.tar.gz).
Linux-образ для AC7020C (ac7020c-sd-flash-20261017.tar.gz).
Проект платы SMPS Controller в Altium (SMPSController_prj_01.08.26.zip).
Плата SMPS Controller для изготовления — Gerber (SMPSController_pcb_01.08.26.zip).
Рис. 1. Плата AC7020C (Zynq-7020) — аппаратная платформа комплекса «Архимед». (Нажмите для увеличения)
1. Область применения и границы системы
Комплекс предназначен для исследования переходных процессов, импульсных преобразователей, индуктивных нагрузок и резонансных цепей. Основные функции: генерация импульсов с дискретностью 10 нс; автоматизация циклов заряда/разряда по порогам; измерение прямого и обратного токов; протоколирование; удалённое управление приборами; программирование сценариев на Forth.
2. Состав и функциональная архитектура
Поток команд: оператор / AI / MCP → очередь запросов Rust → проверка прав и параметров → Forth API → драйверы MMIO/SPI/SCPI → PL и приборы. Поток данных: AD7401A/компаратор → PL → AXI4-Lite → Rust/Forth → SQLite/MQTT/Web. Временная точность фронтов определяется PL и внешней электроникой, а не задержками Linux.
Рис. 2. Схема логики работы комплекса «Архимед».
| Подсистема | Реализация | Ответственность |
|---|---|---|
| Вычислительная PS | Zynq-7020, ARM Cortex-A9, Embedded Linux | Сеть, процессы, журналирование, сценарии |
| Программируемая логика PL | FPGA Zynq-7020 | Генерация импульсов, входы компаратора, обработка PDM |
| Системный слой | Rust | Драйверы, очереди, дескрипторы, ограничения доступа |
| Исполнительная среда | Собственное ядро Forth на Rust | Композиция экспериментальных процедур |
| Интерфейс AI | Ollama / удалённый API; MCP / A2A | Интерпретация задач и формирование сценариев |
| Измерительный тракт | AD7401A, шунт, цифровая обработка PL | Измерение полярности и статистик тока |
| Пороговый тракт | Делитель, буфер, TLV3502, MCP42010 | Обнаружение достижения заданных порогов |
| Приборы | OWON ODP6033, XDM3051 по SCPI/TCP | Источник питания и независимые измерения |
2.1. Разделение ответственности
Rust владеет системными ресурсами и ограничивает доступ к устройствам. Forth задаёт последовательности операций через документированные слова. AI генерирует или предлагает Forth-сценарий, который должен проходить те же проверки, что и команды оператора. FPGA выполняет критичные по времени операции.
3. Программная среда Rust/Forth
Ядро Forth реализовано на Rust, содержит словарь, компилятор, стек данных, стек возвратов, контекст выполнения и регистрацию примитивов с описанием стек-эффекта. Контекст связывает словарь, I/O-источники, таймеры, устройства и SQLite. Диспетчер word_service обслуживает результаты AI, MCP, сетевые/терминальные очереди и таймеры; при отсутствии задач предусмотрено ожидание до 10 мс.
| Источник | Интерфейс | Назначение |
|---|---|---|
| Console | stdin/stdout, последовательная консоль или SSH | Отладка и ручное управление |
| Web | HTTP/WebSocket, порт 8081 | Терминал в браузере |
| MQTT | TCP, внешний брокер | Телеметрия и интеграция |
| MCP | HTTP, порт 8090, и stdio | Внешние AI-агенты |
| A2A | HTTP, порт 8091 | Межагентные задачи |
3.1. Приборный слой
odp: SCPI/TCP, OWON ODP6033, установка напряжений и токовых ограничений, коммутация каналов.xdm: SCPI/TCP, OWON XDM3051, контрольные измерения.spi:/dev/spidev1.0, цифровой потенциометр MCP42010.pulse/pulse_devmem: AXI4-Lite,timing_controller, база0x43C00000.adc/adc_devmem: AXI4-Lite, обработка AD7401A, база0x43C10000.sqlite,time,timer,thread: журналирование и вспомогательные службы.
4. Аппаратная платформа и тактирование
Модуль AC7020C содержит Zynq-7020 с процессорной системой PS и программируемой логикой PL. PS работает под Embedded Linux, PL получает команды через AXI4-Lite. Генератор тактируется частотой 100 МГц, поэтому дискретность программируемых интервалов равна 10 нс. Это шаг счётчика, а не гарантированная точность электрических фронтов на затворе MOSFET: следует отдельно измерять задержку драйвера, джиттер и время распространения сигнала.
5. Восьмиканальный генератор
База AXI4-Lite: 0x43C00000. Шаг канала: 0x24 (36 байт). Используемый объём: 8 × 0x24 = 0x120 байт. Описанное внутреннее пространство 0x200 байт достаточно; выделенное в Vivado окно может быть 4096 байт и не обязано совпадать с размером фактически декодируемых регистров. Ширина AXI-адреса в IP — 32 бита; смещение внутри IP определяется младшими адресными разрядами.
Адрес регистра: 0x43C00000 + 0x24 × channel + offset, channel = 0…7.
| Смещение | Регистр | Доступ | Назначение |
|---|---|---|---|
0x00 |
STATUS | RO | Состояние канала |
0x04 |
CTRL | RW | Пуск, сброс, режим, инверсия, секвенсор |
0x08 |
PRE_DELAY | RW | Предзадержка, такты |
0x0C |
PULSE | RW | Длительность импульса, такты; 0 запрещён |
0x10 |
PAUSE | RW | Пауза, такты |
0x14 |
BURST | RW | Число импульсов; 0 запрещён |
0x18 |
PST_DELAY | RW | Постзадержка, такты |
0x1C |
CYCLE | RW | Число пачек / циклов |
0x20 |
BURST_DONE | RO | Счётчик выполненных импульсов |
CTRL: бит 0 RUN, 1 RESET, 2 MODE (0 ONE-SHOT / 1 CONTINUOUS), 3 INVERT, 4 SEQUENCE; биты 5–31 зарезервированы. STATUS: бит 0 running, 1 running_dup, 2 done, 3 bReset, 4 error, 5 comparator_sync (1 — напряжение в окне). Назначения отражают опубликованную карту; не следует менять их без синхронного изменения RTL и драйвера.
Требует формализации по RTL: RESET — уровень или самосбрасывающийся импульс; условия повторного запуска при RUN=1; семантика CYCLE=0; момент очистки BURST_DONE; приоритет STOP/RESET/COMP; фиксация ошибки; состояние выхода после DONE; разрешение записи параметров при RUN=1. До проверки эти свойства нельзя выдавать за гарантированные.
5.1. Пример расчёта таймингов
При частоте 100 МГц: PULSE=1000 задаёт 10 мкс, PAUSE=500 — 5 мкс. Для BURST=10 суммарная длительность десяти импульсов и девяти промежуточных пауз составляет 10×10 + 9×5 = 145 мкс, если FSM не добавляет дополнительную паузу после последнего импульса. Точная длительность пачки должна быть подтверждена временной диаграммой RTL.
6. Оконный компаратор и управление зарядом/разрядом
Система использует TLV3502 и два регулируемых порога от MCP42010 через SPI /dev/spidev1.0. POT0 задаёт верхний порог отключения заряда, POT1 — нижний порог отключения разряда. Опубликованный пример Forth:
0x11 0x0B cmp-set \ коды верхнего и нижнего порогов
0 0x11 spi-u17 mcp42010-set
1 0x0B spi-u17 mcp42010-set
Пример в прежней редакции интерпретировался как окно приблизительно 34,5–56,5 В; одновременно приводился шаг около 4,06 В/код. Эти значения нельзя считать согласованной калибровкой без измеренной функции передачи. Корректная модель для каждого канала:
Коэффициенты a_j, b_j должны быть получены измерением порога переключения на входе контролируемого напряжения и записаны с указанием ревизии платы, температуры и методики. Для MCP42010 необходимо учитывать конечное сопротивление движка и реальную схему включения, а не предполагать идеальный линейный ЦАП.
Логика цикла: канал 0 формирует импульсы заряда до верхнего порога; канал 1 — разряда до нижнего. Опубликованное описание утверждает аппаратное исключение одновременной работы. Для инженерной верификации требуются RTL-assertions и осциллограммы, подтверждающие взаимную блокировку, в том числе при сбросе, переключении режимов и дребезге компаратора. Следует предусмотреть гистерезис и/или правила повторного разрешения, чтобы избежать колебаний на границе порога.
7. Измерительный тракт AD7401A
База AXI4-Lite: 0x43C10000; четыре канала, шаг 0x40 байт. Шунт: номинально 0,5 Ом. PDM: 20 МГц; OSR: 256. Один блок из 256 PDM-бит занимает 256/20 МГц = 12,8 мкс, что соответствует 78 125 блокам/с. Это скорость выдачи блочных результатов, не полоса пропускания тракта и не возможность разрешить отдельный 20–50-нс импульс.
В опубликованной реализации для нуля используется ориентир 128 единиц в 256-битном окне; превышение трактуется как прямой ток, уменьшение — как обратный. Точная зависимость плотности PDM от входного дифференциального напряжения и применимость номинальной полной шкалы ±320 мВ должны подтверждаться документацией AD7401A и калибровкой. Результат простого подсчёта единиц и результат sinc³-децимации неэквивалентны по частотной характеристике.
7.1. Карта регистров одного канала AD7401A
Адрес: 0x43C10000 + 0x40 × channel + offset, channel = 0…3.
| Смещение | Имя | Доступ | Назначение по опубликованному интерфейсу |
|---|---|---|---|
0x00 |
CTRL | RW | Управление измерением |
0x04 |
STATUS | RO | Статус готовности |
0x08 |
COUNT | RO | Число завершённых окон OSR |
0x0C |
FWD_ACC | RO | Накопленная положительная составляющая |
0x10 |
FWD_CNT | RO | Число положительных отсчётов |
0x14 |
FWD_AVG | RO | Среднее прямой составляющей, Q8 |
0x18 |
FWD_EMA | RO | Экспоненциальное среднее, Q8 |
0x1C |
REV_ACC | RO | Накопленная обратная составляющая |
0x20 |
REV_CNT | RO | Число отрицательных отсчётов |
0x24 |
REV_AVG | RO | Среднее обратной составляющей, Q8 |
0x28 |
REV_EMA | RO | Экспоненциальное среднее, Q8 |
Опубликованная схема разделяет Batch (ACC/CNT/AVG; фиксация при спаде RUN) и Stream (EMA; обновление при поступлении новых блоков). Формула AVG = ACC × 256 / CNT соответствует Q8, если ACC накапливает целочисленные значения той же измеряемой величины, а CNT — число участвующих отсчётов. Требуется явно задокументировать разрядность ACC, переполнение, округление, случай CNT=0, формат отрицательных величин, статус VALID и момент атомарной публикации нескольких регистров.
7.2. Контракт захвата результатов
Для воспроизводимого измерения необходимо определить единый аппаратно-программный контракт: при начале RUN обнулить накопители новой серии; во время RUN обновлять статистики; при окончании RUN сохранить накопленные значения и зафиксировать согласованный снимок. Чтение всех регистров одной серии должно возвращать одну версию данных. Если реализован отдельный механизм LOCK/ARM, его переходы и приоритет относительно RUN должны быть описаны в карте CTRL/STATUS и проверены по RTL. Не следует смешивать две различные версии IP без номера ревизии.
8. Масштабирование, заряд и энергетический баланс
Пусть c_n — результат одного окна PDM, c_0 — измеренный нулевой код, а K_I — калиброванный коэффициент в амперах на код. Тогда:
Если FWD/REV_AVG хранит среднее в Q8, физическое значение равно raw/256 × K, где K зависит от определения целочисленной единицы в RTL. Прежняя формула I_FWD = FWD_AVG × 5000 / 256 [мкА] означает 5 мА на целый код и может применяться только после проверки калибровки. Аналогично Q_net = (FWD_ACC − REV_ACC) × 64 [нКл] верно лишь при ACC в единицах 5 мА·отсчёт и интервале 12,8 мкс. При Q8-накоплении коэффициент меняется в 256 раз.
Важное ограничение: нулевой суммарный заряд через шунт за интервал не равнозначен нулевой потреблённой энергии. Для энергии необходимо синхронно измерять напряжение и ток:
При высокочастотных переходных процессах следует учитывать фазовую ошибку каналов, полосу измерения, паразитные элементы, возврат энергии в источник и изменение запасённой энергии в конденсаторах/индуктивностях. Одно среднее значение тока не позволяет вычислить активную энергию при переменном напряжении.
8.1. Метрологический паспорт канала (заполняется испытаниями)
| Параметр | Метод определения | Статус |
|---|---|---|
| Смещение нуля | Запись при нулевом токе | Требует измерения |
| Коэффициент преобразования | Калиброванный DC-ток в обеих полярностях | Требует измерения |
| Нелинейность | Несколько контрольных точек диапазона | Требует измерения |
| Полоса/задержка | Ступень тока и частотный тест | Требует измерения |
| Температурный дрейф | Контроль при разных температурах | Требует измерения |
| Переполнение ACC | Длительная серия и граничные тесты | Требует RTL-проверки |
| Согласованность снимка | Чтение при RUN/STOP | Требует RTL-проверки |
9. Аппаратная безопасность и управление доступом
- Независимая блокировка: аварийное отключение силовых выходов должно быть реализовано аппаратно и иметь приоритет над RUN и командами AI.
- Токовая защита: программное ограничение 200 мА недостаточно для защиты от наносекундных или микросекундных аварий; требуются соответствующий аналоговый/аппаратный канал ограничения и подтверждённое время реакции.
- Взаимная блокировка: запрет одновременной проводимости конфликтующих ключей должен подтверждаться на уровне выходов драйверов, включая запуск, RESET и потерю тактирования.
- Fail-safe: при сбое Linux, потере связи, зависании Forth, перезагрузке PS или некорректной конфигурации PL выходы должны переходить в безопасное состояние; это требование подлежит реализации и испытаниям.
- Арбитраж: только один владелец может менять силовые параметры конкретного канала; чтение телеметрии допускается параллельно.
- AI: модель не получает привилегированного прямого MMIO-доступа; все команды проходят проверки диапазонов, прав, состояний и журналируются.
До подтверждения перечисленных механизмов испытания проводить с независимыми ограничителями источника питания, защитой персонала и контролем энергии накопителя.
10. Аппаратный секвенсор заряда и разряда
Секвенсор (sequencer.vhd) — модуль программируемой логики Zynq-7020, координирующий два канала импульсного генератора timing_controller по сигналам оконного компаратора. Канал CH0 управляет зарядом накопительного конденсатора, CH1 — разрядом. После настройки переходы между стадиями выполняются в FPGA без программного переключения каждого этапа со стороны ARM, Linux или Rust/Forth.
Секвенсор определяет, какой канал разрешён к работе, но не генерирует импульсы самостоятельно. Длительность, частота и временные параметры импульсов задаются соответствующими каналами timing_controller.
Функциональная структура
Функциональная схема. Выходы секвенсора управляют двумя каналами импульсного генератора.
Режимы управления
| SEQ0 | SEQ1 | Режим | Поведение |
|---|---|---|---|
| 0 | 0 | Ручной | Программные RUN/RESET управляют каналами; пороги не участвуют в переключении. |
| 1 | 0 | Заряд | CH0 управляется секвенсором до достижения верхнего порога; CH1 остаётся под ручным управлением. |
| 0 | 1 | Разряд | CH1 управляется секвенсором до достижения нижнего порога; CH0 остаётся под ручным управлением. |
| 1 | 1 | Эстафета | Автоматическое чередование заряда CH0 и разряда CH1 по двум порогам. |
Алгоритм автоматической эстафеты
- При разрешённой работе активируется CH0, начинается заряд конденсатора.
- При достижении верхнего порога вход
comp_highпереходит в 0; секвенсор прекращает заряд и разрешает CH1. - CH1 разряжает конденсатор до нижнего порога.
- При
comp_low=0разряд прекращается и вновь разрешается CH0. - Цикл повторяется, пока сохраняются условия разрешения работы.
Сигналы comp_high и comp_low имеют активный низкий уровень. Пороги напряжения устанавливаются внешним измерительно-компараторным трактом; секвенсор не измеряет напряжение и не рассчитывает пороги.
Интерфейс и временные характеристики
| Группа | Сигналы | Назначение |
|---|---|---|
| Синхронизация | clk, reset | Тактовый сигнал и сброс логики |
| Обратная связь | comp_high, comp_low | События достижения верхнего и нижнего порогов |
| Управление | ch0_sw_run, ch1_sw_run, ch0_sw_reset, ch1_sw_reset | Программные запросы RUN/RESET |
| Выбор режима | ch0_sequence, ch1_sequence | Включение последовательного управления по каналам |
| Выходы | ch0_gen_run, ch1_gen_run, ch0_gen_reset, ch1_gen_reset | Управление генераторами |
| Резерв | ch0_gen_stop, ch1_gen_stop | В описанной версии постоянно равны 0 |
При частоте тактирования FPGA 100 МГц период составляет 10 нс. Асинхронные входы компаратора проходят синхронизацию; поэтому фактическая задержка реакции превышает один такт и зависит от структуры синхронизаторов и управляющей логики. Полное время отключения силового ключа дополнительно определяется задержками компаратора и драйвера.
Итог: sequencer.vhd формирует аппаратный контур управления стадиями заряда и разряда по обратной связи от оконного компаратора. Временная структура силовых импульсов остаётся задачей timing_controller, а защитные блокировки должны проверяться отдельно.
Технический источник: Описание реализации секвенсора.
11. Протокол эксперимента и воспроизводимость
Каждая серия должна иметь идентификатор и содержать: дату/время, ревизию PCB, версию bitstream и исходников RTL, хеш программной сборки Rust/Forth, версию калибровки, параметры генератора, пороги компаратора, условия питания, исходные счётчики и результаты измерения, события защит, причину останова, а также сведения о контрольных приборах. Для SQLite следует определить схему таблиц и единицы хранения.
10.1. Последовательность безопасного выполнения
- Проверить состояние питания, аварийные входы и блокировки; обеспечить отключённые выходы.
- Загрузить и проверить калибровку компаратора и измерительного тракта.
- Установить нижний и верхний пороги; проверить
LOW < HIGHи допустимые пределы. - Записать параметры генератора; прочитать обратно и проверить корректность.
- Подготовить АЦП и зафиксировать идентификатор новой серии.
- Разрешить аппаратную логику, запустить генератор и регистрацию.
- Остановить генератор по завершению, команде или аварии; дождаться подтверждённого останова.
- Зафиксировать согласованный набор измерений, сохранить его вместе с параметрами и кодом завершения.
- Снять разрешение силовых выходов и вернуть комплекс в безопасное состояние.
10.2. Пример Forth (синтаксис существующего API)
\ Демонстрация известных слов. Перед реальным запуском проверить
\ порядок аргументов, межблокировки и контракт завершения RUN/ADC.
0x11 0x0B cmp-set
adc0 1 adc-enable!
adc0 adc-reset-count
1000 pulse-width! \ 10 мкс при 100 МГц
500 pulse-pause! \ 5 мкс
10 pulse-burst!
1 pulse-cycles!
0 pulse-mode! \ ONE-SHOT
1 pulse-seq!
pulse-start
\ Здесь должно быть ожидание аппаратного DONE или FAULT,
\ а не немедленный останов после запуска.
\ После подтверждения DONE/STOP — фиксация и чтение Batch.
Слова adc-avg-valid?, wait, adc-batch@ из прежнего примера допустимо применять только после проверки их стек-эффектов и фактической семантики. Сама последовательность выше — иллюстрация API, не готовый безопасный производственный скрипт.
12. План верификации и критерии приёмки
| Проверка | Метод | Критерий |
|---|---|---|
| Карта AXI | Чтение/запись всех регистров, границы каналов | Нет алиасинга, корректные RO/RW |
| Импульс 10 нс × N | Логический анализатор/осциллограф | Соответствие счётчику с учётом оговорённой задержки |
| PULSE=0, BURST=0 | Негативные тесты | Ошибка и отсутствие опасных импульсов |
| RUN/RESET/DONE | Тест переходов FSM | Соответствие формальному контракту |
| Конфликт каналов 0/1 | Одновременные команды, RESET, FAULT | Отсутствие запрещённого перекрытия |
| Порог TLV3502 | Плавный прогон входного напряжения | Срабатывание в калиброванном диапазоне |
| Нуль/полярность АЦП | 0, ±I от эталонного источника | Корректный знак, погрешность в спецификации |
| Интеграл заряда | Известный постоянный ток и длительность | Q ≈ I × t в заданном допуске |
| Переполнение | Максимальная длительность серии | Нет скрытой потери старших разрядов |
| Отказ связи/PS | Отключение сети, зависание процесса | Подтверждённое безопасное состояние |
Численные допуски, максимальные задержки и результаты тестов должны быть опубликованы после измерений. До этого таблица является планом испытаний, а не свидетельством их успешного прохождения.
AI-Assisted Scientific Research — исследования на естественном языке
Комплекс «Архимед» используется не только для автоматизации лабораторного оборудования, но и непосредственно в экспериментальных исследованиях с участием AI-агентов.
Исследователь формулирует задачи на естественном языке. AI-агент преобразует их в последовательности Forth-команд, управляет генераторами и источниками питания, считывает измерительные параметры, фиксирует результаты и сохраняет контекст текущего эксперимента.
Пример исследовательского сценария — поиск и уточнение резонансной частоты:
Исследователь: «Включи генератор, уточним резонансную частоту».
AI-агент формирует команды управления генератором и запускает измерительный процесс.
Исследователь: «Увеличь/уменьши период сигнала на 10 нс».
AI-агент корректирует временные параметры генератора, сохраняя контекст эксперимента.
Исследователь: «Зафиксируй. На источнике питания 50 В, ток 0,15 А, максимальное измеренное напряжение 347 В. Выключай».
AI-агент регистрирует параметры эксперимента, фиксирует результаты измерений и выполняет команду отключения оборудования.
Ключевые возможности:
- Интерактивное управление экспериментами на естественном языке.
- Пошаговая настройка генераторов, источников питания и измерительных приборов.
- Изменение временных параметров сигналов с наносекундным разрешением.
- Сохранение контекста эксперимента между последовательными командами.
- Регистрация измерений и параметров эксперимента в SQLite.
- Контроль фактического состояния оборудования через аппаратную обратную связь.
- Выполнение последовательностей измерений с участием AI-агента без ручного написания управляющих программ.
Таким образом, AI используется на двух уровнях: как инструмент ускоренной разработки программного комплекса и как непосредственный участник экспериментальной работы — для управления оборудованием, настройки параметров и регистрации результатов.
Работающая демонстрация управления лабораторным источником питания OWON ODP6033 на естественном языке:
13. Заключение
«Архимед» объединяет детерминированную FPGA-периферию, системное программирование на Rust, расширяемую предметную среду Forth и интерфейсы AI/MCP. Научная и инженерная ценность комплекса определяется не самим наличием AI, а проверяемым соответствием управляющих команд физическим действиям и измеряемым величинам. Поэтому каждая аппаратная гарантия должна подтверждаться RTL и испытанием, а каждая численная характеристика измерительного тракта — калибровкой и указанием погрешности.