写在前面:本章主要内容为了解和确认 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/.