Menu
CoddyTech

移位运算符

本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 26 课,共 90 课。

移位运算符会在向量中向左或向右移动位。

可用的移位运算符

运算符操作说明
<<逻辑左移向左移动位,并用零填充
>>逻辑右移向右移动位,并用零填充
<<<算术左移与逻辑左移相同
>>>算术右移向右移动,并保留符号位

它们的工作原理

左移(<<):

8'b00001010 << 2 = 8'b00101000

位向左移动。右侧用零填充。

右移(>>):

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     // Still negative

逻辑右移(>>)会用零填充,并丢失符号。

常见用途

乘以 2 的幂(左移):

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

除以 2 的幂(右移):

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

提取字段:

// Get bits 5-2 from an 8-bit value
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 在线编译器