Retornar para: Colunas - Fórum PCs
30/01/2006
< Computadores XXII: Uma UCP Elementar funcionando >
Nossa jornada em busca do conhecimento já se estendeu um bocado (e espero que os poucos que a estão acompanhando tenham usufruído de sua leitura o mesmo prazer que tenho sentido ao escrevê-la). O caminho tem sido longo e algumas vezes pedregoso. Mas hoje chegamos a um marco, um daqueles pontos em que se pára um pouco para apreciar o que já se aprendeu: vamos destrinchar o funcionamento interno de uma UCP. Vamos ver como funciona esse circuito, tido como o mais complexo dentre os circuitos eletrônicos (quando digo "ver como funciona" quero dizer exatamente isto: ver com seus próprios olhos o funcionamento do processador, experimentando diferentes dados e diferentes instruções em uma animação que reproduz o funcionamento da UCP). E aposto que vocês acharão mais simples do que imaginavam.
É claro que não vai dar para examinar detalhadamente as entranhas de uma UCP como, por exemplo, o Itanium, com seus dez milhões de transistores, centenas de instruções dezenas de registradores e operandos de 64 bits. Nossa UCP será bem mais modesta. Ela será constituída por uma combinação de portas lógicas que poderá ser montada com bem menos de cem transistores. Não terá registradores porque não precisará deles. Seu conjunto de instruções será mínimo: "saberá" executar apenas quatro instruções. E poderá manejar simultaneamente apenas dois operandos que serão de uma simplicidade franciscana: terão apenas um bit cada. Mas nem por isso ela deixará de ser uma unidade central de processamento perfeitamente funcional: poderá receber qualquer combinação de seus dois operandos e, com elas, executar qualquer uma de suas quatro instruções. Veja um diagrama esquemático de nossa UCP elementar na Figura 1.
Figura 1: diagrama esquemático de UCP elementar.
Clique na figura para ampliar.
Para podermos entender como nossa UCP funciona precisamos conhecer seus componentes. Afinal, nesta altura dos acontecimentos, depois de lermos a coluna "Componentes da UCP" temos uma idéia razoável de como é constituída internamente uma UCP: Ela contém apenas uma unidade de entrada e saída, uma unidade de controle, uma unidade aritmética e lógica e um conjunto de registradores. Com a vantagem de que a nossa, por ser mais simples, dispensa os registradores. Vamos ver como os demais constituintes se distribuem na Figura 1.
A Unidade de Entrada e Saída, como sabemos, serve apenas para que os dados entrem e saiam do microprocessador. No nosso caso ela está dispersa em torno dos demais componentes. Repare: no alto da figura temos dois terminais que recebem a instrução no interior do retângulo intitulado "Instrução" ao lado de dois outros terminais que recebem os dados no interior de um retângulo intitulado "Entrada". Este é o conjunto da entrada (de dados e instruções; já o examinaremos com mais detalhes). À direita temos um terminal de saída ligado a uma porta "OR" de quatro entradas, cada uma proveniente de uma porta "AND" de duas entradas. Este conjunto de cinco portas lógicas e um terminal é a saída. Aí está, portanto, toda a unidade de entrada e saída.
Examinemos melhor a unidade de entrada. A entrada de instruções pode ser feita apenas através de dois terminais porque o conjunto de instruções ("instruction set") de nossa UCP se resume a quatro instruções. Que, como sabemos, são números. Portanto todo o conjunto de instruções pode ser representado pelos números de zero a três. Que, em binário, são 00; 01; 10 e 11. Portanto, energizando ou desenergizando apenas dois terminais poderemos representar nossas quatro instruções.
Que instruções são estas? Bem, dada a simplicidade de nossa UCP não podemos esperar dela tarefas muito esotéricas. Cada instrução executa uma operação com os dados de entrada. Três delas são operações lógicas: a instrução 00 executa a operação lógica unária "NOT" usando como operando um dos dados de entrada (mais especificamente, a entrada B, desprezando o valor de A; lembre-se disso mais adiante quando estiver "operando" sua UCP), a instrução 01 executa a operação lógica "AND" com os dois dados de entrada e a instrução 10 executa a operação lógica OR também com os dois dados de entrada. A quarta instrução, 11, executa uma operação aritmética: a soma dos dois dados de entrada. Todo o conjunto de instruções, com seus valores de entrada em binário e decimal, é mostrado próximo ao canto inferior esquerdo da Figura 1. E a entrada de dados? Bem, são apenas dois dados de entrada, cada um deles constituído por um único bit. Portanto bastam dois terminais, A e B, cada um deles apto a receber um dado, ou seja, um bit, que pode assumir os valores "zero" e "um".
A saída é igualmente simples. Todo o conjunto de cinco portas lógicas serve apenas para selecionar a saída válida, ou seja, aquela correspondente à instrução executada (isto será melhor entendido quando virmos a animação em funcionamento). E basta um único terminal porque o resultado das operações lógicas NOT, OR e AND pode ser expresso por um único bit e a soma de dois valores de um bit resulta também em um valor de um bit e um eventual "vai um" (que é representado um pouco mais abaixo e é perfeitamente funcional, como veremos na animação). Para permitir que esta UCP elementar seja combinada com outros circuitos de forma a se poder entrar dados com mais de um bit, foi incluído também o circuito relativo ao "vem um". No nosso caso consideraremos que este terminal (que, como o "vai um", não é de entrada nem de saída, mas de intercomunicação entre diferentes circuitos em uma UCP mais complexa) se manterá sempre desenergizado, ou seja, recebendo um "zero". Ou seja: para a nossa UCP nunca "vem um".
Bem, como sabemos que nossa UCP elementar prescinde dos registradores, havendo examinado a unidade de E/S nos falta examinar as unidades de controle e aritmética e lógica. Ambas estão assinaladas na figura, a de controle no retângulo da esquerda, a aritmética e lógica no do centro.
Examine a UC, a unidade de controle de nossa UCP. Ela não lhe parece familiar? Se porventura ela nada lhe trouxe à mente, consulte novamente a coluna ; "Multiplexadores, decodificadores e flip-fops". Repare no decodificador de três entradas que lá é destrinchado. Agora olhe novamente para a unidade de controle de nossa UCP. Percebeu?
Isso! Nossa unidade de controle não passa de um decodificador de duas entradas. É tudo o que ela precisa e é fácil entender porque.
Ela precisa de um decodificador porque nenhuma unidade de controle de um microprocessador pode prescindir de um decodificador, do contrário seria impossível decodificar a instrução. E "decodificar a instrução", como sabemos, nada mais é que energizar o circuito eletrônico (no nosso caso representado por um circuito lógico) que irá executá-la. Portanto o decodificador é imprescindível. Mas e o resto?
Os demais componentes que costumam integrar uma unidade de controle são o cristal, ou "clock", e os circuitos correspondentes às micro-operações necessárias à execução da instrução. Ora, o ritmo em que nossa UCP vai funcionar será ditado por você mesmo, quando clicar nos botões da animação correspondentes aos operandos e à instrução a ser executada. Portanto ela não precisa de cristal. E a própria natureza das instruções de nosso "instruction set" é tão simples que podem ser executadas inteiramente na unidade aritmética e lógica, dispensando assim qualquer micro-operação preparatória. Por isso nossa unidade de controle não precisa de nada além de seu imprescindível decodificador.
Resta a ULA, a unidade lógica e aritmética.
Tudo o que nossa UCP "sabe" fazer (restrição ditada por seu reduzido conjunto de instruções) são três operações lógicas (NOT, OR e AND) e uma aritmética (soma), todas elas com operadores de um único bit. Portanto a ULA consiste apenas nos circuitos capazes de realizar estas quatro operações.
Aí está nossa UCP.
Mas como ela funciona?
Animação: UCP elementar
Acompanhe na animação. Atere a instrução clicando nos respectivos botões e os valores aplicados às entradas A e B clicando nos botões "Liga" e "Desliga" e veja o resultado na saída.
Como os dados são de apenas um bit, cada entrada pode receber apenas os valores "um" e "zero", correspondendo, respectivamente, ao bit ligado e desligado. Clicando nos botões você pode efetuar todas as combinações possíveis com os dados de entrada. Que não são muitas, são apenas quatro...
Para "operar" a animação, primeiro entre com os dados ligando ou desligando as chaves A e/ou B e então escolha a instrução clicando nos botões que representam as quatro instruções, de número 0 a 3 (note que "escolher uma instrução" corresponde a energizar e/ou desenergizar os terminais de alimentação das entradas, permitindo selecionar um dos quatro circuitos mostrados no interior de retângulos de diferentes cores na Figura 1, cada um deles correspondendo a uma instrução). Ao clicar na instrução você a estará executando sobre os dados de entrada previamente ajustados. E o terminal de saída refletirá o resultado.
Por exemplo: Deixe a entrada A em seu valor "zero", ajuste a entrada B para "um" clicando no botão "ligar" correspondente a B e em seguida clique no botão correspondente à instrução "2", que corresponde à operação lógica "OR". Você comandou a execução da operação (A OR B) com os valores "zero" e "um", ou seja, efetuou a operação "0 OR 1". O resultado, como sabemos, é "um" e por isso a saída está energizada (terminal exibindo vermelho) e ao lado dela se lê "0 OR 1 = 1".
Experimente com outros valores de dados e outras instruções e examine o funcionamento interno dos circuitos de nossa UCP (lembre que a instrução "0" corresponde a NOT B. portanto não levará em conta o valor - ou estado da chave - do terminal A). Ela funciona como qualquer outra, seja simples, seja complexa: em um dado momento (no nosso caso, quando você clicou no botão correspondente à instrução, que deflagrou sua execução; no caso das UCPs mais complexas, quando o sinal de "clock" é disparado) o processador examinou os dados de entrada (no nosso caso, entrados por você clicando nos botões "Liga" ou "Desliga" dos terminais de entrada para entrar com os valores "um" e "zero", respectivamente; no caso de uma UCP complexa, os valores contidos nos registradores utilizados pela instrução que está sendo executada), os introduziu na unidade lógica e aritmética e executou todas as operações possíveis com eles. Ao mesmo tempo, o valor da instrução foi introduzido no decodificador, que tem quatro saídas e energizou apenas aquela correspondente à instrução recebida. Os valores das saídas do decodificador e da ULA foram então combinados e a saída final reflete o resultado da operação correspondente à instrução aplicada aos operandos.
Mas não se limite apenas a clicar aqui e ali para ver como os resultados se manifestam. Faça mais que isso: examine os valores intermediários (um condutor desenergizado, ou seja, que não está conduzindo eletricidade, é representado em preto, um condutor que está conduzindo eletricidade é representado em vermelho). Veja como eles se combinam para gerar os resultados finais. Analise a função de cada porta lógica e veja sua ação no conjunto de ações. Afinal, não é sempre que lhe é dada a oportunidade de examinar em detalhes o funcionamento interno de uma CPU (ainda que simples como a nossa).
Aproveite.