Xây dựng bộ xử lý logic phổ quát 2 chiều bằng các cổng logic NAND


8

Một 2 chiều xử lý phổ quát (2ULP) là một mạng lưới các cổng logic mà phải mất hai dây đầu vào AB, cũng như bốn đầu vào khác L_, L_a, L_b, và L_ab, và tạo ra một đầu ra duy nhất L(a, b)sử dụng bốn Lđầu vào là một hàm bảng sự thật:

  • 2ULP trả về L_nếu ABlà cả hai 0.
  • Nó trả về L_anếu A = 1B = 0.
  • Nó trả về L_bnếu A = 0B = 1.
  • Nó trả về L_abnếu ABlà cả hai 1.

Ví dụ, với các đầu vào L_ = 0, L_a = 1, L_b = 1, và L_ab = 0, sau đó đầu ra L(a, b)sẽ bằng A xor B.

Nhiệm vụ của bạn là xây dựng 2ULP chỉ sử dụng cổng NAND, sử dụng càng ít cổng NAND càng tốt. Để đơn giản hóa mọi thứ, bạn có thể sử dụng cổng AND, OR, NOT và XOR trong sơ đồ của mình, với các điểm tương ứng sau:

  • NOT: 1
  • AND: 2
  • OR: 3
  • XOR: 4

Mỗi điểm số này tương ứng với số lượng cổng NAND cần thiết để xây dựng cổng tương ứng.

Mạch logic sử dụng các cổng NAND ít nhất để tạo ra một chiến thắng xây dựng chính xác.


1
Kỹ năng thiết kế logic kỹ thuật số của tôi rất gỉ, thật đáng cười, nhưng tôi rất thích kết quả cuối cùng của những cuộc thi này. +1
Lập trình viên

Với cổng NAND hai đầu vào, không có nhiều chỗ cho sự sáng tạo trong thiết kế này. Có lẽ, thay vì yêu cầu thiết bị phải có sáu đầu vào, hãy thiết kế một khối có số lượng đầu vào và một đầu ra tùy ý và yêu cầu đưa ra hai đầu vào A và B và lựa chọn một trong mười sáu chức năng, nó phải có khả năng kết nối các đầu vào của khối với một số kết hợp A, B, Cao và Thấp, sao cho đầu ra sẽ mang lại chức năng đó. Một thiết bị như vậy sẽ là bộ xử lý logic 2 chiều phổ quát (chỉ cần thêm dây), nhưng có lẽ có thể được thực hiện trong ít hơn 11 cổng.
supercat

1
Chúng ta nên phát minh ra cổng golf , nơi bạn viết với số lượng cổng nhỏ nhất.
TheDoctor

Đó là những gì cổng nguyên tử-mã-golf + logic dành cho.
Joe Z.

Câu trả lời:


10

11 NAND

Xác định cổng MUX (giá 4) là

MUX(P, Q, R) = (P NAND Q) NAND (NOT P NAND R)

với bảng chân lý

P Q R    (P NAND Q)   (NOT P NAND R)    MUX
0 0 0        1               1           0
0 0 1        1               0           1
0 1 0        1               1           0
0 1 1        1               0           1
1 0 0        1               1           0
1 0 1        1               1           0
1 1 0        0               1           1
1 1 1        0               1           1

Sau đó, đây là toán tử ternary quen thuộc MUX(P, Q, R) = P ? Q : R

Chúng tôi chỉ đơn giản là có

2ULP = MUX(A, MUX(B, L_ab, L_a), MUX(B, L_b, L_))

với chi phí 12, nhưng tiết kiệm một cổng tầm thường bằng cách sử dụng lại NOT Btừ hai MUXes bên trong .


3
Bạn vừa cho tôi một ý tưởng về thứ gì đó để thử với đá đỏ trong Minecraft, cảm ơn
David Wilkins

1
Tối thiểu tuyệt đối là 11 NAND. Tôi đã tìm kiếm kỹ lưỡng. Và mạch nhanh nhất tôi tìm thấy có độ sâu 5 cổng. Vì vậy, câu đố này được giải quyết bởi Peter Taylor.
KimOyhus

3

chi phí: 4 * 4 * 14 + 4 * (13) + 13 * 3 + 3 * 3 + 24 * 1 + 4 = 352

Tôi không phải là người đàn ông boolean, đây là điều tốt nhất của tôi trong việc mã hóa những thứ này (tôi biết điều này sẽ không mang lại cho tôi nhiều điểm internet bất di bất dịch ..).

# l1 is for a=F , b=F
# l2 is for a=F , b=T
# l3 is for a=T , b=F
# l4 is for a=T , b=T

2ULP(l1,l2,l3,l4,a,b) =
 (l1&l2&l3&l4)|             # always true
 (!l1&l2&l3&l4)&(a|b)|      # a=F,b=F->F; ee in T
 (l1&!l2&l3&l4)&(!a&b)|     # a=F,b=T->F; ee in T
 (!l1&!l2&l3&l4)&(a)|       # a=F,b=F->F; a=F,b=T->F; a=T,b=F->T; a=T,b=T->T; 
 (l1&l2&!l3&l4)&(a&!b)|     # a=T,b=F->F, ee in T
 (!l1&l2&!l3&l4)&(b)|       # a=T,b=F->F, ee in T
 (!l1&!l2&!l3&l4)&(a&b)|    # a=T,b=T->T, ee in F
 (l1&l2&l3&!l4)&(!(a|b))|   # a=T,b=T->F, ee in T
 (!l1&l2&l3&!l4)&(!(avb))|  # a=T,b=F->T, a=F,b=T->T, ee in T , note v is the exor.
 (l1&!l2&l3&!l4)&(!b)|      # T when b=T
 (!l1&!l2&l3&!l4)&(a&!b)|   # T when a=T,b=F
 (l1&l2&!l3&!l4)&(!a)|      # T when a=F
 (!l1&l2&!l3&!l4)&(!a&b)|   # T when a=F,B=T
 (l1&!l2&!l3&!l4)&(!(a|b))  # T when a=F,B=F

Nếu bạn theo hệ thống được vạch ra bởi các gạch đầu dòng trong câu hỏi thì bạn sẽ có chi phí là 29, vì vậy điều này rất ấn tượng.
Peter Taylor

Tôi xin lỗi ông Taylor, tôi chỉ hy vọng điều này sẽ không làm hỏng đôi mắt của bạn.
Antonio Ragagnin

3

Bằng cách sử dụng ngôn ngữ Wolfram, tôi có thể nhận được một công thức 13 cổng :

logicfunc = Function[{a, b, Ln, La, Lb, Lab},
                   {a, b, Ln, La, Lb, Lab} -> Switch[{a, b},
                          {0, 0}, Ln, {1, 0}, La, {0, 1}, Lb, {1, 1}, Lab]
                  ];
trueRuleTable = Flatten[Outer[logicfunc, ##]] & @@ ConstantArray[{0, 1}, 6] /. {0 -> False, 1 -> True};
BooleanFunction[trueRuleTable, {a, b, Ln, La, Lb, Lab}] // BooleanMinimize[#, "NAND"] &

đầu ra nào:

Công thức NAND

Ở đây Ln, La, LbLabL_, L_a, L_bL_abriêng trong OP.

sidenote: Kết quả của BooleanMinimizechức năng trong ngôn ngữ Wolfram bị giới hạn ở hai cấp độ NANDNOTkhi gọi BooleanMinimize[(*blabla*), "NAND"], vì vậy nó không tốt như công thức bốn cấp của Peter Taylor ở trên .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.