Menu
Coddy logo textTech

シフト演算子

CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 26/90。

シフト演算子は、ベクトル内のビットを左または右に移動させます。

利用可能なシフト演算子

演算子操作説明
<<論理左シフトビットを左にシフトし、0で埋めます
>>論理右シフトビットを右にシフトし、0で埋めます
<<<算術左シフト論理左シフトと同じ
>>>算術右シフト右にシフトし、符号ビットを保持します

仕組み

左シフト (<strong><<</strong>):

8'b00001010 << 2 = 8'b00101000

ビットが左に移動します。右側は 0 で埋められます。

右シフト (<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     // 負のまま

論理シフト (>>) は0で埋められ、符号が失われます。

一般的な用途

2の累乗を掛ける(左シフト):

x << 1    // 2を掛ける
x << 2    // 4を掛ける
x << 3    // 8を掛ける

2の累乗で割る(右シフト):

x >> 1    // 2で割る
x >> 2    // 4で割る
x >> 3    // 8で割る

フィールドの抽出:

// 8ビットの値からビット5-2を取得する
field = (data >> 2) & 4'b1111;
challenge icon

チャレンジ

各タスクに対して正しいシフト演算式を記述してください。

作業内容:

  1. a を左に3ビットシフトし、left_result に格納してください。
  2. a を右に1ビットシフトし、right_result に格納してください。
  3. b を右に2ビット算術シフトし、arith_result に格納してください。

チートシート

シフト演算子は、ベクトル内のビットを左または右に移動させます:

演算子説明
<<論理左シフト(0で埋める)
>>論理右シフト(0で埋める)
<<<算術左シフト(論理シフトと同じ)
>>>算術右シフト(符号ビットを維持する)
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 で割る

// 8ビットの値からビット5-2を抽出する
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;       // 2進数で 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腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

基礎のすべてのレッスン