NAND và NOR: dựng các phép logic từ một loại cổng

Khoảng 45 phútMức 1/3Bản nháp: một số khẳng định chưa đối chiếu spec

Sau bài này bạn sẽ

  • Giải thích vì sao NAND hoặc NOR có thể tạo mọi hàm Boolean hữu hạn
  • Dựng NOT, AND, OR và XOR bằng mạng cổng cụ thể
  • Phân biệt số cổng trong sơ đồ với kết quả mapping thật

Chỉ có một loại cổng thì làm được gì?

Giả sử hộp linh kiện chỉ có NAND hai đầu vào. Bạn vẫn có thể dựng NOT, AND và OR, rồi ghép chúng thành một hàm từ bảng chân trị.

“Universal” ở đây là đủ khả năng biểu diễn chức năng Boolean. Nó không có nghĩa mọi mạch chỉ dùng NAND sẽ nhanh nhất, nhỏ nhất hoặc phù hợp nhất với FPGA.

Vì sao dựng đủ ba phép là đủ?

Một bảng chân trị hữu hạn có thể viết thành canonical SOP: mỗi hàng ra 1 tạo một minterm, OR các minterm lại. Các minterm chỉ cần AND và NOT; ghép chúng cần OR.

Nếu một loại cổng dựng được NOT, AND và OR, nó dựng được các SOP ấy. Đây là lập luận về khả năng biểu diễn, không phải hứa mạch tạo bằng cách đó đã tối ưu.

AND và OR đơn thuần không tạo được NOT: khi tăng một đầu vào từ 0 lên 1, mạng chỉ chứa hai phép ấy không làm đầu ra giảm từ 1 xuống 0. XOR một mình cũng không tạo mọi hàm, dù có thể tạo phép đảo nếu cấp hằng 1.

Dựng ba phép bằng NAND

NAND cho 0 chỉ khi cả hai đầu vào đều 1. Nối cùng một tín hiệu vào hai chân sẽ tạo phép NOT.

Phép cần có Cách nối NAND hai đầu vào
NOT A A NAND A
A AND B Lấy T=A NAND B, rồi T NAND T
A OR B (A NAND A) NAND (B NAND B)

Công thức OR dùng De Morgan: đảo cả hai đầu vào rồi NAND chúng. Ví dụ A bằng 0, B bằng 1: hai phép đảo cho 1 và 0, NAND ra 1, đúng với OR.

Không được bỏ bubble đảo khi lần tín hiệu qua sơ đồ. NAND nối thêm inverter tạo AND; NAND tự nó chưa phải AND.

Dựng ba phép bằng NOR

NOR cho 1 chỉ khi cả hai đầu vào đều 0. Dùng các kết nối đối ngẫu:

Phép cần có Cách nối NOR hai đầu vào
NOT A A NOR A
A OR B Lấy T=A NOR B, rồi T NOR T
A AND B (A NOR A) NOR (B NOR B)

Một NOR nhận đầu vào 1 sẽ cho 0; một NAND nhận đầu vào 0 sẽ cho 1. Hai câu này giúp kiểm nhanh việc nhầm bảng chân trị.

Nếu đầu vào hoặc đầu ra của giao diện active-low, cần theo dõi tên và mức kích hoạt xuyên suốt, không chỉ đếm số dấu đảo ở một đoạn.

Một mạng XOR bằng bốn NAND

Đặt T=A NAND B, U=A NAND T, V=B NAND T, rồi Y=U NAND V. Bốn cổng cùng chia sẻ T.

A B T U V Y
0 0 1 1 1 0
0 1 1 1 0 1
1 0 1 0 1 1
1 1 0 1 1 0

Thay cả bốn cổng trong mạng ấy bằng NOR sẽ cho XNOR. Muốn XOR từ mạng NOR này, thêm một NOR dùng như inverter ở đầu ra.

Đây là hai cấu trúc cụ thể có bảng đã kiểm, không phải bằng chứng số cổng tối thiểu cho mọi giả thiết về hằng, đầu vào đảo sẵn hoặc cell nhiều chân.

Chọn dạng biểu thức để giảm phép đảo thừa

SOP thường hợp với mạng NAND–NAND; POS thường hợp với mạng NOR–NOR. Ví dụ F=AB+C' viết được thành (A NAND B) NAND C. Hai lần đảo ở đường nối có thể triệt tiêu về chức năng.

Đừng thay mỗi cổng riêng lẻ bằng một mạng tương đương rồi dừng ngay. Lần theo toàn biểu thức để tìm inverter nối tiếp và hạng dùng chung; sau mỗi biến đổi kiểm lại bảng.

RTL synthesis có thể factor hoặc map sang AND, OR, XOR, AOI/OAI, mux hoặc LUT. Sơ đồ universal gate giúp hiểu tương đương; không buộc công cụ giữ nguyên số cổng hay các nút trung gian đã vẽ.

Không lấy tính universal làm kết luận về công nghệ

  • Nhầm NOR với NAND vì cả hai có phép đảo ở đầu ra.
  • Cho rằng thay NAND bằng NOR giữ nguyên hàm của một sơ đồ.
  • Coi AND và OR đã đủ mà không cần khả năng đảo.
  • Giả định cổng hai đầu vào có cùng trễ, tải và chi phí với cổng nhiều đầu vào.
  • Dùng số cổng trên giấy làm báo cáo area/timing.

