0

我正在阅读这本书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)
...

而且我不知道我收到此错误是因为测试程序出现故障还是因为我的代码错误并且软件无法加载它。

4

3 回答 3

1

检查 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 相反的输出。另一种思考二进制值“相反”的方法是“不是”那个值。

如果您通过 Nand 门发送 2 个输入,然后通过 Not 门发送其输出,您将得到 Not(Nand(a, b)),它等价于 And(a, b)。

于 2018-05-18T20:14:15.763 回答
0

您的问题是您正在尝试使用尚未定义的部分(非、与和或)(并且您正在尝试在与门的定义中使用与门)。

在课程的每一点,您只能使用您之前构建的部分。如果没记错的话,此时您唯一可用的部分是与非门。

您应该能够仅使用 Nand 门来构建 And 门。

于 2018-03-06T17:55:19.903 回答
0

你对问题的思考过度了

如果给定一个 NAND 或 (not) AND,则 AND 可以构造为 (not)NAND,因为 (not)(not) AND = AND

于 2018-03-07T13:50:56.763 回答