飞道的博客

【FPGA】Verilog 编码实现:与非门 | 或非门 | 异或门 | NAND/NOR/XOR 行为验证

502人阅读  评论(0)

写在前面:本章主要内容为了解和确认 NAND/NOR/XOR 门的行为,并使用Verilog实现,生成输入信号后通过模拟,验证每个门的操作,并使用 FPGA 来验证 Verilog 实现的电路的行为。

本章目录:

Ⅰ. 前置知识

0x00 与非门(NAND)

0x01 或非门(NOR)

0x02 异或门(XOR)

Ⅱ. 练习(Assignment)

0x00  4-input NAND gate

0x01  4-input NOR gate

0x02  4-input XOR gate

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:


  
  1. `timescale 1ns / 1 ps
  2. module input_4_NAND (
  3. // Input the var
  4. input a, b, c, d,
  5. // Output the var
  6. output e, f, g
  7. );
  8. // NAND = NOT + AND
  9. assign e = ~(a & b); // a and b then inv
  10. assign f = ~(e & c); // e and c then inv
  11. assign g = ~(f & d); // f and d then inv
  12. endmodule

💬 Simulation:


  
  1. `timescale 1ns / 1ps
  2. module input_4_NAND_tb;
  3. reg aa, bb, cc, dd;
  4. wire e, f, g;
  5. input_4_NAND u_input_4_NAND (
  6. .a(aa),
  7. .b(bb),
  8. .c(cc),
  9. .d(dd),
  10. .e(e),
  11. .f(f),
  12. .g(g)
  13. );
  14. initial aa = 1'b0;
  15. initial bb = 1'b0;
  16. initial cc = 1'b0;
  17. initial dd = 1'b0;
  18. always aa = # 100 ~aa;
  19. always bb = # 200 ~bb;
  20. always cc = # 400 ~cc;
  21. always dd = # 800 ~dd;
  22. initial begin
  23. # 1600
  24. $finish;
  25. end
  26. endmodule

🚩 运行结果如下:

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

0x01  4-input NOR gate

比较 AB 的布尔表达式,完成 A 和 B 的 Verilog 代码,通过 Simulation 结果进行比较。

💬 Design source:


  
  1. `timescale 1ns / 1 ps
  2. module input_4_NOR (
  3. /* Input the var */
  4. input a, b, c, d,
  5. /* Output the var */
  6. output e, f, g
  7. );
  8. /* NOR = NOT + OR */
  9. assign e = ~(a | b);
  10. assign f = ~(e | c);
  11. assign g = ~(f | d);
  12. endmodule

💬 Testbench:


  
  1. `timescale 1ns / 1ps
  2. // input_4_NOR_tb
  3. module input_4_NOR_tb;
  4. // input
  5. reg aa, bb, cc, dd;
  6. // output
  7. wire e, f, g;
  8. input_4_NOR u_input_4_NOR (
  9. .a(aa),
  10. .b(bb),
  11. .c(cc),
  12. .d(dd),
  13. .e(e),
  14. .f(f),
  15. .g(g)
  16. );
  17. initial aa = 1'b0;
  18. initial bb = 1'b0;
  19. initial cc = 1'b0;
  20. initial dd = 1'b0;
  21. always aa = # 100 ~aa;
  22. always bb = # 200 ~bb;
  23. always cc = # 400 ~cc;
  24. always dd = # 800 ~dd;
  25. initial begin
  26. # 1600
  27. $finish;
  28. end
  29. endmodule

🚩 运行结果如下:

0x02  4-input XOR gate

比较 AB 的布尔表达式,完成 A 和 B 的 Verilog 代码,通过 Simulation 结果进行比较。

💬 Design source:


  
  1. `timescale 1ns / 1 ps
  2. module input_4_XOR (
  3. /* Input the var */
  4. input a, b, c, d,
  5. /* Output the var */
  6. output e, f, g
  7. );
  8. /* XOR */
  9. assign e = a ^ b;
  10. assign f = e ^ c;
  11. assign g = f ^ d;
  12. endmodule

💬 Testbench:


  
  1. `timescale 1ns / 1ps
  2. module input_4_XOR_tb;
  3. // input
  4. reg aa, bb, cc, dd;
  5. // output
  6. wire e, f, g;
  7. input_4_XOR u_input_4_XOR (
  8. .a(aa),
  9. .b(bb),
  10. .c(cc),
  11. .d(dd),
  12. .e(e),
  13. .f(f),
  14. .g(g)
  15. );
  16. initial aa = 1'b0;
  17. initial bb = 1'b0;
  18. initial cc = 1'b0;
  19. initial dd = 1'b0;
  20. always aa = # 100 ~aa;
  21. always bb = # 200 ~bb;
  22. always cc = # 400 ~cc;
  23. always dd = # 800 ~dd;
  24. initial begin
  25. # 1600
  26. $finish;
  27. end
  28. endmodule

🚩 运行结果如下:

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

💬 Design source:


  
  1. `timescale 1ns / 1 ps
  2. module inpu_4_AOI (
  3. /* Input the var */
  4. input a, b, c, d,
  5. /* Output the var */
  6. output e, f, g
  7. );
  8. /* AOI */
  9. assign e = a & b;
  10. assign f = e & c;
  11. assign g = ~(e | f);
  12. endmodule

💬 Testbench:


  
  1. `timescale 1ns / 1ps
  2. module inpu_4_AOI_tb;
  3. // input
  4. reg aa, bb, cc, dd;
  5. // output
  6. wire e, f, g;
  7. inpu_4_AOI u_inpu_4_AOI (
  8. .a(aa),
  9. .b(bb),
  10. .c(cc),
  11. .d(dd),
  12. .e(e),
  13. .f(f),
  14. .g(g)
  15. );
  16. initial aa = 1'b0;
  17. initial bb = 1'b0;
  18. initial cc = 1'b0;
  19. initial dd = 1'b0;
  20. always aa = # 100 ~aa;
  21. always bb = # 200 ~bb;
  22. always cc = # 400 ~cc;
  23. always dd = # 800 ~dd;
  24. initial begin
  25. # 1600
  26. $finish;
  27. end
  28. endmodule

🚩 运行结果如下:


  
  1. 📌 [ 笔者 ]   王亦优
  2. 📃 [ 更新 ]    2022.9 .20
  3. ❌ [ 勘误 ]   /* 暂无 */
  4. 📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,
  5. 本人也很想知道这些错误,恳望读者批评指正!

📜 参考资料 

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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场