(следующий совет в значительной степени зависит от архитектуры устройства и инструментов синтеза, я говорю из опыта работы с FPGA Xilinx, такими как детали Virtex-5).
Ваше предположение, что инициализация не является синтезируемой, неверно. Инициализация сигнала абсолютно синтезируема !
Например, это можно синтезировать, чтобы запрограммировать устройство с начальным значением:
signal arb_onebit : std_logic := '0';
signal arb_priority : std_logic_vector(3 downto 0) := "1011"
Кроме того, вы можете добиться лучшего качества результатов (QoR), используя инициализацию сигналов и отказываясь от традиционных асинхронных или синхронизированных схем глобального сброса. Это потому, что инструментам больше не нужно направлять сигналы сброса на все ваши FF вокруг вашей части. Хотя некоторые FPGA старого поколения могли иметь выделенные ресурсы для сброса, это не относится к новым версиям. Это означает, что сброс маршрутизируется так же, как и любой другой сигнал в вашем проекте, замедляя процесс сборки и снижая производительность.
Что вы можете сделать вместо этого? Используйте инициализацию сигнала.
- Используйте выделенный "GSR" (глобальная установка / сброс, я считаю) Это доступно через специальный примитив Xilinx. Обратите внимание, что при использовании GSR сбрасываются не все элементы памяти устройства. Например, я считаю, что BRAM сохраняют значения, но FF сбрасываются до инициализированных значений.
- ПРОГЛ ваше устройство. Это приведет к перепрограммированию всего устройства из исходного потока битов (расположенного в PROM). Каждый раз, когда устройство загружается из PROM, все элементы памяти (FF, BRAM и т. Д.) Переводятся в известное состояние, продиктованное вашей инициализацией. Если вы не инициализируете, я полагаю, что по умолчанию это состояние "0" Вы можете проверить состояние инициализации элемента памяти, просмотрев результаты с помощью такого инструмента, как редактор FPGA (поставляется как часть набора инструментов Xilinx)
Если вам действительно нужно сбросить только небольшую часть вашего проекта («локальный» сброс), то вам следует справиться с этим так же, как вы обычно выполняете сброс.
Вот несколько ссылок на инструменты Xilinx:
EDIT
После некоторых дальнейших исследований я обнаружил, что указание начальных значений, хотя в некоторых случаях полезно для улучшения QoR, в других может повредить его. Это действительно сводится к тому, как ваш поставщик инструментов синтеза будет соблюдать первоначальную стоимость. По своей сути, начальное значение является ограничением для инструмента. Когда ваш дизайн синтезируется и затем отображается на части, к вашему проекту добавляется примечание, что «когда вы реализуете этот элемент памяти, присвойте ему это начальное значение». Во многих случаях добавление этого ограничения не позволяет оптимизировать элемент (удалить, объединить и т. Д.).
Предложение: Нет жесткого / быстрого / универсального правила для сброса и инициализации. Для лучшей оптимизации и использования ресурсов вы должны знать свой инструмент синтеза, а должны знать целевую технологию.