Para compreendermos o funcionamento do circuito da Unidade de Controle fizemos o digrama de blocos abaixo. Primeiro temos o Registrador circular que é responsável por dividir a frequência do clock e assim possuirmos um maior controle da ordem em que os componentes são ativados, depois temos o contador de programa que é o responsável por percorrer os endereços da memória RAM que contém as instruções pré-definidas. A partir das informações contidas na memória RAM temos um bit de desvio que nos diz se o dado é um sinal ou um literal.
O circuito no Logisim inicia com o clock conectado no Registrador Circular e o Reset conectado em todos componentes que precisam ser "zerados" a cada execução do programa. A partir do Registrador Circular temos o Contador de Programa que age como Registrador de Endereços da Memória, em que é responsável por percorrer uma Memória RAM com capacidade de Armazenar 24 bits de largura. Na saída da memória separamos 23 bits para as saídas de literal/sinal e o bit 24 é o responsável por identificar quando temos um sinal ou literal.
Para compreendermos melhor como os bits estão codificados, criamos a tabela abaixo que nos mostra a organização que realizamos. Do bit na posição 0 até a posição 16 temos a codificação de todos componentes presentes no circuito principal, e a posição 23 é a responsável por identificar se a informação é um literal ou sinal. mas essas informações possuem 24 bits e a memória RAM converte em números hexadecimais, ou seja, separamos os 24 bits em 6 conjuntos de 4 bits e convertemos para hexadecimal.
E para codificarmos essas instruções de maneira em que consigamos carregar na memória RAM posteriormente, devemos criar um arquivo de texto e na primeira linha colocamos "v2.0 raw" e nas demais linhas colocamos os 6 números hexadecimais das instruções desejadas. Após isso, salvamos o arquivo e no Logisim selecionamos a memória RAM que iremos utilizar e carregamos o arquivo salvo no computador.
Por exemplo, se quisermos adicionar o conteúdo da posição 1 da memória RAM no ACC. Primeiro temos que enviar o x1(hexadecimal 1) para o barramento principal da Calculadora, depois esse valor deve ser armazenado no Registrador MAR para conseguirmos acessar a posição de memória. Com o valor carregado no MAR, precisamos ativar a memória RAM e enviar o conteúdo da posição x1 para o barramento principal, com a operação 00 configurada na ULA, ativamos o acumulador e o valor fica armazenado no ACC.
Para codificarmos a operação descrita anteriormente vemos que para enviar o literal x1 (hexadecimal 1) ao barramento principal precisamos de dois comandos, o 100000000000000000000001(binário)-> 800001(hexadecimal) e 000000000000000000000001(binário)-> 000001(hexadecimal), a tabela abaixo nos ajuda a compreender o processo. Agora precisamos que o valor presente no barramento seja carregado no registrador de Controle de Endereços de Memória, para isso temos o comando 000000000000000001000001(binário)-> 000041(hexadecimal), e por fim enviamos o conteúdo da RAM com a operação de soma (00) ativamos o Acumulador e recebemos o valor lá, 000000000000000110000000->000180 (hexadecimal). Com todos os valores convertidos para hexadecimal, criamos um arquivo de texto (".txt") a primeira linha recebe: v2.0 raw e a partir da segunda linha digitamos cada instrução em uma das linhas, sem colocar vírgulas ou pontos. Com o arquivo de texto salvo, devemos ir no circuito da Unidade de Controle, e na memória de instruções temos que "carregar imagem", procuramos o arquivo que salvamos e abrimos, e então só precisamos preencher o conteúdo das posições que serão utilizadas da memória RAM do circuito principal e então ativamos o clock e esperamos o resultado da operação.
No link ao lado temos um: Vídeo explicando Codificação e Correção de Bugs