使用运算符进行赋值
本课属于 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;挑战
根据任务补充缺失的 assign 语句。
要做什么:
- 将
and_result设为input_a AND input_b(按位) - 将
or_result设为input_a OR input_b(按位) - 将
xor_result设为input_a XOR input_b(按位) - 将
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这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Verilog 在线编译器