2016-09-12 4 views
0

Я пытаюсь реализовать Hack ALU без использования мультиплексоров, но я не могу загрузить hdl в симулятор. Любая помощь будет оценена по достоинству. БлагодарностиРеализация Nand2tetris ALU без использования Muxes

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); 

ответ

0

входы, как б [0..15] = notzx не действительны в HDL, так как обе стороны задания не имеют одинаковую ширину. Единственными значениями, которые имеют переменную ширину, являются true и false.

Вы могли бы попробовать что-то вроде:

And16 (а = х, Ь [0] = notzx, б [1] = notzx, ..., б [15] = notzx, из = Zerox);

+0

Вот исправленная версия, которая до сих пор не загружалась. –

+0

@VikBhullar: Вы, кажется, не добавили исправленную версию, так что я не могу дать вам дополнительную информацию. Конечно, можно комбинировать входы, если обе стороны назначения имеют одинаковые ширины бит. Например, вот строка, которую я схватил из одного из моих проектов: Mux16 (a = ALUout, b [15] = false, b [0..14] = инструкция [0..14], sel = aInstr, из = AREGin); – MadOverlord

Смежные вопросы