Menu
Coddy logo textTech

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

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

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

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

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

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

Сдвиг влево (<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

Арифметический right Shift (>>>)

Для signed чисел арифметический right Shift сохраняет бит sign:

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

Извлечь field:

// Получить биты 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

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

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Проверьте себя

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор Verilog