0

我正在尝试在不使用多路复用器的情况下实现 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);
4

1 回答 1

0

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

您可以尝试以下方法:

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

于 2016-09-12T12:35:17.130 回答