Atualmente, sou estudante do ensino médio e tenho interesse em engenharia elétrica / de computadores, especificamente no design de microprocessadores. Li o Code de Charles Petzold , e comecei a ler o Wikibook de design de microprocessador (que parece incompleto.) Ao ler Code , entendo a lógica básica por trás de uma CPU e comecei a criar uma no LogiSim. O capítulo 17 do código detalha a CPU que eu quero construir, mas os circuitos não possuem os principais componentes - sinais de clock e decodificação de instruções. Alguns dos sinais do relógio parecem bastante óbvios (o PC parece precisar de um sinal constante do relógio), mas outros (como travar os valores da RAM), tive que pensar e tentar trabalhar.
Eu posso construir um acumulador de trabalho (acho que não pode ser chamado com precisão de ALU, porque falta a parte L) que alterna entre adição e subtração com uma única entrada e entendo que isso é tudo o que preciso para a parte aritmética - uma vez que os opcodes de salto funcionem, posso implementar a multiplicação e a divisão no código. A parte com a qual estou lutando é a decodificação de instruções. Através de algumas pesquisas no Google, vejo que cada código de operação precisa ser interpretado como várias microinstruções, mas estou perdido quanto à forma como preciso que isso funcione. Atualmente, meu decodificador de instruções é apenas um circuito de análise combinacional com uma única saída binária para cada código de operação - 13 ao todo.
A maneira como o código funciona é que ele possui um valor de código de 8 bits (eu só uso o byte low-end) e, em seguida, dois valores separados de endereço de 8 bits que eu então combino para ser o endereço de 16 bits inserido na RAM. Para travar os valores, tenho um contador separado que conta até 10b e redefine para 00b. É a entrada do relógio para cada trava por sua vez (para as três travas, há a, bec, os segundos relógios têm a 1, enquanto b & c são 0, então b é 1 e 1 & c são 0, então c é um e 1 e b são 0, depois é redefinido). Mas, em instruções como ADD 000Ah, o PC salta para 000AH ... que deveria ser adicionado ao acumulador, mas na verdade é travado na trava de código e, em seguida, interpretado como o próximo código de operação, o que faz com que tudo aconteça louco.
Sinto que estou perdendo algumas informações importantes sobre decodificação de instruções e como preciso fazer sinais de relógio ...
Aqui estão os arquivos .circ do 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/8BitInverter.circ ID.circ https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/PetzoldMk5.circ
PetzoldMk5 é a CPU principal, contando com os outros arquivos a serem importados como bibliotecas.
Aqui está uma lista de códigos de operação (todos binários):
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