位运算符
本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 23 课,共 90 课。
位运算符对数字的每一位分别进行运算。与将数字视为整体值的算术运算符(+、-、*、/)不同,位运算符逐位进行运算。
可用的按位运算符
| 运算符 | 运算 | 作用 |
|---|---|---|
& | AND | 只有当两个输入位都是 1 时,输出位才是 1 |
| | OR | 当至少一个输入位是 1 时,输出位就是 1 |
^ | XOR | 当输入位不同时,输出位是 1 |
~ | NOT | 翻转所有位(0 变成 1,1 变成 0) |
使用按位运算符时,Verilog 会在后台将数字视为二进制数。
reg [3:0] a, b;
a = 4'd10; // Decimal 10 = binary 1010
b = 4'd12; // 十进制 12 = 二进制 1100
c = a & b; // 效果与直接使用二进制相同你可以用十进制、十六进制或二进制表示数字:Verilog 会将它们转换为二进制,以便进行按位运算。
位运算的工作原理
每个运算符都对成对的位进行运算(NOT 对单个位进行运算):
4 位数示例:
a = 1010 (binary)
b = 1100 (binary)
AND: a & b = 1000
(1&1=1, 0&1=0, 1&0=0, 0&0=0)
OR: a | b = 1110
(1|1=1, 0|1=1, 1|0=1, 0|0=0)
XOR: a ^ b = 0110
(1^1=0, 0^1=1, 1^0=1, 0^0=0)
NOT: ~a = 0101
(~1=0, ~0=1, ~1=0, ~0=1)代码示例
module bitwise_demo;
reg [3:0] a, b;
reg [3:0] and_res, or_res, xor_res, not_res;
initial begin
a = 4'b1010;
b = 4'b1100;
and_res = a & b; // 1010 & 1100 = 1000
or_res = a | b; // 1010 | 1100 = 1110
xor_res = a ^ b; // 1010 ^ 1100 = 0110
not_res = ~a; // ~1010 = 0101
$display("a = %b", a);
$display("b = %b", b);
$display("a & b = %b", and_res);
$display("a | b = %b", or_res);
$display("a ^ b = %b", xor_res);
$display("~a = %b", not_res);
$finish;
end
endmodule输出:
a = 1010
b = 1100
a & b = 1000
a | b = 1110
a ^ b = 0110
~a = 0101挑战
计算给定值的按位运算结果。
要做什么:
- 计算
a & b,并将结果存入and_res - 计算
a | b,并将结果存入or_res - 计算
a ^ b,并将结果存入xor_res - 计算
~a,并将结果存入not_res
亲手试试
module bitwise_challenge;
reg [3:0] a, b;
reg [3:0] and_res, or_res, xor_res, not_res;
initial begin
a = 4'b1101;
b = 4'b1011;
and_res = ______; // a & b
or_res = ______; // a | b
xor_res = ______; // a ^ b
not_res = ______; // ~a
$display("a = %b", a);
$display("b = %b", b);
$display("a & b = %b", and_res);
$display("a | b = %b", or_res);
$display("a ^ b = %b", xor_res);
$display("~a = %b", not_res);
$finish;
end
endmodule这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Verilog 在线编译器