Điều khiển màn hình 7 đoạn thập lục phân bằng cổng logic NAND


9

Màn hình số 7 đoạn phổ biến có thể hiển thị rõ ràng tất cả 16 chữ số thập lục phân như hiển thị trong wikipedia .gif này

Các mục nhập cho thử thách này sẽ tạo ra một sơ đồ mạch sử dụng các cổng logic NAND, biến đổi bốn bit của một chữ số hex thành các đầu vào cho bảy phân đoạn. Các đầu vào cho màn hình 7 đoạn thường được dán nhãn như sau: (DP (dấu thập phân) bị bỏ qua cho thử thách này)

nhập mô tả hình ảnh ở đây

Do đó, mạch của bạn sẽ cần phải tuân theo bảng chân lý sau:

Hex   | Hex Input Bit | Output to Segment line:
digit |  3  2  1  0   |  A  B  C  D  E  F  G
------+---------------+-----------------------
   0  |  0  0  0  0   |  1  1  1  1  1  1  0
   1  |  0  0  0  1   |  0  1  1  0  0  0  0
   2  |  0  0  1  0   |  1  1  0  1  1  0  1
   3  |  0  0  1  1   |  1  1  1  1  0  0  1
   4  |  0  1  0  0   |  0  1  1  0  0  1  1
   5  |  0  1  0  1   |  1  0  1  1  0  1  1
   6  |  0  1  1  0   |  1  0  1  1  1  1  1
   7  |  0  1  1  1   |  1  1  1  0  0  0  0
   8  |  1  0  0  0   |  1  1  1  1  1  1  1
   9  |  1  0  0  1   |  1  1  1  1  0  1  1
   A  |  1  0  1  0   |  1  1  1  0  1  1  1
   b  |  1  0  1  1   |  0  0  1  1  1  1  1
   C  |  1  1  0  0   |  1  0  0  1  1  1  0
   d  |  1  1  0  1   |  0  1  1  1  1  0  1
   E  |  1  1  1  0   |  1  0  0  1  1  1  1
   F  |  1  1  1  1   |  1  0  0  0  1  1  1

Tôi nghĩ bảng này là chính xác, nhưng vui lòng cho tôi biết nếu bạn phát hiện bất kỳ lỗi nào.

Điểm của bạn được xác định bởi số lượng cổng NAND 2 đầu vào bạn sử dụng (1 điểm cho mỗi cổng). Để đơ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

thách thức này dường như là về việc vẽ sơ đồ mạch chứ không phải về mã hóa. Ngoài ra, các giá trị điểm trên mỗi cổng có vẻ tùy ý (có thể có chủ ý) và sử dụng AND + KHÔNG là 3 điểm, khi bạn nêu NAND chỉ là 1.
stokastic

@stokastic Có rất nhiều thử thách cổng logic khác trên trang web này, vì vậy tôi giả sử loại thử thách này được cộng đồng chấp nhận. Nhiều người sử dụng cùng một hệ thống tính điểm. Logic NAND tôi nghĩ giải thích hệ thống tính điểm này khá tốt.
Chấn thương kỹ thuật số

Đủ công bằng. Tôi đã không nhìn thấy những thẻ đó trước đây. Nó dường như không thực sự phù hợp với 'câu đố lập trình' hay 'golf mã'.
stokastic

Mạch có thể tách? Nói cách khác, bạn có thể lưu các giá trị vào các biến và gọi lại chúng sau này không?
xnor

@xnor Bạn đang nói về loại điều này: codegolf.stackexchange.com/a/26235/11259 ? Nếu vậy, câu trả lời là có.
Chấn thương kỹ thuật số

Câu trả lời:


17

Đô-mi-nô - Tổng số điểm: 243 NAND

  • OR được sử dụng: 61 (mỗi 3 NAND -> 183 NAND)

  • KHÔNG được sử dụng: 60 (mỗi 1 NAND -> 60 NAND)

Giải pháp này nằm trong trò chơi domino và yêu cầu một bộ phần mềm tôi đã viết trong quá trình trả lời hai câu hỏi liên quan đến Domino của Martin Büttner để sản xuất ( Golfing for Domino DayDomino Circuits ).

