📜  Verilog运算符(1)

📅  最后修改于: 2023-12-03 15:20:59.379000             🧑  作者: Mango

Verilog 运算符

Verilog 运算符是一种规定了特定语法的符号或单词,用于执行各种操作。这些操作可以包括简单的算术运算,也可以是比较运算、逻辑运算、位运算等等。本文将介绍 Verilog 中常用的运算符,并提供相应的代码示例。

算术运算符

Verilog 中的算术运算符用于执行基本算术运算,如加、减、乘、除和取模。以下是 Verilog 支持的算术运算符及其使用方法:

| 运算符 | 描述 | 示例 | | :---: | :--- | :--- | | + | 加法 | A+B | | - | 减法 | A-B | | * | 乘法 | A*B | | / | 除法 | A/B | | % | 取模 | A%B |

代码示例:

module arithmetic();
  reg A = 5;
  reg B = 3;
  reg result;
  
  initial begin
    // 加法
    result = A + B;
    $display("A + B = %d", result); // A + B = 8
    
    // 减法
    result = A - B;
    $display("A - B = %d", result); // A - B = 2
    
    // 乘法
    result = A * B;
    $display("A * B = %d", result); // A * B = 15
    
    // 除法
    result = A / B;
    $display("A / B = %d", result); // A / B = 1
    
    // 取模
    result = A % B;
    $display("A %% B = %d", result); // A % B = 2
  end
endmodule
比较运算符

比较运算符用于比较两个值是否相等、不等、大于、小于、大于等于或小于等于。以下是 Verilog 支持的比较运算符及其使用方法:

| 运算符 | 描述 | 示例 | | :---: | :--- | :--- | | == | 相等 | A == B | | != | 不等 | A != B | | > | 大于 | A > B | | < | 小于 | A < B | | >= | 大于等于 | A >= B | | <= | 小于等于 | A <= B |

代码示例:

module comparison();
  reg A = 5;
  reg B = 3;
  reg result;
  
  initial begin
    // 相等
    result = A == B;
    $display("A == B: %d", result); // A == B: 0
    
    // 不等
    result = A != B;
    $display("A != B: %d", result); // A != B: 1
    
    // 大于
    result = A > B;
    $display("A > B: %d", result); // A > B: 1
    
    // 小于
    result = A < B;
    $display("A < B: %d", result); // A < B: 0
    
    // 大于等于
    result = A >= B;
    $display("A >= B: %d", result); // A >= B: 1
    
    // 小于等于
    result = A <= B;
    $display("A <= B: %d", result); // A <= B: 0
  end
endmodule
逻辑运算符

逻辑运算符用于执行逻辑运算,如与、或、非、异或和等于。以下是 Verilog 支持的逻辑运算符及其使用方法:

| 运算符 | 描述 | 示例 | | :---: | :--- | :--- | | && | 与 | A && B | | \|\| | 或 | A \|\| B | | ! | 非 | !A | | ^ | 异或 | A ^ B | | ~^ | 相当于异或取反操作 | ~^ A | | === | 等于 | A === B | | !== | 不等于 | A !== B |

代码示例:

module logic();
  reg A = 1;
  reg B = 0;
  reg result;
  
  initial begin
    // 与运算
    result = A && B;
    $display("A && B: %d", result); // A && B: 0
    
    // 或运算
    result = A || B;
    $display("A || B: %d", result); // A || B: 1
    
    // 非运算
    result = !A;
    $display("!A: %d", result); // !A: 0
    
    // 异或运算
    result = A ^ B;
    $display("A ^ B: %d", result); // A ^ B: 1
    
    // 相当于异或取反操作
    result = ~^ A;
    $display("~^ A: %d", result); // ~^ A: 0
    
    // 等于运算
    result = A === B;
    $display("A === B: %d", result); // A === B: 0
    
    // 不等于运算
    result = A !== B;
    $display("A !== B: %d", result); // A !== B: 1
  end
endmodule
位运算符

位运算符用于执行位操作,如按位与、按位或、按位异或和左右移位。以下是 Verilog 支持的位运算符及其使用方法:

| 运算符 | 描述 | 示例 | | :---: | :--- | :--- | | & | 按位与 | A & B | | \| | 按位或 | A \| B | | ^ | 按位异或 | A ^ B | | ~^ | 相当于异或取反操作 | ~^ A | | ~ | 取反 | ~A | | << | 左移 | A << B | | >> | 右移 | A >> B |

代码示例:

module bitwise();
  reg A = 5; // 二进制 0101
  reg B = 3; // 二进制 0011
  reg result;
  
  initial begin
    // 按位与
    result = A & B;
    $display("A & B: %d", result); // A & B: 1
    
    // 按位或
    result = A | B;
    $display("A | B: %d", result); // A | B: 7
    
    // 按位异或
    result = A ^ B;
    $display("A ^ B: %d", result); // A ^ B: 6
    
    // 相当于异或取反操作
    result = ~^ A;
    $display("~^ A: %d", result); // ~^ A: 1
    
    // 取反
    result = ~A;
    $display("~A: %d", result); // ~A: -6
    
    // 左移
    result = A << B;
    $display("A << B: %d", result); // A << B: 40
    
    // 右移
    result = A >> B;
    $display("A >> B: %d", result); // A >> B: 0
  end
endmodule
三目运算符

三目运算符也称为条件运算符,它是 Verilog 中唯一的三元运算符。其基本形式为 expression1 ? expression2 : expression3,如果 expression1 的计算结果为真,则返回 expression2 的值,否则返回 expression3 的值。

代码示例:

module ternary();
  reg A = 5;
  reg B = 3;
  reg result;
  
  initial begin
    // 三目运算符
    result = (A > B) ? A : B;
    $display("(A > B) ? A : B = %d", result); // (A > B) ? A : B = 5
  
    result = (A < B) ? A : B;
    $display("(A < B) ? A : B = %d", result); // (A < B) ? A : B = 3
  end
endmodule
取较高位运算符

取较高位运算符 >>> 用于对无符号数进行逻辑右移,其左侧最高位补 0。该运算符在一般的 Verilog 中不被支持,需要使用 SystemVerilog 才能使用。

代码示例:

module logical_shift_right();
  logic [3:0] A = 8; // 二进制 1000
  logic [3:0] result;
  
  initial begin
    // 逻辑右移
    result = A >>> 1; // 二进制 0100
    $display("A >>> 1: %b", result); // A >>> 1: 0100
  end
endmodule
结论

本文介绍了 Verilog 中常用的运算符及其使用方法,涵盖了算术运算符、比较运算符、逻辑运算符、位运算符、三目运算符和取较高位运算符。程序员们可以根据需求灵活应用这些运算符,以优化自己的代码。