Processador TTA. Parte 1

Prefácio


A idéia de criar meu próprio processador simples, se é que posso chamar assim, eu liguei por um longo tempo. A escolha da arquitetura é uma questão ambígua, mas, em parte minimalista, eu queria implementar algo simples, ao mesmo tempo poderoso e expansível, o TTA era perfeito para isso.
Parte 1.
Parte 2.
Em resumo, a idéia é que a unidade de controle possua apenas um comando de movimentação de dados e os cálculos sejam um subproduto desses movimentos.

Vou trazê-lo à vida em um programa simples para compilar e simular circuitos lógicos e elétricos - o Logisim , escolheu por sua simplicidade e acessibilidade; no caso de uma implementação bem-sucedida, planeja reescrever para o Verilog .

Ao ler, é melhor tocar o projeto imediatamente, ele pode ser encontrado no final do artigo.

Bloco de controle


A unidade de controle é o componente principal. Por uma questão de simplicidade, optou-se por escolher 16 entradas e 16 saídas, como resultado, o comando recebido na unidade de controle é de 8 bits, a primeira metade apontando para uma das entradas e a outra para uma das saídas. Para que o bloco receptor entenda que os dados chegaram a ele, 1 bit é adicionado a cada entrada do bloco, é habitual chamar esses blocos de blocos funcionais.

Assim:



Memória


Para que a unidade de controle execute o programa, ele deve ser armazenado em algum lugar, a memória será uma unidade funcional, uma das saídas conectadas ao barramento da unidade de controle.

Assim:


A entrada mais baixa é um sinal de relógio, a mais à esquerda são dados de entrada, a mais à direita são dados de saída, eles também são comandos BU e o último é o que serve como sinalizador, informando a chegada dos dados. Após o recebimento dos dados, eles são gravados no contador, que indica o comando atual, a cada pulso do relógio, o contador aumenta e a unidade de controle transmite dados de uma FU para outra.

Outro fu simples


Crie FUs simples que executem ações comuns de adição e subtração.
O modelo da FU se parece com o seguinte: na entrada, há registros de 8 bits de acordo com o número de entradas, eles são gravados quando os dados chegam. A saída também pode conter os registros nos quais a resposta será armazenada, mas isso não é necessário para o somador.

Assim, o somador e o subtractor terão a seguinte aparência:



Dispositivo acabado


Vamos conectar a memória e a unidade de controle, e depois tentaremos criar uma nova unidade de controle e escrever um programa.
O botão atuará como um sinal de relógio.

Então a conexão:


Agora conecte o somador e o subtractor, bem como duas constantes de entrada:


Tudo está pronto para escrever um programa, ele executará uma sequência banal de ações: adicione uma ao valor anterior do somador e depois vá para o início por meio de uma transição relativa (para isso, foi feito um subtrator: 3).

Vamos escrever um programa.

Inicialmente, todos os registros são zerados, portanto, não faz sentido, o primeiro comando é enviar uma unidade para uma das entradas do adicionador (In3 -> O2), enviar a saída do adicionador para sua segunda entrada (In1 -> O1), enviar o endereço de memória atual para a entrada do subtrator (In0 -> O3), enviando a alteração de endereço para outra entrada do subtrator, ela será subtraída (In4 -> O4), depois que o subtrator for para a entrada do ponteiro de endereço, concluindo assim a transição (In2 -> O0).

O programa fica assim:

1. In3 -> O2
2. In1 -> O1
3. In0 -> O3
4. In4 -> O4
5. In2 -> O0

Na memória:


Isso é tudo. Este programa está funcionando corretamente. Eu pretendo fazer mais UFs e tornar sua conexão com a unidade de controle mais conveniente, pela maneira como elas são praticamente dispositivos ControlFlow. Você também pode conectar várias unidades de controle, ou seja, criar uma rede desses dispositivos.

Obrigado pela atenção!

GitHub

All Articles