Buenas Demócrito, te mando unas sugerencias por mi parte, no quiere decir que debas seguirlas, simplemente me apetecía mirar más a fondo tu micro porque creo que entre todos podemos aprender mucho, como te digo son sólo comentarios, coge lo que te guste o te pueda resultar interesante . Te adjunto una modificación del circuito versión A, el versión B no me funciona, se queda un led parpadeando y como ando con el tiempo pillado no quería retrasar escribirte esto por buscar el bug o avisarte y esperar.
Lo que te cuento se puede aplicar a la versión b si te gustara , así que nada aquí te voy contando:
1) Por empezar de lo más sencillo a lo complejo, comentarte sobre el sistema de reset, para mi punto de vista es algo que debería ir fuera del micro, el micro debería simplemente de gestionar que si recibe un pulso por el reset, reinicializarse.
Cuando implantemos el micro con más periféricos, en general lo lógico es que haya un sistema de inicio y reset para todo el conjunto, si cada cosa tiene su propio sistema y sus tiempos, al final sincronizar todo realmente será duro (cuando haya más cosas que unas dependan de otras ....). Así que te he creado un pequeño sistema de reset externo, como te digo ni será lo más óptimo, pero en principio va muy bien.
El sistema de reset inicializa a los 10ms (puedes configurar esto con el parámetro correspondiente) y si se recibe un pulso desde el pulsador 1 de la Alhambra II.
El circuito verás que es algo así:
2) Te recomendaría que te plantearas de inicio los nemotécnicos de las instrucciones te ayudará a definir bien el lenguaje y no crear instrucciones que puedan estar duplicadas , además te ayudará a que el código sea más sencillo de leer. cuando se complique estar recordando si el 0x16 es el JMP o el ADD será motivo de confusiones, yo al menos me gusta leer un código que vaya entendiendo, si pones números te obligarás si quieres mantenerlo bien a meter muchos comentarios, lo que al final redunda y pierde atención si por ejemplo hay variables que su nombre ya te ayuden a entender, además de que si usas esas variables, si cambiaras el código binario , ampliaras bits, etc casi todo el código sería inmutable, menos donde lo inicialices.
Para esto te he creado un grupo de cables que funcionan a modo de flags,según las condiciones se ponen a 1 o a 0 para decir si estás en esa instrucción, el código lo verás así:
como ves es tu mismo código de los ifs pero secuenciado al inicio, de esta forma si por ejemplo cambiaras el código de alguna instrucción o ampliaras bits, etc, sólo tendrías que cambiarlo aquí, en el resto de lugares como verás usaras el isXXX para saber si estás en esa instrucción.
Por otro lado algo tonto, pero te he quitado la inicialización de los registros al inicio, esto a veces hace que en la síntesis se consuman recursos para ello, yo prefiero definir bien el reset y el start y que en esa fase se inicialice todo como se debe. En este caso como es muy sencillo, los primeros 10ms puede estar todo "loco", habría que mejorar la etapa de reset del estilo a que en vez de un pulso, sea un estado (1 activo ,0 en reset, o al revés) y que el circuito de inicio se encargue de al arrancar tener el reset en modo activo hasta que llegue el primer pulso, esto si quieres le doy una vuelta estos días para dejar uns istema de reset limpio, ando con poco tiempo.y por eso lo he simplificado en lo que te mando.
También te he simplificado la sintaxis símplemente , no afecta a rendimientos ni nada pero creo que queda más claro, no hace falta en este caso declarar el wire y luego hacer los assigns, a mi al menos me parece más sencillo de seguir que en este caso en un vistazo ves ya todo:

Con esto en la parte de asignaciones continuas, el loop se simplifica muchísimo, si te fijas, dejo que se hagan operaciones en paralelo que aparentemente es absurdo, es decir en vez de hacer un if para separar por cada instrucción, agrupo como has hecho tu y ejecuto todos a la vez, esto lo hago porque como verás, la lógica de ifs es muy costosa en la fpga. Esto es un quiebro mental que hay que hacer, aunque la sintaxis se parezca a la programación secuencial a la que estamos acostumbrados, en la fpga todo se convierte en espacio y tiempo, los recursos van a. ocupar su lugar, no es como en programación secuencial que todo está en memoria y vamos iterando en ese proceso, aquí hay unos elementos físicos que se reconfiguran y van a estar ahí, el if no va a dejar que ocupes unas áreas de la fpga.
Al revés, los ifs generarán interconexiones que pueden ser innecesarias y hacer que se ocupen. más recursos y que el circuito pueda tener más limitaciones de velocidad.
Así que de este modo el loop se simplifica mucho, se agrupan las instrucciones por tipología y como ves se lee super bien (dejarás de enredarte con ifs).
Como verás para este tipo de situaciones me gusta utilizar la nomenclatura del ? y de los : porque como te he comentado arriba par ami es muy importante que el código se lea rápido, de este modo no tengo que andar mirando a qué if corresponde el end o leerme un comentario para entender qué pasa, dices mira el pc cambia de dos modos , vale data si estás en estas 7 instrucciones y si no lo incrementas y así....
Esto se puede ir desenrollando si hace falta o convirtiéndose en ifs y como te comento, al menos mi experiencia es que si las cosas no interfieren hay que verlo en paralelo y no secuencial y ahorrarnos unos cuantas "rupturas" del flujo que al fin y al cabo es lo que hace el "if".
Luego otro consejo en los ifs, aunque sean de una línea pon begin y end, oí una frase que se me quedó grabada hace mucho tiempo sobre programación en C que dice que "los ifs sin paréntesis los carga el diablo", cometer un error a largo plazo porque metas una instrucción que pensabas que estaba en el bloque del if y que ha quedado fuera pueden ser horas de debug locas por un error absurdo.
Los resultados de esta refactorización, mira, por un lado aquí está el tuyo original:
Luego tenemos el tuyo , con el reset sólo con el botón para poder compararlo sin circuitería adicional:
Y luego tenemos el último limpiando inicialización de variables y metiendo el circuito de reset:
Como ves es muy interesante, con el cambio de código hemos ahorrado entorno a 49LC . manteniendo la velocidad y aunque parezca poco piensa que según vaya creciendo el micro estas diferencias de cómo se implementan las cosas supondrá un gran ahorro de recursos físicos.
Por otro lado fíjate en el tercero al quitar el reset interno del micro, lo que hemos conseguido, aunque aumentan los lc , lógicamente por haber más circuitería, es que hemos ganado prácticamente 10MHz
Por otro lado comentarte que la versión b, por alguna razón a mi no me funciona, se queda parpadeando la luz en el bit 7, no me he parado a ver el bug que pueda tener, más que nada avisarte aunque seguro que ya lo tienes rodado.
Espero que esto te pueda ser de utilidad te iré siguiendo en tu evolución y en lo que pueda iré colaborando y aprendiendo de vosotros.
Un gran abrazo!