Open matias-m6reno opened 3 weeks ago
Hola @matias-m6reno.
Si configuras la entrada load
en 0, tu registro SP nunca actualizará su valor a 1111111111111111
, por lo que su valor inicial será 0 y nunca usarás el valor de SP en la dirección inicial. Para corroborar que ese es el problema, ejecuta el siguiente fragmento de código:
MOV A,3
PUSH A
MOV B,(0)
Si se da que B = 3
, entonces efectivamente tu SP parte en 0 y estás escribiendo en la dirección 0 de memoria, lo que es incorrecto.
Un arreglo rápido es cambiar la forma en la que instancias SP a lo siguiente:
inst_RegSP : RegSP port map (
clock => clock,
clear => '0',
load => clear,
up => incSP,
down => decSP,
datain => "111111111111",
dataout => regSP_dataout
);
La señal clear
solo se activa al principio para limpiar los registros. Por ende, al instanciarlo de esta forma evitas que se limpie y haces que se guarde el valor correcto al principio de la ejecución del programa. Avísame si esto funciona.
PD: No compartas más código ni combinación de señales, por favor. Si necesitas entregar más información, hazlo en las issues del repositorio de tu grupo.
Saludos.
Hola, intente el primer test que nos proporcionas. El resultado del B fue 2, no 3. Sinceramente no se que pueda significar esto.
Estoy sintetizando los cambios en el código (disculpas por adjuntarlo, no volverá a pasar) de todos modos. Cambiando la arquitectura termina dando lo mismo (0302). No se que significa esto, voy a probar mostrar en el display el stack como recomendo un compañero. Gracias de antemano y saludos
Edit: Mostrando en el display 0000 junto con los 12 bits del RegSP y corriendo el codigo que me proporcionaste, veo 0FFF y luego 0FFE asi que creo que está usando el final
@matias-m6reno en este caso, sugiero cambiar MOV A,3
por otro valor, por ejemplo MOV A,7
. Esto te ayudará a ver si consistentemente guardas un valor una unidad menor o no.
Ok, probé cambiar a MOV A,7. el resultado fue 0702, es decir que se guarda en (0) un 2 por alguna razon. Probé reinciar la Basys y hacer la instrucción sin el PUSH: MOV B,(0) sto con la Basys limpia me dio 0000. Volví luego a hacer el MOV A,7 PUSH A MOV B,(0) lo que me volvio a retornar 0702, creo que esto significa que PUSH A guarda por alguna razon un 2 en la direccion 0, ahora, no se porque un 2 ni tampoco por que lo hace en la direccion 0. Mostrando en el display 0000 junto con los 12 bits del RegSP y corriendo PUSH A, veo 0FFF y luego 0FFE asi que creo que deberia estare usando el final.
Espero puedas ayudarme, de todas formas muchas gracias
Revisaré tu repositorio y te contactaré en él, ya que parece ser un error de implementación de tu grupo.
Saludos.
Hola, ¿como están?, somos el grupo 62
Llevamos varias horas intentando reparar el proyecto y no logramos encontrar el problema. El problema pasa en el stack, resulta que PUSH A no guarda el valor de A o el SP da cualquier valor. Hemos probado cambiando muchas cosas, pero siempre luego de un PUSH A al leer la memoria en la dirección SP, vemos un 0 o no el valor que debería ser.
Probamos cambiar el load a 0 (antes era un 1 lógico) y cambiar datain de "0000 0000 0000" a "1111 1111 1111". Tambien creamos el RegSP como design source para que tenga 12 bits. Intentamos buscar en distintas direcciones el valor de A después de PUSH A, pero no se guardaba en ningun lugar que sepamos. Verificamos varias veces el opcode, el cual esta así: 00100000001000100 que corresponde a la concatenación de las señales del excel.
Describimos el registro de esta forma:
inst_RegSP : RegSP port map ( clock => clock, clear => clear, load => '0', up => incSP, down => decSP, datain => "111111111111", dataout => regSP_dataout );
Notamos también, en las siguientes instrucciones... // PUSH A C0: MOV A,5 // A=5 PUSH A // SP (FFF) = 5 MOV A,0 // A=0 NOT B,A // B=FFFF MOV A,(B) // A = mem[FFF] = SP = 5 CMP A,5 // A==5? JEQ C1 JMP mal
Cuando se ejecuta NOT B,A debería ser FFFF, pero en realidad es 1000, esto lo demostramos restándole un 4095 lógico a B que nos dio un 1 lógico en B.
Gracias de antemano