Nand2tetris ALU实现不使用Muxes

时间:2016-09-12 12:18:56

标签: alu nand2tetris

我试图在不使用多路复用器的情况下实现Hack ALU,但我无法将hdl上传到模拟器中。任何帮助,将不胜感激。感谢

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

    PARTS:
    // Put you code here:

  //To zero x or not

  Not(in=zx, out=notzx);
  And16(a=x, b[0..15]=notzx, out=zerox);

  //To zero y or not
  Not(in=zy, out=notzy);
  And16(a=y, b[0..15]=notzy, out=zeroy);

  //Negate x or not 

  Xor16(a=zerox, b[0..15]=nx, out=negatex);


  //Negate y or not
  Xor16(a=zeroy, b[0..15]=ny, out=negatey);

  Not(in=f, out=fnot);

  //"and" or "add" x?

  And16(a=negatex, b[0..15]=f, out=addx);
  And16(a=negatex, b[0..15]=fnot, out=andx);

  //"and" or "add" y

  And16(a=negatey, b[0..15]=f, out=addy);
  And16(a=negatey, b[0..15]=fnot, out=andy);

  //adding x and y

  Add16(a=addx, b=addy, out=sum);

  //anding x and y
  And16(a=andx, b=andy, out=outxandy);

  //output of adding or anding

  Or16(a=sum, b=outxandy, out=out1);

  //Negating using "Xor"

  Xor16(a=out1, b[0..15]=no, out=out2);
  Not(in=out2[15], out=ng);
  Or8Way(in=out2[0..7], out=zr1);
  Or8Way(in=out2[8..15], out=zr2);
  Or(a=zr1, b=zr2, out=zr);  
  And16(a=out2, b=out2, out=out);

1 个答案:

答案 0 :(得分:0)

b [0..15] = notzx等输入在HDL中无效,因为赋值的两边宽度不同。唯一具有可变宽度的值是true和false。

您可以尝试以下方式:

And16(a = x,b [0] = notzx,b [1] = notzx,...,b [15] = notzx,out = zerox);