sel[1] 和 sel[2] 在尝试使用 nand2tetris HDL 构建和 8 路解复用器时存在不同的总线宽度错误

问题描述 投票:0回答:1

我不明白为什么前一种实现有效,但后者不起作用。我可以理解它们背后的逻辑,在我看来它们本质上是相同的,只是前者使用 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 表单上提出了这个问题,目前正在等待回复,但可能需要一段时间才能得到回复,所以我认为在这里提问也是个好主意。

hdl nand2tetris
1个回答
0
投票

它们不一样。

DMux4Way 需要 2 位 sel 输入来选择 4 个输出中的哪一个为真。在您的非工作示例中,您仅提供 1 位 (sel[0]),因此会出现错误。

为了在不使用 DMux4Way 的情况下完成您想要的操作(即:仅使用 DMux),您需要 DMux 的 1-2-4 级联,第一个处理 sel[2],第二个处理 sel[1] 和最后一个四个处理 sel[0].

最后,如果由于某种原因你不需要特定的输出引脚,就不要定义它;不需要使用 null (哎呀,我什至不知道你可以,而且我已经用 NAND2Tetris 搞了近十年了!)

© www.soinside.com 2019 - 2024. All rights reserved.