移位运算符
本课属于 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;挑战
为每项任务写出正确的移位表达式。
要做什么:
- 将
a左移 3 位,并存入left_result - 将
a右移 1 位,并存入right_result - 将
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这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Verilog 在线编译器