0

i am trying to implement Hack ALU without using muxes but i cant upload the hdl into the simulator. Any help would be appreciated. Thanks

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);
Ishita Sinha
  • 2,168
  • 4
  • 25
  • 38

1 Answers1

0

Inputs like b[0..15]=notzx are not valid in HDL because the two sides of the assignment do not have the same width. The only values that have variable width are true and false.

You might try something like:

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

MadOverlord
  • 1,034
  • 6
  • 11
  • Here is the revised version that still wouldn't load. – Vik Bhullar Sep 12 '16 at 13:52
  • @VikBhullar: You do not appear to have added a revised version, so there is no way I can give you any additional feedback. It is certainly possible to combine inputs as long as the two sides of the assignment have identical bit-widths. For example, here's a line that I grabbed from one of my projects: Mux16(a=ALUout,b[15]=false,b[0..14]=instruction[0..14],sel=aInstr,out=AREGin); – MadOverlord Sep 12 '16 at 15:03