Aunque etiqueté esta tarea, en realidad es para un curso que estoy haciendo de manera gratuita. De todos modos, el curso se llama "De Nand a Tetris" y espero que alguien haya visto o tomado el curso para que pueda obtener ayuda. Estoy en la etapa en la que estoy construyendo la ALU con el lenguaje hdl suministrado. Mi problema es que no puedo hacer que mi chip compile correctamente. Recibo errores cuando intento establecer los indicadores de salida para la ALU. Creo que el problema es que no puedo subscribir ninguna variable intermedia, ya que cuando intento configurar los indicadores en verdadero o falso en función de alguna variable aleatoria (por ejemplo, un indicador de entrada), no obtengo los errores. Sé que el problema no está en los chips que trato de usar, ya que estoy usando todos los chips integrados.¿Cómo configuro los indicadores de salida para ALU en el curso "Nand to Tetris"?
Aquí es mi ALU chips hasta el momento:
/**
* 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);
}
Así que el problema aparece cuando estoy tratando de enviar una versión con subíndice de 'fuera' al chip Or8Way. Intenté usar una variable diferente a 'out', pero con el mismo problema. Luego leo que no puedes subindicar variables intermedias. Pensé que tal vez si enviaba la variable intermedia a algún otro chip, y ese chip lo subscribe, resolvería el problema, pero tiene el mismo error. Lamentablemente, no puedo pensar en una forma de establecer los indicadores zr y ng sin subscribir alguna variable intermedia, ¡así que estoy realmente atascado!
Para que lo sepas, si reemplazo de las líneas problemáticas con lo siguiente, se compilará (pero no dar los resultados correctos, ya sólo estoy usando alguna entrada al azar):
// zr flag
Not(in=zx, out=zr);
// ng flag
Not(in=zx, out=ng);
Alguien tiene alguna ideas?
Editar: Aquí está el appendix of the book for the course que especifica cómo funciona el hdl. Mire específicamente la sección 5 que habla sobre los buses y dice: "Un pin interno (como v arriba) no puede ser subíndice".
Edit: Aquí está el error exacto que obtengo: "Línea 68, No se puede conectar el pin de salida de la puerta a la parte". El mensaje de error es un poco confuso, ya que no parece ser el problema real. Si simplemente reemplazo "Or8way (in = out [0..7], out = zr1);" con "Or8way (in = falso, out = zr1);" no generará este error, que es lo que me llevó a buscar en el apéndice y encontrar que la variable de salida, ya que se derivó como intermedio, no se pudo suscribir.
¿Por qué se cerró esta pregunta? Definitivamente ha ayudado a muchos visitantes como lo demuestran las votaciones y las respuestas. –
Votación para volver a abrir, porque la pregunta es sobre un problema común al resolver un problema en un curso en línea bien conocido. –