Bằng cách sửa đổi bộ giải mạch Domino của tôi , tôi có thể tạo ra một mạch domino (tệp này cũng chứa đầu ra của bộ giải và bộ xương mạch) bao gồm các OR và IFNOT trong đó đầu vào đầu tiên luôn luôn TRUE (vì vậy về cơ bản là KHÔNG). Bởi vì không có nhiều mà sẽ phù hợp trong câu trả lời này, tôi trình bày OR và NOT giải pháp cho bảng sự thật:

A: 1011011111101011
((-1 ifnot (2 or (1 or (-1 ifnot 0)))) or ((-1 ifnot ((-1 ifnot 1) or (-1 ifnot 2))) or ((-1 ifnot (3 or (-1 ifnot (0 or (-1 ifnot 1))))) or (-1 ifnot (0 or ((-1 ifnot 3) or (-1 ifnot (2 or 1))))))))
B: 1111100111100100
((-1 ifnot (3 or 1)) or ((-1 ifnot (3 or (2 or 0))) or (-1 ifnot ((-1 ifnot 3) or ((-1 ifnot (2 or (0 or (-1 ifnot 1)))) or (-1 ifnot ((-1 ifnot 0) or (-1 ifnot 2))))))))
C: 1101111111110100
((-1 ifnot (2 or (-1 ifnot 3))) or ((-1 ifnot (1 or (-1 ifnot 0))) or (-1 ifnot (0 or (-1 ifnot (3 or (1 or (-1 ifnot 2))))))))
D: 1011011011011110
((-1 ifnot (3 or (1 or 0))) or ((-1 ifnot (2 or ((-1 ifnot (3 or 0)) or (-1 ifnot (1 or 0))))) or (-1 ifnot ((-1 ifnot 2) or ((-1 ifnot (3 or 1)) or (-1 ifnot ((-1 ifnot 1) or (-1 ifnot 3))))))))
E: 1010001010111111
((-1 ifnot (3 or (-1 ifnot (2 or (-1 ifnot 1))))) or (-1 ifnot ((-1 ifnot 0) or (-1 ifnot (2 or 1)))))
F: 1000111011111011
((-1 ifnot (3 or (-1 ifnot 1))) or ((-1 ifnot (2 or (0 or (-1 ifnot (1 or (-1 ifnot 3)))))) or (-1 ifnot ((-1 ifnot 0) or (-1 ifnot (2 or (-1 ifnot 1)))))))
G: 0011111011110111
((-1 ifnot (2 or (0 or (-1 ifnot 1)))) or ((-1 ifnot (1 or (-1 ifnot (2 or 0)))) or (-1 ifnot ((-1 ifnot (3 or 2)) or (-1 ifnot (0 or (-1 ifnot 3)))))))

Lưu ý rằng các hoạt động nhị phân duy nhất được sử dụng là OR và IFNOT, trong đó tôi tính mỗi IFNOT là KHÔNG cho mục đích ghi điểm

Tôi đã thêm một màn hình 7 đoạn vào cuối mạch và đưa nó vào một trình tạo giả lập / gif domino. Gif kết quả (hiển thị 'A' được hiển thị) mất khoảng 2 giờ để tạo. Bởi vì mạch cuối cùng có kích thước 1141 * 517, mỗi "ô" được biểu thị bằng một pixel. Một tế bào đen trống rỗng, một tế bào màu xám có một domino đứng trong đó và một tế bào trắng có một domino rơi trong đó. Điều này có nghĩa là bạn thực sự không thể biết chuyện gì đang xảy ra và sẽ không có ích gì nếu nó bị nghiền nát. Sparr vui lòng cung cấp một phiên bản nhỏ hơn nhiều của gif gốc của tôi (650kB), vì vậy đây là!

Hoạt hình

Dưới đây là khung cuối cùng của hình ảnh động cho đầu vào 1010 ('A') như trên. Bạn có thể thấy các đầu vào ở phía bên trái, đường dây điện ở trên cùng, tổng đài chiếm phần lớn không gian, 7 đoạn logic riêng lẻ (đây là các biểu diễn domino của các chức năng ở trên) ở bên trái của bảng chuyển đổi và phía bên phải là màn hình 7 đoạn. Khi điều này chạy, các phân đoạn riêng lẻ sáng lên cùng một lúc, vì vậy bạn không thể nhìn vào nó quá lâu với một số phân đoạn sáng lên chờ đợi những người khác sáng lên.

