Obwohl ich diese Hausaufgaben getaggt habe, ist es eigentlich für einen Kurs, den ich alleine mache. Wie auch immer, der Kurs heißt "From Nand to Tetris" und ich hoffe, dass jemand hier den Kurs gesehen oder gemacht hat, damit ich Hilfe bekommen kann. Ich bin auf der Bühne, wo ich die ALU mit der mitgelieferten HDL-Sprache baue. Mein Problem ist, dass ich meinen Chip nicht richtig kompilieren kann. Ich bekomme Fehler, wenn ich versuche, die Ausgabeflags für die ALU zu setzen. Ich glaube, das Problem ist, dass ich keine intermediäre Variable subscriptieren kann, da, wenn ich gerade versuche, die Flags basierend auf einer Zufallsvariablen auf wahr oder falsch zu setzen (sagen wir ein Eingabeflag), bekomme ich die Fehler nicht. Ich kenne das Problem nicht mit den Chips, die ich versuche zu verwenden, da ich alle eingebauten Chips benutze.Wie setze ich Ausgabeflags für ALU in "Nand to Tetris" natürlich?
Hier ist meine ALU-Chip so weit:
/**
* 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);
}
So das Problem zeigt sich, wenn ich versuche, eine indizierte Version von 'out' zu senden, um den Or8Way Chip. Ich habe versucht, eine andere Variable als "out" zu verwenden, aber mit dem gleichen Problem. Dann habe ich gelesen, dass Sie Zwischenvariablen nicht tiefstellen können. Ich dachte, wenn ich die Zwischenvariable an irgendeinen anderen Chip senden würde und dieser Chip es einbetten würde, würde es das Problem lösen, aber es hat denselben Fehler. Leider kann ich mir einfach keine Möglichkeit vorstellen, die zr- und ng-Flags zu setzen, ohne eine Zwischenvariable zu subskribieren, also bin ich wirklich festgefahren!
Nur damit Sie wissen, wenn ich die problematischen Zeilen mit folgenden ersetzen, wird es kompilieren (aber nicht die richtigen Ergebnisse liefern, da ich einige zufällige Eingabe nur bin mit):
// zr flag
Not(in=zx, out=zr);
// ng flag
Not(in=zx, out=ng);
Wer noch keine Ideen?
Bearbeiten: Hier ist die appendix of the book for the course, die angibt, wie das hdl funktioniert. Sehen Sie sich speziell Abschnitt 5 an, der über Busse spricht und sagt: "Ein interner Pin (wie v oben) darf nicht indiziert sein".
Edit: Hier ist der genaue Fehler, den ich bekomme: "Line 68, kann den Ausgang Pin des Tors nicht mit dem Teil verbinden". Die Fehlermeldung ist jedoch etwas verwirrend, da dies nicht das eigentliche Problem zu sein scheint. Wenn ich einfach "Or8way (in = out [0..7], out = zr1)"; mit "Or8way (in = falsch, out = zr1)"; Es wird diesen Fehler nicht erzeugen, was dazu führte, dass ich im Anhang nachschaue und herausfand, dass die out-Variable, da sie als intermediate abgeleitet wurde, nicht subskribiert werden konnte.
Warum wurde diese Frage geschlossen? Es hat definitiv vielen Besuchern geholfen, wie die Upvotes und Antworten belegen. –
Wählen Sie erneut zu öffnen, weil die Frage über ein gemeinsames Problem bei der Lösung eines Problems in einem bekannten Online-Kurs ist. –