提问人:user243557 提问时间:8/31/2023 更新时间:8/31/2023 访问量:136
Nand2Tetris:如何在 ALU 中编码 16 位常量
Nand2Tetris: How to code 16-bit constant in ALU
问:
我正在 Nand2Tetris 课程的项目 2 中执行 ALU 任务。
// and operates on the resulting values, as follows:
// if (zx == 1) set x = 0 // 16-bit constant
// if (nx == 1) set x = !x // bitwise not
// if (zy == 1) set y = 0 // 16-bit constant
// if (ny == 1) set y = !y // bitwise not
// if (f == 1) set out = x + y // integer 2's complement addition
// if (f == 0) set out = x & y // bitwise and
// if (no == 1) set out = !out // bitwise not
// if (out == 0) set zr = 1
// if (out < 0) set ng = 1
CHIP ALU {
IN
x[16], y[16], // 16-bit inputs
zx, // zero the x input?
nx, // negate the x input?
zy, // zero the y input?
ny, // negate the y input?
f, // compute out = x + y (if 1) or x & y (if 0)
no; // negate the out output?
OUT
out[16], // 16-bit output
zr, // 1 if (out == 0), 0 otherwise
ng; // 1 if (out < 0), 0 otherwise
我正在尝试做第一个 - 如果 zx == 1,那么 x = 0。
Or (a=zx, b=x[0..15], out=zerox[0..15]);
Not (in=zeroY[0..15], out=out[0..15]);
逻辑是,如果 zx 为 1,那么 Or 将产生 1,通过否定它,我会得到 0,这是我应该做的。 问题是 zx 是 a1 位输入,但 x[0..15] 和输出是 16 位值。我已经思考了好几天的问题,但仍然无法弄清楚如何克服它。我什至不确定 Or 在这里是否正确或有效,也许像 Mux 这样的东西会更好。但在这种情况下,我也不知道如何避免混合 1 位和 16 位输入?
任何帮助/提示都是值得赞赏的。
答:
1赞
MadOverlord
8/31/2023
#1
有 HDL 常量 “true” 和 “false”,您可以将它们用作逻辑单元的输入,并且会自动调整大小,因此如果输入要求是 16 位总线,您将获得 16 位适当的值。有关详细信息,请参阅本书的附录 2.2。
本附录解释的另一件事是,组件的输出可以被切片和切块,并同时以多种方式输出。以 Mux16 组件为例:
多路复用器16(a=x,b=y,sel=choose,out=result);
您不必只满足于单个 16 位输出总线(在这种情况下是结果)。您可以执行以下操作:
Mux16(a=x,b=y,sel=choose,out=result16,out[0]=lobit,out[4..7]=secondnybble);
您可以对输入执行类似的操作,例如,提取较宽的总线的子集,并将较小的总线焊接在一起,形成较宽的输入。
最后,输入或输出总线中未指定的位设置为零(只要其他一些位被设置为某个位)。
享受课程!这很有趣。
评论
0赞
user243557
9/1/2023
谢谢!您能告诉我它到底是哪个附录吗?我看一下 B 2.2 - 它被称为 B.2.2 数据类型和变量。我找不到你上面写的内容。
0赞
user243557
9/2/2023
好的,我通过了 Inc16。事实证明,正确答案只有 1 行:And16 (a=in, b[0]=true, out=out);我的问题是系统如何知道 b 中的其他值是假的?它是 hdl 中的默认布尔值吗?我通过了,但我很困惑。
0赞
MadOverlord
9/3/2023
附录2,A.2.2;这是我这本书的第286-287页。我不确定你所说的“传递 Inc16”是什么意思,你的 And16 组件只会设置输入的低位——如果低位已经是 1,则不会增加,因为它不处理进位。是的,“未连接”位默认为假 (0),尽管这是不好的做法。
评论