You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Hack HDL实现8路或门遇阻,求技术解决方案

问题分析与修正方案

你的核心错误是混淆了NAND门与OR门的等价逻辑,以及多级OR组合时的逻辑错误。先明确基础逻辑:

  • NOT(x) = NAND(x, x)(用同输入NAND实现取反)
  • OR(a,b) = NAND(NOT(a), NOT(b))(OR门的NAND实现方式)

当输入为00000001时,你的代码输出错误的根本原因:在组合多级OR结果时,直接对OR结果做NAND,得到的是NOT(OR1 AND OR2)而非OR1 OR OR2,导致最终输出为0而非正确的1。

修正后的代码(基于你第二版逻辑调整)

CHIP Or8Way {
    IN in[8];
    OUT out;

    PARTS:
    // 第一步:对每个输入取反
    Nand(a = in[0], b = in[0], out = not0);
    Nand(a = in[1], b = in[1], out = not1);
    Nand(a = in[2], b = in[2], out = not2);
    Nand(a = in[3], b = in[3], out = not3);
    Nand(a = in[4], b = in[4], out = not4);
    Nand(a = in[5], b = in[5], out = not5);
    Nand(a = in[6], b = in[6], out = not6);
    Nand(a = in[7], b = in[7], out = not7);

    // 第二步:两两组合成2输入OR
    Nand(a = not0, b = not1, out = mid1); // mid1 = in0 OR in1
    Nand(a = not2, b = not3, out = mid2); // mid2 = in2 OR in3
    Nand(a = not4, b = not5, out = mid3); // mid3 = in4 OR in5
    Nand(a = not6, b = not7, out = mid4); // mid4 = in6 OR in7

    // 第三步:将2输入OR结果组合成4输入OR
    Nand(a = mid1, b = mid1, out = notMid1);
    Nand(a = mid2, b = mid2, out = notMid2);
    Nand(a = notMid1, b = notMid2, out = orA); // orA = mid1 OR mid2 = in0~3的OR

    Nand(a = mid3, b = mid3, out = notMid3);
    Nand(a = mid4, b = mid4, out = notMid4);
    Nand(a = notMid3, b = notMid4, out = orB); // orB = mid3 OR mid4 = in4~7的OR

    // 第四步:最终组合成8输入OR
    Nand(a = orA, b = orA, out = notOrA);
    Nand(a = orB, b = orB, out = notOrB);
    Nand(a = notOrA, b = notOrB, out = out);
}

简化版实现(逐级累加OR)

如果觉得多级中间变量麻烦,也可以直接从第一个输入开始,逐级和后续输入做OR:

CHIP Or8Way {
    IN in[8];
    OUT out;

    PARTS:
    // in0 OR in1
    Nand(a=in[0], b=in[0], out=not0);
    Nand(a=in[1], b=in[1], out=not1);
    Nand(a=not0, b=not1, out=or01);

    // or01 OR in2
    Nand(a=or01, b=or01, out=notOr01);
    Nand(a=in[2], b=in[2], out=not2);
    Nand(a=notOr01, b=not2, out=or02);

    // or02 OR in3
    Nand(a=or02, b=or02, out=notOr02);
    Nand(a=in[3], b=in[3], out=not3);
    Nand(a=notOr02, b=not3, out=or03);

    // or03 OR in4
    Nand(a=or03, b=or03, out=notOr03);
    Nand(a=in[4], b=in[4], out=not4);
    Nand(a=notOr03, b=not4, out=or04);

    // or04 OR in5
    Nand(a=or04, b=or04, out=notOr04);
    Nand(a=in[5], b=in[5], out=not5);
    Nand(a=notOr04, b=not5, out=or05);

    // or05 OR in6
    Nand(a=or05, b=or05, out=notOr05);
    Nand(a=in[6], b=in[6], out=not6);
    Nand(a=notOr05, b=not6, out=or06);

    // or06 OR in7
    Nand(a=or06, b=or06, out=notOr06);
    Nand(a=in[7], b=in[7], out=not7);
    Nand(a=notOr06, b=not7, out=out);
}

内容的提问来源于stack exchange,提问作者Heinrich Mller Domtastick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 21:04:59