Menu
Coddy logo textTech

Побитовые операторы

Часть раздела Основы путешествия по 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
challenge icon

Задание

Вычислите результаты побитовых операций для заданных значений.

Что нужно сделать:

  1. Вычислите a & b и сохраните в and_res
  2. Вычислите a | b и сохраните в or_res
  3. Вычислите a ^ b и сохраните в xor_res
  4. Вычислите ~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
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы