Actualmente estoy en la escuela secundaria, y me ha interesado la ingeniería informática / eléctrica, específicamente el diseño de microprocesadores. He leído Code by Charles Petzold , y he comenzado a leer el < a href="https://en.wikibooks.org/wiki/Microprocessor_Design"> Wikilibro de diseño de microprocesadores (que parece estar incompleto). Al leer Code , entiendo la lógica básica detrás de una CPU, y han comenzado a construir uno en LogiSim. El Capítulo 17 en Código detalla la CPU que quiero construir, pero los circuitos carecen de componentes clave: señales de reloj y decodificación de instrucciones. Algunas de las señales de reloj parecen ser bastante obvias (la PC parece necesitar una señal de reloj constante) pero otras (como la forma de bloquear los valores de RAM) he tenido que pensar y tratar de trabajar.
Puedo construir un acumulador que funcione (no puede llamarse con precisión una ALU, creo, porque carece de la parte L) que cambia entre suma y resta con una sola entrada, y entiendo que esto es todo lo que necesito para la parte aritmética: una vez que hago funcionar los códigos de salto, puedo implementar la multiplicación y la división en el código. La parte con la que estoy luchando es la decodificación de instrucciones. A través de algunas búsquedas en Google, veo que cada código de operación debe interpretarse como múltiples microinstrucciones, pero estoy perdido en cuanto a cómo necesito que esto funcione. Actualmente, mi decodificador de instrucciones es solo un circuito de análisis combinacional con una única salida binaria para cada código de operación: 13 en total.
La forma en que funciona el código es que tiene un valor de código de 8 bits (solo uso el byte de bajo nivel), y luego dos valores de dirección de 8 bits separados que luego combino para ser la entrada de la dirección de 16 bits en la RAM. Para bloquear los valores, tengo un contador separado que cuenta hasta 10b y luego se restablece en 00b. Es la entrada de reloj para cada pestillo en turno (para los tres pestillos, hay a, b, y c. Los segundos relojes tienen un valor de 1 mientras que b & c es 0, luego b es 1 y 1 & c es 0 , entonces c es uno y 1 & b son 0, luego se restablece). Pero en instrucciones como ADD 000Ah, la PC salta a 000AH ... que se supone que se agrega al acumulador, pero en realidad se engancha al código, y luego se interpreta como el siguiente código de operación, que hace que todo funcione. loco.
Siento que me falta información importante sobre la decodificación de instrucciones y cómo necesito hacer señales de reloj ...
Aquí están los archivos .circ de LogiSim: enlace enlace enlace enlace enlace enlace
PetzoldMk5 es la CPU principal, confiando en los otros archivos que se importarán como bibliotecas.
Aquí hay una lista de códigos de operación (todos binarios):
Load 0001
Add 0010
Add w/ Carry 0011
Sub 0100
Sub w/ Borrow 0101
Jump 0110
Jump w/ Carry 0111
Jump W/ 0 1000
Jump w/o C 1001
Jump W/o 0 1010
Store 1011
Halt 1100
Reset 1101