1. Введение: зачем нужны HDL
Языки описания аппаратуры (HDL, Hardware Description Language) — специализированные языки для проектирования, моделирования и верификации цифровых схем. Они позволяют:
- описывать структуру и поведение электронных устройств на разных уровнях абстракции;
- автоматизировать синтез реальных схем (на ПЛИС, ASIC);
- проводить симуляцию до физического изготовления;
- документировать проект в машиночитаемой форме.
Ключевые задачи HDL:
- описание структуры (какие блоки и как соединены);
- описание поведения (как схема реагирует на входные сигналы);
- временной анализ (задержки, синхронизация);
- верификация (проверка корректности через тесты).
2. Основные HDL: Verilog и VHDL
2.1. Краткая история
VHDL (VHSIC Hardware Description Language):
- разработан в 1980‑х по заказу Минобороны США (программа VHSIC);
- стандартизован IEEE (1076), версии: 1987, 1993, 2002, 2008;
- строгая типизация, близок к Ada.
Verilog:
- создан в 1984 г. компанией Gateway Design Automation;
- приобретён Cadence, передан в общественное пользование;
- стандартизован IEEE (1364), версии: 1995, 2001, 2005, 2012;
- синтаксис напоминает C.
2.2. Области применения
- проектирование ПЛИС (FPGA, CPLD);
- разработка ASIC (специализированных ИС);
- моделирование и симуляция цифровых систем;
- генерация тестовых стендов и верификация.
3. Общие концепции HDL
3.1. Уровни абстракции описания
- Поведенческий — что делает схема (алгоритмы, уравнения).
- Регистрово‑передаточный (RTL) — передача данных между регистрами, логические операции.
- Вентильный (gate‑level) — конкретные логические элементы (И, ИЛИ, НЕ).
- Физическй (layout) — размещение на кристалле (обычно не в HDL).
3.2. Параллелизм
В отличие от программных языков, HDL моделирует параллельные процессы:
- несколько блоков выполняются одновременно;
- сигналы распространяются с задержками;
- синхронизация через тактовые сигналы.
3.3. Временная модель
- Дельта‑задержки (внутри такта);
- инкрементные задержки (например,
#5— задержка 5 нс); - тактовая синхронизация (всегда@(posedge clk)).
3.4. Иерархия проектирования
- модули/сущности (top‑level, подблоки);
- порты (входы/выходы);
- сигналы (внутренние связи);
- компоненты (экземпляры подблоков).
4. VHDL: основы и особенности
4.1. Структура модуля (entity + architecture)
entity MyAdder is
port (
A, B : in std_logic_vector(7 downto 0);
Sum : out std_logic_vector(7 downto 0);
Cout : out std_logic
);
end entity;
architecture RTL of MyAdder is
begin
-- Описание поведения
process(A, B)
begin
Sum <= A + B;
Cout <= (A(7) and B(7)) or (A(7) and Sum(7)) or (B(7) and Sum(7));
end process;
end architecture;
Компоненты:
entity— интерфейс (порты);architecture— реализация (логика);port— входы/выходы;signal— внутренние сигналы;process— параллельный блок кода.
4.2. Типы данных
bit,boolean— бинарные;std_logic— 9‑знаковый тип (U, X, 0, 1, Z, W, L, H, -);std_logic_vector— вектор битов;integer,natural,positive;- пользовательские типы (
type,subtype).
4.3. Операторы
- Логические:
and,or,not,xor; - Сравнения:
=,/=,<,>,<=,>=; - Присваивание:
<=(для сигналов),:=(для переменных в process); - Конкатенация:
&.
4.4. Управляющие конструкции
if…then…elsif…else…end if;case…when…end case;- циклы:
for,while; wait(для моделирования задержек).
4.5. Пакеты и библиотеки
use ieee.std_logic_1164.all;— стандартные типы;use ieee.numeric_std.all;— арифметические операции;- пользовательские пакеты (
package).
5. Verilog: основы и особенности
5.1. Структура модуля
module MyAdder (
input [7:0] A, B,
output [7:0] Sum,
output Cout
);
// Описание поведения
assign {Cout, Sum} = A + B;
endmodule
Компоненты:
module— объявление модуля;input,output,inout— порты;wire,reg— типы сигналов;assign— непрерывное присваивание;always— процедурный блок.
5.2. Типы данных
wire— комбинационный сигнал;reg— регистр (может хранить значение);integer,real;- векторы:
[7:0](от старшего к младшему биту); parameter— константы.
5.3. Операторы
- Логические:
&&,||,!,^; - Побитовые:
&,|,~,^; - Арифметические:
+,-,*,/,%; - Сдвиги:
<<,>>; - Условный:
? :.
5.4. Управляющие конструкции
if…else;case…endcase;- циклы:
for,while,repeat; - процедурные блоки:
always @(posedge clk)— синхронный процесс;always @*— комбинационный процесс.
5.5. Макросы и компиляторные директивы
define— макроопределения;include— включение файлов;ifdef/ifndef— условная компиляция.
6. Сравнение VHDL и Verilog
| Параметр | VHDL | Verilog |
|---|---|---|
| Синтаксис | Строгий, много ключевых слов | Лаконичный, похож на C |
| Типизация | Строгая, безопасная | Менее строгая, проще ошибки |
| Типы сигналов | std_logic (9 значений) | wire, reg (2 значения + Z) |
| Параллелизм | process, block | assign, always |
| Арифметика | Через пакеты (numeric_std) | Встроенная для векторов |
| Читаемость | Явный, самодокументируемый | Компактный, но менее очевидный |
| Распространение | Европа, оборонка, аэрокосмос | США, коммерция, стартапы |
| Обучение | Требует понимания типов и иерархии | Проще для программистов на C |
7. Синтез: от HDL к аппаратуре
7.1. Что такое синтез
Преобразование HDL‑кода в сеть логических элементов (вентилей, триггеров, мультиплексоров) с учётом:
- технологических библиотек (стандартные ячейки);
- ограничений по времени (тайминги);
- площади и мощности.
7.2. Синтезируемые конструкции
VHDL:
- процессы с чувствительным списком (
process(clk, reset)); - операторы
if,case; - арифметические



