我不明白为什么前一种实现有效,但后者不起作用。我可以理解它们背后的逻辑,在我看来它们本质上是相同的,只是前者使用 sel[0..1] 作为简写,而不是必须使用额外的 demux 门与 sel[0] 和选择[1]。
CHIP DMux8Way {
IN in, sel[3];
OUT a, b, c, d, e, f, g, h;
PARTS:
// Working code
// DMux(in=in, sel=sel[2], a=outA, b=outB);
// DMux4Way(in=outA, sel=sel[0..1], a=a, b=b, c=c, d=d);
// DMux4Way(in=outB, sel=sel[0..1], a=e, b=f, c=g, d=h);
// Non working code; produces error "Sel (1) and sel (2) have different bus widths"
DMux(in=in, sel=sel[2], a=outA, b=outB);
DMux(in=outA, sel=sel[1], a=outA1, b=null);
DMux(in=outB, sel=sel[1], a=null, b=outB1);
DMux4Way(in=outA1, sel=sel[0], a=a, b=b, c=c, d=d);
DMux4Way(in=outB1, sel=sel[0], a=e, b=f, c=g, d=h);
}
我不明白如何导致错误“Sel (1) 和 sel (2) 具有不同的总线宽度”。如果 sel === 001 那么 sel[1] 肯定会是 0,sel[2] 会是 1,在这种情况下,两个索引都是 1 位,因此宽度相同。我知道后一种实现效率低下,但我只想知道为什么会发生这种情况,以确保我完全理解它。 (我在第二个多路分配器门中将 null 分配给 b ,反之亦然,为第三个多路分配器门分配 null 的原因是为了防止错误“内部引脚只能由部件输出引脚馈送一次”,最初我有一个多路分配器门并且然后使用两个内部品脱来馈送 4 路多路分配器门)。如果 nand2tetris HDL 中索引的工作方式不是这种情况,那么我的 4 路复用器门如何工作?
CHIP Mux4Way16 {
IN a[16], b[16], c[16], d[16], sel[2];
OUT out[16];
PARTS:
Mux16(a=a, b=b, sel=sel[0], out=out1);
Mux16(a=c, b=d, sel=sel[0], out=out2);
Mux16(a=out1, b=out2, sel=sel[1], out=out);
}
我唯一能想到的(这对我来说没有任何意义,而且似乎 可笑)是在某个场景中,例如 sel 的值为 001,sel[2] 将是 001,sel[1] 将是 00,sel[0] 将是 0。
我已经在 nand2tetris 表单上提出了这个问题,目前正在等待回复,但可能需要一段时间才能得到回复,所以我认为在这里提问也是个好主意。
它们不一样。
DMux4Way 需要 2 位 sel 输入来选择 4 个输出中的哪一个为真。在您的非工作示例中,您仅提供 1 位 (sel[0]),因此会出现错误。
为了在不使用 DMux4Way 的情况下完成您想要的操作(即:仅使用 DMux),您需要 DMux 的 1-2-4 级联,第一个处理 sel[2],第二个处理 sel[1] 和最后一个四个处理 sel[0].
最后,如果由于某种原因你不需要特定的输出引脚,就不要定义它;不需要使用 null (哎呀,我什至不知道你可以,而且我已经用 NAND2Tetris 搞了近十年了!)