Выбор правильного кодирования FPGA: практическое исследование на примере «Игры жизни» Конвея
Следуйте за тремя экспериментами, иллюстрирующими, как выбрать наиболее подходящее кодирование для FPGA-дизайна.
При проектировании FPGA-логики инструмент синтеза обычно выбирает кодирование; обычно лучше доверять его решению. Однако понимание нюансов бинарного, Грея и one-hot представлений может помочь предвидеть, когда компилятор может предпочесть одно над другими.
Эта статья проводит через практический эксперимент, использующий «Игру жизни» Конвея в качестве тестовой площадки, подсвечивая компромиссы, возникающие при применении каждого кодирования к большому массиву конечных автоматов.
В этой серии мы охватывали построение FSM в Verilog, влияние начальных состояний и памяти на кодирование, и высокоуровневое сравнение бинарных, one-hot и схем Грея.
Система под тестом
Для увеличения аппаратных различий я инстанцировал конечный автомат десятки раз по сетке 23×23, позволяя прямое сравнение бинарного, Грея и one-hot кодирований.
«Игра жизни» Конвея — классический клеточный автомат, моделирующий рождение, выживание и смерть клеток на прямоугольной 2D решётке. Каждая клетка следует трём простым правилам в каждом цикле:
- Живые клетки с двумя или тремя живыми соседями выживают.
- Мёртвые клетки с тремя живыми соседями становятся живыми.
- Все остальные клетки умирают или остаются мёртвыми.
Эти правила порождают богатое разнообразие возникающих паттернов и обеспечивают чистую, хорошо понятную нагрузку для оценки стратегий кодирования.
Ниже GIF пушки Билла Госпера (Glider Gun), популярного паттерна в Игре жизни.

Вариация Игры жизни Конвея, известная как Пушка Госпера. GIF создан Лукасом Виейрой [CC BY-SA 3.0]
Verilog код
Логика клетки моделируется как 8-состояний FSM. Хотя вычисление на клетку в Игре жизни завершается за один цикл, 8-состояний дизайн создаёт заметные различия между кодированиями. Следующий Verilog модуль демонстрирует оригинальное бинарное кодирование.
`define STATE_0 3'b000
`define STATE_1 3'b001
`define STATE_2 3'b010
`define STATE_3 3'b011
`define STATE_4 3'b100
`define STATE_5 3'b101
`define STATE_6 3'b110
`define STATE_7 3'b111
module LifeCell( input clk, input nrst, input seed, input [7:0] neighbors, output reg alive); reg [2:0] state; always @ (posedge clk) if (nrst == 0) state <= `STATE_0; else case(state) `STATE_0: begin // ... state <= `STATE_1; end `STATE_1: begin // ... state <= `STATE_2; end // ... `STATE_7: begin // ... state <= `STATE_1; end endcase endmodule
Если вы хотите глубже погрузиться в код, полный проект доступен на GitHub.
Реализации кодирования FPGA
Дизайн был синтезирован на сетке 23×23 клеток, результатом в 27 различных реализаций: три варианта FSM, каждый скомпилированный с бинарным, Греем и one-hot кодированием, на трёх целевых FPGA.
FSM #1: Оригинальная модель
Этот FSM запускает начальное состояние один раз, затем циклится через оставшиеся семь состояний — последовательность, предполагавшая преимущество Грея.

FSM #2: Последовательность А
Действующий как простой 3-битный счётчик, этот FSM ещё больше укрепил ожидание доминирования Грея.

FSM #3: Произвольный запутанный путь
Этот вариант делит критический путь FSM #1, но идёт нелинейным маршрутом, когда счётчик соседей превышает три. One-hot кодирование казалось естественным выбором для таких иррегулярных переходов.

Целевые архитектуры
Реализации строились с вендорными тулчейнами для следующих устройств:
- Xilinx Vivado Suite на Artix-7 FPGA
- Intel Quartus Prime на Cyclone-V FPGA
- Lattice Diamond на LatticeXP2 FPGA
Сравнение результатов
Бенчмаркинг FPGA-дизайнов по своей природе метрико-ориентирован. Я выбрал четыре ключевых индикатора — использование логических ресурсов, количество регистров, оценочная максимальная частота и накристаллическая мощность — и назначил взвешенные баллы каждому. Лучший исполнитель в каждой метрике получил +1 (или +2 для взвешенных метрик), худший — –1 (или –2), средний — 0.
- Логические единицы: LUTs (Xilinx/Lattice) или ALMs (Intel). Вес 1.
- Регистры: Вес 1.
- Максимальная частота: Вес 2.
- Накристаллическая мощность: Вес 2.
Накопительные баллы для каждой из 27 реализаций показаны ниже.

Таблица результатов для всех 27 реализаций. Зелёный подсвечивает лучшее кодирование, красный — худшее, жёлтый — медиану (без ничьих).
Во всех случаях one-hot кодирование появляется в нижних двух строках, с только двумя случаями паритета с другими схемами. Напротив, кодирование Грея последовательно выявляется как лучший исполнитель, особенно когда частота и мощность имеют больший вес.
Для подсветки победителей, таблица ниже изолирует ведущее кодирование для каждого варианта.

Вердикт
Хотя данные склоняются к кодированию Грея для этой конкретной нагрузки Игры жизни, результат зависит от того, какие метрики вы приоритизируете. Если вы цените использование ресурсов над производительностью, может появиться другой рейтинг. Моя цель здесь — не предписать универсальное правило, а проиллюстрировать, как эмпирические доказательства могут направлять выбор кодирования.
Не стесняйтесь исследовать исходный код, 27 синтезированных реализаций или живую симуляцию Игры жизни в репозитории проекта на GitHub.
Встроенный
- Swissbit запустила U-50n Nano USB 3.1 флеш-накопитель — надежное высокопроизводительное хранилище для промышленного и IoT
- AAEON COM-CFHB6: Компактный высокопроизводительный Type-6 модуль с Intel CPU, 48 ГБ DDR4 ECC и 24 PCIe lanes для Edge, AIoT и промышленности
- Выбор правильного контроллера: ПЛК, PAC, DCS или IPC — разбор вариантов
- Когда использовать тестирование голых плат для надежной разработки печатных плат
- Защитите свои двигатели: основные преимущества линейных реакторов
- Когда использовать молотковидный кран: практическое руководство
- Отрасли, использующие Кевлар: от авиакосмики до личной защиты
- Максимизация эффективности с решениями Remote Expert в Industry 4.0
- Выбор правильного алюминиевого сплава для вашего проекта
- Титан против алюминия: выбор лучшего цветного металла для прочности и веса