使用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
相关产品推荐
相关产品推荐

