我正在阅读本书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)
...
我不知道我是否收到此错误,因为测试程序出现故障或因为我的代码错误且软件无法加载。
答案 0 :(得分:0)
您的问题是您正在尝试使用尚未定义的部件(Not,And和Or)(并且您尝试在And门的定义中使用And门)。
在课程的每个点上,您只能使用之前构建的部件。如果内存服务,此时你唯一可用的部分是Nand门。
你应该能够仅使用Nand门构建一个And门。
答案 1 :(得分:0)
你明显地过度思考问题
如果给一个NAND,或者(不)AND,那么AND可以被构造为(非)NAND,因为(不)(不)AND = 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)。