Мастерство VHDL и Verilog: написание чистой комбинационной и последовательной логики
Использование блоков Process в VHDL и Always в Verilog
И в VHDL, и в Verilog блоки Process (VHDL) и Always (Verilog) являются основными конструкциями для описания поведения аппаратуры. Они используются для моделирования двух различных типов логики:
- Комбинационная логика — выходы зависят только от текущих входов.
- Последовательная логика — выходы зависят от текущих входов и прошлых состояний, обычно управляемых тактом.
Хотя многие учебники иллюстрируют простые комбинационные примеры, реальные проекты почти исключительно полагаются на последовательные блоки для реализации регистров, конечных автоматов и конвейерных стадий.
Почему D-триггеры важны
В сердце каждой последовательной схемы лежит D-триггер, минимальный элемент, захватывающий и хранящий один бит данных на фронте такта. Понимание его тайминга и ограничений setup/hold необходимо перед погружением в HDL-код более высокого уровня.
Читатели, незнакомые с основами D-триггера, должны прерваться здесь, чтобы повторить базовую работу триггера.
Комбинационная логика в блоке Process/Always
Хотя возможно, использование блока Process или Always исключительно для комбинационных присваиваний редко рекомендуется. Прямое непрерывное присваивание понятнее и менее ошибочно.
Пример VHDL
process (input_1, input_2) begin and_gate <= input_1 and input_2; end process;
Пример Verilog
always @ (input_1 or input_2) begin and_gate = input_1 & input_2; end
Список чувствительности (например, input_1, input_2) гарантирует выполнение блока при изменении любого перечисленного сигнала. Однако ту же функциональность можно выразить более лаконично с непрерывным присваиванием:
-- VHDL and_gate <= input_1 and input_2;
// Verilog assign and_gate = input_1 & input_2;
Эти операторы эквивалентны по эффекту, но непрерывное присваивание предпочтительно для чистой комбинационной логики.
Последовательная логика: распространенный вариант использования
Блоки Process (VHDL) и Always (Verilog) блестят при моделировании тактируемого поведения. Типичный паттерн включает список чувствительности с тактом и опциональным асинхронным сбросом:
Пример последовательной логики VHDL
process (clk, rst_n) begin if rst_n = '0' then q <= '0'; elsif rising_edge(clk) then q <= d; end if; end process;
Пример последовательной логики Verilog
always @(posedge clk or negedge rst_n) begin if (!rst_n) q <= 1'b0; else q <= d; end
Эти фрагменты иллюстрируют, как D-триггер неявно инстанцируется HDL. Проектировщики должны использовать этот паттерн всякий раз, когда сигнал должен быть зарегистрирован или состояние сохранено.
Лучшие практики
- Используйте непрерывные присваивания для чистой комбинационной логики.
- Резервируйте блоки Process/Always для последовательной логики, требующей фронтов такта или асинхронного управления.
- Всегда включайте явную обработку сброса, чтобы избежать выведенных защелок.
- Держите списки чувствительности явными и минимальными, чтобы предотвратить несоответствия симуляции.
Следуя этим рекомендациям, вы напишете HDL, который эффективен для синтеза и прост для верификации.
VHDL
- Мастерство VHDL и Verilog: написание чистой комбинационной и последовательной логики
- Infrastructure as Code: преимущества, вызовы и лучшие практики
- Комбинационные логические функции: основы и практические применения
- Что такое программирование: практическое руководство по языкам, рабочим процессам и частым вызовам
- Освоение Xilinx Vivado: Integrated Logic Analyzer (ILA) и Virtual Input/Output (VIO) для отладки
- Stack vs Heap в Java: Практическое руководство по распределению памяти
- Как читать и писать CSV файлы в Python: подробное руководство
- Ladder Logic 102: плюсы, минусы и когда применять
- Цифровое написание процедур: простое, эффективное и надежное
- G-код против M-кода: ключевые различия для операторов станков с ЧПУ