Uso de SRAM asíncrona en CPU homebrew

Estoy construyendo una CPU casera y ahora he llegado al punto de diseñar la parte SRAM. Planeo usar una RAM estática simple de 32K x 8 bits (como la CY62256N de Chipre). Mi preocupación es que la parte sea asíncrona, pero quiero que actúe como una parte síncrona.

En el resto de mi diseño, los registros se escriben en el flanco ascendente del reloj con el nuevo valor requerido ya en las líneas de datos. Durante el resto del período del reloj, se procesa la nueva instrucción y se puede colocar un nuevo valor en las líneas de datos. Esto está bien porque el registro solo se actualiza en el flanco ascendente y no más tarde, aunque el reloj todavía esté alto.

Supongo que este enfoque no funcionará con SRAM asíncrona. Me preocupa que el flanco ascendente del reloj actualice la SRAM, pero si el reloj aún está alto cuando el valor de las líneas de datos se actualiza para la siguiente instrucción, causará otra actualización que no se desea.

¿Hay alguna técnica común para lograr lo que necesito?

Respuestas (3)

En general, cualquier parte real tendrá lo que se puede considerar como contamination delayun propagation delaycambio en la dirección o entrada de control, hasta que los valores antiguos de las salidas dejen de ser válidos y comiencen a transitar hacia un nuevo valor, muy probablemente a través de varios intermedios inválidos.

Si puede asegurarse de que la conducción de las salidas de dirección y control del procesador ocurra en un momento estrechamente relacionado (o incluso después) del bloqueo de las entradas de la memoria, es probable que un retraso de contaminación finito garantice que reciba valores válidos.

Sin embargo, tenga en cuenta que una memoria síncrona típica impone un retraso de tubería de reloj adicional, mientras que una memoria asíncrona solo tendrá retrasos de propagación. Agregar un registro de tubería adicional en las líneas de dirección haría que una memoria asíncrona actuara más como una síncrona, al menos mientras tenga tiempo.

Sin faltar el respeto, pero eso no responde a mi pregunta en absoluto. Si mi reloj (y, por lo tanto, la línea de escritura) está alto durante 500 ns, pero la SRAM solo tarda 70 ns en realizar una escritura, entonces tengo un problema con cualquier cambio en las líneas de dirección/datos durante el período de tiempo (500 - 70) = 430 ns. ¿Cómo resolver eso?
¿Qué RAM está tratando de usar que escribe cuando la señal de escritura es alta ? Definitivamente ese no es el caso del CY62256N mencionado en su pregunta. El punto aquí es que las líneas de dirección y datos deben ser válidas durante el mismo tiempo que la línea de escritura, antes del tiempo de configuración y superando el tiempo de espera (que puede ser o no un número positivo). Por lo general, las realidades son tales que registrar todo exactamente al mismo tiempo funciona; pero si algunas señales tienen más retraso que otras, puede que no.
Sugerencia: intente observar la temporización del bus de los procesadores típicos y vea lo que hacen con las líneas /WR, de dirección y de datos.

SRAM es como un pestillo transparente. Cuando un ciclo de escritura está en progreso (CE y WR son bajos), los datos en el bus se almacenarán en la RAM en la dirección actual. Durante este tiempo, las líneas de dirección deben ser estables o, de lo contrario, se podrían escribir en varias ubicaciones de memoria. Al final del ciclo de escritura (cuando WR y/o CE alcanzan un nivel alto), la RAM continúa conservando los datos almacenados en ella.

Al igual que con un registro cronometrado, debe cumplir con la dirección de la RAM y los tiempos de configuración de datos. Sin embargo, la SRAM es mucho más lenta que un registro típico, por lo que su tiempo de acceso probablemente se extenderá hasta 'el resto del período del reloj'. Si su dirección y/o líneas de datos solo son válidas justo antes del flanco ascendente del reloj, entonces puede bloquearlas y comenzar el ciclo de escritura en el flanco ascendente, luego terminar el ciclo de escritura en algún momento posterior (por ejemplo, cuando el reloj baja) . Por supuesto, no podrá volver a acceder a la RAM hasta que finalice el ciclo de escritura actual.

Estoy tratando de resolver este problema simplemente bajando /wr cuando el reloj está bajo.

           _______         _______         __
clock    _/       \_______/       \_______/

/fetch   ___                 _______________ 
enables     \_______________/               \

/instr.  _________         __________________
latch             \_______/    

/execute     _______________
enables  ___/               \_______________/       

/execute _________________________         __
latches                           \_______/
(inc. /wr)

Hago esto usando el reloj como bit alto en un decodificador BCD y solo usando las salidas 0-7. Obtengo decodificación de destino de instrucción de 3 bits y períodos de bloqueo cortos de un IC.

Las señales de habilitación son retardadas por un contador y puertas lógicas.

¿Es esta una respuesta o es una nueva pregunta publicada incorrectamente como respuesta?
Es una respuesta, pero es tentativa ya que aún no la he construido.