Как я устанавливаю выходные флаги для ALU в “NAND к Тетрису” курс?

Ванильное решение Пример демонстрации и кода

li - тег, а не id Таким образом, вы должны получить элементы по тегу, например,

var elements = document.getElementsByTagName()

Теперь вы не можете использовать elements напрямую, потому что это массив элементов. Таким образом, у вас есть итерация каждого элемента в массиве, например используя цикл for, как я сделал. Затем вы присваиваете текущий элемент переменной var в моем случае element и создаете оператор if, как вы делали это раньше.

17
задан zubergu 25 March 2016 в 14:10
поделиться

5 ответов

Решение как предложенный Мир состояло в том, чтобы использовать промежуточную переменную, как введено для другой микросхемы, такой как Or16Way. Вот код после того, как я решил проблему и отладил:

CHIP ALU {

IN  // 16-bit inputs:
    x[16], y[16],
    // Control bits:
    zx, // Zero the x input
    nx, // Negate the x input
    zy, // Zero the y input
    ny, // Negate the y input
    f,  // Function code: 1 for add, 0 for and
    no; // Negate the out output

OUT // 16-bit output
    out[16],

    // ALU output flags
    zr, // 1 if out=0, 0 otherwise
    ng; // 1 if out<0, 0 otherwise

PARTS:
// Zero the x input
Mux16( a=x, b=false, sel=zx, out=x2 );

// Zero the y input
Mux16( a=y, b=false, sel=zy, out=y2 );

// Negate the x input
Not16( in=x2, out=notx );
Mux16( a=x2, b=notx, sel=nx, out=x3 );

// Negate the y input
Not16( in=y2, out=noty );
Mux16( a=y2, b=noty, sel=ny, out=y3 );

// Perform f
Add16( a=x3, b=y3, out=addout );
And16( a=x3, b=y3, out=andout );
Mux16( a=andout, b=addout, sel=f, out=preout );

// Negate the output
Not16( in=preout, out=notpreout );
Mux16( a=preout, b=notpreout, sel=no, out=preout2 );

// zr flag
Or16Way( in=preout2, out=notzr );
Not( in=notzr, out=zr );

// ng flag
And16( a=preout2, b=true, out[15]=ng );

// Get final output
And16( a=preout2, b=preout2, out=out );
}
5
ответ дан 30 November 2019 в 12:20
поделиться

Имейте Вас попробованный:

// zr flag
Or8way(
    in[0]=out[ 0], in[1]=out[ 1], in[2]=out[ 2], in[3]=out[ 3],
    in[4]=out[ 4], in[5]=out[ 5], in[6]=out[ 6], in[7]=out[ 7],
    out=zr1);
Or8way(
    in[0]=out[ 8], in[1]=out[ 9], in[2]=out[10], in[3]=out[11],
    in[4]=out[12], in[5]=out[13], in[6]=out[14], in[7]=out[15],
    out=zr2);
Or( a=zr1, b=zr2, out=zr );

Я не знаю, будет ли это работать, но это, кажется, имеет смысл от рассмотрения этого документа здесь.

Я также думал бы дважды об использовании out как имя переменной, так как это путает попытку выяснить различие между этим и ключевым словом out (как в"out=...").

После Вашего редактирования, если Вы не можете преобразовать промежуточные значения в нижний индекс, затем кажется, что необходимо будет реализовать отдельную "микросхему" такой как IsZero16 который примет 16-разрядное значение, как введено (Ваше промежуточное звено out) и возвратите один бит, указывающий на его нулевое, в которое можно загрузиться zr. Или Вы могли сделать IsZero8 микросхема, но необходимо было бы затем назвать его им два этапа, как Вы в настоящее время делаете с Or8Way.

Это походит на допустимое решение, так как можно преобразовать входные значения в нижний индекс к микросхеме.

И, просто смотря на ошибку, это может быть другой проблемой к той, которую Вы предлагаете. Фраза "Не может соединиться, выходной контакт логического элемента для разделения" означал бы для меня, что Вы неспособны к сигналам соединения от выходного параметра назад в область обработки микросхем. Это имеет смысл с электрической точки зрения.

