
写在前面:本章主要内容为了解和确认 NAND/NOR/XOR 门的行为,并使用Verilog实现,生成输入信号后通过模拟,验证每个门的操作,并使用 FPGA 来验证 Verilog 实现的电路的行为。
本章目录:
0x03 4-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 / 
      1
      ps
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      module 
      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 inv
     
    
- 
    
     
    
    
     
      assign g = ~(f & d);    
      // f and d then inv
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      endmodule
     
    
 💬 Simulation:
  
   - 
    
     
    
    
     
      `timescale 
      1ns / 
      1ps
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      module 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;
     
    
- 
    
     
    
    
     
      end
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      endmodule
     
    
 🚩 运行结果如下:

💡 解读:在 assign 语句中,用取反运算符 ~ 和或运算符 | 实现了 4 个输入取反或运算,并将结果分别赋值给输出变量 e, f, g。
0x01 4-input NOR gate

比较 AB 的布尔表达式,完成 A 和 B 的 Verilog 代码,通过 Simulation 结果进行比较。
💬 Design source:
  
   - 
    
     
    
    
     
      `timescale 
      1ns / 
      1
      ps
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      module 
      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_tb
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      module input_4_NOR_tb;
     
    
- 
    
     
    
    
     
      // input
     
    
- 
    
     
    
    
     
      reg aa, bb, cc, dd;
     
    
- 
    
     
    
    
     
      // output
     
    
- 
    
     
    
    
     
      wire 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;
     
    
- 
    
     
    
    
     
      end
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      endmodule
     
    
 🚩 运行结果如下:

0x02 4-input XOR gate
比较 AB 的布尔表达式,完成 A 和 B 的 Verilog 代码,通过 Simulation 结果进行比较。

💬 Design source:
  
   - 
    
     
    
    
     
      `timescale 
      1ns / 
      1
      ps
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      module 
      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 / 
      1ps
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      module input_4_XOR_tb;
     
    
- 
    
     
    
    
     
      // input
     
    
- 
    
     
    
    
     
      reg aa, bb, cc, dd;
     
    
- 
    
     
    
    
     
      // output
     
    
- 
    
     
    
    
     
      wire 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;
     
    
- 
    
     
    
    
     
      end
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      endmodule
     
    
 🚩 运行结果如下:

0x03 4-input AOI(AND OR Inverter) gate

💬 Design source:
  
   - 
    
     
    
    
     
      `timescale 
      1ns / 
      1
      ps
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      module 
      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 / 
      1ps
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      module inpu_4_AOI_tb;
     
    
- 
    
     
    
    
     
      // input
     
    
- 
    
     
    
    
     
      reg aa, bb, cc, dd;
     
    
- 
    
     
    
    
     
      // output
     
    
- 
    
     
    
    
     
      wire 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;
     
    
- 
    
     
    
    
     
      end
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      endmodule
     
    
 🚩 运行结果如下:


  
   - 
    
     
    
    
     
      📌 [ 笔者 ]   王亦优
     
    
- 
    
     
    
    
     
      📃 [ 更新 ]   
      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/. | 
转载:https://blog.csdn.net/weixin_50502862/article/details/128603167
 
					