Menu
Coddy logo textTech

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

Часть раздела Основы путешествия по Verilog на Coddy — урок 26 из 90.

Операторы сдвига перемещают биты влево или вправо внутри вектора.

Доступные операторы сдвига

ОператорОперацияОписание
<<Логический сдвиг влевоСдвигает биты влево, заполняет нулями
>>Логический сдвиг вправоСдвигает биты вправо, заполняет нулями
<<<Арифметический сдвиг влевоТо же самое, что и логический сдвиг влево
>>>Арифметический сдвиг вправоСдвигает вправо, сохраняет знаковый бит

Как они работают

Сдвиг влево (<strong><<</strong>):

8'b00001010 << 2 = 8'b00101000

Биты сдвигаются влево. Нули заполняют правую сторону.

Сдвиг вправо (<strong>>></strong>):

8'b00001010 >> 2 = 8'b00000010

Биты сдвигаются вправо. Нули заполняют левую сторону.

Пример кода

module shift_demo;
  reg [7:0] original, left_shift, right_shift;
  
  initial begin
    original = 8'b00001010;
    
    left_shift  = original << 2;   // 00001010 → 00101000
    right_shift = original >> 2;   // 00001010 → 00000010
    
    $display("original   = %b", original);
    $display("<< 2       = %b", left_shift);
    $display(">> 2       = %b", right_shift);
    $finish;
  end
endmodule

Результат:

original   = 00001010
<< 2       = 00101000
>> 2       = 00000010

Арифметический сдвиг вправо (>>>)

Для знаковых чисел арифметический сдвиг вправо сохраняет знаковый бит:

reg signed [7:0] a;
a = -5;                // 11111011
a >>> 2 = 11111110     // Все еще отрицательное

Логический сдвиг (>>) заполнит освободившиеся разряды нулями и приведет к потере знака.

Распространенные способы использования

Умножение на степень 2 (сдвиг влево):

x << 1    // Умножение на 2
x << 2    // Умножение на 4
x << 3    // Умножение на 8

Деление на степень 2 (сдвиг вправо):

x >> 1    // Деление на 2
x >> 2    // Деление на 4
x >> 3    // Деление на 8

Извлечение поля:

// Получение битов 5-2 из 8-битного значения
field = (data >> 2) & 4'b1111;
challenge icon

Задание

Напишите правильные выражения сдвига для каждой задачи.

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

  1. Сдвиньте a влево на 3 бита и сохраните в left_result
  2. Сдвиньте a вправо на 1 бит и сохраните в right_result
  3. Сдвиньте b вправо на 2 бита (арифметический сдвиг) и сохраните в arith_result

Шпаргалка

Операторы сдвига перемещают биты влево или вправо внутри вектора:

ОператорОписание
<<Логический сдвиг влево (заполняется нулями)
>>Логический сдвиг вправо (заполняется нулями)
<<<Арифметический сдвиг влево (аналогичен логическому)
>>>Арифметический сдвиг вправо (сохраняет знаковый бит)
8'b00001010 << 2  // = 8'b00101000
8'b00001010 >> 2  // = 8'b00000010

reg signed [7:0] a;
a = -5;           // 11111011
a >>> 2           // = 11111110 (знак сохранен)

Типичные варианты использования:

x << n    // Умножение на 2^n
x >> n    // Деление на 2^n

// Извлечение бит 5-2 из 8-битного значения
field = (data >> 2) & 4'b1111;

Попробуйте сами

module shift_challenge;
  reg [7:0] a;
  reg signed [7:0] b;
  reg [7:0] left_result, right_result;
  reg signed [7:0] arith_result;
  
  initial begin
    a = 8'b00010001;
    b = -8'sd16;       // 11110000 в двоичном виде
    
    left_result  = ______;   // Сдвинуть a влево на 3 бита
    right_result = ______;   // Сдвинуть a вправо на 1 бит
    arith_result = ______;   // Сдвинуть b вправо на 2 бита (арифметический сдвиг)
    
    $display("a = %b", a);
    $display("a << 3 = %b", left_result);
    $display("a >> 1 = %b", right_result);
    $display("b = %b", b);
    $display("b >>> 2 = %b", arith_result);
    $finish;
  end
endmodule
quiz iconПроверьте себя

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

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