在HDL中实现AND芯片

时间:2018-03-06 17:32:59

标签: hdl nand2tetris

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

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

3 个答案:

答案 0 :(得分:0)

您的问题是您正在尝试使用尚未定义的部件(Not,And和Or)(并且您尝试在And门的定义中使用And门)。

在课程的每个点上,您只能使用之前构建的部件。如果内存服务,此时你唯一可用的部分是Nand门。

你应该能够仅使用Nand门构建一个And门。

答案 1 :(得分:0)

你明显地过度思考问题

如果给一个NAND,或者(不)AN​​D,那么AND可以被构造为(非)NAND,因为(不)(不)AN​​D = AND

答案 2 :(得分:0)

检查Nand和And的真值表可能会有所帮助:

的Nand
a | b |出
0 | 0 | 1
0 | 1 | 1
1 | 0 | 1
1 | 1 | 0


a | b |出
0 | 0 | 0
0 | 1 | 0
1 | 0 | 0
1 | 1 | 1个

并且是Nand的反转,意味着对于每个输入组合,并且将给出Nand的相反输出。另一种思考二元值“相反”的方法是“不”那个值。

如果您通过Nand门发送2个输入,然后通过Not门发送其输出,则您将具有Not(Nand(a,b)),这相当于And(a,b)。