第01课 · 逻辑门
基础VerilogVerilator
📌 学习目标:掌握基本逻辑门(AND、OR、NOT、XOR、NAND、NOR)的原理、真值表和 Verilog 实现,并通过 Verilator 仿真验证正确性。
一、什么是逻辑门?
逻辑门(Logic Gate)是数字电路的基本构建单元,执行布尔逻辑运算。任何复杂的数字系统——从简单的加法器到 CPU——都可以由这些基本门组合而成。
逻辑门接收一个或多个二进制输入(0 或 1),产生一个二进制输出。常见的逻辑门有:
- AND 门:所有输入为 1 时输出 1
- OR 门:任一输入为 1 时输出 1
- NOT 门:输出取反
- XOR 门:输入不同时输出 1
- NAND 门:AND 的反(通用门)
- NOR 门:OR 的反(通用门)
二、基本逻辑门详解
2.1 AND 门(与门)
AND 门是最基本的逻辑门之一。只有当所有输入都为 1 时,输出才为 1。逻辑表达式:Y = A · B
| A | B | Y = A AND B |
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
2.2 OR 门(或门)
OR 门:任一输入为 1,输出即为 1。逻辑表达式:Y = A + B
| A | B | Y = A OR B |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
2.3 NOT 门(非门/反相器)
NOT 门将输入取反:输入 0 输出 1,输入 1 输出 0。逻辑表达式:Y = Ā
2.4 XOR 门(异或门)
XOR 门在输入不同时输出 1,相同时输出 0。逻辑表达式:Y = A ⊕ B
| A | B | Y = A XOR B |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
2.5 NAND 门(与非门)
NAND = NOT AND,是 AND 门输出的取反。NAND 门是通用门,仅用 NAND 门就能构建所有其他逻辑门。
| A | B | Y = A NAND B |
| 0 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
2.6 NOR 门(或非门)
NOR = NOT OR,同样是通用门。
| A | B | Y = A NOR B |
| 0 | 0 | 1 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 0 |
三、Verilog 实现
下面用 Verilog 实现所有 6 种基本逻辑门,并编写测试台(testbench)进行仿真验证。
3.1 逻辑门模块
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
);
and(y_and, a, b);
or(y_or, a, b);
not(y_not, a);
xor(y_xor, a, b);
nand(y_nand, a, b);
nor(y_nor, a, b);
endmodule
3.2 使用 assign 的等价写法
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;
assign y_or = a | b;
assign y_not = ~a;
assign y_xor = a ^ b;
assign y_nand = ~(a & b);
assign y_nor = ~(a | b);
endmodule
3.3 测试台(Testbench)
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
{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
✅ 所有逻辑门真值表验证通过!
========================================
五、逻辑门的应用场景
逻辑门看似简单,但它们是所有数字电路的基石:
- AND 门:使能信号控制、地址译码
- OR 门:中断请求合并、多源选通
- NOT 门:信号取反、差分对生成
- XOR 门:奇偶校验、加法器进位
- NAND 门:SRAM 单元、Flash 存储
- NOR 门:ROM 阵列、低功耗逻辑
🤔 思考题:为什么 NAND 和 NOR 被称为"通用门"?试着只用 NAND 门构建 NOT、AND、OR 门。
💡 提示:NAND(NAND(A,A), NAND(A,A)) = NOT(NOT(A)) = A... 不对,想想 NAND(A,A) 等于什么?
六、关键知识点总结
| 逻辑门 | 表达式 | Verilog 运算符 | 特性 |
| AND | A·B | & | 全1出1 |
| OR | A+B | | | 有1出1 |
| NOT | Ā | ~ | 取反 |
| XOR | A⊕B | ^ | 异出1 |
| NAND | ¬(A·B) | ~& | 通用门 |
| NOR | ¬(A+B) | | | 通用门 |
🏆 成就解锁:逻辑门大师
✅ Verilator 仿真验证通过
✅ AND/OR/NOT/XOR/NAND/NOR 真值表全部验证正确
✅ 掌握 Verilog 门级建模和数据流建模两种方式
🎯 下一目标:用逻辑门组合实现更复杂的布尔函数 → 第02课:布尔代数