Khung hình cuối cùng của hoạt hình

Xem hoạt hình trong vinh quang đầy đủ của nó ở đây (36MB) hoặc ở đây (650kB, lịch sự của Sparr) (bản sao nhỏ hơn nhỏ hơn nhiều, nhưng trình duyệt của tôi dường như thích bỏ qua các khung hình làm đẹp nên tôi đã rời khỏi bản gốc)

Chi tiết về màn hình 7 đoạn có thể xem tại đây ('1' được hiển thị)


3
+1 cho sự siêu thực tuyệt đối khi lái màn hình 7 đoạn với domino!
Chấn thương kỹ thuật số

Điều đó thật tuyệt vời ... Ai đó nên thử điều này trong cuộc sống thực
Beta Decay

11

30 NAND

Tôi khá chắc chắn rằng không có giải pháp nào đơn giản hơn cho vấn đề này, ngoại trừ có lẽ bằng cách thay đổi các biểu tượng trên màn hình, nhưng đó sẽ là một vấn đề khác và khác.

Vì đây thực sự là một việc hữu ích để làm, ví dụ như khi lập trình một FPGA để hiển thị đầu ra, tôi cung cấp mã Verilog.

Đối với chủ nghĩa tối giản: Tất nhiên đó là khó khăn để thực hiện. Không thể hiểu được, vì màn hình 7 đoạn chỉ là một cách khá ngẫu nhiên mà con người hiển thị số, dẫn đến một mạch cũng khá ngẫu nhiên. Và như là điển hình cho các mạch tối thiểu này, độ sâu logic của nó có phần cao hơn so với các giải pháp gần. Tôi đoán điều này là do nối tiếp đơn giản hơn song song.

Độ trễ truyền được biểu thị bằng vị trí hướng xuống của mỗi cổng NAND trên trang tính.

Trình điều khiển hiển thị 7 đoạn thập lục phân tối thiểu

Mã Verilog:

// Hexadecimal 7-segment display driver
// Minimal at 30 NANDs
//
// By Kim Øyhus 2018 (c) into (CC BY-SA 3.0)
// This work is licensed under the Creative Commons Attribution 3.0
// Unported License. To view a copy of this license, visit
// https://creativecommons.org/licenses/by-sa/3.0/
//
// This is my entry to win this Programming Puzzle & Code Golf
// at Stack Exchange: 
// /codegolf/37648/drive-a-hexadecimal-7-segment-display-using-nand-logic-gates
//
// I am quite sure there are no simpler solutions to this problem,
// except perhaps by changing the symbols on the display,
// but that would be another and different problem.
//
// Since this is actually something useful to do, for instance when
// programming an FPGA to show output, I provide this Verilog code.
//
// As for the minimalism: Of course it was tricky to make.
// It is not comprehensible, since a 7-segment display is
// just a fairly random way of showing numbers, resulting
// in a circuit that is fairly random too.
// And as is typical for these minimal circuits, its logical depth
// is somewhat higher than for close solutions. I guess this is because
// serial is simpler than parallel.
//
// 4 bits of input "in_00?", and 7 bits of output,
// one bit per LED in the segment.
//   A
// F   B
//   G
// E   C
//   D

