我正在阅读这本书 http://nand2tetris.org/book.php,这本书教授 CS 的基本概念,但我被要求编写 AND 芯片并在提供的测试软件中测试它。
这是我到目前为止所得到的:
/**
* And gate:
* out = 1 if (a == 1 and b == 1)
* 0 otherwise
*/
CHIP And {
IN a, b;
OUT out;
PARTS:
// Put your code here:
Not(in=a, out=nota);
Not(in=b, out=notb);
And(a=a, b=b, out=out);
Or(a=nota, b=b, out=nota);
Or(a=a, b=notb, out=notb);
}
问题是我收到此错误:
...
at Hack.Gates.CompositeGateClass.readParts(Unknown Source)
at Hack.Gates.CompositeGateClass.<init>(Unknown Source)
at Hack.Gates.GateClass.readHDL(Unknown Source)
at Hack.Gates.GateClass.getGateClass(Unknown Source)
at Hack.Gates.CompositeGateClass.readParts(Unknown Source)
at Hack.Gates.CompositeGateClass.<init>(Unknown Source)
at Hack.Gates.GateClass.readHDL(Unknown Source)
...
我不知道我收到这个错误是因为测试程序出现故障还是因为我的代码错误并且软件无法加载它。
检查 Nand 和 And 的真值表可能会有所帮助:
南德
一个 |乙|出
0 | 0 | 1
0 | 1 | 1
1 | 0 | 1
1 | 1 | 0
还有
一个 |乙|出
0 | 0 | 0
0 | 1 | 0
1 | 0 | 0
1 | 1 | 1
And 是 Nand 的逆,这意味着对于每个输入组合,And 都会给出与 Nand 相反的输出。思考二进制值“相反”的另一种方式是“不是”该值。
如果您通过与非门发送 2 个输入,然后通过非门发送其输出,您将得到 Not(Nand(a, b)),这相当于 And(a, b)。
您的问题是您正在尝试使用尚未定义的部分(Not、And 和 Or)(并且您正在尝试在 And 门的定义中使用 And 门)。
在课程的每个点上,您只能使用之前构建的部件。如果没记错的话,此时您唯一可用的部分是 Nand 门。
您应该能够仅使用与非门构建与门。
你对这个问题想太多了
如果给定 NAND 或(非)AND,则 AND 可以构造为(非)NAND,因为(非)(非)AND = AND
我也为此苦苦挣扎。我假设上面关于仅使用与非门来制作与门的评论是指令。上面的评论“0”给了我们答案,但她没有为我们“拼出”。 (所以,我仍然花了一段时间才找到答案。)对于 AND 的输入 a 和 b,将它们链接到 NAND 的 a 和 b。然后,将 NAND 的扇出到另一个 NAND 的 a 和 b。然后,第二个 NAND 的输出可以映射到 AND 的输出。
这实际上不是唯一的方法!这就是芯片逻辑如此有趣的原因!