DocsTech
/
VERILOG HDL
/

~ cd комбинационная логика. операторы. assign

1. Что такое комбинационная логика?

Комбинационная логика — это схема, у которой выход зависит ТОЛЬКО от текущего состояния входов. Никакой памяти, никаких тактовых сигналов.

Пример из жизни: обычный выключатель света. Положение выключателя (вход) сразу определяет, горит лампа (выход) или нет.

В Verilog комбинационная логика описывается двумя способами:

Главное правило: комбинационная схема не хранит состояние. Изменился вход — изменился выход.

2. Ключевое слово assign

assign — это главный инструмент для комбинационной логики. Оно создает непрерывное соединение: как только меняется сигнал справа, сигнал слева пересчитывается мгновенно.

Синтаксис:

...
Копировать
assign имя_сигнала = выражение;

Пример:

...
Копировать
assign o_y = i_a & i_b; // выход o_y всегда равен i_a AND i_b

Важно: слева от assign может стоять только wire, но никогда reg. Это логично: провод не хранит, а непрерывно передает.

3. Битовые операторы (побитовые)

Эти операторы работают с каждым битом вектора независимо. Самые популярные:

Пример:

...
Копировать
assign o_result = i_a & i_b; // поразрядное И
assign o_xor = i_a ^ i_b; // поразрядное XOR

Если i_a = 4'b1100i_b = 4'b1010, то:

4. Алгебраические операторы

Обычная арифметика, но с подвохом — результат зависит от разрядности.

Пример:

...
Копировать
assign o_sum = i_a + i_b;
assign o_diff = i_a - i_b;

Важно: при сложении может возникнуть переполнение. Если складываешь два 4-битных числа, результат может быть 5-битным. Думай о разрядности!

5. Операторы сдвига

Позволяют двигать биты влево или вправо. Используются для умножения/деления на степени двойки и для работы с последовательными интерфейсами.

Пример:
assign o_shl = i_a << 2; // умножили на 4
assign o_shr = i_a >> 1; // поделили на 2 (целочисленно)

Интересно: i_a << 2 эквивалентно умножению на 4, но в железе реализуется просто переподключением проводов — никакой логики!

6. Условный оператор (тернарный)

Работает как if-else в одну строку. Очень удобно для мультиплексоров.

Синтаксис:

...
Копировать
assign результат = (условие) ? значение_если_истина : значение_если_ложь;

Пример:

...
Копировать
assign o_mux = (i_sel) ? i_a : i_b; // если i_sel=1, выход = i_a, иначе i_b

Условия можно вкладывать друг в друга:

...
Копировать
assign o_out = (i_sel == 2'b00) ? i_a : (i_sel == 2'b01) ? i_b : (i_sel == 2'b10) ? i_c : i_d;

В железе это превращается в дерево мультиплексоров.

7. Пример с выбором ответа: Угадай результат

Дан код:

...
Копировать
module test;

    wire [3:0] i_a = 4'b1010;
    wire [3:0] i_b = 4'b1100;
    wire [3:0] o_result;

    assign o_result = (i_a & i_b) | (i_a ^ i_b);
endmodule

Чему равно o_result в двоичном виде? Ответ: 4’b1110

4’b1010

4’b1110

4’b0110

4’b0000

8. Создаем простой сумматор

Соберем комбинационный сумматор, используя префиксы в портах.

...
Копировать
module adder #(
    parameter WIDTH = 4
) (
    input [WIDTH-1:0] i_a, // первое слагаемое
    input [WIDTH-1:0] i_b, // второе слагаемое
    input i_cin, // входной перенос
    output [WIDTH-1:0] o_sum, // сумма
    output o_cout // выходной перенос
);
    assign {o_cout, o_sum} = i_a + i_b + i_cin;
endmodule

Фигурные скобки {} — это конкатенация (склеивание). Мы складываем три числа и результат (который может быть шире) разбиваем на перенос и сумму.

9. Сводим всё вместе

Сегодня мы разобрали:

Комбинационная логика — это фундамент. Научишься ей — сможешь собрать что угодно, от сумматора до процессора. Главное помнить: никакой памяти, только текущие входы.

Главная
Курсы
Вебинары
Комбинационная логика. Операторы. Assign
3. Лексические правила(Синтаксис) Verilog HDL
4. Типы данных Verilog HDL
5. Выражения и Операторы Verilog HDL
6. Назначения (Assignments) в Verilog HDL
7. Моделирование на уровне вентилей и переключателей в Verilog HDL
8. Примитивы, объявляемые пользователем (UDP) Verilog HDL
9. Процедурные назначения. Поведенческое моделирование в Verilog HDL.
9. If, case for, while и repeat Verilog HDL
9. Initial, always, задержки, блоки Verilog HDL
10. Задачи(task) и функции (function) в Verilog HDL
11. Семантика планирования. Стек (stack) в Verilog HDL
12. Модули(module). Переопределение параметров(defparam).
12. Порты. Иерархические имена в Verilog HDL
12. Generate блоки Verilog HDL
12. Иерархические имена Verilog HDL
13. Конфигурирование содержимого конструкции
13. Использование библиотек. Конфигурирование содержимого конструкции в Verilog HDL
14. Specify блоки в Verilog HDL
15. Setup, hold, setuphold и recovery в Verilog HDL
15. Skew, period, width и nochange Verilog HDL
15. Проверка синхронизации сигналов в Verilog HDL
16. Бэканнотирование с использованием стандартного формата задержки (SDF) в Verilog HDL
17. Системные задачи и функции
17.2 Файлы. Запись и чтение файлов Verilog
17. Задачи временной шкалы, управления, PLA и стохастического анализа Verilog
$time, $stime и $realtime Verilog
17.8. Функции преобразования Verilog
17.9. Функции распределения вероятностей Verilog
17.10. Ввод командной строки. 17.11. Математические функции
18. Дамп файлы изменения значений (VCD)
18. Формат файла VCD расширенные и четырьмя состояниями
19. Директивы компилятора Verilog HDL
20. Обзор интерфейса языка программирования (PLI) Verilog
28. Зашифрованные оболочки
Закрыть