FPGA dùng LUT và tài nguyên có sẵn; standard-cell ASIC dùng thư viện khác. Cần mapping và báo cáo đúng công nghệ trước kết luận vật lý.

Dựng rồi thử bốn hàng

  1. Dùng NAND dựng NOR hai đầu vào. Chỉ rõ từng nút và phép đảo.
  2. Dùng NOR dựng AND rồi lập bảng bốn hàng.
  3. Trong mạng XOR bốn NAND, điều gì xảy ra ở hàng A bằng 1, B bằng 1?
  4. Rút F=(AB+C')' từ mạng NAND tương đương; cần giữ phép đảo nào ở cuối?
  5. Nếu một sơ đồ có ít cổng hơn nhưng fanout lớn hơn, đã đủ nói nhanh hơn chưa?

Kiểm tra

Tự kiểm tra: NAND và NOR: dựng các phép logic từ một loại cổng

  1. Tạo NOT A bằng một NAND hai đầu vào như thế nào?
  2. Vì sao NAND dựng được mọi bảng chân trị Boolean hữu hạn?
  3. A=0,B=1 thì NOR cho kết quả gì?
  4. Thay bốn NAND trong mạng XOR đã nêu bằng NOR sẽ tạo hàm gì?
  5. Yosys generic đạt có chứng minh đúng số cổng NAND vật lý trên giấy không?

Bằng chứng kiểm chứng

Expected tính trước chạy: UNIVERSAL CHECK vectors=4 nand_functions=16 nor_functions=16 time_ns=4.

NOT/AND/OR/XOR bằng các mạng NAND hoặc NOR

Kỳ vọng tính trước chạy: UNIVERSAL CHECK vectors=4 nand_functions=16 nor_functions=16 time_ns=4

universal_core.sv RTL
`timescale 1ns/1psmodule universal_core(input logic a,b,output wire [3:0] nand_values,nor_values); wire na=~(a&a),nb=~(b&b),nab=~(a&b); wire nu=~(a&nab),nv=~(b&nab),nx=~(nu&nv); wire oa=~(a|a),ob=~(b|b),oab=~(a|b); wire ou=~(a|oab),ov=~(b|oab),oxn=~(ou|ov),ox=~(oxn|oxn); assign nand_values={na,~(nab&nab),~(na&nb),nx}; assign nor_values={oa,~(oa|ob),~(oab|oab),ox};endmodule
tb.sv testbench
`timescale 1ns/1psmodule tb_a2_universal; logic a,b;wire [3:0] nand_values,nor_values;universal_core dut(.*); logic [3:0] truth[4]='{4'b1000,4'b1011,4'b0011,4'b0110}; int vectors=0; initial begin  for(int i=0;i<4;i++)begin   a=1'(i/2);b=1'(i%2);#1;vectors++;   if(nand_values!==truth[i]||nor_values!==truth[i])$fatal(1,"Universal truth mismatch vector=%0d",i);  end  if(vectors!=4||$time!=4)$fatal(1,"Universal contract");  $display("UNIVERSAL CHECK vectors=%0d nand_functions=%0d nor_functions=%0d time_ns=%0d",vectors,4*vectors,4*vectors,$time);  $finish; endendmodule

Đã kiểm chứng thế nào

  • Phân tích và elaborate theo LRM (pyslang 12.1.0)
  • Lint -Wall (Verilator 5.050)
  • Mô phỏng, exit 0 và output khớp kỳ vọng tính tay (Verilator 5.050, 2-state)
  • Tổng hợp, số cell khớp kỳ vọng (Yosys 0.70)

Output phải khớp: UNIVERSAL CHECK vectors=4 nand_functions=16 nor_functions=16 time_ns=4

Kỳ vọng sau tổng hợp: universal_core: $_*DFF* = 0universal_core: $_*LATCH* = 0

Finite known 0/1 input domains only. Generic synthesis, where claimed, is not technology mapping, STA or PPA. No all-width or X/Z language conformance claim.

Các kiểm tra chạy lúc xây dựng nội dung (2026-11-07), không chạy trong trình duyệt. Kỳ vọng được tính tay trước khi chạy.

Bốn phép NOT/AND/OR/XOR được thực hiện bằng mạng NAND và NOR. Bảng đầu ra là literal viết trước chạy, kiểm đủ bốn cặp đầu vào cho cả hai họ.

Parsed/linted/simulated/synthesized đạt; synthesis generic không có flip-flop/latch. Không giữ hoặc kiểm số cell sau tối ưu, không claim số transistor hay tối ưu toàn cục. Các bit đều 0/1; chưa kiểm behavior X/Z hoặc cell vật lý.

[1] [2] [3]

Nguồn và mức độ đối chiếu

  1. Universal Gates — bản chụp resources.zip, What Makes a Gate Universal?; Building Basic Gates from NAND; Building Basic Gates from NOR; Converting a Function to NAND-Only Form; XOR from Four NAND Gates. Trích dẫn; nguồn đã đọc các mục liên quan.
  2. Thí nghiệm nguyên bản A2.universal, Four independent NOT/AND/OR/XOR truth rows for NAND-only and NOR-only networks. Trích dẫn; nguồn đã đọc toàn văn.
  3. IEEE 1800-2023 SystemVerilog LRM, Scalar bitwise inversion, AND and OR expressions in combinational networks — chưa đối chiếu LRM. Chưa đối chiếu với văn bản nguồn (chưa mở).