module display7 ( in_000, in_001, in_002, in_003,  G, F, E, D, C, B, A );
  input in_000, in_001, in_002, in_003;
  output G, F, E, D, C, B, A;
  wire wir000, wir001, wir002, wir003, wir004, wir005, wir006, wir007, wir008, wir009, wir010, wir011, wir012, wir013, wir014, wir015, wir016, wir017, wir018, wir019, wir020, wir021, wir022 ;

  nand gate000 ( wir000, in_000, in_002 );
  nand gate001 ( wir001, in_000, in_000 );
  nand gate002 ( wir002, wir000, in_001 );
  nand gate003 ( wir003, in_001, wir002 );
  nand gate004 ( wir004, wir000, wir002 );
  nand gate005 ( wir005, in_002, wir003 );
  nand gate006 ( wir006, in_003, wir001 );
  nand gate007 ( wir007, wir006, wir004 );
  nand gate008 ( wir008, in_003, wir005 );
  nand gate009 ( wir009, wir005, wir008 );
  nand gate010 ( wir010, in_003, wir008 );
  nand gate011 ( wir011, wir010, wir009 );
  nand gate012 ( wir012, wir010, wir007 );
  nand gate013 ( wir013, wir001, wir011 );
  nand gate014 ( wir014, wir003, wir004 );
  nand gate015 (      G, wir011, wir014 );
  nand gate016 ( wir015, in_003, wir014 );
  nand gate017 ( wir016, wir015, wir013 );
  nand gate018 (      C, wir016, wir012 );
  nand gate019 ( wir017, wir016, wir007 );
  nand gate020 ( wir018, wir003, wir012 );
  nand gate021 ( wir019, wir017, in_003 );
  nand gate022 (      F, wir011, wir017 );
  nand gate023 (      D, wir018, wir017 );
  nand gate024 (      B, wir012,      F );
  nand gate025 ( wir020, wir004, wir018 );
  nand gate026 ( wir021, wir001,      D );
  nand gate027 (      E, wir019, wir021 );
  nand gate028 ( wir022,      D, wir019 );
  nand gate029 (      A, wir020, wir022 );
endmodule

Kim husyhus


Đây là một giải pháp thực sự ấn tượng! Tại sao bạn lại tự tin rằng một người không thể làm tốt hơn 30? 37 đã trông "khá giảm", imo.
Alex Meiburg

Cảm ơn. Tôi đã tìm kiếm ngoài giải pháp này, sử dụng nhiều thời gian hơn cho việc đó hơn là tìm kiếm giải pháp đó, và không có gì ở đó. Xác suất mà tôi bỏ lỡ một cái gì đó tốt hơn là rất nhỏ. Đó là một lập luận thống kê.
KimOyhus

7

Sử dụng ~ cho NOT và N cho NAND, một tìm kiếm trên máy tính (không chia sẻ thuật ngữ giữa các đầu ra) sẽ tìm ra giải pháp với 82 NAND mà không cần chia sẻ. Tìm kiếm thủ công các thuật ngữ chia sẻ giúp giảm xuống còn 54 NAND và tìm kiếm trên máy tính bao gồm chia sẻ tiếp tục giảm xuống còn 37 NAND. Mức tối thiểu có thể còn thấp hơn, vì phương pháp này chắc chắn không toàn diện.

Đây là chương trình tạo lại bảng trên. Mỗi dòng được dán nhãn NANDS cho đầu ra đó.

#include <stdio.h>

int N(int x, int y) { return 1 & ~(x & y); }

void main(void)
{
    int i0, i1, i2, i3;
    for (i3 = 0; i3 <= 1; i3++) {
    for (i2 = 0; i2 <= 1; i2++) {
    for (i1 = 0; i1 <= 1; i1++) {
    for (i0 = 0; i0 <= 1; i0++) {
            printf("%d %d %d %d : %d %d %d %d %d %d %d\n", i3, i2, i1, i0,
    /* 14 */        N(N(N(i3, N(i2, i1)), N(N(i2, i0), ~i1)), N(N(i2, N(i3, N(i3, i0))), N(i0, N(i3, N(i3, i1))))),
    /* 12 */        N(N(N(i3, i0), N(i2, N(i1, i0))), N(~i1, N(N(i3, i0), N(~i3, N(i2, i0))))),
    /* 10 */        N(N(i0, N(i3, i1)), N(N(i3, i2), N(i1, N(i1, N(~i3, ~i2))))),
    /* 16 */        N(N(N(i2, i1), N(N(i3, i0), N(i2, i0))), N(N(i0, N(i1, ~i2)), N(N(i3, i2), N(N(i3, i1), N(i2, N(i2, i1)))))),
    /*  7 */        N(N(i3, i2), N(N(i2, N(i2, i1)), N(i0, N(i3, i1)))),
    /* 11 */        N(N(i3, N(i2, N(i3, i1))), N(N(i1, N(i2, N(i2, i0))), N(i0, N(i2, ~i3)))),
    /* 12 */        N(N(i3, i0), ~N(N(i1, N(i2, i0)), N(N(i3, i2), N(~i3, N(i2, N(i2, i1)))))) );
    } } } }
}