Можно найти, что необходимо сохранить вывод во временную переменную и использование это к обоим наборам zr и out (так как, после того как сигналы были "отправлены" в выходные контакты микросхем, они больше не могут быть доступными).

Можем мы пробовать:

CHIP SetFlags16 {
    IN  inpval[16];
    OUT zflag,nflag;
    PARTS:
        Or8way(in=inpval[0.. 7],out=zr0);
        Or8way(in=inpval[8..15],out=zr1);
        Or(a=zr0,b=zr1,out=zflag);
        Not(in=inpval[15],out=nflag);
}

и затем, в Вашей микросхеме ALU, используйте это в конце:

// Negate the output
Not16( in=preout, out=notpreout );
Mux16( a=preout, b=notpreout, sel=no, out=tempout );

// flags
SetFlags16(inpval=tempout,zflag=zr,nflag=ng);

// Transfer tempout to out (may be a better way).
Or16(a=tempout,b=tempout,out=out);
1
ответ дан 30 November 2019 в 12:20
поделиться

Для всех, кого интересует, решение, которое поддерживает эмулятор, заключается в использовании нескольких выходов. Что-то вроде:

Mux16( a=preout, b=notpreout, sel=no, out=out,out=preout2,out[15]=ng);
20
ответ дан 30 November 2019 в 12:20
поделиться

Вот один также с новым чипом, но это чувствует себя чище

/**
 * Negator16 - negates the input 16-bit value if the selection flag is lit
 */
CHIP Negator16 {
  IN sel,in[16];
  OUT out[16];

  PARTS:
  Not16(in=in, out=negateIn);
  Mux16(a=in, b=negateIn, sel=sel, out=out);
}

CHIP ALU {
  // IN and OUT go here...
  PARTS:
  //Zero x and y if needed
  Mux16(a=x, b[0..15]=false, sel=zx, out=x1);
  Mux16(a=y, b[0..15]=false, sel=zy, out=y1);

  //Create x1 and y1 negations if needed
  Negator16(in=x1, sel=nx, out=x2);
  Negator16(in=y1, sel=ny, out=y2);

  //Create x&y and x+y
  And16(a=x2, b=y2, out=andXY);
  Add16(a=x2, b=y2, out=addXY);

  //Choose between And/Add according to selection
  Mux16(a=andXY, b=addXY, sel=f, out=res);

  // negate if needed and also set negative flag
  Negator16(in=res, sel=no, out=res1, out=out, out[15]=ng);

  // set zero flag (or all bits and negate)
  Or16Way(in=res1, out=nzr);
  Not(in=nzr, out=zr);
}
1
ответ дан 30 November 2019 в 12:20
поделиться

Вот как я сделал ALU:

CHIP ALU {
IN  // 16-bit inputs:
    x[16], y[16],
    // Control bits:
    zx, // Zero the x input
    nx, // Negate the x input
    zy, // Zero the y input
    ny, // Negate the y input
    f,  // Function code: 1 for add, 0 for and
    no; // Negate the out output
OUT // 16-bit output
    out[16],
    // ALU output flags
    zr, // 1 if out=0, 0 otherwise
    ng; // 1 if out<0, 0 otherwise
PARTS:      
    Mux16(a=x, b=false, sel=zx, out=M16x);
    Not16(in=M16x, out=Nx);
    Mux16(a=M16x, b=Nx, sel=nx, out=M16M16x);

    Mux16(a=y, b=false, sel=zy, out=M16y);
    Not16(in=M16y, out=Ny);
    Mux16(a=M16y, b=Ny, sel=ny, out=M16M16y);

    And16(a=M16M16x, b=M16M16y, out=And16);
    Add16(a=M16M16x, b=M16M16y, out=Add16);
    Mux16(a=And16, b=Add16, sel=f, out=F16);

    Not16(in=F16, out=NF16);
    Mux16(a=F16, b=NF16, sel=no, out=out, out[15]=ng, out[0..7]=zout1, out[8..15]=zout2);

    Or8Way(in=zout1, out=zr1);
    Or8Way(in=zout2, out=zr2);
    Or(a=zr1, b=zr2, out=zr3);
    Not(in=zr3, out=zr);
}
5
ответ дан 30 November 2019 в 12:20
поделиться