NAND 로직 게이트를 사용하여 비트 카운팅 비교기 구축


11

비트 카운트 비교 부 (BCC)는 카운트 입력 몇개 취하는 논리 회로 A1, A2, A3, ..., An뿐만 아니라, 입력 B1, B2, B4, B8, ...숫자를 표시한다. 그것은 다음 수익률 1의 총 개수 경우 A에있는 입력이 수가에 의해 이진 표현보다 큰 경우 B(예를 들어, 입력 B1, B2그리고 B8수를 만들 것입니다 11), 그리고 0그렇지.

예를 들어, 소요 비트 카운트 비교기 5있는 입력을, A2, A4, A5, 및가 B2설정되고 1, 리턴 1(3 개)이 있기 때문에 A보다 큰 켜져 인풋 2(숫자 만에 의해 표현 B2의 존재가).

귀하의 작업은 2 입력 NAND 게이트 만 사용하고 가능한 한 적은 수의 NAND 게이트를 사용하여 총 16 개의 A입력과 4 개의 B입력 (에서 1~ 까지의 비트를 나타내는) 을 취하는 비트 카운팅 비교기를 작성하는 것 8입니다. 일을 단순화하기 위해 다이어그램에서 AND, OR, NOT 및 XOR 게이트를 다음과 같은 점수로 사용할 수 있습니다.

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

이들 스코어 각각은 대응하는 게이트를 구성하기 위해 걸리는 NAND 게이트의 수에 대응한다.

가장 적은 NAND 게이트를 사용하여 올바른 구성을 생성하는 논리 회로가 승리합니다.


NAND 게이트를 전혀 사용하지 않는 답변이 이길까요? 쉬워야합니다. 16 개의 입력으로 AND 게이트를 사용할 수 있습니까?
r3mainer

@squeamishossifrage 질문을 읽었습니까? AND 게이트는 점수에 2를 더합니다.
Rainbolt

@squeamishossifrage 하나 AND== 두NAND
Timtech

1
@squeamishossifrage, " NAND 게이트 사용 ". 다른 게이트의 점수는 게이트를 만드는 데 필요한 최소 NAND 게이트 수입니다. 본질적으로 그것은 편의 매크로를 정의하고 있습니다.
피터 테일러

1
@ user80551 16 비트가 ON인지 OFF인지를 알려면 16 비트가 필요합니다. 4 비트 숫자를 나타내려면 4 비트가 필요합니다. ON 비트 수는 4 비트 수보다 커야합니다. 왜 그렇게 어려운지 잘 모르겠습니다. "켜져있는 A 입력의 총 수가 B 입력으로 표시되는 수보다 큽니다." 라는 질문의 부분을 참조하십시오 . ?
Rainbolt

답변:


7

169 개의 ​​낸드

A를 더하여 A {1,2,4,8,16}을 얻습니다. 그런 다음 B와 이진 비교를 수행합니다.

몇 가지 빌딩 블록을 더 사용합니다.

  • FA = 완전 가산기, 9 낸드 ( 여기에서 )
  • HA = 반가산기, 7 낸드 (같은 참조)
  • EQ = 평등, 5 게이트 (일명 xnor)

반가산기와 완전 가산기에는 2 개의 출력이 있습니다. 결과는 r, 캐리는 c로 구분됩니다.

A {1,2,4,8,16}은 반가산기의 출력입니다.

여기에 이미지 설명을 입력하십시오


1
와. 와우 절반 가산기는 5 개의 게이트 ( codegolf.stackexchange.com/a/10848/9498 , xor의 경우 4, xor의 첫 번째 낸드를 뒤집는 경우 1) 로 만들 수 있습니다 . 그래서 우리는 xor와 and를 얻습니다. 사진 : i.stack.imgur.com/qCFxa.png
Justin Justin

@Quincunx : 감사합니다. 반가산기가 좋을수록 카운트가 161로 줄어 듭니다. 쿼터 다이어그램이 필요하다고 생각하지 않지만 원하는 경우 대답을 업데이트 할 수 있습니다.
Keith Randall

5

751 개의 낸드 게이트

