Actualmente soy estudiante de secundaria en la escuela secundaria, y me ha interesado la ingeniería informática / eléctrica, específicamente el diseño de microprocesadores. Leí el Código de Charles Petzold y comencé a leer el Wikibook de diseño de microprocesador (que parece estar incompleto). Al leer el Código , entiendo la lógica básica detrás de una CPU, y comencé 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 cómo bloquear los valores de RAM) he tenido que pensar y tratar de trabajar.
Puedo construir un acumulador que funcione (no se puede llamar 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 funcionen los códigos de operación 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 no sé 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 gama baja), y luego dos valores de dirección de 8 bits separados que luego combino para ser la entrada de dirección de 16 bits a la RAM. Para bloquear los valores, tengo un contador separado que cuenta hasta 10b y luego se restablece a 00b. Es la entrada del reloj para cada pestillo a su vez (para los tres pestillos, hay a, byc. Los segundos relojes tienen un be 1 mientras que b & c son 0, luego b es 1 y 1 & c son 0, luego c es uno y 1 yb son 0, luego se restablece). Pero en instrucciones como ADD 000Ah, la PC salta a 000AH ... que se supone que debe agregarse al acumulador, pero en realidad se engancha en el pestillo del código, y luego se interpreta como el próximo código de operación, lo que hace que todo funcione loco.
Siento que me falta una gran información sobre la decodificación de instrucciones y cómo necesito hacer señales de reloj ...
Aquí están los archivos .circ de LogiSim: https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/8BitAdder.circ https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/8BitAdderSubtractor.circ https: // dl.dropboxusercontent.com/u/61676438/PetzoldMk5/8BitInverter.circ https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/8BitLatch.circ https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/ ID.circ https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/PetzoldMk5.circ
PetzoldMk5 es la CPU principal y depende de 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