Menu
CoddyTech

使用运算符进行赋值

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

理解连续赋值后,你可以将它与运算符结合起来,创建实用的逻辑。assign 语句可以使用任何运算符来驱动 wire。

基本语法

assign wire_name = expression;

表达式可以包含:

  • 算术运算符(+、-、*、/)
  • 按位运算符(&、|、^、~)
  • 逻辑运算符(&&、||、!)
  • 比较运算符(>、<、==、!=)
  • 移位运算符(<<、>>)
  • 条件运算符(? :)

不同运算符的示例

按位与:

assign out = a & b;

加法:

assign sum = a + b;

比较:

assign is_greater = (a > b);

条件运算(多路复用器):

assign out = sel ? a : b;

移位:

assign shifted = data << 2;

拼接:

assign bus = {high_byte, low_byte};

代码示例

module assign_operators (
  input [3:0] a, b,
  input sel,
  output [3:0] and_out,
  output [4:0] sum_out,
  output is_equal,
  output [3:0] mux_out
);
  
  assign and_out = a & b;           // 按位与
  assign sum_out = a + b;           // 加法
  assign is_equal = (a == b);       // 比较
  assign mux_out = sel ? a : b;     // 条件选择(多路复用器)
  
endmodule

在一个赋值中使用多个运算符

你可以在一个表达式中组合使用多个运算符:

assign result = (a & b) | (c ^ d);
assign final = (a + b) > (c - d);
assign parity = ^data;   // 归约异或(1 的个数为奇数)

运算符优先级

Verilog 遵循标准的运算符优先级。使用括号 ( ) 可以让你的意图更清楚:

// 不清晰
assign out = a & b | c;

// 清晰
assign out = (a & b) | c;
challenge icon

挑战

根据任务补充缺失的 assign 语句。

要做什么:

  1. 将 and_result 设为 input_a AND input_b(按位)
  2. 将 or_result 设为 input_a OR input_b(按位)
  3. 将 xor_result 设为 input_a XOR input_b(按位)
  4. 将 not_result 设为 NOT input_a(按位)

亲手试试

module assign_challenge (
  input input_a,
  input input_b,
  output and_result,
  output or_result,
  output xor_result,
  output not_result
);
  
  // TODO:为以下结果添加 assign 语句:
  // and_result = input_a & input_b
  // or_result  = input_a | input_b
  // xor_result = input_a ^ input_b
  // not_result = ~input_a

endmodule
quiz icon自我测试

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

基础知识中的所有课

自己练习: Verilog 在线编译器