Hdl 什么';我的DMUX4方式有什么问题?

Hdl 什么';我的DMUX4方式有什么问题?,hdl,mux,nand2tetris,Hdl,Mux,Nand2tetris,它似乎接近工作,只是在7号线出了点问题 /** * 4-way demultiplexor. * {a,b,c,d} = {in,0,0,0} if sel==00 * {0,in,0,0} if sel==01 * {0,0,in,0} if sel==10 * {0,0,0,in} if sel==11 */ CHIP DMux4Way { IN in, sel[2]; OUT a, b,

它似乎接近工作,只是在7号线出了点问题

/**
 * 4-way demultiplexor.
 * {a,b,c,d} = {in,0,0,0} if sel==00
 *             {0,in,0,0} if sel==01
 *             {0,0,in,0} if sel==10
 *             {0,0,0,in} if sel==11
 */


CHIP DMux4Way {
    IN in, sel[2];
    OUT a, b, c, d;

    PARTS:
    DMux(in = in, sel = sel[0], a = out1, b = out2);

    DMux(in = out1, sel = sel[1], a = a, b = b);
    DMux(in = out2, sel = sel[1], a = c, b = d);
}
我已经按照如下方式实现了我的DMux,我只是将其当作一棵树来使用:

/**
 * Dmultiplexor.
 * {a,b} = {in,0} if sel==0
 *         {0,in} if sel==1
 */


CHIP DMux {
    IN in, sel;
    OUT a, b;

    PARTS:
    Not(in = sel, out = notsel);
    And(a = in, b = notsel, out = a);
    And(a = in, b = sel, out = b);
}

你的想法是对的!但是您首先缩小了sel[0]的范围,而不是sel[1],它对应于左列

我知道我迟到了

编辑:根据下面的请求添加固定代码。谢谢你的反馈

CHIP DMux4Way {
    IN in, sel[2];
    OUT a, b, c, d;

    PARTS:
    DMux(in = in, sel = sel[1], a = out1, b = out2);

    DMux(in = out1, sel = sel[0], a = a, b = b);
    DMux(in = out2, sel = sel[0], a = c, b = d);
}

缩小真值表中左边列的范围(即sel[1];记着计数时从右边开始),实际上是将选项从中间的右边分割开来

另一种更接近OP试图做的事情的方法(以及他错过正确的部分):

将输出中的b和c交换到不同的行,如下所示:

CHIP DMux4Way {

IN in, sel[2];
OUT a, b, c, d;

PARTS:
// Put your code here:
DMux(in=in, sel=sel[0], a=dOut1, b=dOut2);

DMux(in=dOut1, sel=sel[1], a=a, b=c);

DMux(in=dOut2, sel=sel[1], a=b, b=d);
}


你可以从真值表中看出,考虑到你正在缩小sel[0]

的范围,这也是有道理的,你想用哪种HDL来写你的东西?它看起来既不像VHDL也不像Verilog…它似乎就是NAND2TTERIS课程中使用的代码:哇,我写的代码和你的完全一样。似乎我们都误解了sel[0]和sel[1]。在[0,1]中,sel[0]=1,sel[1]=0。如果没有其他人回答,那么迟到没什么错!您可能还需要考虑(部分)张贴纠正代码,以使其尽可能清晰。在这种特殊情况下,您不应该发布解决方案。我不确定你是否知道,但作者明确要求你不要这样做。@AdrianWragg:我完全同意你的看法,但即使有人回答了,晚回答也没什么错。任何增加q/a价值的事情都可以,不管是晚还是早。