第01课 · 逻辑门

基础VerilogVerilator

📌 学习目标:掌握基本逻辑门(AND、OR、NOT、XOR、NAND、NOR)的原理、真值表和 Verilog 实现,并通过 Verilator 仿真验证正确性。

一、什么是逻辑门?

逻辑门(Logic Gate)是数字电路的基本构建单元,执行布尔逻辑运算。任何复杂的数字系统——从简单的加法器到 CPU——都可以由这些基本门组合而成。

逻辑门接收一个或多个二进制输入(0 或 1),产生一个二进制输出。常见的逻辑门有:

二、基本逻辑门详解

2.1 AND 门(与门)

AND 门是最基本的逻辑门之一。只有当所有输入都为 1 时,输出才为 1。逻辑表达式:Y = A · B

ABY = A AND B
000
010
100
111

2.2 OR 门(或门)

OR 门:任一输入为 1,输出即为 1。逻辑表达式:Y = A + B

ABY = A OR B
000
011
101
111

2.3 NOT 门(非门/反相器)

NOT 门将输入取反:输入 0 输出 1,输入 1 输出 0。逻辑表达式:Y = Ā

AY = NOT A
01
10

2.4 XOR 门(异或门)

XOR 门在输入不同时输出 1,相同时输出 0。逻辑表达式:Y = A ⊕ B

ABY = A XOR B
000
011
101
110

2.5 NAND 门(与非门)

NAND = NOT AND,是 AND 门输出的取反。NAND 门是通用门,仅用 NAND 门就能构建所有其他逻辑门。

ABY = A NAND B
001
011
101
110

2.6 NOR 门(或非门)

NOR = NOT OR,同样是通用门。

ABY = A NOR B
001
010
100
110

三、Verilog 实现

下面用 Verilog 实现所有 6 种基本逻辑门,并编写测试台(testbench)进行仿真验证。

3.1 逻辑门模块

// logic_gates.v — 基本逻辑门实现 module logic_gates ( input a, input b, output y_and, output y_or, output y_not, output y_xor, output y_nand, output y_nor ); // 使用 Verilog 内置门原语 and(y_and, a, b); // AND 门 or(y_or, a, b); // OR 门 not(y_not, a); // NOT 门(取反 a) xor(y_xor, a, b); // XOR 门 nand(y_nand, a, b); // NAND 门 nor(y_nor, a, b); // NOR 门 endmodule

3.2 使用 assign 的等价写法

// logic_gates_assign.v — 使用数据流建模 module logic_gates_assign ( input a, input b, output y_and, output y_or, output y_not, output y_xor, output y_nand, output y_nor ); assign y_and = a & b; // AND assign y_or = a | b; // OR assign y_not = ~a; // NOT assign y_xor = a ^ b; // XOR assign y_nand = ~(a & b); // NAND assign y_nor = ~(a | b); // NOR endmodule

3.3 测试台(Testbench)

// tb_logic_gates.v — 逻辑门测试台 module tb_logic_gates; reg a, b; wire y_and, y_or, y_not, y_xor, y_nand, y_nor; // 实例化被测模块 logic_gates uut ( .a(a), .b(b), .y_and(y_and), .y_or(y_or), .y_not(y_not), .y_xor(y_xor), .y_nand(y_nand), .y_nor(y_nor) ); integer pass_count = 0; integer fail_count = 0; task check; input expected_and, expected_or, expected_not, expected_xor, expected_nand, expected_nor; begin if (y_and !== expected_and || y_or !== expected_or || y_not !== expected_not || y_xor !== expected_xor || y_nand !== expected_nand || y_nor !== expected_nor) begin $display("FAIL: a=%0b b=%0b | and=%b or=%b not=%b xor=%b nand=%b nor=%b", a, b, y_and, y_or, y_not, y_xor, y_nand, y_nor); fail_count = fail_count + 1; end else begin pass_count = pass_count + 1; end end endtask initial begin // 遍历所有 4 种输入组合 {a, b} = 2'b00; #10; check(0,0,1,0,1,1); {a, b} = 2'b01; #10; check(0,1,1,1,1,0); {a, b} = 2'b10; #10; check(0,1,0,1,1,0); {a, b} = 2'b11; #10; check(1,1,0,0,0,0); $display("========================================"); $display("逻辑门测试结果: PASS=%0d FAIL=%0d", pass_count, fail_count); if (fail_count == 0) $display("✅ 所有逻辑门真值表验证通过!"); else $display("❌ 存在验证失败!"); $display("========================================"); $finish; end endmodule

四、Verilator 仿真验证

🔧 编译与运行命令

verilator --cc logic_gates.v --exe tb_logic_gates.v \ --build --top-module tb_logic_gates ./obj_dir/Vtb_logic_gates

Verilator 会将 Verilog 编译为 C++ 代码并执行测试台。输出应显示所有 4 组输入的真值表验证通过。

📊 预期输出

======================================== 逻辑门测试结果: PASS=4 FAIL=0 ✅ 所有逻辑门真值表验证通过! ========================================

五、逻辑门的应用场景

逻辑门看似简单,但它们是所有数字电路的基石:

🤔 思考题:为什么 NAND 和 NOR 被称为"通用门"?试着只用 NAND 门构建 NOT、AND、OR 门。

💡 提示:NAND(NAND(A,A), NAND(A,A)) = NOT(NOT(A)) = A... 不对,想想 NAND(A,A) 等于什么?

六、关键知识点总结

逻辑门表达式Verilog 运算符特性
ANDA·B&全1出1
ORA+B|有1出1
NOTĀ~取反
XORA⊕B^异出1
NAND¬(A·B)~&通用门
NOR¬(A+B)|通用门

🏆 成就解锁:逻辑门大师

✅ Verilator 仿真验证通过

✅ AND/OR/NOT/XOR/NAND/NOR 真值表全部验证正确

✅ 掌握 Verilog 门级建模和数据流建模两种方式

🎯 下一目标:用逻辑门组合实现更复杂的布尔函数 → 第02课:布尔代数