Хотя я отметил эту домашнюю работу, это на самом деле для курса, который я делаю самостоятельно бесплатно. Во всяком случае, курс называется «От Нанда до Тетриса», и я надеюсь, что кто-то здесь увидит или отправит курс, чтобы я мог помочь. Я нахожусь на стадии, когда я строю ALU с предоставленным языком hdl. Моя проблема в том, что я не могу заставить свой чип правильно компилироваться. Я получаю ошибки, когда пытаюсь установить выходные флаги для ALU. Я считаю, что проблема в том, что я не могу индексировать какую-либо промежуточную переменную, поскольку, когда я просто пытаюсь установить флаги в true или false на основе некоторой случайной переменной (например, флаг ввода), я не получаю ошибок. Я знаю, что проблема связана не с чипами, которые я пытаюсь использовать, так как я использую все встроенные чипы.Как установить выходные флаги для ALU в курсе «Nand to Tetris»?
Вот мой ALU чип до сих пор:
/**
* The ALU. Computes a pre-defined set of functions out = f(x,y)
* where x and y are two 16-bit inputs. The function f is selected
* by a set of 6 control bits denoted zx, nx, zy, ny, f, no.
* The ALU operation can be described using the following pseudocode:
* if zx=1 set x = 0 // 16-bit zero constant
* if nx=1 set x = !x // Bit-wise negation
* if zy=1 set y = 0 // 16-bit zero constant
* if ny=1 set y = !y // Bit-wise negation
* if f=1 set out = x + y // Integer 2's complement addition
* else set out = x & y // Bit-wise And
* if no=1 set out = !out // Bit-wise negation
*
* In addition to computing out, the ALU computes two 1-bit outputs:
* if out=0 set zr = 1 else zr = 0 // 16-bit equality comparison
* if out<0 set ng = 1 else ng = 0 // 2's complement comparison
*/
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=x, out=notx);
Mux16(a=x, b=notx, sel=nx, out=x3);
// Negate the y input
Not16(in=y, out=noty);
Mux16(a=y, 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=out);
// zr flag
Or8way(in=out[0..7], out=zr1); // PROBLEM SHOWS UP HERE
Or8way(in=out[8..15], out=zr2);
Or(a=zr1, b=zr2, out=zr);
// ng flag
Not(in=out[15], out=ng);
}
Таким образом, проблема появляется, когда я пытаюсь отправить индексируются версию «из» на чип Or8Way. Я пробовал использовать другую переменную, чем «out», но с той же проблемой. Затем я прочитал, что вы не можете индексировать промежуточные переменные. Я подумал, может быть, если бы я отправил промежуточную переменную на какой-то другой чип, и этот чип подстроил его, это решило бы проблему, но у нее такая же ошибка. К сожалению, я просто не могу придумать способ установить zr и ng флаги без подписи некоторой промежуточной переменной, поэтому я действительно застрял!
Только так вы знаете, если я заменю проблемные строки со следующим, он будет компилировать (но не дают правильные результаты, так как я только с помощью какой-то случайный вход):
// zr flag
Not(in=zx, out=zr);
// ng flag
Not(in=zx, out=ng);
Кто-нибудь есть идеи?
Редактировать: Вот appendix of the book for the course, который определяет, как работает hdl. В частности, посмотрите раздел 5, который рассказывает о автобусах и говорит: «Внутренний вывод (например, v выше) не может быть индексирован».
Редактировать: Вот точная ошибка, которую я получаю: «Строка 68, Невозможно подключить выходной вывод штыря к разъему». Сообщение об ошибке несколько путается, поскольку это, похоже, не является реальной проблемой. Если я просто заменил «Or8way (in = out [0..7], out = zr1); с «Or8way (in = false, out = zr1)»; он не будет генерировать эту ошибку, что и привело меня к поиску в приложении и обнаружил, что переменная out, так как она была получена как промежуточная, не может быть расширена.
Почему этот вопрос закрыт? Это определенно помогло многим посетителям, о чем свидетельствуют ответы и ответы. –
Голосование за повторное открытие, потому что вопрос касается общей проблемы при решении проблемы в известном онлайн-курсе. –