Menu
CoddyTech

位运算符

本课属于 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
challenge icon

挑战

计算给定值的按位运算结果。

要做什么:

  1. 计算 a & b,并将结果存入 and_res
  2. 计算 a | b,并将结果存入 or_res
  3. 计算 a ^ b,并将结果存入 xor_res
  4. 计算 ~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
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

基础知识中的所有课

自己练习: Verilog 在线编译器