T27.AI

Блог

Глаз на плате: камера нашла не ту плату, а спецификация на t27 вывела правильную в сеть

2026-10-08 · 5 мин чтения

[одна плата на одном столе; приём по Wi-Fi; маячок только передаёт, ARP и ping пока нет] Теперь за нашим стендом с ПЛИС следит USB-камера. На первом же кадре на плате читалось «ALINX», хотя наши записи несколько месяцев называли её QMTech Wukong: тот же кристалл в другом корпусе, так что все выводы, которые мы проверяли, были не те. Пересобранный под ALINX AX7203 маячок на t27 вывел плату в сеть. Mac за семь минут принял 2929 из 3168 её UDP-кадров, по 7.45 в секунду, как и предсказывает тайминг спецификации, а светодиоды платы, которыми управляет спецификация, показали линк, гигабит и пульс.

Гравюрный триптих к статье: Глаз на плате: камера нашла не ту плату, а спецификация на t27 вывела правильную в сеть
Открыть полный триптих в исходном размере
#t27#FPGA#Ethernet

У стенда с ПЛИС появился глаз: USB-камера, которая смотрит на плату. Цикл такой: собрать, загрузить, посмотреть. t27c превращает спецификацию в Verilog, открытая цепочка (yosys, nextpnr-xilinx, prjxray) делает из него битстрим, openFPGALoader загружает его в ПЛИС, а камера читает, что показывает плата. В первый же день глаз обнаружил, что в наших записях не та плата. А потом маячок, написанный на t27, вывел правильную плату в сеть.

Что глаз увидел первым

На первом кадре на плате читалось «ALINX». Наши записи о железе несколько месяцев называли эту плату QMTech Wukong, то есть кристалл XC7A200T в корпусе FGG676. На деле это ALINX AX7203: тот же кристалл XC7A200T, но в корпусе FBG484. По JTAG кристалл сообщает один и тот же код, 0x3636093, в обоих корпусах, поэтому ни один инструмент в цепочке не мог их различить.

[измерено] Вопрос закрыл битстрим, собранный раньше для AX7203. От генератора 200 МГц этой платы он ответил по её последовательному порту 512 из 512 сложений, совпавших до бита.

Результаты, где использовался только JTAG, остаются в силе: такие дизайны не трогают ни одного вывода корпуса. А все поиски по выводам смотрели не туда, и поэтому целый день проб не нашёл тактового сигнала ни на одном выводе.

Маячок, написанный на t27

specs/fpga/eth_beacon.t27 собирает один широковещательный UDP-кадр байт за байтом: преамбулу, широковещательный адрес, заголовок IPv4 с контрольной суммой, заголовок UDP, полезную нагрузку «T27E» со счётчиком кадров и контрольную сумму Ethernet (CRC-32). Его 9 тестов закрепляют контрольную сумму IPv4, байты заголовка, CRC строки «123456789» и последние четыре байта кадров 0 и 1. Эти четыре байта сначала посчитали через zlib, ещё до того как спецификация была написана.

Вокруг спецификации — 40 строк Verilog, только примитивы Xilinx: входной буфер для тактовой частоты 200 МГц, PLL, который делает 125 МГц и копию со сдвигом на 90 градусов, и выходные ячейки, которые выдают каждый байт на четыре провода RGMII двумя половинами по 4 бита. Сдвинутая копия служит тактом передачи. Её фронт попадает в середину каждого бита данных, поэтому сетевой микросхеме не нужна дополнительная настройка.

Три переписывания до 125 МГц

[измерено] Гигабитному Ethernet по RGMII нужна логика на 125 МГц. Первая сборка дала 64.2 МГц: позиция внутри кадра была 32-битным числом, и вычитания из неё ставили цепочки сумматоров перед CRC. С 8-битной позицией и выборкой каждого байта на такт вперёд вышло 94.6 МГц. С таблицей по позиции байта в кадре, без арифметики над этой позицией, вышло 179.7 МГц. Каждое переписывание должно было давать те же байты контрольной суммы, и тесты это проверяли.

Одно переписывание провалило тест ещё до платы. Оно записывало уходящий байт и читало тот же байт в том же такте, а тест и железо выполняют это в разном порядке. Тест контрольной суммы поймал разницу.

Светодиоды — собственный выход спецификации

Спецификация управляет четырьмя пользовательскими светодиодами: линк на порту 1, линк на порту 2, гигабитный линк и пульс, который меняется каждые четыре кадра. Камера за ними следила. Сначала мигал только пульс: тактовый сигнал и логика работали, но линка не было ни на одном порту.

[измерено] Небольшой сниффер, тоже на t27 (specs/fpga/rgmii_sniff.t27), с чтением по JTAG, измерил обе сетевые микросхемы. Порт 1 держал такт приёма 25 МГц и ничего не видел. Порт 2 работал на 125 МГц и сообщал: линк есть, 1000 Мбит/с, полный дуплекс. Принятые кадры начинались с ожидаемой преамбулы 0x55555555. Кабель был в порту 2.

Что получил компьютер

[измерено] С загруженным маячком Mac в той же сети принимал датаграммы платы с адреса 192.168.1.227. За семь минут без перерыва он получил 2929 из 3168 кадров, пронумерованных платой (92.5%). Они шли по 7.45 в секунду: это 125 МГц, делённые на паузу спецификации в 2^24 такта. Операционная система принимает кадр, только если верны контрольная сумма Ethernet, контрольная сумма IPv4 и заголовок UDP, и она приняла каждый дошедший кадр. Недостающие 7.5% потерялись по дороге к Mac на Wi-Fi, где широковещательные кадры не подтверждаются и не пересылаются повторно.

Потом камера показала то, что обещала спецификация: горят светодиоды порта 2 и гигабита, мигает пульс.

Как камера попала в цепочку

macOS не дала камеру процессу командной строки, который запускает сборки, а в настройках конфиденциальности нет кнопки, чтобы его добавить. Та же команда ffmpeg, набранная во встроенном терминале приложения Claude, работает, потому что доступ к камере запрашивает само приложение. Поэтому цикл снимает кадры там.

Чего это не решает

Пруфы

Поработаем вместе

Нужно довести FPGA/RTL-задачу до замеров на железе?

Работаю по контракту и part-time с hardware-AI, FPGA/RTL и ML-системами — от спецификации и открытого тулчейна до воспроизводимых измерений.