Побитовые операторы
Часть раздела Основы путешествия по Verilog на Coddy — урок 23 из 90.
Побитовые операторы выполняют операции над каждым отдельным битом числа. В отличие от арифметических операторов (+, -, *, /), которые рассматривают числа как цельные значения, побитовые операторы работают побитово.
Доступные побитовые операторы
| Оператор | Операция | Что он делает |
|---|---|---|
& | AND | Выходной бит равен 1, только если оба входных бита равны 1 |
| | OR | Выходной бит равен 1, если хотя бы один входной бит равен 1 |
^ | XOR | Выходной бит равен 1, если входные биты различаются |
~ | NOT | Инвертирует все биты (0 становится 1, 1 становится 0) |
Когда вы используете побитовые операторы, Verilog неявно рассматривает числа как двоичные.
reg [3:0] a, b;
a = 4'd10; // Десятичное 10 = двоичное 1010
b = 4'd12; // Десятичное 12 = двоичное 1100
c = a & b; // Работает так же, как при использовании двоичных чисел напрямуюВы можете записывать числа в десятичном, шестнадцатеричном или двоичном формате — Verilog преобразует их в двоичный формат для побитовых операций.
Как работают побитовые операции
Каждый оператор работает с парами битов (или с одиночными битами для NOT):
Пример с 4-битными числами:
a = 1010 (binary)
b = 1100 (binary)
AND: a & b = 1000
(1&1=1, 0&1=0, 1&0=0, 0&0=0)
OR: a | b = 1110
(1|1=1, 0|1=1, 1|0=1, 0|0=0)
XOR: a ^ b = 0110
(1^1=0, 0^1=1, 1^0=1, 0^0=0)
NOT: ~a = 0101
(~1=0, ~0=1, ~1=0, ~0=1)Пример кода
module bitwise_demo;
reg [3:0] a, b;
reg [3:0] and_res, or_res, xor_res, not_res;
initial begin
a = 4'b1010;
b = 4'b1100;
and_res = a & b; // 1010 & 1100 = 1000
or_res = a | b; // 1010 | 1100 = 1110
xor_res = a ^ b; // 1010 ^ 1100 = 0110
not_res = ~a; // ~1010 = 0101
$display("a = %b", a);
$display("b = %b", b);
$display("a & b = %b", and_res);
$display("a | b = %b", or_res);
$display("a ^ b = %b", xor_res);
$display("~a = %b", not_res);
$finish;
end
endmoduleРезультат:
a = 1010
b = 1100
a & b = 1000
a | b = 1110
a ^ b = 0110
~a = 0101Задание
Вычислите результаты побитовых операций для заданных значений.
Что нужно сделать:
- Вычислите
a & bи сохраните вand_res - Вычислите
a | bи сохраните вor_res - Вычислите
a ^ bи сохраните вxor_res - Вычислите
~aи сохраните вnot_res
Шпаргалка
Побитовые операторы работают с каждым отдельным битом числа:
| Оператор | Операция | Выходной бит равен 1, когда... |
|---|---|---|
& | AND | Оба входных бита равны 1 |
| | OR | Хотя бы один входной бит равен 1 |
^ | XOR | Входные биты различаются |
~ | NOT | Инвертирует все биты (унарный) |
// a = 1010, b = 1100
a & b = 1000 // AND (И)
a | b = 1110 // OR (ИЛИ)
a ^ b = 0110 // XOR (Исключающее ИЛИ)
~a = 0101 // NOT (НЕ)
Попробуйте сами
module bitwise_challenge;
reg [3:0] a, b;
reg [3:0] and_res, or_res, xor_res, not_res;
initial begin
a = 4'b1101;
b = 4'b1011;
and_res = ______; // a & b
or_res = ______; // a | b
xor_res = ______; // a ^ b
not_res = ______; // ~a
$display("a = %b", a);
$display("b = %b", b);
$display("a & b = %b", and_res);
$display("a | b = %b", or_res);
$display("a ^ b = %b", xor_res);
$display("~a = %b", not_res);
$finish;
end
endmoduleВ этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Введение
Что такое VerilogHardware против SoftwareУровни абстракции проектированияВаш первый модульКомментарии4Операторы. Часть 1
Арифметические операторыОператор остатка от деленияОператоры сравненияПовторение: простая математикаПобитовые операторы7Оператор Assign и логические вентили
Непрерывное присваиваниеAssign с операторамиВстроенные примитивы вентилейВентили AND, OR, NOTВентили XOR, XNORИтоги: Схемы на логических вентилях10Принятие решений
Оператор ifКонструкция if - elseПовторение: простой компараторОператор caseОператоры casex и casezПовторение: проектирование ALU5Операторы. Часть 2
Логические операторыОператоры редукцииОператоры сдвигаОператор конкатенацииУсловный операторПовторение — Испытание по операторам3Системы счисления
Двоичное представлениеЧисла с заданным размеромЧисла без заданного размераОтрицательные числаСпециальные значения X и ZИтоги — форматы чисел6Модули
Структура модуляВходные и выходные портыПорты InoutИнстанцирование модуляПодключение портов по имениПодключение портов по порядкуИтоги: создание модуля9Процедурные блоки
Блок alwaysБлок initialСписок чувствительностиБлокирующее присваиваниеНеблокирующее присваиваниеИтоги: always против initial