Và đây là đầu ra:

0 0 0 0 : 1 1 1 1 1 1 0
0 0 0 1 : 0 1 1 0 0 0 0
0 0 1 0 : 1 1 0 1 1 0 1
0 0 1 1 : 1 1 1 1 0 0 1
0 1 0 0 : 0 1 1 0 0 1 1
0 1 0 1 : 1 0 1 1 0 1 1
0 1 1 0 : 1 0 1 1 1 1 1
0 1 1 1 : 1 1 1 0 0 0 0
1 0 0 0 : 1 1 1 1 1 1 1
1 0 0 1 : 1 1 1 1 0 1 1
1 0 1 0 : 1 1 1 0 1 1 1
1 0 1 1 : 0 0 1 1 1 1 1
1 1 0 0 : 1 0 0 1 1 1 0
1 1 0 1 : 0 1 1 1 1 0 1
1 1 1 0 : 1 0 0 1 1 1 1
1 1 1 1 : 1 0 0 0 1 1 1

Và đây là các phương trình tương đương, các điều khoản chia sẻ giúp giảm xuống còn 54 NAND:

    /* 1 */ int z1 = 1 - i1;
    /* 1 */ int z2 = 1 - i2;
    /* 1 */ int z3 = 1 - i3;

    /* 1 */ int n_i2_i0 = N(i2, i0);
    /* 1 */ int n_i2_i1 = N(i2, i1);
    /* 1 */ int n_i3_i0 = N(i3, i0);
    /* 1 */ int n_i3_i1 = N(i3, i1);
    /* 1 */ int n_i3_i2 = N(i3, i2);

    /* 1 */ int n_i0_n_i3_i1 = N(i0, n_i3_i1);
    /* 1 */ int n_i2_n_i2_i1 = N(i2, n_i2_i1);

            printf("%d %d %d %d : %d %d %d %d %d %d %d\n", i3, i2, i1, i0,
    /* 9 */ N(N(N(i3, n_i2_i1), N(n_i2_i0, z1)), N(N(i2, N(i3, n_i3_i0)), N(i0, N(i3, n_i3_i1)))),
    /* 7 */ N(N(n_i3_i0, N(i2, N(i1, i0))), N(z1, N(n_i3_i0, N(z3, n_i2_i0)))),
    /* 5 */ N(n_i0_n_i3_i1, N(n_i3_i2, N(i1, N(i1, N(z3, z2))))),
    /* 8 */ N(N(n_i2_i1, N(n_i3_i0, n_i2_i0)), N(N(i0, N(i1, z2)), N(n_i3_i2, N(n_i3_i1, n_i2_n_i2_i1)))),
    /* 2 */ N(n_i3_i2, N(n_i2_n_i2_i1, n_i0_n_i3_i1)),
    /* 8 */ N(N(i3, N(i2, n_i3_i1)), N(N(i1, N(i2, n_i2_i0)), N(i0, N(i2, z3)))),
    /* 6 */ N(n_i3_i0, ~N(N(i1, n_i2_i0), N(n_i3_i2, N(z3, n_i2_n_i2_i1)))) );

