Baixe o app para aproveitar ainda mais
Prévia do material em texto
Circuitos Lógicos Material Teórico Responsável pelo Conteúdo: Prof. Ms. Fábio Peppe Beraldo Revisão Textual: Profa. Esp. Márcia Ota Revisão Técnica: Prof. Ms. Rodrigo da Rosa Unidade Lógica e Aritmética • Unidade Lógica e Aritmética (ULA) • O Ciclo de Instrução • O Pipeline • Circuitos Sequenciais · O objetivo desta unidade é capacitar o aluno a usar corretamente os registradores do computador, consumindo menos memória, ao mesmo tempo em que acelera o ciclo de instruções. OBJETIVO DE APRENDIZADO Nesta Unidade, vamos aprender um pouco mais sobre o que é a Organização de processadores, o ciclo de instrução e os registradores, além do conceito de flip-flop. Leia o material com atenção e, se sentir necessidade, releia para que sua absorção seja adequada. Fique atento (a) nessa etapa, pois é o momento oportuno para registrar suas dúvidas; por isso, não deixe de registrá-las e transmiti-las ao professor-tutor. Além disso, para que a sua aprendizagem ocorra num ambiente mais interativo possível, na pasta de atividades, você também encontrará as atividades de avaliação, uma atividade reflexiva e a videoaula. Cada material disponibilizado é mais um elemento para seu aprendizado, por favor, estude todos com atenção! Bom Estudo! ORIENTAÇÕES Unidade Lógica e Aritmética UNIDADE Unidade Lógica e Aritmética Contextualização A Unidade Central de Processamento ou Central Processing Unit (CPU) é considerada por muitos o cérebro do computador; porém, podemos dizer que ele é o coração também, uma vez que gera informações que alimentam o sistema operacional e este, por usa vez, os programas. Tecnicamente, sua função é executar programas armazenados na memória principal, buscando suas instruções, examinando essas instruções e identificando seus comandos, como visto na última unidade e, então, executá-las sequencialmente. Nesta unidade da disciplina, aprenderemos como que a CPU realiza sua função e como as instruções se comportam quando migram entre as memórias. Bom estudo! 6 7 Unidade Lógica e Aritmética (ULA) A unidade lógica e aritmética é o componente da CPU responsável pelas execuções das operações matemáticas dos dados, ou seja, é na ULA que as operações das instruções estudadas, realmente, são trabalhadas interpretadas e as respostas são geradas. As operações que a ULA compreende são: • Soma; • Multiplicação; • Operação lógica AND; • Operação lógica XOR; • Deslocamento à direita; • Incremento; • Subtração; • Divisão; • Operação logica OR; • Operação complemento; • Deslocamento à esquerda; • Decremento. Normalmente, essas operações utilizam um ou dois valores e, por isso, a ULA possui duas entradas e ambas se concentram a uma saída, via barramento interno. Figura 1: Estrutura da CPU com destaque para a ULA Fonte: Monteiro, M., Introdução a Organização de Computadores. Figura 2: Interligação da ULA com a CPU. Fonte: Monteiro, M., Introdução a Organização de Computadores. 7 UNIDADE Unidade Lógica e Aritmética É possível definir que a ULA funciona como um conjunto de circuitos lógicos, utilizados conforme o tipo de operação a ser realizada, que recebem na entrada dois ou, às vezes um; valores, que seguem pela circuitaria, determinados pelas portas lógicas e, na saída, entregam um resultado. Vamos exemplificar, aqui, a soma de dois valores binários, X=1 e Y=1, que irão produzir o valor Z=0 e um bit carry (C=1) que tem a função de armazenamento em um registrador especial do processador para referências, quando necessário. Chamamos esse registrador de FLAG. O que muitos desconsideram é que as distâncias percorridas fisicamente têm grande influência no tempo de resposta, apenas para lembrar, a ULA ainda obedece à fórmula e = vt, onde: • e = é a distância entre a entrada e a saída do circuito. • v = é a velocidade atingida pelos sinais elétricos que são representações dos bits através do circuito que é, nominalmente, a velocidade da luz; porém, jamais alcança os 300.000km/s, pois isso só ocorre no vácuo. • t = é o tempo de execução da operação, ou seja, o tempo de percurso dos sinais desde a entrada até a saída. Figura 3: Circuito lógico da ULA. Fonte: Monteiro, M., Introdução a Organização de Computadores. O circuito somador é a base de funcionamento da ULA, classificado, essencialmente, pelo somador half adder ou somador parcial e o somador full adder, que é o somador completo. No somador parcial, a soma é realizada apenas com os dois valores binários envolvidos recebidos na entrada (X e Y como visto na figura 3) e em sua saída, entrega um resultado Z e o carry (o carry, às vezes, pode não acontecer), ou seja, a figura 3 é uma representação lógica de um somador parcial. No somador completo, o carry é considerado na soma, que fica com três parcelas. 8 9 Dessa forma, as ULAs, em sua totalidade, são fabricadas como um circuito somador que pode somar dois valores numéricos, independentemente da quantidade de bits que eles possam possuir, dependendo diretamente da palavra do processador. Mais para frente na disciplina, nós aprenderemos sobre os circuitos lógicos e, então, retomaremos os exemplos práticos dos somadores, utilizando a representação de circuitaria de suas portas lógicas. Processadores Um processador tem a função de armazenar dados em uma memória e, então, usar esses dados para o correto processamento. Esse processamento envolve a busca de instruções do programa armazenado, exame e identificação dos opcodes e operandos dessa instrução e, por fim, a execução do mesmo para que o programa “rode” corretamente. Como já mencionado, para executar o processamento das instruções, a CPU usa uma quantidade de memória para o armazenamento temporário de dados, ela mantém a posição de memória da última instrução e, com isso, recebe o valor de endereçamento, onde obtém a instrução seguinte para o processamento contínuo. Para realizar todo o trabalho corretamente, a CPU segue alguns passos, descritos a seguir: 1. Busca de instrução: a CPU executa a leitura de uma instrução localizada na memória. 2. Interpretação de instrução: decodifi cação da instrução em busca da ação desejada. 3. Busca de dados: carregamento, se necessário, de um dados da memória ou dispositivo de E/S. 4. Processamento de dados: operações aritméticas ou lógicas sobre os dados carregados. 5. Escrita de dados: escrita dos dados processados. Fonte: https://goo.gl/4EpV8e Na figura 4, há um diagrama simplificado da CPU, já demonstrado na unidade anterior. Conforme a figura, podemos resumir a CPU como um dispositivo composto por uma ULA (Unidade Lógica e Aritmética) e uma UC (Unidade de Controle). Vimos, na última unidade, que a ULA tem a função de processar todas as instruções, conforme sua construção de opcodes e operandos, já a UC é responsável por controlar a transferência de dados e instruções entre a CPU e os demais componentes do computador, além de controlar o próprio funcionamento da ULA. Faz parte também da composição de uma CPU uma quantidade de memória especial chamada Registrador que tem a função de armazenar dados imediatos para o processamento. 9 UNIDADE Unidade Lógica e Aritmética Figura 4: Estrutura da CPU com destaque para a ULA Fonte: Monteiro, M., Introdução a Organização de Computadores. Uma visão mais atenta da figura 4 nos mostra todos os caminhos percorridos por um sinal dentro da CPU, sendo eles os caminhos de transferência de dados e a sinalização de controle da UC que, por muitos, é chamado de barramento interno de CPU. Esse sinal de controle é utilizado apenas para transferência interna das partes da instrução durante seu trabalho, sem contato com o ambiente externo à CPU; a esta comunicação externa cabe o trabalho do barramento de transferência de dados. Registradores Os registradoressão unidades de memória de alto nível ou hierarquia que possuem duas funções definidas: • Registradores visíveis para o usuário: possibilitam ao programador de linguagem de montagem ou de máquina minimizar referências à memória, pela otimização do uso de registradores. • Registradores de controle e de estado: são usados pela unidade de controle para controlar a operação da CPU e por programas privilegiados do sistema operacional para controlar a execução de programas. Registradores Visíveis ao usuário Esses registradores são aqueles que o programador pode referenciar por conta própria via linguagem de máquina executada pela CPU e pode ser dividido em: • Registradores de propósito geral: podem conter operandos que executem qualquer tipo de operação, sendo de propósito geral; porém, como tudo na vida, há exceções, onde esses registradores armazenam valores não gerais, como operações com número de ponto flutuante ou pilhas. 10 11 • Registradores de dados: são usados apenas para conter dados e não podem ser empregados no cálculo de endereços de operandos. • Registradores de endereços: podem funcionar como os de propósito geral ou para um endereçamento especial como: • Registradores de segmento: utilizados para armazenar endereçamentos segmentados. • Registradores de índices: utilizados para endereçamentos indexados. • Apontador de topo de pilha: utilizado na pilha visível para o usuário; dessa forma, a pilha ficará alocada na memória, onde um registro especial endere- çará o topo da pilha. • Registradores de códigos de condição ou flags: são bits utilizados pela CPU como resultados de operações. Registradores de controle e de estado Uma CPU utiliza vários tipos de registradores para controlar a operação e, por sua vez, a maioria dessas não são visíveis para o programador, em contraposto ao modelo anterior. Lembrando que diversas máquinas possuem registradores construídos de forma diferente. Então, foi preciso criar um padrão de registradores para funções específicas, como segue: • Contador de programa (PC): contém o endereço da instrução a ser buscada. • Registrador de instrução (IR): contém a última instrução buscada. • Registrador de endereçamento à memória (MAR): contém o endereço de uma posição de memória. • Registrador de armazenamento temporário de dados (MBR): contém uma palavra de dados a ser escrita na memória ou a palavra lida mais recentemente. Esses registradores são responsáveis pelo transporte de dados entre CPU e me- mória externa, sem que o usuário tome conhecimento dessa ação, sendo que den- tro da CPU esses dados são entregues somente para a ULA. Há ainda a possibili- dade de um registrador intermediário que interage entre o MBR e a E/S da ULA. Uma vez clara a necessidade de diversos tipos de registradores na CPU, criou-se um conjunto conhecido como Palavra de Estado de Programa (PSW) que irá conter os códigos de condição além de informações do estado da instrução, constituídos dos seguintes campos: • Sinal: contém o bit de sinal do resultado da última operação aritmética. • Zero: atualizado com valor 1 se o resultado da última operação for O. • ‘Vai-um’: atualizado com valor 1 se uma operação resultar em um ‘vai-um’ para fora do bit de ordem superior (adição) ou em um ‘vem-um’ para o bit de ordem superior (subtração). É usado por operações aritméticas de múltiplas palavras. 11 UNIDADE Unidade Lógica e Aritmética • Igual: atualizado com valor 1 se uma comparação lógica resultar em igualdade. • Overflow: usado para indicar overflow aritmético. • Habilitar/desabilitar interrupção: usada para habilitar ou desabilitar interrupções. • Supervisor: indica se a CPU está executando em modo supervisor ou em modo de usuário. Certas instruções privilegiadas apenas podem ser executadas no modo supervisor, assim como certas áreas de memória apenas podem ser acessadas no modo supervisor. É necessário também que a CPU possua um registrador que sempre aponte para um ponto na memória, onde haja informações do estado original da instrução. Quando esse ponto na memória for especificamente uma memória virtual, esse registrador apontará para a tabela de páginas. Uma forma de facilitar o desenvolvimento correto dos registradores ocorre quando o programador tem conhecimento total sobre sistemas operacionais, pois ele sabe como o sistema irá interagir com a CPU. O Ciclo de Instrução O ciclo de instruções de um computador ocorre quando a CPU busca uma instrução em um campo de memória. Para tanto, é utilizado um registrador chamado contador de instruções que sempre irá guardar o endereçamento da instrução a ser executa, ou seja, após fazer uma busca, o contador de instruções já armazena o endereçamento da próxima instrução para manter o processamento sequencial. Após a busca, a instrução deve ser entregue para o processador e isso ocorre através do carregamento dos dados no registrador de instruções do processador que criará bits que identificarão que ação o processador deve executar nos dados. Assim, ele pode interpretar a instrução e executar cada ação corretamente. Essas ações estão listadas a seguir: • Processador-memória: transferência de dados do processador para a memória ou da memória para o processador. • Processador E/S: transferência de dados entre o processador e um dispositivo periférico por meio de um módulo de E/S. • Processamento de dados: execução de operações aritméticas ou lógicas sobre os dados. • Controle: determinadas instruções podem especificar que a sequência de execução de instruções seja alterada. Como já dito anteriormente, em unidades anteriores, o computador possui uma memória ou registro de armazenamento chamado AC (acumulador), considerando instruções e dados de 16 bits, organizamos a palavra do processador em 12 13 16 bits; assim, a instrução é construída contendo 4 bits para o código de operação, conforme estudado anteriormente. Para exemplificar o funcionamento do ciclo de instrução, vamos analisar a execução parcial de uma aplicação mostrada na figura 5. Figura 5: Diagramação do Ciclo de Instrução. Fonte: Stallings, W., Arquitetura e Organização de Computadores. No passo 1, temos que o PC (contador de instruções) está em 300, ou seja, o programa já rodou 299 instruções e está, agora, executando a instrução 300 que é carregada no IR (registrador de instruções). No passo 2, os quatro primeiros bits do IR são interpretados, de forma que seu comando é o armazenamento do AC (acumulador) de um valor. O valor que deve ser armazenado no AC está descrito e endereçado (endereço 940) nos 12 bits restantes da instrução do IR. No passo 3, o PC sobe para 301, ou seja, para o próximo ciclo de instrução que é, então, carregada para o IR. No passo 4, a instrução é interpretada e, como no passo 2, é identificado que uma soma deve ser feita com o conteúdo endereçado como AC e o endereçado como 941; por fim, o resultado deve ser endereçado de volta para AC, apagando o valor que lá havia. No passo 5, o PC muda, mais uma vez, para a próxima instrução que é buscada e carregada em IR. 13 UNIDADE Unidade Lógica e Aritmética No passo 6, novamente, da mesma forma que no passo 2, a instrução é interpretada como a ação de armazenamento do valor do AC para o endereço de memória 941, sobrescrevendo o valor existente nessa posição. Na figura 5, foi descrito o funcionamento de uma execução de programa, utilizando três ciclos de instruções, todos com os momentos de busca e execução. Como sabemos, há processadores com arquiteturas complexas que podem ter vários comandos e endereçamentos de memória, o que reduziria o número de ciclos e, possivelmente, o tempo de processamento. Os estados de um ciclo de instruções podem ser descritos por: Cálculo de endereço de instrução (CEI): instruction addresscalculation: nesse estado temos a determinação do endereço da próxima instrução que será carregada. Esse estado geralmente envolve a soma de um valor constante ao endereço da instrução anterior. Busca de instrução (BI): instruction fetch: nesse estado, a instrução calculada é carregada ou lida da memória para o processador. Decodificação de instrução (DI): instruction operation decoding: nesse estado faz-se a análise do código da instrução carregada que será executada. Esse estado determina qual é a operação a ser realizada e quais operandos serão utilizados. Cálculo de endereço de operando (CEO): operand address calculation: ocorre quando a operação atual envolver uma referência a operando na memória ou nos dispositivos de E/S, para então carrega-lo. Busca de operando (BO): operand fetch: o operando é localizado na memória ou é lido no dispositivo de E/S. Execução da operação (EO): data operation: nesse passo há a execução da operação indicada pela instrução. Armazenamento de resultado (AR): operand store: escrita do resultado do processamento. Fonte: https://goo.gl/ilnwtd Instruction fetch Operand fetch Operand store Instruction address calculation Instruction operation decoding Operand address calculation Operand address calculation Data Operation Interrupt check Interrupt operandos múltiplos Resultados múltiplos instrução completa, busca de nova instrução retorno de cadeia de catacteres ou vetor sem interrupção Figura 6: Diagrama de transição de estados de um ciclo de instrução. Fonte: Stallings, W., Arquitetura e Organização de Computadores. 14 15 Os estados na parte superior da figura 6 envolvem transferências de valores entre o processador, de um lado, e a memória ou um dispositivo de E/S, de outro. Os estados na parte inferior do diagrama envolvem apenas operações realizadas internamente no processador. O estado (CEO) aparece duas vezes, pois uma instrução pode envolver uma operação de leitura. Fluxo de dados do clico de instruções Não existe uma sequência correta única para o fluxo de dados, pois esse fluxo depende da forma como a CPU foi projetada; porém, é possível que se estime uma estrutura, ao menos, lógica, de como deve ser a sequência. Basicamente, um ciclo de busca é constituído de um momento onde a instrução é lida da memória. Nessa sequência, o PC mantém o endereço da próxima instrução que deve ser carregada. Esse endereço é carregado para o MAR (via address bus), A UC comanda que seja feita a leitura da memória e o valor lido é copiado no MBR e, então, para o IR (via data bus), o contador sobe um valor que é a próxima instrução a ser executada. A figura 7 mostra uma sequência de ciclo de instruções, demonstrando o fluxo das informações, semelhante ao apresentado na figura 5; porém, com a adição dos barramentos que realizam o transporte dos dados da instrução para seus respectivos controladores. CPU PC MAR Unidade de controle MBRIR Memória Barramento de endereço Barramento de dados Barramento de controle Figura 7: Fluxo de dados do clico de busca. Fonte: Stallings, W., Arquitetura e Organização de Computadores. O Pipeline Podemos dizer que um pipeline funciona de forma semelhante a uma linha de montagem uma vez que as instruções passam por uma sequência de estágios. Vamos tomar o seguinte exemplo: Sabemos que um ciclo de instrução possui várias etapas. Então, vamos pegar as etapas de busca e execução das instruções, enquanto parte da instrução está sendo 15 UNIDADE Unidade Lógica e Aritmética executada a memória não está trabalhando. Nesse instante, a memória poderia ser utilizada em paralelo com a execução; dessa forma, o pipeline executa duas funções paralelamente, enquanto uma parte da instrução é executada a próxima está sendo armazenada de forma temporária, quando a execução termina, a memória de trabalho recebe o valor carregado na memória temporária e começa uma nova execução. Enquanto isso, uma nova instrução é carregada temporariamente e assim por diante. Chamamos essa sequência de trocas de função de busca antecipada de instrução (instruction prefetch) ou superposição de busca (jetch overlap). A figura 8 mostra duas formas de execução: na primeira (a), há uma execução sem pipeline e na segunda forma (b), há uma execução com pipeline, conforme a descrição de pipeline. Instrução Instrução Instrução Instrução Resultado Resultado Busca Busca Execução Execução Novo endereço Espera Espera Descarte (a) (b) Figura 8: Demonstração lógica do trabalho do pipeline. Fonte: Stallings, W., Arquitetura e Organização de Computadores. Com essa explicação, fica óbvio que usando o pipeline o tempo de execução do ciclo diminui bastante; porém, isso só ocorre quando os tempos de busca e execu- ção são o mesmo, o que dificilmente acontece, pois é comum que o tempo de exe- cução seja maior que o de busca devido às maiores operações que devem ser feitas. Quando há instruções de desvio, a próxima instrução que deve ser buscada não teve aquele carregamento prévio, pois seu endereçamento não é conhecido e a busca em paralelo com a execução não é possível, pois essa descoberta só ocorre durante a execução. O desvio condicional é quando uma instrução sendo executada faz referência à outra instrução ou dado em um determinado endereçamento diferente daquele sequencial à execução do programa. Essa referência servirá como dado para se alcançar o resultado da instrução em execução no momento e despois é descartada; porém, esse desvio de percurso gera um atraso no ciclo e impede a correta execução do pipeline. 16 17 Para tentar solucionar o problema das instruções de desvio ou desvio condicional, é executada uma estratégia de adivinhação, tecnicamente chamada de preempção, ou seja, quando uma instrução de desvio condicional é passada do estágio de busca para o de execução, o estágio de busca obtém na memória a instrução, imediatamente, seguinte à instrução de desvio. Então, se não ocorrer o desvio, nenhum tempo será perdido. Se ocorrer o desvio, a instrução buscada deve ser descartada, sendo buscada uma nova instrução. As instruções de desvio, realmente, interferem no tempo do ciclo de instruções e mesmo com a preempção de endereçamento não se obtém uma solução otimizada. Para tanto, é preciso que o pipeline tenha mais estágios de trabalho paralelo, da mesma forma que demonstrada, quando falamos sobre os estados do clico de instrução: • Busca de instrução (BI); • Decodificação da instrução (DI); • Cálculo de operandos (CD); • Busca de operandos (BD); • Execução da instrução (EI); • Escrita de operando (ED). Na figura 9, temos a demonstração de um pipeline, onde nove instruções tiveram seu tempo de processamento conjunto reduzido de 54 unidades de tempo (9 instruções de 6 unidades de tempo) para 14 unidades de tempo, usando os estados de ciclo de instruções. BI DI CO BO EI EO BI DI CO BO EI EO BI DI CO BO EI EO BI DI CO BO EI EO BI DI CO BO EI EO BI DI CO BO EI EO BI DI CO BO EI EO BI DI CO BO EI EO BI DI CO BO EI EO Intrução 1 Intrução 2 Intrução 3 Intrução 4 Intrução 5 Intrução 6 Intrução 7 Intrução 8 Intrução 9 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Tempo Figura 9: Diagrama de tempo para operação da pipeline de instruções. Fonte: Stallings, W., Arquitetura e Organização de Computadores. 17 UNIDADE Unidade Lógica e Aritmética Em contraponto, no caso de uma interrupção (parada da execução devido à alta prioridade de outro processo ou programa) ou um desvio condicional, se imaginarmos as mesmas nove instruções de 6 unidades de tempo; porém, com um desvio condicional ocorrendo da instrução três para a instrução 15. Nesse caso, a CPU não tem como saber de quemodo fazer a preempção, ou seja, a instrução 4 é carregada e sua execução ocorre, normalmente, até que no momento de desvio da instrução 3, acontece paralelamente, chame ou referencie a instrução 15. Nesse momento, todas as instruções ocorrendo em paralelo são interrompidas e aguardam o fim da instrução 15 e suas subsequentes. Quando o resultado dessas execuções subsequentes terminarem e o valor resultado indicar o retorno para a instrução 3, todas as instruções interrompidas retomam seu trabalho, caso contrário, elas irão aguardar o fim das instruções, subsequente à instrução 15 e depois serão retomadas, como demonstrado na figura 10. BI DI CO BO EI EO BI DI CO BO EI EO BI DI CO BO EI EO BI DI CO BO BI DI CO BI DI BI BI DI CO BO EI EO BI DI CO BO EI EO Intrução 1 Intrução 2 Intrução 3 Intrução 4 Intrução 5 Intrução 6 Intrução 7 Intrução 8 Intrução 9 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Tempo Penalidade devido ao desvio Figura 10: Desvio condicional na operação de uma pipeline de instruções. Fonte: Stallings, W., Arquitetura e Organização de Computadores. Desempenho da pipeline Além de lidar com os desvios condicionais da pipeline e as interrupções, é muito importante sabermos como se dará o desempenho da pipeline. Para tanto, veremos algumas equações para fazer essa medição de desempenho. 18 19 Podemos dizer que o tempo relativo de uma pipeline de instrução é o tempo que um conjunto inteiro de instruções leva para avançar um estágio da pipeline. Esse tempo de ciclo pode ser determinado pela equação: τ τ τ= [ ] + → + ≤ ≤max � ,�i md d i i k1 Onde: • τm = atraso máximo de estágio (atraso por meio do estágio de maior atraso). • K = número de estágios da pipeline de instrução. τm • D = tempo necessário para propagar sinais e dados de um estágio para o próximo. Nessa equação, o (d) é a aproximação ao pulso de um relógio e (τm) >> d. Se considerarmos que uma quantidade de instruções representada por (n) sem o desvio condicional, o tempo total Tk para executar todas as (n) instruções é representado por: T k nk = + −( ) ×1 τ Se lembrarmos do exemplo gráfico anterior (figuras 8 e 9), onde havia 9 instruções com 6 unidades de tempo cada e sem desvio condicional teríamos, então, 14 unidades de tempo para todo o clico do conjunto de instruções, provado pela equação: 14 6 9 1= + −( ) É possível calcular o quão mais rápido uma execução com pipeline sobre uma execução sem pipeline, calculando o speedup (comparação de velocidades) entre elas, da seguinte forma: S T T n k k n n k k nk k = = × × + −( ) × = × + −( ) 1 1 1 τ τ A figura 11 demonstra duas vertentes de avaliação de desempenho de ciclo de instruções. Na parte (a), é demonstrado um speedup de execução de um conjunto de instruções em função de instruções executadas em cada conjunto sem a presença do desvio condicional. N parte (b), é demonstrado um gráfico de speedup; porém, dessa vez, em função da quantidade de estágios de pipeline que cada conjunto possui, onde se pode notar que quanto maior o número de estágios, maior o speedup. É possível notar que somente aumentar a quantidade de estágios acelera o processo, isso se torna claro na parte (b) da figura 11, onde o speedup aumenta quando se aumentou demais o número de estágios; porém, o número de instruções diminuiu. Isso ocorre devido ao aumento de custo, por atrasos entre estágios e pelo fato de que instruções de desvio requerem que a pipeline seja esvaziada, ou seja, o uso de um número de estágios entre 6 e 9 parece ser mais adequado, sendo contraproducente o uso de um número de estágios maior. 19 UNIDADE Unidade Lógica e Aritmética Speedup Speedup k = 12 estágios k = 9 estágios k = 6 estágios 0 1 2 4 8 16 32 64 128 2 4 6 0 2 4 6 8 10 12 8 10 12 Número de instruções (a) Número de instruções (b) 14 0 5 10 15 20 n= 30 instruções n= 20 instruções n= 10 instruções Figura 11: Speedups obtidos com o uso de pipeline de instruções Fonte: Stallings, W., Arquitetura e Organização de Computadores Visão Elétrica de Postas que Compõem uma ULA Simples Como já vimos, uma ULA tem a função de processar números usando o mesmo formato que o resto do circuito digital. Os sistemas numéricos de complemento para um e complemento para dois permitem que a subtração seja realizada pela adição do minuendo com o complemento do subtraendo, simplificando o circuito lógico. Uma vantagem do complemento para dois em relação aos outros sistemas é que a representação possui apenas um zero, não possuindo um “zero negativo”. Podemos resumir o trabalho de uma ULA de formas: Operações simples: • Operações aritméticas com inteiros; • Operações lógicas bit a bit AND, NOT, OR, XOR; • Operações de deslocamento de bits (deslocamento, rotação por um número específico de bits para esquerda ou direita, com ou sem sinal); deslocamentos podem ser interpretados como multiplicações ou divisões por 2. 20 21 Operações complexas: O engenheiro de hardware deve projetar uma ULA para calcular qualquer operação; no entanto, isso gera complexidade; o problema é que quanto mais complexa a operação, mais cara é a ULA, mais espaço utiliza do processador e mais dissipa energia. Dessa forma, é uma obrigatoriedade o estudo entre o poder de processamento e a sua complexidade, satisfazendo aos requisitos do processador ou de outro circuito. Imagine um cenário, onde é preciso calcular a raiz quadrada. O engenheiro teria as seguintes opções: 1. Projetar uma ULA extremamente complexa que calcula a raiz quadrada de qualquer número num único passo. Isso é chamado cálculo em passo-único de clock. 2. Projetar uma ULA bastante complexa que calcula a raiz quadrada de qualquer número em vários passos. Mas, existe um truque, os resultados intermediários vão através de uma série de circuitos arranjados em linha, como numa linha de produção, que faz com que a ULA seja capaz de aceitar novos números para cálculo antes mesmo de terminar o cálculo dos anteriores. Isso faz com que a ULA seja capaz de produzir números tão rápido como cálculos em passo-único de relógio, com um atraso inicial até os números começarem a sair. Isso é chamado cálculo em pipeline. 3. Projetar uma ULA complexa que calcula a raiz quadrada através de vários passos. Isso é chamado de cálculo iterativo e usualmente confia no controle de uma complexa unidade de controle com microcódigo. 4. Projetar uma ULA simples no processador e vender separadamente um processador especializado e caro que o consumidor possa instalá-lo ao lado desse, realizando uma das opções acima. Isso é chamado de coprocessador. 5. Dizer aos programadores que não há nenhum coprocessador e que não há nenhuma emulação, assim eles têm que escrever seus próprios algoritmos para calcular a raiz quadrada por software. Isso é chamado de bibliotecas de software. 6. Emular a existência de um coprocessador, ou seja, sempre que um programa tenta realizar o cálculo da raiz quadrada, faz o processador verificar se há coprocessador presente e o utiliza se está ali; se não há, interrompe o programa e invoca o sistema operacional para realiza o cálculo da raiz através de algum algoritmo de software. Isso é chamado de emulação de software. É comum que processadores poderosos utilizem a opção #1 para as operações mais simples, #2 para as operações complexas mais comuns e #3 para as operações extremamente complexas. Isso é possível através da construção de ULAs complexas. Na figura 12, você tem um exemplo da representação dos circuitos envolvidos na construção de uma ULA simples de 2-bit que faz AND, OR, XOR e adição. 21 UNIDADE Unidade Lógica e Aritmética Figura 12: Representação de uma ULA simplesde 2-bit que faz AND, OR, XOR e adição Fonte: SILVA, Rodrigo; ADAMCZEVSKI, Tiago; ULA de 2 entradas de 4 bits e 4 Operações, Universidade Federal do Paraná, 2010 Como seriam as representações de suas portas lógicas na forma estruturadas de construção? Podemos ver a representação dos circuitos elétricos correspondente das portas lógicas que podem existir na ULA e a estrutura de construção em chip, nas figuras a seguir: Figura 13: Layout da porta lógica NOT Fonte: SILVA, Rodrigo; ADAMCZEVSKI, Tiago; ULA de 2 entradas de 4 bits e 4 Operações, Universidade Federal do Paraná, 2010 22 23 Figura 14: Layout da porta lógica AND Fonte: SILVA, Rodrigo; ADAMCZEVSKI, Tiago; ULA de 2 entradas de 4 bits e 4 Operações, Universidade Federal do Paraná, 2010 Figura 15: Layout da porta lógica OR Fonte: SILVA, Rodrigo; ADAMCZEVSKI, Tiago; ULA de 2 entradas de 4 bits e 4 Operações, Universidade Federal do Paraná, 2010 Figura 16: Layout da porta lógica XOR Fonte: SILVA, Rodrigo; ADAMCZEVSKI, Tiago; ULA de 2 entradas de 4 bits e 4 Operações, Universidade Federal do Paraná, 2010 23 UNIDADE Unidade Lógica e Aritmética Figura 17: Layout do módulo de portas lógicas AND Fonte: SILVA, Rodrigo; ADAMCZEVSKI, Tiago; ULA de 2 entradas de 4 bits e 4 Operações, Universidade Federal do Paraná, 2010 Figura 18: Layout do módulo de portas lógicas OR Fonte: SILVA, Rodrigo; ADAMCZEVSKI, Tiago; ULA de 2 entradas de 4 bits e 4 Operações, Universidade Federal do Paraná, 2010 Figura 19: Layout do módulo de soma/subtração Fonte: SILVA, Rodrigo; ADAMCZEVSKI, Tiago; ULA de 2 entradas de 4 bits e 4 Operações, Universidade Federal do Paraná, 2010 24 25 Figura 20: Layout do seletor de funções da ULA Fonte: SILVA, Rodrigo; ADAMCZEVSKI, Tiago; ULA de 2 entradas de 4 bits e 4 Operações, Universidade Federal do Paraná, 2010 Figura 21: Layout do seletor de ULA ativa Fonte: SILVA, Rodrigo; ADAMCZEVSKI, Tiago; ULA de 2 entradas de 4 bits e 4 Operações, Universidade Federal do Paraná, 2010 Figura 22: Layout da ULA Fonte: SILVA, Rodrigo; ADAMCZEVSKI, Tiago; ULA de 2 entradas de 4 bits e 4 Operações, Universidade Federal do Paraná, 2010 25 UNIDADE Unidade Lógica e Aritmética Circuitos Sequenciais Agora que já estudamos vários tipos de circuitos e seus elementos de memória, o funcionamento da ULA e do processador, podemos usar essa base para avançar nos conceitos de dispositivos mais complexos, sendo aquele estudado agora, os circuitos sequenciais. Classicamente podemos afirmar que um circuito sequencial é composto por um circuito combinacional e elementos de memória, onde suas entradas e as saídas estão conectadas ao circuito combinacional. O conceito clássico de elemento de memória é de um circuito capaz de armazenar informação codificada em binário. Nesses elementos, a saída do circuito combinacional tornam-se entradas para os elementos de memória, recebendo o nome de variáveis de próximo estado. As saídas desses elementos de memória tornam-se parte das entradas para o circuito combinacional e recebem o nome de variáveis do estado atual. Logo, podemos relacionar as conexões entre o circuito conbinacional e os elementos de memória configurando o que se costuma chamar laço de realimentação, pois a saída de um bloco é entrada para o outro e vice-versa. O estado de um circuito sequencial é determinado pela informação armazenada nos elementos mencionados, assim o circuito sequencial recebe informação binária das entradas que, juntamente com a informação do estado atual, determinam os valores das saídas e os valores do próximo estado, como demonstrado na figura 23. Seguindo essa linha de raciocínio, fica mais fácil de compreender que as saídas do circuito sequencial dependem não apenas das entradas, mas também do estado atual, armazenado nos elementos de memória. O mesmo raciocínio pode ser usado nas variáveis de próximo estado, logo, em função deste comportamento sequencial é especificado pela sequencia tempostal de entradas, saídas e estados internos. Conceitualmente, divide-se os circuitos sequenciais em dois tipos, conforme o comportamento temporal dos seus sinais: síncronos e assíncronos, mas esse conceito veremos, a fundo, em outra unidade. Chamamos de flip-flops aqueles elementos de memória utilizados nos circuitos sequenciais síncronos. Um flip-flop nada mais é que um circuito digital que possui duas entradas e duas saídas, e é capaz de armazenar um bit de informação. Nos flip-flops temos duas entradas que não são intercambiáveis: uma é reservada ao sinal de controle (relógio) e a outra recebe o dado (bit) a ser armazenado. As saídas correspondem ao dado (bit) armazenado e ao seu complemento. No exemplo do sinal de relógio, determinamos o instante em que o flip-flop mostra o valor do dado, o que corresponder a uma borda de subida ou a uma borda de descida, dependendo de como o flip-flop é constituído. O diagrama da figura 23 mostra que o valor de cada virável de estado é armazenado em um flip- 26 27 flop específico. Os valores que representam o próximo estado só são mostrados na borda ativa do relógio. Logo, o estado atual fica armazenado no conjunto de flip-flop até que uma nova borda do relógio chegue, quando, então, o próximo estado passa a ser o estado atual e um novo próximo estado será gerado pelo circuito combinacional. Figura 23: Layout da ULA Fonte: GUNTZEL, José Luiz; NASCIMENTO, Francisco; Introdução aos Sistemas Digitais, 2001 Desde que devidamente alimentado com energia, um flip-flop pode manter indefinidamente um estado, até que os sinais de entrada assumam uma configuração tal que o façam mudar de estado. Essa configuração depende de como o flip-flop é constituído. O estado em que um flip-flop se encontra usualmente é associado ao valor binário que ele está armazenando. Desta forma, num dado instante, um flip- flop estará armazenando ou o valor lógico 1 (um) ou o valor lógico 0 (zero), pois esses são os dois valores possíveis para uma variável Booleana. Breve simulação No material complementar, há um link para uma simulação de funcionamento da ULA. Então, acesse o link e, além de aproveitar maiores explicações sobre a CPU (algumas que ainda veremos na disciplina futuramente), atente-se, mais especialmente, ao simulador de parte operativa. Nessa seção, você terá acesso a um simulador online na soma de dois valores pela ULA (somador parcial) e a entrega do resultado. Além disso, verá como ocorre o transporte dos dados entre registradores e ULA. Essa simulação funciona como um resumo do estudado nessa unidade. Desse modo, experimente e faça várias simulações, conforme as instruções do site e discuta suas impressões e resultados com os amigos de sala no fórum virtual. 27 UNIDADE Unidade Lógica e Aritmética Material Complementar Indicações para saber mais sobre os assuntos abordados nesta Unidade: Sites Introdução à Computação – Simulador de CPU https://goo.gl/4dYRWX Arquiteturas de Computadores https://goo.gl/9etNmX Tópicos de Informática Aplicados à Administração https://goo.gl/jNd4LE Vídeos Passos para Execução de uma Instrução https://youtu.be/Ny-v5StdryY 28 29 Referências MONTEIRO, Mario A.; A Organização de Computadores; 5ª Ed.; Editora: LTC; 2012. TANENBAUM, Andrew S.; Organização Estruturada de Computadores; 5ª Ed.; Editora: Pearson Education; 2006. 29
Compartilhar