我目前正在上一门涵盖 nand2tetris 工具等的课程,我的第一份作业是实现一些芯片,但它们似乎都不起作用,我尝试的每个芯片都会收到一条错误消息。这是我第一次处理这样的事情,所以我会感谢任何反馈和更正。
Chip 1 - 它应该将输入乘以 2,错误:在工作文件夹和内置文件夹中找不到 Chip out[0]
IN in[16];
OUT out[16];
PARTS:
out[0] = 0;
out[1] = in[0];
out[2] = in[1];
out[3] = in[2];
out[4] = in[3];
out[5] = in[4];
out[6] = in[5];
out[7] = in[6];
out[8] = in[7];
out[9] = in[8];
out[10] = in[9];
out[11] = in[10];
out[12] = in[11];
out[13] = in[12];
out[14] = in[13];
out[15] = in[14];
}
芯片 2 - 应该返回两个输入不同的位数,错误:第 6 行:diff[0],内部节点的子总线可能无法使用
IN a[16], b[16];
OUT out[16];
PARTS:
Xor(a=a[0], b=b[0], out=diff[0]);
Xor(a=a[1], b=b[1], out=diff[1]);
Xor(a=a[2], b=b[2], out=diff[2]);
Xor(a=a[3], b=b[3], out=diff[3]);
Xor(a=a[4], b=b[4], out=diff[4]);
Xor(a=a[5], b=b[5], out=diff[5]);
Xor(a=a[6], b=b[6], out=diff[6]);
Xor(a=a[7], b=b[7], out=diff[7]);
Xor(a=a[8], b=b[8], out=diff[8]);
Xor(a=a[9], b=b[9], out=diff[9]);
Xor(a=a[10], b=b[10], out=diff[10]);
Xor(a=a[11], b=b[11], out=diff[11]);
Xor(a=a[12], b=b[12], out=diff[12]);
Xor(a=a[13], b=b[13], out=diff[13]);
Xor(a=a[14], b=b[14], out=diff[14]);
Xor(a=a[15], b=b[15], out=diff[15]);
Add16(in = diff, out = out);
}
芯片 3 - 返回从 MSB 开始的一行中零的数量,错误:第 8 行,无法将门的输出引脚连接到部件
IN in[16];
OUT out[16];
PARTS:
And(a=in[15], b=true, out=out[0]);
And(a=in[14], b=out[0], out=out[1]);
And(a=in[13], b=out[1], out=out[2]);
And(a=in[12], b=out[2], out=out[3]);
And(a=in[11], b=out[3], out=out[4]);
And(a=in[10], b=out[4], out=out[5]);
And(a=in[9], b=out[5], out=out[6]);
And(a=in[8], b=out[6], out=out[7]);
And(a=in[7], b=out[7], out=out[8]);
And(a=in[6], b=out[8], out=out[9]);
And(a=in[5], b=out[9], out=out[10]);
And(a=in[4], b=out[10], out=out[11]);
And(a=in[3], b=out[11], out=out[12]);
And(a=in[2], b=out[12], out=out[13]);
And(a=in[1], b=out[13], out=out[14]);
And(a=in[0], b=out[14], out=out[15]);
}
我对此很陌生,所以我知道它们不是最优化甚至正确的解决方案,但这些是我唯一的想法。
我建议你仔细阅读NAND2Tetris这本书的附录,了解HDL的格式和限制。
例如,您不能像在芯片 1 中那样直接连接输入和输出。部件列表必须完全相同,即连接在一起的部件(子芯片)列表。所以每个输入和输出之间必须至少有一个部分。正在生成“错误:在工作和内置文件夹中找不到芯片 out[0]”,因为 HDL 编译器期望看到芯片列表,因此它期望第一个标记(“out[0]”)是一个芯片名称,不存在这样的芯片。
转向芯片 2,错误消息准确地告诉您问题所在:您无法从多个芯片的输出创建内部总线。但是,您可以让每个芯片生成单个位输出(即:diff0、diff1,...),然后指定它们连接到芯片输入总线的哪个位(即:Add16(in[0]= diff0,in[1]=diff1,...)。此外,Add16 将两个数字相加,据我所知,这不是您想要计算的。
最后,在芯片 3 中,您所做的事情与芯片 2 中相同,但使用的是输出总线而不是内部总线,而且,看起来您正在尝试输出一个位位置而不是位数.