Và đây là giải pháp 37 NAND:

    x0fff =  N(i3, i2);
    x33ff =  N(i3, i1);
    x55ff =  N(i3, i0);
    x0f0f =  not(i2);
    x3f3f =  N(i2, i1);
    x5f5f =  N(i2, i0);
    xcfcf =  N(i2, x3f3f);
    xf3f3 =  N(i1, x0f0f);
    x5d5d =  N(i0, xf3f3);
    xaaa0 =  N(x55ff, x5f5f);
    xfc30 =  N(x33ff, xcfcf);
    xd5df =  N(x3f3f, xaaa0);
    xf3cf =  N(x0fff, xfc30);
    xaeb2 =  N(x5d5d, xf3cf);
    x7b6d =  N(xd5df, xaeb2);
    xb7b3 =  N(i1, x7b6d);
    xf55f =  N(x0fff, xaaa0);
    xcea0 =  N(x33ff, xf55f);
    x795f =  N(xb7b3, xcea0);
    xd7ed =  N(xaeb2, x795f);
    xfaf0 =  N(x55ff, x0f0f);
    xae92 =  N(x55ff, x7b6d);
    xdd6d =  N(x33ff, xae92);
    x279f =  N(xfaf0, xdd6d);
    xaf0f =  N(i2, x55ff);
    x50ff =  N(i3, xaf0f);
    xef4c =  N(xb7b3, x50ff);
    x1cb3 =  N(xf3cf, xef4c);
    xef7c =  N(xf3cf, x1cb3);
    xfb73 =  N(i1, x279f);
    x2c9e =  N(xd7ed, xfb73);
    xdf71 =  N(xf3cf, x2c9e);
    xdd55 =  N(i0, x33ff);
    xf08e =  N(x0fff, xdf71);
    x2ffb =  N(xdd55, xf08e);
    x32ba =  N(xcfcf, xdd55);
    xfd45 =  N(x0fff, x32ba);

    printf("%d %d %d %d : %d %d %d %d %d %d %d\n", i3, i2, i1, i0,
            xd7ed, x279f, x2ffb, x7b6d, xfd45, xdf71, xef7c);
    } } } }

2
Bạn nên có một tiêu đề đáng tự hào với "37 NAND". Bài viết của bạn quá khiêm tốn mà không có điều đó.
KimOyhus

4

197 NAND

Vì đây là thử thách cổng logic đầu tiên của tôi. nó không được đánh gôn nhiều, và có thể không phải là giải pháp nhỏ nhất. Tôi không sử dụng phân chia mạch ở đây.

A = OR(AND(d, NOT(AND(a, XOR(c, b)))), AND(NOT(d), NOT(AND(NOT(b), XOR(a, c)))))
B = AND(OR(OR(NOT(c), AND(NOT(d), NOT(XOR(b, a)))), AND(d, a)), NOT(AND(AND(d, b), a)))
C = OR(AND(NOT(c), NOT(AND(AND(NOT(d), b), NOT(a)))), AND(c, OR(NOT(d), AND(AND(d, NOT(b)), a))))
D = AND(OR(OR(OR(a, c), AND(AND(NOT(d), NOT(c)), NOT(a))), AND(AND(d, NOT(c)), NOT(b))), NOT(OR(AND(AND(NOT(d), NOT(b)), XOR(c, a)), AND(AND(c, b), a))))
E = OR(AND(NOT(a), NOT(AND(AND(NOT(d), c), NOT(b)))), AND(d, NOT(AND(AND(NOT(c), NOT(b)), a))))
F = AND(OR(OR(d, c), AND(NOT(b), NOT(a))), NOT(AND(AND(c, a), XOR(d, b))))
G = AND(OR(OR(d, c), b), NOT(OR(AND(AND(NOT(d), c), AND(b, a)), AND(AND(d, c), AND(NOT(b), NOT(a))))))
  • 36 KHÔNG được sử dụng, 36 NAND
  • 41 AND được sử dụng, 84 NAND
  • 19 OR được sử dụng, 57 NAND
  • 5 XOR được sử dụng, 20 NAND

Nếu tôi đúng, điểm của tôi là 197 .


Trong thử thách này, tôi đã tạo một mã JavaScript đơn giản để kiểm tra cổng của mình.

function NOT(a){return !a}function AND(a,b){return a&b}function OR(a,b){return a|b}function XOR(a,b){return a^b}
for(d=0;d<=1;d++){for(c=0;c<=1;c++){for(b=0;b<=1;b++){for(a=0;a<=1;a++){console.log(""+d+c+b+a,
    // Enter your gate here
    // OR(AND(d, NOT(AND(a, XOR(c, b)))), AND(NOT(d), NOT(AND(NOT(b), XOR(a, c)))))
)}}}}

Sao chép và sửa đổi cổng và dán nó vào bảng điều khiển của trình duyệt hoặc Node.js REPL.

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.