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?
En general, cualquier parte real tendrá lo que se puede considerar como contamination delay
un propagation delay
cambio 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.
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.
phil wright
chris stratton
chris stratton