module BitCountingComparator(A, B, O);
    input [15:0] A;
    input [3:0] B;
    output O;

    wire [15:1] is;
    assign is[1] = A[0] | A[1] | A[2] | A[3] | A[4] | A[5] | A[6] | A[7] | A[8] | A[9] | A[10] | A[11] | A[12] | A[13] | A[14] | A[15];

    wire [14:0] and2;
    assign and2[0] = A[0] & A[1];
    assign and2[1] = A[1] & A[2];
    assign and2[2] = A[2] & A[3];
    assign and2[3] = A[3] & A[4];
    assign and2[4] = A[4] & A[5];
    assign and2[5] = A[5] & A[6];
    assign and2[6] = A[6] & A[7];
    assign and2[7] = A[7] & A[8];
    assign and2[8] = A[8] & A[9];
    assign and2[9] = A[9] & A[10];
    assign and2[10] = A[10] & A[11];
    assign and2[11] = A[11] & A[12];
    assign and2[12] = A[12] & A[13];
    assign and2[13] = A[13] & A[14];
    assign and2[14] = A[14] & A[15];

    wire [13:0] and3;
    assign and3[0] = and2[0] & A[2];
    assign and3[1] = and2[1] & A[3];
    assign and3[2] = and2[2] & A[4];
    assign and3[3] = and2[3] & A[5];
    assign and3[4] = and2[4] & A[6];
    assign and3[5] = and2[5] & A[7];
    assign and3[6] = and2[6] & A[8];
    assign and3[7] = and2[7] & A[9];
    assign and3[8] = and2[8] & A[10];
    assign and3[9] = and2[9] & A[11];
    assign and3[10] = and2[10] & A[12];
    assign and3[11] = and2[11] & A[13];
    assign and3[12] = and2[12] & A[14];
    assign and3[13] = and2[13] & A[15];

    wire [12:0] and4;
    assign and4[0] = and3[0] & A[3];
    assign and4[1] = and3[1] & A[4];
    assign and4[2] = and3[2] & A[5];
    assign and4[3] = and3[3] & A[6];
    assign and4[4] = and3[4] & A[7];
    assign and4[5] = and3[5] & A[8];
    assign and4[6] = and3[6] & A[9];
    assign and4[7] = and3[7] & A[10];
    assign and4[8] = and3[8] & A[11];
    assign and4[9] = and3[9] & A[12];
    assign and4[10] = and3[10] & A[13];
    assign and4[11] = and3[11] & A[14];
    assign and4[12] = and3[12] & A[15];

    wire [11:0] and5;
    assign and5[0] = and4[0] & A[4];
    assign and5[1] = and4[1] & A[5];
    assign and5[2] = and4[2] & A[6];
    assign and5[3] = and4[3] & A[7];
    assign and5[4] = and4[4] & A[8];
    assign and5[5] = and4[5] & A[9];
    assign and5[6] = and4[6] & A[10];
    assign and5[7] = and4[7] & A[11];
    assign and5[8] = and4[8] & A[12];
    assign and5[9] = and4[9] & A[13];
    assign and5[10] = and4[10] & A[14];
    assign and5[11] = and4[11] & A[15];

    wire [10:0] and6;
    assign and6[0] = and5[0] & A[5];
    assign and6[1] = and5[1] & A[6];
    assign and6[2] = and5[2] & A[7];
    assign and6[3] = and5[3] & A[8];
    assign and6[4] = and5[4] & A[9];
    assign and6[5] = and5[5] & A[10];
    assign and6[6] = and5[6] & A[11];
    assign and6[7] = and5[7] & A[12];
    assign and6[8] = and5[8] & A[13];
    assign and6[9] = and5[9] & A[14];
    assign and6[10] = and5[10] & A[15];

    wire [9:0] and7;
    assign and7[0] = and6[0] & A[6];
    assign and7[1] = and6[1] & A[7];
    assign and7[2] = and6[2] & A[8];
    assign and7[3] = and6[3] & A[9];
    assign and7[4] = and6[4] & A[10];
    assign and7[5] = and6[5] & A[11];
    assign and7[6] = and6[6] & A[12];
    assign and7[7] = and6[7] & A[13];
    assign and7[8] = and6[8] & A[14];
    assign and7[9] = and6[9] & A[15];

    wire [8:0] and8;
    assign and8[0] = and7[0] & A[7];
    assign and8[1] = and7[1] & A[8];
    assign and8[2] = and7[2] & A[9];
    assign and8[3] = and7[3] & A[10];
    assign and8[4] = and7[4] & A[11];
    assign and8[5] = and7[5] & A[12];
    assign and8[6] = and7[6] & A[13];
    assign and8[7] = and7[7] & A[14];
    assign and8[8] = and7[8] & A[15];

    wire [7:0] and9;
    assign and9[0] = and8[0] & A[8];
    assign and9[1] = and8[1] & A[9];
    assign and9[2] = and8[2] & A[10];
    assign and9[3] = and8[3] & A[11];
    assign and9[4] = and8[4] & A[12];
    assign and9[5] = and8[5] & A[13];
    assign and9[6] = and8[6] & A[14];
    assign and9[7] = and8[7] & A[15];

    wire [6:0] and10;
    assign and10[0] = and9[0] & A[9];
    assign and10[1] = and9[1] & A[10];
    assign and10[2] = and9[2] & A[11];
    assign and10[3] = and9[3] & A[12];
    assign and10[4] = and9[4] & A[13];
    assign and10[5] = and9[5] & A[14];
    assign and10[6] = and9[6] & A[15];

    wire [5:0] and11;
    assign and11[0] = and10[0] & A[10];
    assign and11[1] = and10[1] & A[11];
    assign and11[2] = and10[2] & A[12];
    assign and11[3] = and10[3] & A[13];
    assign and11[4] = and10[4] & A[14];
    assign and11[5] = and10[5] & A[15];

    wire [4:0] and12;
    assign and12[0] = and11[0] & A[11];
    assign and12[1] = and11[1] & A[12];
    assign and12[2] = and11[2] & A[13];
    assign and12[3] = and11[3] & A[14];
    assign and12[4] = and11[4] & A[15];

    wire [3:0] and13;
    assign and13[0] = and12[0] & A[12];
    assign and13[1] = and12[1] & A[13];
    assign and13[2] = and12[2] & A[14];
    assign and13[3] = and12[3] & A[15];

    wire [2:0] and14;
    assign and14[0] = and13[0] & A[13];
    assign and14[1] = and13[1] & A[14];
    assign and14[2] = and13[2] & A[15];

    wire [1:0] and15;
    assign and15[0] = and14[0] & A[14];
    assign and15[1] = and14[1] & A[15];

    wire and16;
    assign and16 = and15[0] & A[15];

    assign is[2] = and2[0] | and2[1] | and2[2] | and2[3] | and2[4] | and2[5] | and2[6] | and2[7] | and2[8] | and2[9] | and2[10] | and2[11] | and2[12] | and2[13] | and2[15];

    assign is[3] = and3[0] | and3[1] | and3[2] | and3[3] | and3[4] | and3[5] | and3[6] | and3[7] | and3[8] | and3[9] | and3[10] | and3[11] | and3[12] | and3[14];

    assign is[4] = and4[0] | and4[1] | and4[2] | and4[3] | and4[4] | and4[5] | and4[6] | and4[7] | and4[8] | and4[9] | and4[10] | and4[11] | and4[13];

    assign is[5] = and5[0] | and5[1] | and5[2] | and5[3] | and5[4] | and5[5] | and5[6] | and5[7] | and5[8] | and5[9] | and5[10] | and5[12];

    assign is[6] = and6[0] | and6[1] | and6[2] | and6[3] | and6[4] | and6[5] | and6[6] | and6[7] | and6[8] | and6[9] | and6[11];

    assign is[7] = and7[0] | and7[1] | and7[2] | and7[3] | and7[4] | and7[5] | and7[6] | and7[7] | and7[8] | and7[10];

    assign is[8] = and8[0] | and8[1] | and8[2] | and8[3] | and8[4] | and8[5] | and8[6] | and8[7] | and8[9];

    assign is[9] = and9[0] | and9[1] | and9[2] | and9[3] | and9[4] | and9[5] | and9[6] | and9[8];

    assign is[10] = and10[0] | and10[1] | and10[2] | and10[3] | and10[4] | and10[5] | and10[7];

    assign is[11] = and11[0] | and11[1] | and11[2] | and11[3] | and11[4] | and11[6];

    assign is[12] = and12[0] | and12[1] | and12[2] | and12[3] | and12[5];

    assign is[13] = and13[0] | and13[1] | and13[2] | and13[4];

    assign is[14] = and14[0] | and14[1] | and14[3];

    assign is[15] = and15[0] | and15[2];

    assign is[16] = and16;


    wire [15:1] eB;
    eB[1] = B[0];
    eB[2] = B[1];
    eB[3] = B[1] & B[0];
    eB[4] = B[2];
    eB[5] = B[2] & B[0];
    eB[6] = B[2] & B[1];
    eB[7] = eB[6] & B[0];
    eB[8] = B[3];
    eB[9] = B[3] & B[0];
    eB[10] = B[3] & B[1];
    eB[11] = eB[10] & B[0];
    eB[12] = B[3] & B[2];
    eB[13] = eB[12] & B[0];
    eB[14] = eB[12] & B[1];
    eB[15] = eB[14] & B[0];

    assign O = is[1] & ~is[2] & ~eB[1] |
        is[2] & ~is[3] & ~eB[2] |
        is[3] & ~is[4] & ~eB[3] |
        is[4] & ~is[5] & ~eB[4] |
        is[5] & ~is[6] & ~eB[5] |
        is[6] & ~is[7] & ~eB[6] |
        is[7] & ~is[8] & ~eB[7] |
        is[8] & ~is[9] & ~eB[8] |
        is[9] & ~is[10] & ~eB[9] |
        is[10] & ~is[11] & ~eB[10] |
        is[11] & ~is[12] & ~eB[11] |
        is[12] & ~is[13] & ~eB[12] |
        is[13] & ~is[14] & ~eB[13] |
        is[14] & ~is[15] & ~eB[14] |
        is[15] & ~eB[15];
endmodule

아직 완전히 골프가 아닙니다. 나는 Verilog에서 답을 주었다. 이런 방식으로 각 섹션을 출력하는 프로그램을 작성할 수 있었기 때문이다. 다이어그램으로 답변해야하는 경우 알려주십시오. 그것들은 동등합니다. &이고, ~존재하지 않으며, |그렇습니다.

내 전략 :

  • 가지고 A모든 이동 넣어 1에서, 낮은 번호에 가게를들 is. (이것은 프로그램의 대다수입니다)
  • 걸릴 B및 16 비트에 압축을 풉니 다 (나는 그것을라는 eB확장을위한 B)
  • 간단한 점검을하십시오.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.