Menu
CoddyTech

Toán tử dịch bit

Thuộc phần Kiến thức nền tảng trong hành trình Verilog của Coddy. Bài học 26 trên 90.

Các toán tử dịch chuyển bit di chuyển các bit sang trái hoặc phải trong một vector.

Các toán tử dịch chuyển bit hiện có

Toán tửPhép toánMô tả
<<Dịch logic sang tráiDịch các bit sang trái, điền các số 0 vào
>>Dịch logic sang phảiDịch các bit sang phải, điền các số 0 vào
<<<Dịch số học sang tráiTương tự phép dịch logic sang trái
>>>Dịch số học sang phảiDịch sang phải, giữ nguyên bit dấu

Cách chúng hoạt động

Dịch trái (<<):

8'b00001010 << 2 = 8'b00101000

Các bit dịch sang trái. Các số 0 lấp vào phía bên phải.

Dịch phải (>>):

8'b00001010 >> 2 = 8'b00000010

Các bit dịch sang phải. Các số 0 lấp đầy phía bên trái.

Ví dụ về code

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

Đầu ra:

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

Dịch phải số học (>>>)

Với số có dấu, phép dịch phải số học giữ nguyên bit dấu:

reg signed [7:0] a;
a = -5;                // 11111011
a >>> 2 = 11111110     // Still negative

Dịch bit logic (>>) sẽ điền các bit 0 và làm mất dấu.

Các cách dùng phổ biến

Nhân với lũy thừa của 2 (dịch trái):

x << 1    // Multiply by 2
x << 2    // Multiply by 4
x << 3    // Multiply by 8

Chia cho lũy thừa của 2 (dịch phải):

x >> 1    // Divide by 2
x >> 2    // Divide by 4
x >> 3    // Divide by 8

Trích xuất một trường:

// Get bits 5-2 from an 8-bit value
field = (data >> 2) & 4'b1111;
challenge icon

Thử thách

Viết biểu thức dịch bit chính xác cho từng nhiệm vụ.

Cần làm:

  1. Dịch a sang trái 3 bit và lưu vào left_result
  2. Dịch a sang phải 1 bit và lưu vào right_result
  3. Dịch số học b sang phải 2 bit và lưu vào arith_result

Tự làm thử

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 ở hệ nhị phân
    
    left_result  = ______;   // Dịch a sang trái 3 bit
    right_result = ______;   // Dịch a sang phải 1 bit
    arith_result = ______;   // Dịch b sang phải 2 bit (dịch số học)
    
    $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 iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Kiến thức nền tảng

Tự luyện tập: Trình biên dịch Verilog online