写在前面:本章主要内容为了解和确认 NAND/NOR/XOR 门的行为,并使用Verilog实现,生成输入信号后通过模拟,验证每个门的操作,并使用 FPGA 来验证 Verilog 实现的电路的行为。
本章目录:
Ⅰ. 前置知识
0x00 与非门(NAND)
0x01 或非门(NOR)
0x02 异或门(XOR)
Ⅱ. 练习(Assignment)
0x00 4-input NAND gate
0x014-input NOR gate
0x024-input XOR gate
0x034-input AOI(AND OR Inverter) gate
Ⅰ. 前置知识
0x00 与非门(NAND)
如果所有输入均为High (1),则输出为Low (0),在其他情况下,将产生High (1) 输出。
- NAND是 AND 运算符的否定结果
布尔表达式中以 “负乘法” 形式表现:
0x01 或非门(NOR)
如果所有输入均为 Low (0),则输出为 High(1),其中一个输入为高 (1) 则产生低功率 (0)。
- NOR 是 OR 运算符的否定结果
布尔表达式中以 “否定合” 形式表现:
0x02 异或门(XOR)
如果 两个值不相同,则异或结果为1。如果 两个值相同,异或结果为0。
Ⅱ. 练习(Assignment)
0x00 4-input NAND gate
比较 AB 的布尔表达式,完成 A 和 B 的 Verilog 代码,通过Simulation 结果进行比较。
Design source:
`timescale 1ns / 1psmodule input_4_NAND( // Input the var input a, b, c, d, // Output the var output e, f, g ); // NAND = NOT + AND assign e = ~(a & b); // a and b then inv assign f = ~(e & c); // e and c then invassign g = ~(f & d); // f and d then invendmodule
Simulation:
`timescale 1ns / 1psmodule input_4_NAND_tb;reg aa, bb, cc, dd;wire e, f, g;input_4_NAND u_input_4_NAND ( .a(aa), .b(bb), .c(cc), .d(dd), .e(e), .f(f), .g(g) );initial aa = 1'b0;initial bb = 1'b0;initial cc = 1'b0;initial dd = 1'b0;always aa = #100 ~aa;always bb = #200 ~bb;always cc = #400 ~cc;always dd = #800 ~dd;initial begin #1600 $finish;endendmodule
运行结果如下:
解读:在 assign
语句中,用取反运算符 ~
和或运算符 |
实现了 4 个输入取反或运算,并将结果分别赋值给输出变量 e
, f
, g
。
0x014-input NOR gate
比较 AB 的布尔表达式,完成 A 和 B 的 Verilog 代码,通过Simulation 结果进行比较。
Design source:
`timescale 1ns / 1psmodule input_4_NOR( /* Input the var */ input a, b, c, d, /* Output the var */ output e, f, g ); /* NOR = NOT + OR */assign e = ~(a | b);assign f = ~(e | c);assign g = ~(f | d);endmodule
Testbench:
`timescale 1ns / 1ps// input_4_NOR_tbmodule input_4_NOR_tb;// inputreg aa, bb, cc, dd;// outputwire e, f, g;input_4_NOR u_input_4_NOR ( .a(aa), .b(bb), .c(cc), .d(dd), .e(e), .f(f), .g(g) );initial aa = 1'b0;initial bb = 1'b0;initial cc = 1'b0;initial dd = 1'b0;always aa = #100 ~aa;always bb = #200 ~bb;always cc = #400 ~cc;always dd = #800 ~dd;initial begin #1600 $finish;endendmodule
运行结果如下:
0x024-input XOR gate
比较 AB 的布尔表达式,完成 A 和 B 的 Verilog 代码,通过Simulation 结果进行比较。
Design source:
`timescale 1ns / 1psmodule input_4_XOR( /* Input the var */ input a, b, c, d, /* Output the var */ output e, f, g);/* XOR */assign e = a ^ b;assign f = e ^ c;assign g = f ^ d;endmodule
Testbench:
`timescale 1ns / 1psmodule input_4_XOR_tb;// inputreg aa, bb, cc, dd;// outputwire e, f, g;input_4_XOR u_input_4_XOR ( .a(aa), .b(bb), .c(cc), .d(dd), .e(e), .f(f), .g(g) );initial aa = 1'b0;initial bb = 1'b0;initial cc = 1'b0;initial dd = 1'b0;always aa = #100 ~aa;always bb = #200 ~bb;always cc = #400 ~cc;always dd = #800 ~dd;initial begin #1600 $finish;endendmodule
运行结果如下:
0x034-input AOI(AND OR Inverter) gate
Design source:
`timescale 1ns / 1psmodule inpu_4_AOI ( /* Input the var */ input a, b, c, d, /* Output the var */ output e, f, g);/* AOI */assign e = a & b;assign f = e & c;assign g = ~(e | f);endmodule
Testbench:
`timescale 1ns / 1psmodule inpu_4_AOI_tb;// inputreg aa, bb, cc, dd;// outputwire e, f, g;inpu_4_AOI u_inpu_4_AOI ( .a(aa), .b(bb), .c(cc), .d(dd), .e(e), .f(f), .g(g) );initial aa = 1'b0;initial bb = 1'b0;initial cc = 1'b0;initial dd = 1'b0;always aa = #100 ~aa;always bb = #200 ~bb;always cc = #400 ~cc;always dd = #800 ~dd;initial begin #1600 $finish;endendmodule
运行结果如下:
[ 笔者 ] 王亦优 [ 更新 ] 2022.9.20❌ [ 勘误 ] /* 暂无 */ [ 声明 ] 由于作者水平有限,本文有错误和不准确之处在所难免, 本人也很想知道这些错误,恳望读者批评指正!
参考资料 Introduction to Logic and Computer Design, Alan Marcovitz, McGrawHill, 2008 Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. . 百度百科[EB/OL]. []. https://baike.baidu.com/. |