Menu
Coddy logo textTech

Shift Operators

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

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

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

ОператорОперацияОписание
<<Логический сдвиг влевоСдвигает bits влево, заполняет нулями
>>Логический сдвиг вправоСдвигает bits вправо, заполняет нулями
<<<Арифметический сдвиг влевоТо же, что и логический сдвиг влево
>>>Арифметический сдвиг вправоСдвигает вправо, сохраняет 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

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

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

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

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

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