Prévia do material em texto
ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES GUILHERME DAL PIZZOL 2ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES SUMÁRIO CENTRO UNIVERSITÁRIO UNIFTEC Rua Gustavo Ramos Sehbe n.º 107. Caxias do Sul/ RS REITOR Claudino José Meneguzzi Júnior PRÓ-REITORA ACADÊMICA Débora Frizzo PRÓ-REITOR ADMINISTRATIVO Altair Ruzzarin DIRETORA DE EDUCAÇÃO A DISTÂNCIA (NEAD) Lígia Futterleib Desenvolvido pelo Núcleo de Educação a Distância (NEAD) Designer Instrucional Sabrina Maciel Diagramação, Ilustração e Alteração de Imagem Igor Zattera Revisora Ana Clara Garcia INTRODUÇÃO 3 PROJETO DE CIRCUITOS DIGITAIS 4 Álgebra Booleana 6 Portas Lógicas e Circuitos Lógicos 10 Derivação de Expressões Booleanas 18 Simplificação de Expressões 20 Circuitos combinacionais 29 Circuitos sequenciais 33 ESTRUTURA INTERNA DE UM COMPUTADOR – MODELO DE VON NEUMANN 42 Blocos funcionais 45 COMPUTADOR HIPOTÉTICO NEANDER 60 ARQUITETURAS DE ALTO DESEMPENHO 69 3ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES INTRODUÇÃO O estudo da arquitetura e da organização de computa- dores está presente em todos os cursos superiores de ciência da computação, engenharia da computação e afins. Em alguns cursos o seu conteúdo é ministrado em até quatro disciplinas distintas, dado a grande gama de arquiteturas e diferentes formas de organização dos computadores (e também de dispositivos computacionais) atuais. Além disso, estamos diante de uma disciplina fundamental para os cursos superiores tecnológicos, como o presente caso. Dessa forma, podemos pensar: como você pode tornar-se um exímio programador sem conhecer alguns detalhes de onde o seu programa será executado? É muito pertinente conhecer os detalhes de funcionamento do computador, pois levará você a entender quais os limites que seu programa poderá alcançar, ou até mesmo como deixá-lo mais eficiente. Assim como, pro- porcionará importantes critérios que facilitarão o seu estudo de sistemas operacionais. Para tanto, nosso estudo iniciará por uma visão de alto nível do que seria um sistema computacional atual (você verá que o modelo que usamos hoje é bastante antigo). Logo, passare- mos a imergir nos elementos que somados formam um modelo, desde as mais simples portas lógicas até os atuais dispositivos periféricos e os grandes computadores espalhados mundo afora. No primeiro capítulo, teremos uma rápida revisão de ál- gebra booleana, para depois fazermos o estudo da lógica digital mediante o uso de portas lógicas. Com o conhecimento obtido do estudo das portas lógicas passaremos a estudar circuitos combinacionais e sequenciais, que nada mais são que a junção de portas lógicas formando elementos de maior complexidade e diferentes finalidades. Ao final do capítulo, você deverá ser capaz de distinguir circuitos lógicos simples, simplificar expressões booleanas e até mesmo projetar um pequeno circuito lógico. No segundo capítulo, estudaremos o modelo de Von Neumann e seus componentes principais: unidade central de processamento (CPU), a hierarquia de memória e alguns bar- ramentos em conjunto com uma rápida abordagem sobre um dos principais dispositivos periféricos de entrada e saída, os discos rígidos. No terceiro capítulo, estudaremos o funcionamento de um computador hipotético, chamado NEANDER (WEBER, XXXX). Através do simulador desse computador, você irá compreender de forma simples como um programa é executado no seu computador. Finalmente, no último capítulo, abordaremos um pouco sobre as grandes máquinas disponíveis ao redor do mundo e no que elas diferem de nossos computadores do dia a dia. 4ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES PROJETO DE CIRCUITOS DIGITAIS Você sabia que todos os computadores utilizam aritmética binária para realizar suas operações? Desde os mais remotos tempos, o homem sempre buscou formas de resolver cálculos matemáticos o mais rapidamente possível. Como você já deve ter estudado em outras disci- plinas, evoluímos do ábaco chinês, passamos pelo ENIAC e hoje estamos na era da IoT (Internet of Things). Aprendemos e vivemos usando o sistema numérico decimal, e é com este que estamos acostumados em nosso dia a dia. Contudo, quando trabalhamos com dispositivos com- putacionais este sistema não é tão simples de ser utilizado diretamente. Precisamos armazenar ou guardar tal informação de alguma forma nos nossos dispositivos. Então, para cada dígito numérico precisaríamos ter 10 posições possíveis (0-9). Mesmo com a atual tecnologia digital disponível essa não seria uma tarefa simples, motivo pelo qual, em 1952, o matemático húngaro, radicado nos Estados Unidos, John Von Neumann, 5ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES d. dispositivos de entrada e saída, de forma a permitir a entrada de dados e sua respectiva saída. Como mencionado anteriormente, o sistema binário faz parte do coração do modelo de Von Neumann e está presente, praticamente, em todos os sistemas computacionais modernos. Por esse motivo, nosso estudo terá início por uma breve abordagem da álgebra booleana, a qual nos permitirá avançar ao estudo das portas lógicas e posteriormente à formação dos elementos básicos da estrutura de Von Neu- mann, a ULA e a UCP. sugeriu que o sistema binário (0 – 1) fosse utilizado em sistemas digitais, devido a facilidade de identificação dos níveis de eletricidade (0 – ausência e 1 – presença de eletricidade). Além disso, esse mesmo matemático propôs os elementos básicos de um sistema computacional “moderno”: a. uma memória para armazenar dados e programas (os computadores até então não eram capazes de armaze- nar programas); b. uma unidade de cálculos, chamada de ULA – Unidade Lógico Arit- mética, responsável por realizar as operações solicitadas pelo programa. Para tanto, utiliza registradores (ou acumuladores) para armazenar os dados; c. uma unidade de controle, chamada de UCP – Unidade Central de Pro- cessamento, cuja função primordial é comandar o f luxo entre as ins- truções do programa e os dados na memória; 6ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES Álgebra Booleana A álgebra dos números reais (do nosso dia a dia) utiliza infinitos valores para uma determinada variável. A álgebra booleana, por sua vez, utiliza apenas dois valores: • F (Falso) e V (Verdadeiro); • L (Low) e H (High); • 0 e 1 (eletrônica digital). O estudo da álgebra booleana foi iniciado ainda no século XIX e seu nome é uma homenagem a George Boole, ma- temático inglês, introdutor do sistema al- gébrico. Existe uma grande quantidade de teoria matemática desenvolvida na álgebra booleana, porém não é desta disciplina e não será tratada neste capítulo. O aluno que se interessar pode buscar esse conteúdo em diversos livros disponíveis gratuita- mente na internet. Na álgebra booleana existem três operações básicas, sendo que todas as de- mais podem ser derivadas formalmente daquelas: • Operação “OU” (“OR”), também conhecida por soma lógica; • Operação “E” (“AND”), também conhecida por multiplicação lógica, e • Operação “Complementação” (“NOT”), também conhecida por inversão ou negação. Assim, como cada variável na álge- bra booleana sempre irá assumir um dos dois possíveis valores (0 ou 1), para cada função ou equação algébrica também é possível montar uma tabela que decompõe a função em termos de suas variáveis (va- riáveis de entrada). Além disso, demonstra os possíveis resultados (variável de saída), tendo por base cada uma dessas combina- ções de variáveis. Dessa forma, tal tabela é chamada de “Tabela Verdade”. Logo, para a montagem da “Tabela Verdade” de operações simples, teremos tantas colunas quantas variáveis de en- trada, além de uma coluna extra com o resultado da operação. As linhas, por sua vez, serão geradas de acordo com o número de diferentes combinações das variáveis de entrada. Por exemplo, se a expressão envolver duas variáveis de entrada teremos quatro linhas na tabela verdade. Com três variáveis de entrada teremos oito linhase assim por diante. Lembre-se que estamos trabalhando com álgebra booleana, assim, o número de linhas sempre seguirá a exponenciação em base 2: 2 nº linhas = nº linhas na tabela verdade Operação “OU” - (“OR”) A operação “Ou” pode ser resumi- da da seguinte forma: “A operação OU resulta 1 (verdadeiro) se pelo menos uma das entradas da operação tiver o valor 1 (verdadeiro)”. Ou ainda, “a operação OU resulta 0 (falso) quando todas as suas en- 7ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES tradas tiverem o valor 0 (falso) ”. O símbolo comumente utiliza- do para representar a operação “ou” em equações/expressões algébricas é “+” ou ainda “v”. A operação deve ser realizada no mínimo com duas entradas (podem ser iguais). Sua tabela verdade para duas va- riáveis, A e B (lê-se A “ou” B), pode ser visualizada a seguir: Ou ainda com três variáveis, A, B e C (lê-se A “ou” B “ou” C): A operação “ou” também é conhe- cida por “soma lógica”. Operação “E” - (“AND”) A operação “E” pode ser resumida da seguinte forma: “A operação E resulta 0 (falso) se pelo menos uma das entradas da operação tiver o valor 0 (falso) ”. Ou ainda, “a operação E resulta 1 (verdadeiro) quando todas suas entradas tiverem o valor 1 (verdadeiro). O símbolo comumente utilizado para representar a operação “e” em equa- ções/expressões algébricas é “.” , ou ainda “^”. A operação deve ser realizada no míni- mo com duas entradas (podem ser iguais). Assim, sua tabela verdade para duas variáveis, A e B (lê-se A “e” B), pode ser logo visualizada: A B A . B 0 0 0 0 1 0 1 0 0 1 1 1 Ou ainda com três variáveis, A, B e C (lê-se A “e” B “e” C): A B C A . B . C 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 0 1 0 0 0 1 0 1 0 1 1 0 0 1 1 1 1 A B A + B 0 0 0 0 1 1 1 0 1 1 1 1 A B C A + B + C 0 0 0 0 0 0 1 1 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 1 0 1 1 1 1 1 8ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES A operação “e” também é conhecida por “multiplicação lógica”. Operação “Negação” - (“NOT”) A operação “Negação”, complemen- tação (complemento) ou ainda inversão (inverso), nada mais é que a troca do valor “0” pelo valor “1” e vice-versa. Assim, por receber apenas um único operando, cha- mam-na de operação unária. Também, diversos símbolos podem ser usados para representar tal operação, a depender do campo de atuação (progra- mação, eletrônica digital, lógica, etc.). Os mais comuns são: “~”, “ ´ ”, “!” ou “¯”. Sua tabela verdade pode ser expressa de maneira muito simples: A A’ (~A) 0 1 1 0 Leis e propriedades Para que possamos desenvolver nos- so estudo de álgebra booleana temos que conhecer algumas leis e propriedades bási- cas, muitas delas já conhecidas da álgebra dos números reais. Para a operação “ou”: • A + 0 = A • A + 1 = 1 • A + A = A • A + A’ = 1 Para a operação “e”: • A . 0 = 0 • A . 1 = A • A . A = A • A . A’ = 0 Para a operação “negação”: • A’’ = A (dupla negação) Todas as propriedades anteriores são facilmente verificadas por meio das tabelas verdade das respectivas opera- ções. Contudo, é importante que você as memorize, pois serão necessárias mais a frente, quando tratarmos de simplificação de expressões booleanas. Além dessas propriedades básicas, temos ainda a associatividade e a comuta- tividade. A primeira diz respeito à forma de agrupar as variáveis em uma equação com mais de uma operação, enquanto a segunda nos diz que a ordem dos fatores não altera o resultado da equação. Ambas podem ser facilmente compreendidas, pois também existem na álgebra dos números reais. Para auxiliar seguem seus exemplos com as operações “ou e “e”: • A + (B + C) = (A + B) + C (asso- ciatividade) • A . (B . C) = (A . B) . C (associa- 9ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES tividade) • A + B = B + A (comutatividade) • A . B = B . A (comutatividade) Outra propriedade existente na ál- gebra dos números reais decimais e que também está presente na álgebra booleana é a distributividade da multiplicação (lógi- ca) com relação à adição (lógica). Ou seja: A . (B + C) = (A . B) + (A . C) Para o estudo da álgebra booleana, duas outras regras são de suma importân- cia, são as leis ou teoremas de De Morgan, criadas ainda no século XIX. Esses teore- mas não são utilizados apenas na álgebra booleana, mas também em proposições de raciocínio lógico, na programação, na matemática e na filosofia. No que tange à algebra booleana, tais teoremas dizem o seguinte: a negação de um produto lógico (“E”) de variáveis é igual à soma lógica (“OU”) das negações das variáveis. Por outro lado, a negação de uma soma lógica (“OU”) de variáveis é igual ao produto lógico (“E”) de negações das variáveis. Ou seja, tais teoremas permi- tem converter operações “E” em operações “OU” e vice-versa, utilizando operações de negação. Ou seja, em termos de equações com duas variáveis teríamos: (A . B)’ = A’ + B’ (A + B)’ = A’ . B’ Com três variáveis teríamos: (A . B . C)’ = A’ + B’ + C’ (A + B + C)’ = A’ . B’ . C’ Avaliando expressões Avaliar uma expressão booleana nada mais é que determinar o valor daque- la expressão para cada uma das possíveis combinações de valores das suas variáveis de entrada. Nas seções anteriores já vimos como fazer isso! Basta montarmos a tabela verdade da equação sob análise. Fizemos o mesmo para as operações básicas e faremos o mesmo procedimento para as equações/ expressões. Contudo, antes de montarmos a ta- bela verdade, precisamos ter em mente a precedência das operações. As expressões são sempre avaliadas a partir do parêntesis mais interno. Além disso, a multiplicação lógica tem precedência sobre a adição, ou seja, sempre que não há um parêntesis determinando a ordem da operação, de- vemos resolver as multiplicações lógicas (“E”), para depois avaliarmos as adições lógicas (“OU”). Com relação à negação, ela deve ser resolvida o mais rápido possível. Ela tem precedência sobre as demais operações. É claro que se a negação for aplicada a uma sub-expressão entre parêntesis, essa deverá ser resolvida antes da aplicação da negação. Tendo por base o que já foi exposto, a montagem da tabela verdade é feita de modo semelhante ao que foi feito anterior- 10ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES mente. O número de linhas na tabela será dado pelo número de variáveis de entrada, usando a exponenciação de base 2, ou seja, 2n, onde n é o número de variáveis. O número de colunas da tabela ver- dade dependerá do número de variáveis, sub-expressões e complementos existentes na função algébrica. À esquerda, criaremos uma coluna para cada variável de entrada e à direita deixaremos uma coluna para o resultado final da função (variável de saída). Entre as colunas da entrada e da saída, criaremos tantas colunas quantas sub-expressões encontrarmos, além de eventuais variáveis negadas. Por exemplo, suponha a equação W = X + Y . Z’. A variável “W” nada mais é que o resultado da função, ou seja, nossa variável de saída. Para ela, deixaremos a coluna mais à direita em nossa tabela verdade. As demais variáveis, “X”, “Y” e “Z” são as nossas variáveis de entrada e deixaremos as três primeiras colunas reservadas a elas. Como não temos parên- tesis podemos partir para a avaliação dos complementos, multiplicações e adições, assim, nessa ordem. Como temos a variável Z’ (complemento de Z), deixamos uma coluna para esse resultado. Após, temos que avaliar a multiplicação Y . Z’ (Y “E” Z’). Finalmente, com o resultado da mul- tiplicação, faremos a soma lógica com X. O número de linhas desta tabela verdade será igual a oito, pois temos 3 variáveis de entrada (23 = 8). Note que poderíamos ocultar a colu- na com o rótulo X+ (Y.Z’), pois é equiva- lente à variável de saída “W”. Nas próximas tabelas não mais colocaremos essa coluna. Portas Lógicas e Circuitos Lógicos Nas seções anteriores, vimos que uma expressão booleana pode ser detalha- da e resolvida através da montagem de sua respectiva tabela verdade.Uma expressão booleana também pode ser representa- da de forma gráfica, através de símbolos que representam as operações básicas e linhas (“fios”) que conectam as variáveis e resultados às operações. À esquerda dos símbolos temos as entradas (fio de entra- da) e à direita temos a(s) saídas, ou seja, o resultado lógico daquela operação. Esses símbolos são conhecidos como portas lógi- cas. Essas mesmas portas lógicas também são utilizadas para representar circuitos eletrônicos, abstraindo detalhes de sua implementação física. Nesses circuitos, o valor lógico 1 é representado por uma voltagem positiva (geralmente 3,3V ou 5V) e o valor lógico 0 pela ausência de voltagem (0V). As portas lógicas das três operações básicas, “OU”, “E” e “Complemento” po- X Y Z Z’ Y.Z’ X+(Y.Z’) W 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1 1 0 1 1 0 0 0 0 1 0 0 1 0 1 1 1 0 1 0 0 1 1 1 1 0 1 1 1 1 1 1 1 0 0 1 1 11ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES dem ser visualizados nas figuras a seguir: Porta lógica OU de duas entradas Porta lógica E de duas entradas Porta lógica Inversor (“Complemento”) As portas lógicas com mais entradas (variáveis) têm o mesmo símbolo gráfico, apenas acrescentamos um novo fio do lado esquerdo da porta lógica, com o respectivo nome da entrada adicionada. De posse do conhecimento destas três portas lógicas, podemos iniciar a cons- trução de expressões de forma gráfica. Desse modo, do processo de construir tais expressões, surgem os circuitos lógi- cos, que nada mais são que um conjunto de portas lógicas e conexões entre elas, de forma a expressar uma determinada função booleana. A construção do circuito lógico ocorre da mesma forma que a avaliação da expressão booleana, ou seja, precisamos ter em mente a precedência das operações. As expressões são sempre avaliadas a partir do parêntesis mais interno. Além disso, a multiplicação lógica tem precedência sobre a adição, ou seja, sempre que não há um parêntesis determinando a ordem da ope- ração, devemos resolver as multiplicações lógicas (“E”), para depois avaliarmos as adições lógicas (“OU”). O primeiro passo nessa construção é verificar a quantidade de variáveis de entrada. Para cada uma delas, criamos 12ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES um rótulo com seu nome à esquerda do circuito e traçamos um fio para a direita (uma linha simples). Para cada variável negada, conectamos à entrada do inversor o fio da variável e seguimos com o fio para a direita, a partir da saída do inversor. Posteriormente, para cada sub-ex- pressão, na sua respectiva ordem, conec- tamos as entradas necessárias na porta lógica correspondente, mediante a utili- zação dos fios (linhas) disponíveis e, na saída da porta lógica, seguimos com fios para a direita. Para o exemplo da expressão da se- ção anterior W = X + Y . Z’ teríamos os seguintes passos: 1. Desenhamos os rótulos das três va- riáveis X, Y e Z à esquerda e traça- mos os seus fios para a direita; 2. Conectamos um inversor na variável Z e traçamos a continuidade do fio relativo a Z’ para a direita; 3. Como não temos parêntesis, resol- vemos as operações “E” e depois as operações “OU”; 4. Usamos uma porta E para a ex- pressão Y . Z’, conectando as duas entradas da porta E aos fios de Y e de Z’. Na saída dessa porta fazemos o prolongamento de um fio para a direita; 5. Finalmente, conectamos o fio criado em 4 a uma das entradas de uma porta OU e o fio relativo à variável X na outra entrada da porta OU. Com isso, temos o resultado final na saída dessa porta. Além das três portas lógicas já men- cionadas, outras duas são importantes na eletrônica digital, devido às questões de implementação física das portas em chips. A primeira delas é a porta NAND. Ela executa a negação da operação “E” (“AND”), ou seja, é equivalente à expressão (A . B)́ . Seu nome é a junção dos termos em inglês das duas operações: NOT + AND. Sua tabela verdade pode ser visu- alizada a seguir: A B (A . B)’ 0 0 1 0 1 1 1 0 1 1 1 0 Graficamente, é semelhante à jun- ção de uma porta “E” (“AND”) e um in- versor em sua saída. Porta NAND de duas entradas 13ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES Para a porta OU temos também sua negação. É a porta NOR. Ela executa a negação da operação “OU” (“ORG”), ou seja, é equivalente à expressão (A + B)́ . Seu nome é a junção dos termos em inglês das duas operações: NOT + OR. Sua tabela verdade pode ser visualizada a seguir: A B (A + B)’ 0 0 1 0 1 0 1 0 0 1 1 0 Em gráfico, é semelhante à junção de uma porta “OU” (“OR”) e um inversor em sua saída. Porta NOR de duas entradas Por fim, temos mais uma porta lógi- ca de extrema importância na computação: a porta XOR, também conhecida pelo nome “ou-exclusivo”. Em termos de função booleana, com duas variáveis, ela equivale à seguinte ex- pressão: (A + B) . (A . B)’ O símbolo comumente utilizado para representar a operação “XOR” em equações/expressões algébricas é “⊕”. A operação deve ser realizada no mínimo com duas entradas (podem ser iguais). Sua tabela verdade para duas vari- áveis, A e B (lê-se A “XOR” B), pode ser visualizada abaixo: Porta XOR de duas entradas A porta XOR tem o mesmo com- portamento da operação de soma biná- ria na representação de complemento de dois, desprezando o “vai-um” ou “carry out”. Ou seja, ela pode ser utilizada para construir circuitos que realizam soma em computadores. Outra utilização muito comum da operação XOR é como geradora de pari- dade par. A título de curiosidade, a pari- dade é uma forma básica de tolerância com falhas, sendo capaz de detectar alterações de conteúdo armazenados ou transmitidos de forma binária. Mas, como isso é feito? Primeiramente, estabelecemos uma regra: qualquer informação a ser armazenada deverá ter um número PAR de “1”. Com essa regra, olhamos para a informação a ser armazenada buscando verificar a quan- tidade de “1” existente. Se for um núme- ro ímpar, armazenamos uma informação A B A ⊕ B 0 0 0 0 1 1 1 0 1 1 1 0 14ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES extra “1”. Se for um número par, então, armazenamos uma informação extra “0”. Note que este comportamento da paridade é exatamente o que faz a função XOR, conforme tabela verdade anterior. Pense em “A” e “B” como a informação que precisamos armazenar e a coluna de resul- tado sendo exatamente a paridade, a qual irá garantir que os dados estão íntegros. A função XOR também é de grande utilidade na área da criptografia, por ser um cifrador e decifrador rápido e de baixo custo. Tal decifrador permite criptografar (“embaralhar”) uma informação, tendo por base, por exemplo, uma senha, e descrip- tografar (“desembaralhar”) a informação criptografada com a mesma senha. Olhe para a tabela verdade e pense que “A” é a informação a ser criptografada, “B” é a senha e o resultado da operação é a informação (“A”) criptografada. Agora, olhe ao contrário, ou seja, o resultado da operação é a informação que você quer descriptografar e “B” é a senha. Note que o resultado dessa nova operação XOR é exatamente a informação original que es- tava em “A”. É claro que essa tabela verdade tra- balha com um único bit. Atualmente, as senhas utilizadas possuem 64 ou 128 bits (ou mais). Entretanto, a operação XOR funciona da mesma forma para 1, 64, 128 ou 1024 bits. Vamos exercitar o que estudamos até aqui? Então... Dicas importantes: para os exercícios de álgebra booleana e seguintes, você pode utilizar o software MMLogic, disponível para download em (http://www.softronix. com/logic.html). Você poderá desenhar os circuitos lógicos e testá-los para validar, inclusive, as tabelas verdade dos exercícios. 1. Desenvolva a tabela verdade para as seguintes expressões booleanas: b. A . B . C + (A . B . C)’ c. (A + B) (A + C)’ (A’ xor B)’ d. A + (B’ + A . C)’ xor D’ 5. Considerando os valores binários abaixo, calcule o valor de X em cada um dos casos: A = 1011 B = 1110 C = 0011D = 1010 a. a) X = A . (B xor C) b. b) X = ( ( A + (B’ xor D)’ ) . (C’ + A) + B ) . (A + B)’ c. c) X = A xor B + C’ . B + A’ 3. Desenhe o diagrama lógico (circuito lógico) correspondente as expressões dos exercícios 1 e 2. 4. Construa a expressão lógica correspondente aos seguintes diagramas: 5. Um computador deve adicionar um bit de paridade a caracteres codificados em ASCII em 7 bits. Acrescente o bit de paridade para obter: a. paridade par, no caractere 1001101 b. paridade ímpar, no caractere 1101101 c. paridade ímpar, no caractere 1001101 d. paridade ímpar, no caractere 1101101 6. Indique duas utilidades da porta XOR. Cálculo da paridade, soma sem carry. 7. Monte a tabela verdade das seguintes equações booleanas. a. F = ab + cd + abc b. F = abc . (bc + ab)’ c. F = ( ab + ( ac + bc ) ’ ) ’ d. F = ( (a + ( bc )’ ) . ( ( ab + c )’ ) )’ 18ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES Derivação de Expressões Booleanas Nas seções anteriores aprendemos como devemos proceder para avaliar uma função booleana e como representá-la de forma gráfica. No entanto, devemos lem- brar que na vida real nem sempre teremos uma função booleana pronta para imple- mentar. Na maioria das vezes é exatamen- te o contrário! Ou seja, sabemos quantas entradas existirão em nosso circuito (ou em nossa equação) e sabemos, para cada uma das combinações das entradas, qual será o valor da saída. Esse é o nosso desafio agora! Como devemos escrever a expressão booleana que representa essa nossa entrada e saída? Como em uma função booleana ape- nas podemos ter duas saídas possíveis para cada uma das combinações da entrada, assim, podemos optar por verificar todas as combinações de entradas que geram uma saída igual a “1”, ou verificar todas as entradas que geram uma saída igual a “0”. No primeiro caso, temos o método da soma de produtos (SdP), onde somente estaremos interessados nas saídas de valor “1”. No segundo caso, temos o método do produto de somas (PdS), onde somente estaremos interessados nas saídas de valor “0”. Soma de Produtos Já vimos que numa montagem da tabela verdade de uma função booleana, teremos 2n diferentes combinações (n = número de variáveis de entrada), sendo as linhas na tabela. Para cada uma dessas linhas (combinações) podemos escrever um termo produto, no qual todas as variáveis estarão representadas. A representação desse termo produ- to deve ser construída da seguinte forma: se a variável correspondente na combina- ção tiver o valor “0” ela deverá ser gerada no termo produto de forma negada. Caso contrário, se o valor for “1” ela deverá ser gerada normalmente. Veja o exemplo a seguir, com uma função de três variáveis: Cada termo produto na tabela acima é chamado de mintermo. Para verificar se a construção do mintermo está correta, basta substituir o valor da variável na expressão e resolvê-la. Caso o valor encontrado seja 1, há grandes chances de estar correto. Por exemplo, em A’.B’.C’ teríamos 0’.0’.0’ ou 1.1.1 = 1. Tendo construídos os mintermos, basta verificar o valor de saída para cada uma das combinações. Aquelas que forem igual a 1, terão o seu mintermo levado para a expressão booleana final. Caso ocorra mais de uma combinação na expressão, A B C Termo Produto (Mintermo) 0 0 0 A’.B’.C’ 0 0 1 A’.B’.C 0 1 0 A’.B.C’ 0 1 1 A’.B.C 1 0 0 A.B’.C’ 1 0 1 A.B’.C 1 1 0 A.B.C’ 1 1 1 A.B.C 19ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES todas elas deverão ser unidas por opera- ções “OU”. Suponha então que para a função da tabela acima, tivéssemos as seguintes saídas: Os mintermos associados aos valores de W = 1 são apenas os 4 acima indica- dos em verde. Ou seja, são os mintermos A’.B.C’, A’.B.C, A.B’.C e A.B.C’. Basta, agora, unirmos estes min- termos com operações “OU” e teremos nossa função booleana. Os símbolos das operações “E” podem ser omitidos para facilitar a visualização. A’BC’ + A’BC + AB’C + ABC’ Produto de Somas A construção de uma expressão através do produto de somas funciona de maneira oposta àquilo que vimos na construção da soma de produtos. Não te- mos mais a representação das variáveis em termo produto, mas sim em termos soma. Sua construção ocorre da seguinte forma: se a variável correspondente na combinação tiver o valor “1” ela deverá ser gerada no termo produto de forma negada. Caso contrário, se o valor for “0” ela deverá ser gerada normalmente. Veja o exemplo abaixo, com uma função de três variáveis: Cada termo soma na tabela acima é chamado de maxtermo. Para verificar se a construção do maxtermo está cor- reta, basta substituir o valor da variável na expressão e resolvê-la. Caso o valor encontrado seja 0, há grandes chances de estar correto. Por exemplo, em A’.B’.C’ teríamos 1’+1’+1’ ou 0+0+0 = 0. Tendo construídos os maxtermos, basta então verificar o valor de saída para cada uma das combinações. Aquelas que forem igual a 0, terão o seu maxtermo levado para a expressão booleana final. Caso ocorra mais de uma combinação na expressão, todas elas deverão ser unidas por operações “E”. A B C Termo Produto (Mintermo) W 0 0 0 A’.B’.C’ 0 0 0 1 A’.B’.C 0 0 1 0 A’.B.C’ 1 0 1 1 A’.B.C 1 1 0 0 A.B’.C’ 0 1 0 1 A.B’.C 1 1 1 0 A.B.C’ 1 1 1 1 A.B.C 0 A B C TermoSoma(Maxtermo) 0 0 0 A+B+C 0 0 1 A+B+C’ 0 1 0 A+B’+C 0 1 1 A+B’+C’ 1 0 0 A’+B+C 1 0 1 A’+B+C’ 1 1 0 A’+B’+C 1 1 1 A’+B’+C’ 20ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES Então, suponha que para a função da tabela anterior, tivéssemos as seguintes saídas: Os maxtermos associados aos valo- res de W = 0 são apenas os 4 acima indica- dos em verde. Ou seja, são os mintermos A+B+C, A+B+C’, A’+B+C e A’+B’+C’. Basta agora unirmos estes maxter- mos com operações “E” e teremos nossa função booleana. (A+B+C).(A+B+C’).(A’+B+C).(A’+B’+C’) Note que no produto de somas, obri- gatoriamente, precisamos de parêntesis em cada uma das somas! (Por quê?) Simplificação de Expressões Você pode ter percebido que as ex- pressões geradas pelas somas de produto ou produto de somas sempre possuem em cada um de seus termos todas as variáveis da equação. Essas expressões, geralmente, não são as ideais para implementação com portas lógicas, pois consomem um grande número das mesmas. Dessa forma, temos sempre que ten- tar minimizar o número de sub-expressões ou o número de variáveis em cada uma das sub-expressões. Estudaremos duas aborda- gens: a fatoração e os mapas de Karnaugh. Fatoração A primeira abordagem que podemos optar é aplicar as leis e propriedades que estudamos nos capítulos anteriores, além de algumas outras que trataremos agora. Tal técnica é conhecida por fatoração. Apenas para relembrar, tínhamos: • Identidades – A + 0 = A – A + 1 = 1 – A + A = A – A + A’ = 1 – A . 0 = 0 – A . 1 = A – A . A = A – A . A’ = 0 – A’’ = A (dupla negação) • Comutatividade – A + B = B + A – A . B = B . A A B C Termo Produto (Mintermo) W 0 0 0 A+B+C 0 0 0 1 A+B+C’ 0 0 1 0 A+B’+C 1 0 1 1 A+B’+C’ 1 1 0 0 A’+B+C 0 1 0 1 A’+B+C’ 1 1 1 0 A’+B’+C 1 1 1 1 A’+B’+C’ 0 21ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES • Associatividade – A + (B + C) = (A + B) + C – A . (B . C) = (A . B) . C • Distributividade – A . (B + C) = (A . B) + (A . C) • Teoremas de De Morgan – (A . B . C)’ = A’ + B’ + C’ – (A + B + C)’ = A’ . B’ . C’ No que tange à distributividade, ainda temos uma outra propriedade não existente na álgebra convencional: é a dis- tributividade da soma lógica em relação à multiplicação lógica: A + (B . C) = (A + B) . (A + C) Além dessas temos a absorção: • A + (A.B) = A • A . (A+B) = A Apenas para fins didáticos, vamos demonstrar rapidamente como aplicar as leis e propriedades anteriores na simpli- ficação da expressão algébrica correspon- dente à absorção: 1. A + (A . B) a. A + (A . B) → Aplicamos a dis- tributividade (ou termo em co- mum) para chegarmos no passo b abaixo b. A . (1 + B) → Aplicamos a iden- tidade da adição lógica (X + 1 = 1) c. A. (1) → Aplicamos a identidade da multiplicação lógica (X . 1 = 1) d. A 2. A . (A + B) c. A . (A + B) → Aplicamos a dis- tributividade (ou termo em co- mum) para chegarmos no passo b abaixo d. A.A + A.B → Aplicamos a iden- tidade da multiplicação lógica (A. A = A) e. A + A.B → Chegamos na mes- ma expressão do item 1 anterior (basta aplicar a mesma sequência de fatoração) f. A Temos mais duas importantes pro- priedades: A + A’.B = A + B (A+B). (A+C) = A + B.C Vamos fazer a fatoração destas duas identidades, apenas para fins didáticos: 1. A + A’.B a. A + A’.B → Termo em comum b. (A+A’) . (A+B) → Identidade da soma lógica 22ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES c. 1 . (A + B) → Identidade da mul- tiplicação lógica d. A + B 2. (A+B) . (A+C) a. (A+B) . (A+C) → Distributiva b. A.A + A.C + B.A + B.C → Co- mutativa c. A.A + A.C + A.B + B.C → Iden- tidade da multiplicação d. A + A.C + A.B + B.C → Termo em comum e. A + A . (C + B) + B.C → Termo em comum f. A . (1 + (C + B)) + B.C → Iden- tidade da adição g. A . (1) + B.C → Identidade da multiplicação h. A + B.C Como último exemplo, vamos fa- torar a seguinte equação (omitimos os símbolos da operação “E”): S = ABC + AC’ + AB’ 1. ABC + AC’ + AB’ a. A (BC + C’ + B’) → Fator co- mum b. A (BC + (C’ + B’) ) → Asso- ciativa c. A (BC + (CB)’ ) → De Morgan d. A (BC + (BC)’ ) → Comutativa e. A (1) → Identidade da adição (X + X’ = 1) f. A Pense agora na implementação em termos de circuito lógico. Como ficaria? Qual seria mais simples? Mapas de Karnaugh A segunda forma de simplificar- mos uma expressão algébrica é baseada em uma identificação tabular de mintermos, de acordo com uma ordem pré-definida em tabelas conhecidas por diagramas ou mapas de Karnaugh. Os mapas de Karnaugh nada mais são que tabelas verdade, agrupadas de forma a manter uma sequência tal das variáveis, a fim de que os respectivos va- lores sejam modificados em apenas um dos algarismos. Em uma expressão com apenas duas variáveis, a premissa anterior é facilmente obtida por meio do mapa a seguir: 23ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES Mapa de Karnaugh para duas va- riáveis. Fonte: GUNTZEL 2005. Note que os valores da variável “A” estão dispostos nas linhas da tabela e, entre as duas linhas dela apenas um algarismo é modificado. Na primeira linha temos “A=0” e na segunda linha “A=1”. O mesmo ocorre com a variável “B”, disposta nas colunas, onde apenas um algarismo é modificado entre as duas colunas. Na primeira coluna temos o valor “B=0” e na segunda coluna “B=1”. Por outro lado, com três variáveis a organização do mapa de Karnaugh é um pouco distinta, mas a premissa continua sendo respeitada: Mapa de Karnaugh para três variáveis. Fonte: GUNTZEL 2005. Nas linhas do mapa de Karnaugh, com três variáveis, continuamos com os valores da variável “A”. Nas colunas, por sua vez, precisamos acomodar as variáveis “B” e “C”. Dessa forma, precisaremos de 4 colunas para representar todos os valores possíveis. Nesse caso, note que a premissa anterior está assegurada: somente ocorre uma única mudança de algarismo entre dois valores adjacentes (00 01 11 10). Finalmente, em um mapa de Kar- naugh para quatro variáveis distintas, pre- cisaremos também de 4 linhas, de forma a acomodar os 4 valores distintos para as combinações possíveis de “A” e “B”. Note, pela figura a seguir, que nossa premissa de alteração de apenas um único algarismo continua válida, seja nas linhas, seja nas colunas. Mapa de Karnaugh para quatro variáveis. Fonte: GUNTZEL 2005. Já vimos como estruturar as linhas e colunas dos diagramas de Karnaugh. Mas, como preencher o conteúdo de cada uma das células? Como nas linhas e colu- nas temos os valores possíveis para cada uma das variáveis, basta agora olhar para a tabela verdade e preencher cada uma das células com o respectivo valor da função. Nas figuras anteriores já foi infor- mado previamente qual mintermo deve ser informado em cada uma das células, con- siderando que as linhas da tabela verdade 24ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES fossem numeradas a partir do número 0. Dessa forma, o mintermo m0, refere-se ao valor da primeira linha da tabela verdade, o mintermo m1 ao valor da segunda linha da tabela verdade, e assim por diante, con- forme a seguinte tabela verdade (apenas para três variáveis). Montando o diagrama da Karnaugh para essa tabela verdade teríamos: Finalizada a montagem do mapa/ diagrama de Karnaugh, podemos passar a etapa de simplificação da expressão bo- oleana. O que precisa ser feito nessa etapa é agrupar TODOS os mintermos com valor igual a 1, que sejam adjacentes, em quadras, pares e mintermos isolados. O agrupamento deve ser feito nessa ordem, para que a expressão possa ser simplificada ao máximo. Não devemos deixar nenhum mintermo 1 sem ser considerado. É impor- tante ressaltar que um mesmo mintermo 1 pode pertencer a mais de um agrupamento. A ideia básica por trás destes agru- pamentos é identificar variáveis que se mantenham constantes em mintermos de valor 1 adjacentes, já que elas são deter- minantes no resultado daquele mintermo. Ora, se o valor da função manteve-se em “1” nos mintermos adjacentes, mesmo com uma variável sendo alterada, esta variável não precisa estar na sub-expressão (ela não interfere no resultado). No exemplo anterior, podemos iden- tificar dois pares de mintermos 1 adjacente (não podemos considerar as diagonais) e um mintermo isolado. Não existem qua- dras (quatro mintermos 1 adjacente). A identificação das quadras pode ser feita levando em consideração as bordas. Ou seja, você pode juntar as bordas laterais e as bordas superior e inferior. Após a identificação das quadras, pares e mintermos 1 isolados, precisa- mos montar a expressão final, simplifi- cada pelo diagrama. A ordem aqui não tem importância, pela regra da comuta- tividade. Assim, começaremos pelo min- termo 1 isolado. Poderíamos verificar a qual mintermo ele se refere através das tabelas que montamos anteriormente, ou seja, chegaríamos à conclusão que ele se refere ao m5 que, por sua vez, refere-se à expressão A.B’.C. Para evitar a necessidade de decorar tais informações, vamos usar a seguinte regra: verifique nos rótulos das colunas e das linhas envolvidas quais va- riáveis não tiveram seus valores alterados. A B C Termo Produto Mintermo W 0 0 0 A’.B’.C’ m0 0 0 0 1 A’.B’.C m1 0 0 1 0 A’.B.C’ m2 1 0 1 1 A’.B.C m3 1 1 0 0 A.B’.C’ m4 0 1 0 1 A.B’.C m5 1 1 1 0 A.B.C’ m6 1 1 1 1 A.B.C m7 0 25ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES Para essas variáveis monte o produto entre elas, complementando aquelas cujo valor seja 0 e mantendo as demais na forma ori- ginal. Desse modo, também chegaríamos à mesma expressão, pois o valor de A é “1”, o valor de B é “0” e o valor de C também é “1”, resultando em A.B’.C. Seguimos a análise para os dois pares encontrados, iniciando pelo par na horizontal. Esse par está na linha em que o valor de A é “0”, o valor de B é “1” nas duas colunas e o valor de C varia de “1” para “0”. Pela regra acima, concluímos que apenas A e B não tiveram alteração de valor e são essas as variáveis determinantes para tal parte da expressão. Como o valor de A é “0” neste par, teríamos: A’.B. O próximo par, na vertical, está na coluna em que B tem o valor “1” e C tem o valor “0”. O valor de A, por sua vez, variou de “0” para “1”. Pela mesma regra, temos que apenas B e C comporão essa parte da expressão. Temos, então, B.C’. Finalmente, como estamos traba- lhando com soma de produtos, basta unir- mos todas as expressões encontradas pela operação “OU”. A.B’.C + A’B + B.C’ Perceba que a expressão simplifi- cada, gerada pelo mapa de Karnaugh é muito mais simples que aquela gerada pela simples soma de produtos (A’BC’ + A’BC + AB’C + ABC’). Como exercício, experimente fatorar (usando as leis e propriedades) a expressão A’BC’ + A’BC + AB’C + ABC’ e veja se vocêchega a mesma simplificação obtida pelo mapa de Karnaugh. Para expressões com quatro vari- áveis, o mecanismo de simplificação é o mesmo, porém temos que considerar antes das quadras a existência de oitavas, ou seja, oito mintermos 1 adjacentes. Sempre lembre que a adjacência pode ocorrer nas bordas do diagrama de Karnaugh. Por exemplo, suponha a tabela ver- dade que segue: 26ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES Transpondo a tabela verdade para o diagrama de karnaugh com 4 variáveis temos: O próximo passo é encontrar as oi- tavas, quadras, pares e termos isolados, de forma a não deixar nenhum mintermo 1 não coberto. Pelo diagrama anterior, temos uma oitava, uma quadra e um par. Por fim, temos que analisar em cada agrupamento quais variáveis não tem seu valor alterado para formar as sub-expressões. No caso, para a oitava temos que o valor de A, B e C são modificados ao longo da mesma e os valores de D são os únicos que se mantêm. No caso, o valor de D é “1” e a sub-expressão relativa à oitava é “D”. Temos uma quadra em que o valor de A é fixo em “1” e o valor de C fixo em “0”. Assim, a respectiva sub-expressão é A.C’. Por fim, temo um par, onde o valor de A e B são fixos em “0” e o valor de C fixo em “1”. Portanto, temos A .́B .́C. A expressão final simplificada é ob- tida pela junção das sub-expressões com a operação “OU”: D + AC’ + A´B´C. A B C D W 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 1 1 0 1 0 0 0 0 1 0 1 1 0 1 1 0 0 0 1 1 1 1 1 0 0 0 1 1 0 0 1 1 1 0 1 0 0 1 0 1 1 1 1 1 0 0 1 1 1 0 1 1 1 1 1 0 0 1 1 1 1 1 Vamos exercitar o que estudamos até aqui? Então... 1. Simplifique as seguintes expressões usando as leis da álgebra: a. a) Y = A . B . C + (A . B . C)’ b. b) Y = ((A.A)’.(B.B)’)’ c. c) Y = ((A.B)’.(A.B)’)’ d. d) Y = ABC . (BC+AB)’ e. e) S = (X’+X’.Y).(X+Y’).(X’.Y)’ f. f) Y = A.B.C.D + A.B.C.D’ 2. A partir das tabelas verdade, desenvolva e simplifique as expressões usando mapas de Karnaugh. 29ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES Circuitos combinacionais Até o presente momento, todas as expressões booleanas que trabalhamos geravam circuitos razoavelmente sim- ples. As saídas (ou saída) desses circuitos sempre eram determinadas tão somente pelos valores das respectivas variáveis de entrada. Tanto é verdade que as tabelas verdade continham apenas colunas com os valores das variáveis de entrada e uma coluna para a variável de saída. Tais cir- cuitos são ditos combinacionais, visto que são resultado direto da combinação das variáveis de entrada. Nesse modelo de circuito não existe nenhum tipo de memória ou de armaze- namento, pois são sempre construídos com portas lógicas simples, sem realimentação, ou seja, a saída de determinada porta ló- gica nunca é utilizada como entrada dela mesma. Dessa maneira, esse tipo de circuito combinacional gera os primeiros elementos de maior porte em um sistema compu- tacional, entre os quais podemos citar o multiplexador, o decodificador e a unida- de lógico aritmética. Sendo essa última responsável por todos os cálculos em um processador. São esses circuitos especiais que passaremos a analisar a partir de agora. Multiplexador O multiplexador nada mais é que um seletor. Ou seja, ele é capaz de selecio- nar um dos valores da entrada é copiá-lo para a saída. Logo, a seleção de qual dos valores será copiado na saída é feita atra- vés de uma entrada adicional, um sinal de controle chamado de seletor ou linha de seleção. Um multiplexador, em termos de circuito lógico e tabela verdade, possui m entradas e uma única saída. Por exemplo, 8 (m) entradas e uma saída. Esse multi- plexador é chamado 8-para-1. (8 entradas, 1 saída). De uma maneira geral, temos: Observe que sempre temos uma re- lação direta entre o número de entradas e o número de linhas de seleção ou sele- tores, obedecendo a relação de √m. Ou seja, para um multiplexador de 4 entradas precisamos de 2 seletores (22 = 4), para 8 entradas, 3 seletores (23 = 8) e assim por diante. Em termos de programação o mul- tiplexador é equivalente a estrutura “case” ou “switch/case”: case seleção of 0: saída := entrada0; 1: saída := entrada1 .. m: saída := entradam Multiplexador Num. Entradas Núm. Linhas Seleção 2-para-1 2 1 4-para-1 4 2 8-para-1 8 3 16-para-1 16 4 30ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES Para um multiplexador de duas en- tradas teríamos a tabela verdade adiante. Lembre que para duas entradas precisamos de um único seletor. Ou seja, serão três colunas da tabela verdade representando variáveis de entrada (duas entradas e o seletor) e uma coluna para a saída. Perceba, pela tabela verdade, que sempre que o seletor (sel) está em “0” a saída (s) é exatamente o valor da entrada0 (a). Sempre que o seletor está em “1” a saída (s) é igual ao valor da entrada1 (b). Construindo a expressão boolea- na através da soma de produtos (a’.b.sel + a.b’.sel’ + a.b.sel’ + a.b.sel) e realizando a simplificação chegamos a: a.sel’ + b.sel, cujo circuito lógico seria, então: Circuito lógico multiplexador 2-para-1 Contudo, como o multiplexador possui uma função própria bem estabe- lecida, conforme visto antes, utilizamos um símbolo específico para ele. Representação simbólica multiplexador 2-para-1 Decodificador Se o multiplexador funcionava como um seletor, podemos dizer que o decodifi- cador faz o papel inverso. É um elemento que possui mais saídas do que entradas. A cada instante de tempo, todas saídas terão o valor “0”, exceto uma, que terá o valor “1”. A saída que terá o valor “1” depende do valor das entradas, seguindo uma regra: “se o valor codificado nas entradas é “x”, a saída de índice “x” será igual a “1”. A relação entre o número de entra- das e saídas segue a exponenciação na base 2. Ou seja, se temos n entradas, teremos 2n saídas. Por exemplo, um decodificador de 2 entradas terá 4 saídas, de 3 entradas terá 8 saídas e assim por diante. Entrada0 (a) Entrada1 (b) Seletor (sel) Saída| (s) 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 1 1 0 0 1 1 0 1 0 1 1 0 1 1 1 1 1 Decodificador Num. Entradas Núm. Saídas 1-para-2 1 2 2-para-4 2 4 3-para-8 3 8 4-para-16 4 16 31ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES Para um decodificador 2-para-4 teríamos a tabela verdade posterior. Ao contrário de outras tabelas verdade agora teremos mais de uma saída. Entretanto, a forma de construir a mesma não muda, ou seja, entradas são representadas nas colunas à esquerda e as saídas nas colunas à direita. Note, pela tabela verdade, que as saídas sempre ficam zeradas, exceto uma. Quando as entradas correspondem ao va- lor “0”, saída0 é que está em “1”. Quando as entradas correspondem ao valor “1”, a saída1 está ativa. Quando as entradas correspondem ao valor “2”, a saída 2 está ativa, e assim por diante. A construção das equações boolea- nas e, consequentemente, do circuito ló- gico, funciona da mesma forma. A única diferença é que temos 4 equações envol- vidas: uma para s0, outra para s1, s2 e s3: • s0 = á .b´ • s1 = a’.b • s2 = a.b’ • s3 = a.b O circuito lógico é montado dei- xando as 4 equações juntas: Circuito lógico decodificador 2-para-4 Na representação simbólica do de- codificador não mantemos dois fios na entrada (um para cada entrada), mas sim um único fio e a representação de que 2 bits são utilizados, o que é equivalente a termos duas entradas de 1 bit (0 ou 1), como fizemos até o presente momento. Unidade Lógica e Aritmética Conhecidas as principais portas ló- gicas e alguns dos mais básicos circuitos combinacionais, vamos verificar como é formada a máquina motriz de um proces- sador, a unidade lógica e aritmética, ou ULA (em inglês, ALU). A ULA é responsável por todas as operações matemáticas (soma, subtração, multiplicação, divisão, exponenciação, etc..), lógicas (“E”, “OU”, “NOT”, etc.), comparações, deslocamentos, entre outras em um computador. A complexidade da ULA acompa- nha a complexidade doprocessador. Pro- cessadores simples possuem ULAs com 4 Entrada0 (a) Entrada1 (b) Saída0 (s0) Saída1 (s1) Saída2 (s2) Saída3 (s3) 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 1 1 0 0 0 1 32ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES operações. Processadores mais complexos podem ter centenas de operações. Apenas para ilustrar vamos verificar como é formada uma ULA básica com 4 operações: soma, AND, OR e NOT. Essas três últimas operações booleanas são facilmente implementadas com suas respectivas portas lógicas, conforme visto anteriormente. Logo, a soma, assim como as demais operações aritméticas, não é tão facilmente implementada, visto que ao contrário das operações booleanas que são realizadas iso- ladamente bit a bit, aquela possui depen- dência entre os bits. Ou seja, para realizar a operação sobre um bit m+1, precisamos saber o resultado da operação no bit m. No caso da soma temos o somador binário mais simples, chamado de meio- -somador, que é capaz de somar dois ope- randos de 1 bit (A e B) e gerar o resultado (S), também de um bit, além de um bit de carry-out ou “vai-um” (C). A tabela verda- de do meio-somador pode ser visualizada a seguir. Como comentado anteriormente, o resultado S pode ser implementado com uma porta XOR e, se você analisar a tabela verdade verá que o vai-um é apenas uma operação AND. Como exercício, propo- mos que você monte o circuito lógico para o meio-somador. Entretanto, esse meio somador não pode ser utilizado para somar mais de um bit, pois prescinde da entrada para o “vai-um” gerado pela soma do bit anterior. Dessa forma, temos que adicionar mais uma entrada na tabela verdade, chamada de carry-in, ou “vem-um”. O circuito lógico desse somador completo pode ser logo visualizado: O circuito do somador completo, apresentado antes, é capaz de somar ape- nas um único bit. Para realizar a soma de mais bits, precisamos adicionar diversos A B S C 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 A B Cin S Cout 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 1 0 1 1 0 0 1 0 1 0 1 0 1 1 1 0 0 1 1 1 1 1 1 33ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES desses somadores em série, conectando a saída Cout de um somador que é ligado na entrada Cin do próximo somador. Agora que já temos as operações booleanas definidas e o somador completo, como podemos fazer para transformar es- sas quatro operações em uma ULA? Basta criarmos um circuito, unindo os quatro circuitos anteriores, conectando as saídas dos mesmos em um multiplexador. Nesse caso teríamos um multiplexador 4-para-1. Assim, com uma entrada A e B definida, a ULA realiza as 4 operações, mas em sua saída apenas uma delas será selecionada através do multiplexador, conforme a so- licitação da operação, sendo executada no processador. Anteriormente, no circuito da ULA, todas as entradas, saídas e conexões inter- nas seriam de n bits, com exceção de Ci (1 bit) e sel (2 bits). O símbolo da ULA pode ser visualizado por meio da figura que segue: Circuitos sequenciais Ao contrário dos circuitos combina- cionais, os quais não possuem realimen- tação, os circuitos sequenciais são todos aqueles que possuem alguma forma de realimentação. Esses produzem o efeito de “memória” ou a capacidade de armazenar alguma informação ao longo do tempo. As saídas de um circuito sequencial não são apenas função de suas entradas, como são os circuitos combinacionais, porém variam de acordo com o estado atual das próprias saídas. Ou seja, o va- lor de determinada saída em t+1, onde t representa o momento atual, dependendo do valor da saída em t. Os exemplos clássicos dos circuitos sequenciais são os registradores, contado- res, f lip-f lops ou latches (registradores de 1 bit). Flip-Flop RS Os f lip-f lops podem ser conside- rados a menor memória existente, sendo capazes de armazenar 1 bit. Eles são a base dos registradores, os quais são as menores unidades de memória existente dentro de um processador. O seu funcionamento é bastante simples e a sua construção é feita com pou- cas portas lógicas. Existem diversos tipos de f lip-flops, sendo que as variações entre eles ocorrem na forma de seu controle. 34ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES O mais simples de todos é o f lip-f lop RS, ele possui duas entradas R, de reset, ou desligar e S, de set, ou ligar. Quando a entrada R é acionada (valor em “1”) a saída é desligada, ou seja, assume o valor “0”. Por sua vez, quando a entrada S é acionada em “1”, a saída é ligada, ou seja, assume o valor “0”. O circuito lógico desse f lip-f lop é geralmente construído com portas lógicas NOR ou NAND, muito embora possa ser construído com portas OR, AND e NOT. Diferentemente dos circuitos combinacionais, onde apenas a entrada é de- terminante para o valor da saída, nos circuitos sequenciais não teremos uma tabela verdade convencional. Então, precisaremos de uma tabela de transição de estados, ou simplesmente tabela de transição, visto que tais circuitos possuem “memória” e o valor da saída depende, além das entradas, do estado intermediário mantido na memória. Geralmente, iniciamos (t0) a construção dessa tabela de transição a partir de valores para as entradas capazes de determinar ou alterar o valor das saídas, indepen- dentemente do valor atual da própria saída. No caso do f lip-f lop RS, seriam os casos onde S = 1 (ligar) ou R = 1 (desligar). Nos momentos posteriores (t1, t2, ..., tn), os valores das entradas vão sendo modifica- dos de forma a verificar o comportamento do circuito em cada um dos casos. Para o f lip-f lop RS teríamos a seguinte tabela com os valores de entrada e de saída ao longo do tempo. Analisando a tabela verdade da fun- ção NOR, percebemos que sempre que uma das entradas for igual a 1 a saída da função também será igual a “0”. Por esse motivo, ao colocar a entrada R em “1”, a saída Q , automaticamente, assume o valor “0”. Como a saída Q está conectada na mesma porta da entrada S e, considerando t R S Q Q’ 0 1 0 0 1 1 0 0 0 1 2 0 1 1 0 3 0 0 1 0 4 1 0 0 1 5 1 0 0 1 6 0 0 0 1 7 0 1 1 0 35ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES ainda, que a entrada S também está em “0”, temos que a saída Q’ terá o valor “1”. Tal valor “1” retroalimenta a porta NOR, mantendo o valor de Q inalterado. Continuando em t1, alteramos o valor de R para 0, e note que nada foi alterado, pois já tínhamos a outra entrada da porta NOR com o valor em “1” (Q’). Ou seja, mantendo as duas entradas R e S com o valor “0”, o f lip-f lop memoriza o valor de suas saídas. Assim, somente teremos uma alte- ração se colocarmos o valor de “S” em 1 (t2), pois aí o valor de Q’ passa a ser “0”, e esse valor de Q , consequentemente, passa a ser “1”. Temos, então, que S com valor “1” liga o f lip-f lop ou ainda faz a informação “1” ser armazenada. Já ao contrário de R, igual a “1”, desligando o f lip-f lop ou fazendo a informação “0” ser armazenada. Por fim, temos que os valores de R e S iguais a “1” não podem ser utilizados nesse f lip-f lop, pois tornaria os valores de Q e Q’ conflitantes. Em resumo, teríamos a seguinte tabela de transição de estados para este f lip-f lop RS. Assim como nos decodificadores e multiplexadores, não usamos o circuito lógico do f lip-f lop, mas sim um símbolo. Flip-Flop RS Controlado Como visto anteriormente, no f lip- -f lop RS temos um comportamento não desejado quando as entradas R e S tem o valor “1”, trazendo um problema de ordem prática. Nesse sentido, de que forma fazer a transição de valores de R e S sem que em determinado momento tivéssemos R e S valendo “1” ou sem passar por um estado temporário? Para isso foi criado um flip-flop que pudesse ser ativado/desativado apenas em determinados momentos. Para tanto, foi adicionado mais uma entrada, chama- da de controle, clock (relógio), ou carga. Enquanto essa entrada estiver desativada (C = 0) qualquer alteração nos valores de R e S não serão percebidas pelo f lip-f lop RS convencional. A ideiaé sincronizar a mudança de estado, sendo permitida apenas quando C = 1. O circuito lógico desse novo f lip- -flop é facilmente obtido através da adição de duas portas NAND ao circuito anterior. R S Qt+1 Ação/Estado 0 0 Qt Mantém o estado anterior 0 1 1 Estado Set (“1”) 1 0 0 Estado Reset (“0”) 1 1 ? Estado proibido / Erro 36ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES A tabela de transição de estados com esse novo controle passa a ser a seguinte: Observe que ainda temos o estado proibido, pois nada impede que enquanto o relógio esteja ativo (C = 1) as variáveis R e S sejam iguais a “1”. Outra novidade é que temos mais uma situação onde há memorização do valor; quando C = 0, ou seja, quando as entradas R e S estão desa- bilitadas pelo relógio. Na tabela anterior apresentamos essa situação pelo valor “X” nas entradas R e S. O valor “X” é conhe- cido por “don’t care”, ou seja, não importa seu valor. Visto que, embora não tenhamos utilizado anteriormente esse valor, também pode ser aplicado em tabelas verdade. Símbolo do flip-flop RS controlado. Flip-Flop D A necessidade de evitar o estado proibido do f lip-f lop RS fez com que os projetistas o evoluíssem para que não houvesse mais duas entradas e sim apenas uma. Isso foi facilmente construído atra- vés do uso de um inversor em uma das entradas, R ou S. Com isso eliminamos o estado proibido, mas também eliminamos a possibilidade de R e S terem o valor “0”, simultaneamente para manutenção do estado anterior. Contudo, como já temos uma outra entrada, não precisaríamos mais manter o relógio que habilita ou não as entradas do f lip-f lop de R e S em “0”, a fim de termos salvo o estado do f lip-f lop. O resultado prático dessa evolução é que temos agora um f lip-f lop que copia o valor de sua entrada para sua saída sempre que o relógio ficar ativo (C = 1). Esse f lip- -f lop é conhecido por f lip-f lop D. O “D” representa o dado que deverá ser copiado da entrada para a saída. O circuito lógico do f lip-f lop D, em termos do f lip-f lop RS controlado, e seu respectivo símbolo podem ser vistos a seguir: C R S Qt+1 Ação/Estado 0 X X Qt Mantém o estado anterior 1 0 1 1 Estado Set (“1”) 1 1 0 0 Estado Reset (“0”) 1 0 0 Qt Mantém o estado anterior 1 1 1 ? Estado proibido / Erro 37ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES Flip-Flop D A tabela de transição de estados pas- sa a ser mais simples, assim, quando C = 0 as saídas ficam estabilizadas no valor anterior (efeito memória). Já, quando C = 1, as saídas têm o mesmo valor da entrada D. Então, note que se D = 1, teríamos a mesma situação do f lip-f lop RS com S = 1 e R = 0 (set, ligar) e, ao contrário, se D = 0, teríamos o f lip-f lop RS com S = 0 e R = 1 (reset, desligar). Existem ainda outros tipos de f lip-f lops, como o tipo T (toggle), que a cada ativação do sinal de controle altera o valor armazenado (valor “0” → “1” e vice-versa) e o tipo JK, que é semelhante ao RS, mas elimina o estado proibido. Nesse último, quando as duas entradas J e K são iguais a “1”, ele funciona como o f lip-f lop T, ou seja, ele altera o valor armazenado anteriormente. Existem outros detalhes de eletrônica digital vinculados aos circuitos sequenciais, mas que não são foco dessa disciplina, como o atraso temporal das portas lógicas e questões relacionadas aos níveis de ativação dos dispositivos, se sensíveis às bordas de subida, descida ou ao nível. Todos esses detalhes podem ser aprofundados em livros e sites de circuitos digitais ou de eletrônica digital. Registradores Com o f lip-f lop D já temos a base para a construção de elementos capazes de armazenar um determinado valor, visto que o mesmo é capaz de armazenar 1 bit de informação. Assim, para armazenarmos mais bits precisamos de uma forma simplista, da seguinte forma: conectar diversos f lip-f lops em série, todos interconectados pelo mesmo sinal de controle (relógio). Assim, se conectarmos 4 f lip-f lops teremos um registrador de 4 bits. Já um registrador de 32 bits pode ser visto como um conjunto de 32 f lip-f lops em série, cada um com sua linha de dados distinta (entrada D do f lip-f lop D) e todos conectados por um mesmo sinal de controle (entrada C do f li- p-f lop D), conforme pode ser visto na figura abaixo. C D Qt+1 Ação/Estado 0 X Qt Mantém o estado anterior 1 1 1 Estado Set (“1”) 1 0 0 Estado Reset (“0”) 38ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES Utilizando estes mesmos f lip-f lops D e, adicionando alguns circuitos com- binacionais, também podemos construir registradores de deslocamento à esquerda e à direita (similares aos operadores << e >> em linguagens de programação de alto nível), bem como contadores (incremen- tadores e decrementadores). Memória Assim como um registrador de n bits pode ser visto como um array (vetor/ conjunto) de n flip-flops, uma memória de m posições pode ser vista como um array de m registradores. Caso os registradores dessa memória sejam, por exemplo, de 32 bits, dizemos que a memória trabalha com palavras de 32 bits. É claro que não basta juntarmos alguns registradores para termos uma memória como conhecemos em nossos computadores, precisamos de no mínimo alguns circuitos combinacionais capazes de: • na escrita de dados, selecionar qual palavra/registrador (endereço) irá receber a informação a ser gravada na memória; • na leitura de dados, selecionar a partir de qual palavra/registrador (endereço) a informação deve ser lida; • enviar a informação (dados) a ser escrita ou receber a informação (da- dos) lida da memória; • autorizar a escrita da informação ou a leitura da informação na memória (controle). Os fios que carregam essas informa- ções de endereços, de controle (leitura/es- crita) e as informações propriamente ditas (os dados a serem gravados ou lidos) são conhecidos por barramentos. De forma mais específica, barramento de endereços, de controle e de dados, respectivamente. A estrutura lógica de uma memó- ria de 4 posições pode ser vista a seguir. Novamente, é importante ressaltar que a implementação física de uma memória não é exatamente da mesma forma que esta estrutura lógica, pois temos que con- siderar atrasos das portas lógicas, tempo de carga e leitura dos componentes e a 39ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES própria tecnologia de implementação. Esses detalhes, obviamente, não são escopo dessa disciplina. Note a utilização do decodificador para a seleção de endereço de gravação dos dados e do multiplexador para a seleção do endereço de leitura dos dados. O ende- reço a ser gravado é enviado para o decodificador, o qual mantém ativa apenas uma das portas AND. E, essa porta AND, com uma das entradas ativa, somente terá sua saída ativa quando o sinal de controle (“write”), enviado através do barramento de controle, também for ativado (em caso de dúvida, veja a tabela verdade da operação AND). Com a saída da porta AND ativa o dado será, enfim, gravado no registrador correto. O procedimento é semelhante para a leitura do dado, através do multiplexa- dor. O endereço a ser lido é enviado para o multiplexador, o qual copiará apenas uma de suas entradas para a sua saída (de acordo com o endereço). A saída do mul- tiplexador, por sua vez, está conectada a uma porta AND, que somente liberará o dado lido quando o sinal de controle “leitura” for ativado. Para sintetizar!!!... Nesse capítulo abordamos desde as mais simples portas lógicas (OR, AND e NOT), passando por portas derivadas (NAND, NOR e XOR) até os componentes básicos de processador e memória (Decodificadores, Multiplexadores e Flip-Flops). É importante que você lembre que a resolução de uma expressão booleana começa pela montagem de uma tabela verdade, a qual irá expressar em suas co- lunas cada uma das variáveis de entrada e sub-expressões, bem como o resultado final da expressão. Dessa maneira, nas linhas das tabelas verdade você terá cada uma das possíveis combinações de valoresdas variáveis de entrada e suas conse- quentes valorações. Tão importante quanto a resolução da expressão é sua simplificação. É muito mais simples de trabalhar quando a expressão está em uma forma simplificada. Para tanto, você pode lançar mão das leis da álgebra, como comutatividade, asso- ciatividade, distributividade e os teoremas de De Morgan. Também é possível fazer a simplificação através dos mapas de Karnaugh, onde buscam-se os mintermos 1 em oitavas, quadras, duplas e isolados. Os mapas de Karnaugh são uma forma diferenciada de tabela verdade, onde as entradas e os valores da expressão estão dispostos de forma a permitir a simplificação. Finalmente, vimos como combinar as portas lógicas para formar circuitos muito importantes na organização de um computador, bem como eles podem ser utilizados para formar unidades funcionais de processadores e circuitos de memória. Vamos exercitar o que estudamos até aqui? Então... 1. Para os exercícios a seguir (de 1 a 5) utilize o software MMLogic. 2. Criar um circuito que demonstre a utilização de um MUX 4:1. 3. Criar um circuito que demonstre a utilização de um Decodificador 2:4. 4. Criar um circuito que demonstre a utilização de um FF do tipo RS. 5. Criar um circuito que demonstre a utilização de um FF do tipo RS controlado. 6. Criar um circuito que demonstre a utilização de um FF do tipo D. 7. Tendo por base o conhecimento do que é um f lip-f lop, como poderia ser representada uma memória de um computador hipotético? 42ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES ESTRUTURA INTERNA DE UM COMPUTADOR – MODELO DE VON NEUMANN Quais são as partes, que juntas, formam o seu computador? A grande maioria dos computadores atuais utiliza uma estrutura interna baseada no modelo de Von Neumann, con- forme já comentado no início do capítulo anterior. 43ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES Uma das grandes contribuições do modelo de Von Neumann, além da dis- tribuição de seus blocos funcionais, foi o armazenamento de programas e dados em uma memória única. Fator que abriu a possibilidade de um programa ser mo- dificado ao longo de sua própria execução. Uma vez que anteriormente a esse modelo, tínhamos um programa estático, geral- mente “gravado” no próprio hardware que acessa os dados em algum tipo de memória auxiliar. Portanto, para fazer um programa novo, seria necessária a construção de um novo computador. Entretanto, antes de falar em pro- grama, temos que saber o que significa um. O programa nada mais é que uma sequência de instruções necessárias para atingir o objetivo computacional. O pro- grama (suas instruções) e os dados sempre estarão armazenados na memória. E uma instrução? O que vem a ser uma instrução? A instrução é a operação que será realizada pelo processador, na forma de: OPERAÇÃO OPERANDOS A operação diz qual função será desempenhada pelo processador, por exemplo: soma, movimentação de dados na memória, comparação, etc. Os ope- randos fornecem a maneira de calcular a posição atual dos dados (na memória, registrador, etc.) com os quais a operação será realizada. Sabendo o que é um programa e uma instrução, então, como o computador “sabe” a forma de executar as instruções? A execução de um programa pelo proces- sador ocorre, como regra geral, dentro de um ciclo chamado de busca-decodifica- ção-execução. O referente ciclo, em todos os pro- cessadores modernos, ocorre como em uma montadora de automóveis, ou seja, em estágios, aqui chamados de pipeline. A cada ciclo de relógio do processador, um novo estágio do ciclo de busca-deco- dificação-execução tem início. Apenas a título de curiosidade, em um processador de 1,2 GHz, temos aproximadamente 1,2 bilhões de ciclos em um segundo. Ou seja, em tese, poderíamos ter 1,2 bilhões de instruções novas iniciando sua execução por segundo. Para que o ciclo funcione correta- mente, o processador possui um registra- dor especial chamado de “apontador de instruções” ou “contador de instruções” ou ainda “ contador de programa” (CP ou PC em inglês – Program Counter), o qual armazena o endereço na memória onde está a próxima instrução a ser executada. Portanto, o estágio de busca verifica o contador de programa (PC), acessa a me- mória e traz a instrução para o registrador de instrução (RI) dentro do processador. O registrador de instrução simplesmente armazena o conteúdo da instrução dentro do processador. Após essa busca, o PC já é atualizado para conter o endereço da próxima instrução a ser buscada. O estágio de decodificação lê o RI, e com base no campo da operação gera sinais de controle para o restante do hardware, utilizando, para tanto, “decodificadores” 44ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES (conforme estudamos no capítulo anterior). Por exemplo, se o campo da operação indi- ca que é necessário realizar uma soma, os decodificadores irão gerar um sinal para ativar a operação de soma na ULA. Realizada a decodificação da instru- ção, a execução pode ser iniciada no pró- ximo ciclo de relógio. Essa execução nada mais é que a aplicação da operação nos operandos, finalizando com o armazena- mento do resultado em algum registrador ou na memória (conforme regra específica da operação e dos operandos envolvidos). A forma como cada instrução é executa- da, ou seja, onde os operandos estarão e onde serão salvos sempre que consultada pelo programador no manual do respectivo processador. É claro, que um programador de linguagem de alto nível não precisa ter este conhecimento, contudo, sempre que for necessário realizar alguma operação de baixo nível (linguagem de máquina ou de símbolos) é recomendável conhecer tais detalhes. Além disso, é nessa etapa que os operandos são buscados na memória para serem carregados nos registradores, de forma a permitir que a operação seja executada com sucesso, tudo conforme as informações da operação e dos operandos (instrução). Caso a operação executada seja do tipo “desvio”, “salto” ou “transferência”, o contador de programa (PC) é atualizado para que a próxima instrução a ser executada seja buscada pelo ciclo de busca. Uma instrução de salto é gerada para o processador, por exemplo, sempre que o programador utilizar estruturas do tipo “IF-ELSE” ou laços em seus programas. Com o novo valor de PC carregado, ou com aquele atualizado ao final da busca da instrução, um novo ciclo busca-decodificação-execução, podendo ser iniciado. Como você pode ter percebido, diversas operações são realizadas durante a exe- cução. Por esse motivo, diferentes processadores dividem este estágio de execução em diversos micro estágios, permitindo uma melhor otimização dos recursos. Os demais estágios também podem ser subdivididos, de acordo com o projeto do processador. É importante ressaltar que quanto menores os estágios, maior pode ser a frequência de relógio de processador. A título de curiosidade, a frequência dos Intel Pentium 4 chegaram a ser superiores a 4 GHz. Conhecendo as frequências dos processadores atuais, você chegará à conclusão que nem sempre uma frequência mais alta significa que o processador seja mais rápido. 45ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES Blocos funcionais A execução de um programa através do ciclo de busca-decodificação-execução requer a existência de estruturas funcionais que forneçam o devido suporte a cada um dos ciclos. Elas podem ser vistas na figura seguinte e nada mais são que as próprias estruturas básicas do modelo de Von Neumann, as quais muitas já conhecemos. Processador – Unidade de Controle Internamente ao processador, além da ULA e dos registradores, os quais já co- mentamos rapidamente, temos a unidade de controle (UC), responsável pela geração dos sinais de controle para os restantes dos blocos funcionais. Esses sinais garantem o gerenciamento do f luxo interno de dados e do instante preciso em que ocorrem as transferências entre uma unidade/bloco e outra. Por exemplo, quando falamos da memóriano capítulo anterior, vimos que existe um sinal de controle, chamado “write” que comanda o armazenamento dos dados na memória. O referido sinal é gerado pela UC no momento correto. Imagine se a UC gera esse sinal quando o dado a ser gravado ainda não está disponível. Teríamos uma potencial perda de informação! Cada sinal de controle é responsável por comandar uma micro-operação, aque- las que ocorrem em cada um dos estágios em que a operação é executada, como por exemplo, as cargas dos dados nos regis- tradores, a seleção de dado para leitura/ gravação na memória e a seleção de uma operação na ULA. Processador – Unidade lógica e aritmética – ULA A ULA, como já vimos anterior- mente, é responsável por todas as ope- rações matemáticas, booleanas, compa- rações, etc. Ela é formada por circuitos combinacionais que recebem como entrada as operações e geram em sua saída os re- sultados da operação selecionada, através da unidade de controle. Processadores mo- 46ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES dernos possuem diversas ULAs, com di- ferentes especialidades: ULA de números inteiros, ULA de números representados em ponto-flutuante, ULA para operações multimídia, etc. Além do resultado da operação, a ULA é responsável por gerar alguns có- digos de condição, os quais são utilizados pelas próprias instruções do programa para tomada de decisões, especialmente atra- vés das instruções de desvio (geradas por estruturas de controle do tipo IF-ELSE ou laço nos programas). A quantidade de códigos de con- dição varia muito de processador para processador, mas geralmente todos apre- sentam os seguintes códigos: • Overflow: indica se na última ope- ração ocorreu um estouro de campo. Um estouro ocorre quando a capa- cidade de representação em biná- rio para determinada informação é superada. Por exemplo, suponha que uma operação de soma em deci- mal 8+8 deva ser executada em um computador com ULA de 4 bits. Com 4 bits, podemos representar os números inteiros positivos de 0 a 15. Ou seja, a soma acima geraria um estouro de representação, pois esse computador não seria capaz de representar tal número adequada- mente. Dessa forma, é provável o resultado da soma, que em decimal, seria zero. A ULA em questão gera- ria o resultado da soma (0) e ligaria o sinal (ou condição) de overf low, para demonstrar que provavelmente um erro ocorreu. • Sinal: se o resultado da operação é negativo ou positivo, de acordo com a representação numérica utiliza- da pelo processador. Geralmente os processadores trabalham com a representação em complemento de 2. • Carry: representa o bit de “vai-um” e “vem-um” em operações aritméticas. • Zero: se da operação ocorreu um resultado zerado. As entradas e saídas da ULA ge- ralmente estão conectadas a registradores do processador e um destes tem um nome especial: o acumulador. O acumulador tem por função essencial armazenar os operan- dos e/ou o resultado fornecido pela ULA. Processadores simples possuem um único acumulador para cada ULA, enquanto processadores mais modernos possuem diversos acumuladores para cada ULA. Barramentos Todos os sinais de controle, bem como os dados e demais informações necessárias ao bom funcionamento dos sistemas computacionais transitam fisica- mente pelos blocos funcionais através do barramento do sistema (system bus). Na verdade, o barramento do sistema é dividi- do em barramento de dados, de controle e de endereço. Todos eles são caracterizados por sua largura, em bits. Por exemplo, um barramento de 32, aqui o barramento 4 bytes pode ser transferido simultaneamen- te. Quanto mais bits, mais informações podem ser transferidas simultaneamente. 47ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES Contudo, quanto maior a quantidade de bits, menor a distância em que o barra- mento pode operar, como também maior é a dificuldade dos projetistas de hardware para aumentar a frequência de seu funcio- namento (em Hz, MHz ou GHz). O barramento de dados é utilizado para transferência dos mesmos de/para o processador, de/para os periféricos (im- pressora, teclado, monitor, etc.) ou de/para a memória. O barramento de controle é por onde circulam os sinais de controle gerados pela UC. E, finalmente, o bar- ramento de endereços é por ondem circu- lam os endereços para acesso à memória e para acesso aos periféricos. Observe, como exemplo, que um barramento de endereço de 32 bits, tem a capacidade de endereçar até 4GB da memória (232 = 4.294.967.296 bits ou 4GB). Esse é um dos motivos pelo qual os processadores de 32 bits reconhe- cem apenas 4GB de memória RAM (sem considerar eventuais extensões). Memória A memória, conforme já foi discor- rido, é o local onde temos armazenado as instruções (programas) e os seus respec- tivos dados. Nenhum programa pode ser executado sem que esteja inserido (instru- ções e dados) na memória do computador. Mesmo que você saiba que o programa está gravado em alguma outra mídia (disco rígido, DVD, pendrive) ele precisará ser carregado na memória para que o pro- cessador possa iniciar a execução de suas instruções. A memória está dividida em pala- vras, cada uma com um respectivo ende- reço. A unidade de controle do processa- dor gera, além dos sinais de controle para leitura/gravação na memória (enviados através do barramento de controle), os endereços que a operação necessita ler ou gravar na memória. Um dos grandes problemas dos computadores atuais é a diferença de ve- locidade de operação do microprocessador e do sistema de memória. A frequência em que os processadores operam é muito mais alta que a frequência em que as me- mórias operam. Além disso, o crescimento da frequência dos processadores é muito maior que o crescimento da frequência das memórias. Uma das possíveis soluções para esse problema e a mais utilizada é o emprego de uma hierarquia de memória. O emprego dessa hierarquia só é possível devido à possibilidade de construção de memórias muito rápidas (trabalhando na mesma fre- quência do processador). Essas memórias são muito caras e por isso de tamanho muito reduzido. Assim, as memórias mais rápidas estão próximas do processador, contendo os dados e instruções que o processador precisa em certo momento. As memórias mais lentas (grande capa- cidade) são utilizadas para guardar dados e instruções que não estão sendo usadas no momento da operação. Além disso, a hierarquia de memória tem sua construção fortemente baseada no princípio de loca- lidade de referência (temporal e espacial), isto é, os programas têm a tendência de 48ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES executar os mesmos trechos de código (ou trechos próximos uns dos outros) durante grande parte do tempo de execução. Logo, ao dividirmos o sistema de memória em níveis, esperamos obter um de- sempenho próximo ao da memória mais rápida e o custo por bit próximo da memória de menor custo. Geralmente, é utilizado um sistema de memória de 3 níveis. O primeiro nível é representado pelas memórias cache, usualmente integradas ao processador ou à placa-mãe, sendo inclusive hierarquizadas em outros dois ou três níveis (cache L1, L2 e L3). O segundo nível é representado pela memória RAM (memória principal) e por fim, o terceiro nível, é representado pelo disco rígido (memória secundária). Hierarquia de memória Grande parte de memória encontrada em um computador pessoal é memória RAM (Random Access Memory), a qual perde as informações quando desligada. A RAM pode ser dinâmica (DRAM), quando necessita de um refresh periódico para não perder a informação, ou estática (SRAM), quando retém a informação enquanto estiver ligada. A SRAM é utilizada geralmente em memórias cache, por ser mais rápida (e mais cara) e a DRAM é utilizada na memória principal (mais lenta, mas mais barata). A memória principal (ou primária) tem evoluído muito nesses últimos anos, tentando acompanhar a evolução dos mi- croprocessadores. As principais tecnologiasdisponíveis hoje em dia são as seguintes: • Synchronous DRAM (SDRAM): capaz de acessar um byte a cada ci- clo de clock. Utiliza um pipeline interno, para iniciar o acesso a um segundo dado antes de o primeiro ter sido consumido pelo sistema. Possui barramentos de 66, 100 e 133 MHz. • Double Data Rate SDRAM (DDR): permite fazer dois acessos a cada ciclo de clock. Possui o dobro da taxa de transferência da memória SDRAM comum, visto que a cada ciclo consegue acessar dois bytes. Atualmente, temos a evolução da memória DDR: DDR3 e DDR4. Ambas realizam dois acessos por ciclo, todavia a primeira permite ler 8 bytes e a segunda 16 bytes para dados a cada ciclo desses. A memó- ria DDR possuía barramentos com 49ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES relógio de 100 a 200 MHz, o que rendia uma taxa de transferência teórica entre 200 a 400 MB/s (mi- lhões de bytes por segundo). Assim, a memória DDR2 trabalhou entre 200 e 533MHz, atingindo taxas de transferência entre 800 e 2132 MB/s. A DDR3, por sua vez, tra- balha com frequências entre 400 e 1066MHz, atingindo taxas de transferência entre 6,4 GB/s (bilhões de bytes por segundo) e 17 GB/s. O cálculo dessas taxas de trans- ferência é feita da seguinte forma: Taxa de transferência X Números de acessos (2) X Número de Bytes transferidos. Da taxa de transfe- rência e da frequência de relógio temos os nomes “comerciais” das referidas memórias. Por exemplo, a memória DDR3-800 refere-se a uma memória do tipo DDR3, com frequência de 400 MHz (o 800 é obtido pela multiplicação da frequ- ência pelo número de acessos, que é sempre 2 para todas as DDRs). Também pode ser encontrada por PC3-6400 (nome dado geralmen- te ao módulo físico da memória). A memória DDR4 trabalha com frequências entre 800 e 1200MHz, obtendo taxas de transferência entre 12,8GB/s e 19,2GB/s. Dois módulos de 8GB – DDR4-2133 (fre- quência de 1066MHz, taxa de 17GB/s) Além da memória RAM, temos nos computadores atuais alguns componentes com memórias do tipo ROM (Read Only Memory). Esse tipo de memória, ao con- trário da RAM, não perde a informação armazenada quando não está energizada. Existem diversos tipos de memória ROM: • •PROM (Programmable ROM): é uma memória ROM que pode ser programada (gravada) apenas uma única vez, mediante aplicação de pulsos de voltagem; • EPROM (Erasable Programmable ROM): é semelhante a PROM, mas seu conteúdo pode ser zerado (e gra- vado novamente) mediante aplicação de luz ultravioleta; • EEPROM (Electricaly Erasable Programmable ROM): semelhante à EPROM, contudo não necessita de luz ultravioleta para zerar seu con- teúdo (substituído por eletricidade). • Flash ROM: é uma variação da EEPROM, permitindo uma exce- lente utilização da área do chip de memória e podendo ser regravado milhares de vezes antes de perder sua utilidade (chips EEPROM tem um número pequeno de ciclos de regravação – apagar/gravar). As utilizações da memória ROM 50ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES (atualmente Flash ROM, devido à ne- cessidade de constantes atualizações) no computador são basicamente destinadas aos firmwares (software que comanda al- gum hardware específico) dos periféricos (disco-rígido, placa de vídeo) e ao próprio software que inicia o computador quando ligado, o BIOS. E, é claro, as memórias Flash também são famosas por serem uti- lizadas em pendrives e cartões de memória portáteis. Periféricos – Sistema de Entrada e Saída (E/S) O sistema de entrada e saída (E/S ou no inglês I/O – Input/Output) é o respon- sável pelo interfaceamento entre o sistema computacional e o mundo externo. Essa interface é feita através da transferência de dados entre periféricos, processador e memória. O sistema de E/S é composto de: • Periféricos: todos os dispositivos conectados ao computador. Podem ser de entrada, como por exemplo: teclado, leitor de código de barra, mouse e scanner; de saída, como monitor e impressora ou ainda mistos: monitor com tela sensível ao toque, pendrives, CD-R/RW/ DVD-R/RW e discos rígidos, entre outros. • Interface: coordena a transferência de dados entre o processador e os periféricos. • Controlador: “cérebro da interface”, realiza o controle da transferência dos dados. • Driver: elemento de software que contém as rotinas encarregadas da comunicação do processador com a interface do periférico. Ainda, é aquele software que o próprio sis- tema operacional instala (ou solicita que você instale) quando um novo periférico é conectado ao compu- tador. • Porta de E/S: endereço no sistema de E/S utilizado para acesso ao pe- riférico. • Barramento: conjunto de fios que transportam dados, endereços ou instruções. Periféricos – Barramentos Os barramentos, como dito anterior- mente, são os elementos do hardware que permitem a interconexão entre diversos componentes. Computadores antigos pos- suíam apenas barramentos ditos internos, pois não existiam periféricos em dema- sia. Com a popularização dos periféricos, barramentos externos ou barramentos de expansão foram sendo criados. A conexão desses componentes no barramento deve seguir um certo padrão lógico e físico. Os padrões mais comuns nos PCs são o PCI e PCI-Express. Além disso, outros barramentos, também impor- 51ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES tantes, são o SATA, SCSI e SAS, utili- zados para fazer a interligação de dispo- sitivos de armazenamento. Também não podemos deixar de citar o USB, barra- mento bastante utilizado para conexão de periféricos comuns a usuários domésticos (pendrives, impressoras, teclado, mouse, dispositivos móveis, etc.). O que diferencia um barramento do outro é sua interface (slots - onde os periféricos são encaixa- dos), a transferência dos dados, serial (1 bit por ciclo) ou paralela (mais de um bit por ciclo), bem como os padrões elétricos e físicos envolvidos. O barramento PCI (Peripheral Component Interconnect) foi introduzi- do pela Intel na linha Pentium, e ainda é utilizado em alguns PCs. Ele foi cons- truído com a intenção de substituir o ISA (Industry Standard Architecture), que é um barramento ultrapassado, lançado nas primeiras versões de PC-AT, o qual traba- lha a 8 MHz e possui um canal de 16 bits, ou seja, é um barramento paralelo, obten- do-se uma taxa de transferência máxima de 16 MB/s. Por sua vez, o barramento PCI, na sua versão original trabalhava a 33 MHz, com um canal de 32 bits, ob- tendo uma taxa de transferência máxima de 133 MB/s. As versões mais novas do barramento podem trabalhar a 66 MHz e 133 MHz com canais de 32 ou 64 bits, atingindo transferências de até 266, 533 e mais de 1000 MB/s. Com a evolução dos periféricos, em especial as placas de vídeo, outros bar- ramentos foram criados, como o AGP (Accelerated Graphics Port) e o PCI- -Express. O primeiro já não é mais am- plamente utilizado e o segundo pode ser visto como uma evolução do próprio PCI, sendo ainda bastante utilizado. A grande diferença entre o PCI e o PCI-Express é que, enquanto o primeiro é um barramento paralelo, o segundo é serial. Barramentos paralelos não conseguem grandes taxas de transferência por problemas de inter- ferência elétrica ao aumentar a frequência de operação. Por ser um barramento serial e, com o intuito de melhorar seu desempenho, o barramento PCI-Express conta com lanes (“pistas”) de 1 bit em cada sentido, para 52ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES transferência de dados (entre cada peri- férico e o controlador PCI-Express). O número de pistas pode variar entre 1, 4, 8, 16 e até mesmo 32. As taxas de trans- ferência podem variar de pouco menos de 1 GB/s (com um lane) até 15,7 GB/s (com 16 lanes). Um dos barramentos mais utiliza- dos pelos usuários é o barramento USB (Universal Serial Bus). Como o próprio nome diz, trata-se de um barramento serial, sendo que, internamente, acaba sendo conectado ao barramento PCI ou PCI-Express. Por ser um barramento de padrões abertos,com baixo custo de seus conectores e capaz de fornecer carga para os mais diversos dispositivos, acabou sen- do amplamente utilizado pela indústria/ consumidores. Quando o padrão USB surgiu com sua versão 1.0 (em 1996), acabou sendo utilizado para conexão de equipamentos “lentos”, como teclado, mouse e impres- soras, substituindo os diversos padrões existentes para conexão destes dispositivos (portas seriais, paralelas, PS/2, DIN e Mini-DIN). O USB teve seu desempenho li- geiramente melhorado com o advento da versão 2.0 em 2001, sendo capaz de atingir taxas de transferência teóricas de até 480 Mbit/s ou 60MB/s (na prática não supe- ram os 35MB/s). A taxa de transferência da versão 1.0 era de apenas 12Mbit/s ou 1,5MB/s. A versão 3.0, disponibilizada em 2010, aumentou a taxa de transferência teórica para 4.0GB/s. O que talvez possa confundir um pouco os usuários é a quantidade de di- ferentes conectores para periféricos USB: tipo A, tipo B, micro-A, micro-B, mini- -A, mini-B e tipo C. Existem também as variantes “superspeed” (super velocidade – versão 3.0 – conector azul), dos tipos A, B e micro B. Abaixo você pode verificar as diferenças entre os conectores. 53ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES Periféricos – Barramentos para Discos rígidos Discos rígidos são meios magné- ticos de armazenamento de informação. As informações são guardadas de forma permanente, permitindo a recuperação das informações mesmo após seu desliga- mento. Sua capacidade é muito maior que a capacidade de memória RAM. Atual- mente, cada disco pode guardar mais de 10 TB (terabytes – 1 terabyte = 1024 GB) de informações. Hoje em dia, são utilizados três ti- pos distintos de interface de discos (inter- conexão entre o barramento e o disco): o SATA, SCSI e o SAS. O padrão SATA (Serial ATA) é a evolução do padrão IDE (Integrated Drive Electronics). Os discos IDE usavam a es- pecificação ATA, e por isso, também eram conhecidos por esse nome. A transferência de dados no padrão IDE/ATA ocorria de forma paralela, com taxas de transferência máxima entre 100 e 133 MB/s. Como já havia ocorrido com outros barramentos, tal padrão não permitia novos avanços em termos de maiores taxas de transferência, tendo evoluído então para a especificação serial do padrão ATA: o Serial ATA, ou SATA. Desde então, o antigo padrão IDE/ ATA, passou a ser conhecido por PATA (Parallel ATA). Slot IDE em Placa-mãe Disco rígido com conexão PATA Cabos PATA A primeira versão do padrão SATA, lançado em 2003, conhecido por SATA-I permitia taxas máximas de transferência de 150MB/s, sendo superior ao último padrão PATA. A versão 2.0 do padrão SATA (SATA-II), lançada já em 2004, trouxe um grande incremento na taxa de transferência, alcançando até 300MB/s. Essa versão era compatível com a versão 1.0, permitindo a interoperabilidade entre os discos. É claro que conectando um disco SATA-2 em uma controladora SATA-1, o mesmo não iria fornecer todo o desem- penho possível. 54ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES Diferença entre conector SATA (esquerda) e PATA (direita) Com o padrão 2.0 do SATA, os discos de estado sólido (SSDs – Solid State Disk) começaram a tornar-se po- pular, dado que até então nenhuma con- troladora era capaz de suportar a grande taxa de leitura/gravação que esse tipo de tecnologia de disco era capaz de fornecer. Falaremos um pouco mais dessa tecnologia na sequência. Cabo SATA Em 2009, foi lançada a versão 3.0 do padrão SATA, alcançando taxas de transferência de até 600MB/s (6 Gbit/s). As versões posteriores, 3.1 e 3.2, intro- duziram melhorias para tratamento dos discos SSD, permitindo até taxas de 16 Gbit/s ou 1900 MB/s. O padrão SATA também possui uma interface externa, semelhante a uma porta USB, chamada eSATA (e = external), conforme figura a seguir. É uma alternativa para conexão de discos externos, sem a necessidade de cabos extra de alimentação, com uma ex- celente taxa de transferência. Porta eSATA O padrão SCSI (Small Computer System Interface) foi lançado em 1988 e era utilizado por computadores Macintosh. Hoje em dia, ele é bastante utilizado em servidores PCs que fazem muito acesso a disco. O SCSI não é só utilizado para discos rígidos, ele é um barramento de periféricos, podendo ligar além de discos, drives de CD-ROM, discos óticos, fitas magnéticas, scanners, entre outros. A ver- são paralela do SCSI, a mais comum até a década passada alcançava uma taxa de transferência de até 160 MB/s no SCSI-3 Ultra-3. Conectores e cabos SCSI paralelos 55ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES Disco SCSI Como acontecera com os outros pa- drões, o SCSI também recebeu versões seriais, sendo SAS a mais conhecida – Serial attached SCSI. Uma das grandes vantagens do SAS é ser compatível com o padrão SATA-II e mais recentes. Além disso, é importante ressaltar que o contrá- rio não é possível, ou seja, não é possível conectar um disco SAS em uma interface SATA. A versão 3 do SAS alcança taxas de transferência de até 12 GBit/s ou 1,2GB/s. Diferença entre interface SATA e SAS No barramento SCSI (e SAS), a co- municação dos dados sempre ocorre en- tre um initiator (“iniciador”) e um target (“destino”). O initiator envia um comando ao target, o qual responde. Desse modo, existem mais de 60 comandos definidos pelo protocolo SCSI (incluindo os de leitu- ra e escrita), motivo pelo qual o barramen- to sempre foi bastante robusto e utilizado, primeiramente, em servidores. O padrão SATA, hoje em dia, utiliza grande parte desses comandos. Cada dispositivo em um barramento SCSI recebe um identificador SCSI único ou ID SCSI, sendo que podem existir di- versas unidades lógicas em um dispositivo, como, por exemplo: um gravador de fitas com diversos leitores ou um equipamento SAN – Storage Area Network. Assim, cada unidade lógica é endereçada atra- vés de um Logical Unit Number (LUN – número de unidade lógica). Dispositivos simples, como um disco rígido, possuem apenas um único LUN. Periféricos – Discos Rígidos (HD) Agora que já conhecemos um pouco sobre os barramentos que conectam os discos rígidos ao computador, podemos falar um pouco sobre os discos rígidos ou hard disks (HD). Os discos rígidos são formados por sequências de círculos concêntricos (de mesmo centro), chamados de trilhas. Estas trilhas são separadas entre elas por espaços sem dados, chamados de gaps. Cada trilha é separada em unidades de tamanho fixo, chamadas de setores. Cada setor físico tem, geralmente, 512 bits de informação. As trilhas estão dispostas em discos ou pratos, sendo assim, um conjunto de tri- 56ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES lhas concêntricas é chamado de cilindro. Pratos, cabeças de leitura e cilindros. Além da informação propriamente dita, cada um dos setores também armaze- na informações de controle em seu início e no seu fim. Essas informações de controle incluem código ECC (Error correction code), responsável por detectar e corrigir erros nos dados armazenados. A definição das trilhas e dos setores nas trilhas é feita pelo fabricante do disco rígido através do processo de formatação física. Alguns fabricantes fornecem essas ferramentas ao usuário final. Atente-se para o fato de que o usu- ário realiza em seu computador o processo de formatação lógica, que é distinto da formatação física, por preparar o disco rígido para ser lido e gravado pelo siste- ma operacional selecionado (Windows, Linux, etc.). Outro processo importante, realizado pelos usuários, é o de particio- namento do disco antes de sua utilização. O processo de particionamento cria uni- dades de armazenamento lógicas, como forma de otimizar o armazenamento dos dados, limitar o crescimento de dados em uma partição específica e também isolar eventuais problemas que ocorram com o disco rígido. É como se o usuário criasse um, dois, três ou n discos em um único hardware. O processo de leitura/gravação no discorígido é realizado através da passa- gem de uma cabeça de leitura/gravação sobre o prato (setor/trilha) onde os dados estão/serão armazenados. Para quem já teve a oportunidade de visualizar ou uti- lizar um disco de vinil, é um processo se- melhante. A única diferença é que no vinil a cabeça de leitura entra em contato com o disco, no HD isso nunca pode acontecer. Se houver contato entre a cabeça de leitura e o prato magnético do disco rígido, você perderá seu disco e, consequentemente, seu conteúdo. É por esse motivo que não podem existir movimentos fortes no com- putador enquanto ele está sendo utilizado. Nesse processo de leitura/gravação, três tempos bastante importantes estão envolvidos: 1. Tempo de posicionamento (seek time): tempo necessário para posi- cionar o cabeçote de leitura na trilha desejada. São fatores determinantes para esse tempo o acionamento e aceleração do braço do cabeçote e o deslocamento até a trilha desejada. Esses são dados fornecidos pelo fa- bricante no manual do disco rígido. Sempre os verifique na comparação 57ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES entre modelos distintos. 2. Tempo de latência rotacional (la- tency time): tempo necessário para o setor específico ficar embaixo do cabeçote. Depende, na maioria das vezes, da velocidade de rotação dos discos: os valores geralmente en- contrados são 5400 (5.4K) , 7200 (7.2K), 10.000 (10K) e 15.000 (15K) rpm (rotações por minuto). Quanto maior o valor, melhor e, obviamente, mais caro será. 3. Tempo de transferência: tempo ne- cessário para a efetiva leitura/escri- ta dos dados. Depende também da velocidade de rotação dos discos. Tempos associados a uma leitura/gravação em disco. Outra tecnologia de disco rígido surgida há poucos anos e que vem tomando conta do mercado, especialmente em face às rápidas interconexões lançadas (SATA 2 e 3), é a dos discos de estado sólido ou SSD – Solid State Disk. A grande dife- rença desses discos é que não são mais usados pratos magnéticos para armazenar as informações e sim memória do tipo Flash, semelhantes àquelas que falamos anteriormente. Assim, não existem mais problemas de contato entre a cabeçote e o prato magnético, bem como o espaço destinado aos discos rígidos pode ser di- minuído, reduzindo até mesmo o consumo elétrico e de ar condicionado em grandes datacenters. Entretanto, como nem tudo é perfei- to, esse tipo de tecnologia também apre- senta seus problemas. Um deles é o custo mais elevado de aquisição, comparado a um disco convencional de mesma capaci- dade. O segundo é a quantidade de ciclos de gravação que o dispositivo suporta em cada uma das células que formam este tipo de memória. A memória NAND Flash (evolução da memória Flash ROM que falamos ante- riormente), assim como as demais memó- rias ROM, não permitem a modificação dos dados armazenados, ao contrário da memória RAM do computador e os discos magnéticos comuns. Para alterar um valor nos SSDs (lembre que os mesmos utili- zam memória NAND Flash), é necessário apagar a informação existente e gravar o conteúdo desejado. Isso é o chamado ciclo de gravação, limitado nesses dispositivos a alguns milhares (aproximadamente 50 a 100 mil) em cada uma de suas célu- las. Muito embora as tecnologias estejam evoluindo para minimizar tal problema, juntamente com os sistemas operacionais (ao invés de apagar um arquivo o sistema operacional informa quais dados não estão mais em uso), esse ainda é um problema para adoção em massa dessa tecnologia. Para sintetizar!!!... Os computadores atuais possuem o mesmo modo de funcionar dos primeiros computadores da década de 60. São compostos por processador, memória principal e dispositivos periféricos de entrada e saída, incluída a memória secundária (discos rígidos). O processador é composto pelas unidades funcionais, ou aritmético e lógicas, responsáveis por todos os cálculos e pela unidade de controle, também pelo envio de sinais de controle que comandam todos os demais ele- mentos do computador. Além disso, ainda temos no processador os registradores, encarregado por armazenar a informação em processamento dentro do processador. As conexões entre as unidades do processador e dos demais elementos são realizadas pelos barramentos (de dados, controle e de endereços). A capacidade de transporte dos barramentos e de armazenamento dos processadores em bits determinam se o processador é de 16, 32 ou 64 bits. Quando falamos em barramentos, temos que lembrar que diversas tecnologias são empregadas em sua cons- trução e os mesmos podem ser paralelos, como o PCI, PATA e SCSI ou seriais, como USB, PCI-Express, SATA e SAS. Temos dois tipos de memória: RAM e ROM. A principal característica da primeira é a perda da informação armazenada sempre que a energia é retirada. A segunda, por sua vez, não perde a informação, porém não pode ser modificada. Nos modelos de ROM que conseguimos alterar a informação, primeiro temos que apagar e depois gravar a nova informação. As memórias, com exceção dos registradores internos ao processador, sempre são mais lentas que o processador, motivo pelo qual existe uma hierarquia de memória. Memórias mais rápidas e caras são postas próximas ao processador (memória cache) enquanto grande quantidade de memória, barata e menos rápida) é deixada como principal (memória RAM propriamente dita). Entre os principais dispositivos de entrada e saída, temos os discos rígidos. Atualmente temos duas principais tecnologias: magnética, onde os dados estão dispostos em pratos magnéticos, cuja leitura é realizada através do posicionamento de uma cabeça de leitura sobre/sob cada um dos pratos; e de estado sólido, onde os dados são armazenados em memória ROM do tipo Flash. Vamos exercitar o que estudamos até aqui? Então... 1. Pesquise o que é um equipamento SAN. Procure diferenciá-lo de um equipamento do tipo NAS (Network Attached Storage). 2. O que é e como é formada uma instrução? 3. O que é um programa? 4. O que é o ciclo de busca-decodificação-execução de instruções? 5. Quais blocos funcionais formam um computador clássico (4 blocos – o processador é dividido em dois blocos)? 6. O que são sinais de controle? Quem os gera? 7. O que são barramentos? Quais são os tipos (não tecnologias) de barramento encontrados em um computador? 8. O que é a palavra de uma memória? 9. O que são códigos de condição em uma ULA? 10. O que é um acumulador? Qual sua função? 11. O que é o apontador de instruções ou contador de programa? 12. O que é o modelo de Von-Neumann? Qual sua importância? 13. O que caracteriza a arquitetura de um computador? 60ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES COMPUTADOR HIPOTÉTICO NEANDER Como o computador executa um programa? Um computador pode ser visto de um ponto de vista organizacional, ou seja, do modo que ele se encontra fisica- mente organizado (quais são suas interfaces, sinais de controle, tipo de memória, etc.) ou do ponto de vista arquitetural ou funcional. Quando falamos em arquitetura de um computador estamos nos referindo de como o programador enxerga esse computador. Por exemplo, existem dois principais fabricantes de processadores para PCs domésticos: Intel e AMD. Ambos compartilham de uma mesma arquitetura (chamada IA-32 para processadores de 32 bits e x64 para processadores de 64 bits), mas a organização interna das duas famílias de processadores é bastante distinta. Dessa maneira, esse é um dos motivos para os dois nunca serem iguais quanto ao desempenho. Ou seja, os programadores e usuários enxergam o computador da mesma forma, independentemente se o processador é um ou outro. Nesse sentido, essas visões podem ocorrer em di- ferentes níveis: desde o hardware, passando pela linguagem 61ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES de máquina, de símbolos e de alto nível. Quanto a visão de linguagem de alto nível, você terá oportunidade de verificar em outras disciplinas. Já, nessa discipli- na você teráa oportunidade de conhecer um pouco de linguagem de máquina e de linguagem de símbolos. Para tanto, usaremos um computador hipotético, de fins exclusivamente didáticos, chamado NEANDER. No entanto, antes disso, é importan- te que você conheça como uma pequena operação matemática é resolvida por um processador, claro, dependendo do tipo de arquitetura utilizada. Em uma arquitetura de quatro ende- reços, o formato da instrução é o seguinte (lembre-se de que cada instrução é forma- da por OPERAÇÃO OPERANDOS): OP E1 E2 E3 E4 Suponha, então, a expressão mate- mática: A = (( B+ C ) * D + E – F ) / (G * H). Para resolvê-la usando uma arquitetura seriam necessárias as seguintes instruções: Já, em uma arquitetura de três ende- reços, o formato da instrução é o seguinte: OP E1 E2 E3 Endereço Instrução Comentário e1 ADD B C A e2 Adiciona B e C, resultado em A; vai para e2 e2 MUL A D A e3 Multiplica A por D, resultado em A; vai para e3 e3 ADD A E A e4 Adiciona A e E, resultado em A; vai para e4 e4 SUB A F A e5 Subtrai F de A, resultado em A; vai para e5 e5 DIV A G A e6 Divide A por G, resultado em A; vai para e6 e6 DIV A H A e7 Divide A por H, resultado final em A; vai para e7 e7 HALT Fim do programa 62ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES Nesse tipo de arquitetura não temos mais como indicar qual a próxima instru- ção a ser executada, então precisamos de um registrador para apontar qual a ins- trução a ser executada. Este registrador especial, que já comentamos no capítulo anterior, é chamado de PC ou Program Counter – Contador de programa. Como não temos mais como indicar qual o pró- ximo endereço, também precisamos de instruções de salto ou jump, que servem apenas para alterar o f luxo normal de exe- cução das instruções (a próxima instrução). A mesma expressão anterior pode ser resolvida nos seguintes passos. Ainda, em uma arquitetura de dois endereços, o formato da instrução é o se- guinte: OP E1 E2 Nessa arquitetura não temos mais um operando para armazenar o resultado das operações. Dessa forma, o resultado da operação é sempre armazenado em um dos dois operandos. Aqui, o primeiro ope- rando também receberá o resultado da operação. Também passa a ser necessário uma instrução que movimente os dados de um registrador (variável de entrada) para outro. A mesma expressão anterior pode ser resolvida nos seguintes passos: Endereço Instrução Comentário e1 ADD B C A Adiciona B e C, resultado em A; incrementa PC e1 + 1 MUL A D A Multiplica A por D, resultado em A; incrementa PC e1 + 2 ADD A E A Adiciona A e E, resultado em A; incrementa PC e1 + 3 SUB A F A Subtrai F de A, resultado em A; incrementa PC e1 + 4 DIV A G A Divide A por G, resultado em A; incrementa PC e1 + 5 DIV A H A Divide A por H, resultado final em A; incrementa PC e1 + 6 HALT Fim do programa 63ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES Por fim, temos arquitetura de ape- nas um único operando (ou endereço). Em uma arquitetura de um endereço temos um Endereço Instrução Comentário e1 MOV A B Move o conteúdo de B para A e1 + 1 ADD A C Adiciona A e C, resultado em A; incrementa PC e1 + 2 MUL A D Multiplica A por D, resultado em A; incrementa PC e1 + 3 ADD A E Adiciona A e E, resultado em A; incrementa PC e1 + 4 SUB A F Subtrai F de A, resultado em A; incrementa PC e1 + 5 DIV A G Divide A por G, resultado em A; incrementa PC e1 + 6 DIV A H Divide A por H, resultado final em A; incrementa PC e1 + 7 HALT Fim do programa registrador adicional, chamado acumulador, utilizado sempre como um dos operandos em operações aritméticas e lógicas. Ele também recebe o valor resultante da operação. A mesma expressão anterior pode ser resolvida nos seguintes passos: Como você deve ter notado, em qualquer uma das arquiteturas conseguimos resolver a expressão matemática. Em uma arquitetura com menos operandos nas instruções precisamos de alguns passos a mais. Contudo, simplificando as instruções, os projetistas de hardware podem construir processadores mais simples e eficientes. O que interessa a nós, neste momento, é conhecer como são formadas as instruções nos processadores que iremos trabalhar. Endereço Instrução Comentário e1 LDA B Carrega o conteúdo de B no acumulador (ACC) e1 + 1 ADD C Adiciona ACC e C, resultado em ACC; incrementa PC e1 + 2 MUL D Multiplica ACC por D, resultado em ACC; incrementa PC e1 + 3 ADD E Adiciona ACC e E, resultado em ACC; incrementa PC e1 + 4 SUB F Subtrai F de ACC, resultado em ACC; incrementa PC e1 + 5 DIV G Divide ACC por G, resultado em ACC; incrementa PC e1 + 6 DIV H Divide ACC por H, resultado final em ACC; incrementa PC e1 + 7 STA A Salva o conteúdo de ACC em A; incrementa PC e1 + 8 HALT Fim do programa 64ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES Computador NEANDER O NEANDER é um computador de 8 bits (1 byte), ou seja, os barramen- tos de dados e endereços são capazes de transportar 8 bits por ciclo de relógio. Com um barramento de endereços de 8 bits, o NEANDER possui apenas 256 posições de memória, cada uma com 8 bits, ou seja, a palavra do NEANDER também é de 8 bits. Os dados são sempre representados através do complemento de dois (B-2). Portanto, a representação dos números em seu simulador sempre respeitará essa forma de representação. Caso você queira trabalhar com outra forma de representa- ção, terá que fazer as adaptações em seu programa. Os seus registradores também são de 8 bits e incluem: • 1 acumulador de 8 bits (AC) • 1 apontador de programa ou con- tador de programa (PC) de 8 bits • 1 registrador de estado com dois códigos de condição (saída da ULA) • Negativo (N) • Zero (Z) Ademais, ele possui apenas um modo de endereçamento: direto ou abso- luto. O modo de endereçamento indica como os dados serão acessados na memó- ria. O modo direto ou absoluto significa que o operando que segue junto à ope- ração representa diretamente o endereço na memória daquele operando. Apenas a título de curiosidade, processadores da arquitetura x86 (IA32) e x64 possuem cinco modos distintos de endereçamento. O conjunto de instruções (que tam- bém é um atributo de uma arquitetura de um computador) é formado das seguintes instruções: Do ponto de vista de operações, essa mesma tabela pode ser visualizada da se- guinte forma: Código Instrução Comentário 0000 NOP Nada 0001 STA end Armazena acumulador (store) 0010 LDA end Carrega acumulador (load) 0011 ADD end Soma 0100 OR end Ou lógico 0101 AND end E lógico 0110 NOT Inverte acumulador 1000 JMP end Desvio incondicional (jump) 1001 JN end Desvio condicional (jump on negative) 1010 JZ end Desvio condicional (jump on zero) 1111 HLT Fim 65ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES Seguindo nesse sentido, o que tal- vez você ainda não tenha visto de alguma forma nesse material sejam as instruções de desvio ou pulo. Elas são utilizadas para modificar o f luxo de execução do pro- grama. Por exemplo, imagine um laço de repetição de tipo “FOR” em uma lingua- gem de programação de alto nível. O que ocorre com o f luxo de instrução ao chegar ao final da repetição? Ele não continua na próxima instrução abaixo, e sim, retorna ao ponto inicial da repetição, não é? Quem faz esse retorno é exatamente a instrução JMP, vista recentemente. E no caso de um laço do tipo “WHI- LE” ou “ENQUANTO”? A repetição apenas continua enquanto determinada condição for verdadeira. É exatamente isso que executam os comandos JZ e JN. Eles modificam o f luxo de execução para retornar ao ponto de interesse, respecti- vamente, sempre que a condição for zero ou negativa. Nos exercícios você terá a oportunidade de testar esses saltos. Para verificar como um programa em Neander deve ser criado, vamos criar um programa exemplo que realiza a soma de três operandos em memória e armazena o resultado em outra posição de memória. O primeiro passo para resolução do problema é separar a memória única do NEANDERentre as instruções do pro- grama e os dados do mesmo. Você deve atentar para que as duas áreas não sejam sobrepostas. Uma sugestão inicial é divi- di-las pela metade, ou seja, do endereço 0 até 127 (7F em hexadecimal - H) tere- mos nossas instruções e do endereço 128 (80H) até 255 (FFH) teremos os dados do programa. Assim, o nosso programa começará no endereço 0 (0H), já na memória e na nossa área de dados teremos três posições para os operandos a serem somados, e uma posição para o resultado da soma. Como sugestão, usaremos os endereços sequen- ciais após o início da área de dados, ou seja, 128 (80H), 129 (81H), 130 (82H) e 131 (83H), respectivamente. Como estamos trabalhando com uma arquitetura com instruções de apenas um único operando, temos que, primei- ramente, carregar (LDA) um operando (128) no acumulador para podermos, na sequência, somarmos com o segundo operando (129). Como o resultado dessa soma inicial será também armazenada no acumulador, podemos já somar a terceira parcela (130). Com o resultado da soma da terceira parcela, poderemos levar o resul- tado do acumulador (STA) para a posição Código Instrução Comentário 0000 NOP Nada 0001 STA end MEMÓRIA(end) ← AC 0010 LDA end AC ← MEMÓRIA (end) 0011 ADD end AC ← MEMÓRIA (end) + AC 0100 OR end AC ← MEMÓRIA (end) OR AC 0101 AND end AC ← MEMÓRIA (end) AND AC 0110 NOT AC ← NOT (AC) 1000 JMP end PC ← end 1001 JN end IF N==1 THEN PC ← end 1010 JZ end IF Z==1 THEN PC ← end 1111 HLT Fim 66ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES de memória do resultado (131). Desse modo, o programa seria cons- truído da seguinte maneira: O programa, quando escrito na for- ma da coluna “Instrução” da tabela ante- rior, é o que chamamos de linguagem de símbolos. Ou seja, estamos instruindo o processador a executar os comandos re- presentados pelos símbolos apresentados antes. Você não pode deixar de lembrar que o mesmo não entende símbolos, apenas linguagem binária. Então, esse mesmo programa pode ser visto das seguintes for- mas, tendo por base a tabela dos comandos do Neander. Em decimal: 32 128 48 129 48 130 16 131 240 Em hexadecimal: 20 80 30 81 30 82 10 83 F0 Em binário: 00100000 10000000 00110000 10000001 00110000 10000010 00010000 10000011 11110000 Finalmente, removendo espaços, o que o processador efetivamente irá execu- tar é o seguinte: 0010000010000000001100001000000 10011000010000010000100001000001 111110000 Não importa o quão complexo é o programa a ser executado em qualquer processador, ele sempre será uma sequência de 0 e 1. Talvez sejam alguns bilhões de 0 e 1, mas a essência é sempre a mesma. Endereço Instrução Comentário 00 LDA 128 Acumulador recebe posição 128 01 ADD 129 Conteúdo do AC + Pos. 129 02 ADD 130 Conteúdo do AC + Pos. 130 03 STA 131 Conteúdo do AC vai para pos. 131 04 HLT FIM Para sintetizar!!!... O Neander é um computador de 8 bits criado exclusivamente para fins didáticos, apesar de ser viável sua construção física. O seu processador possui capacidade de execução de 11 instruções. Cada instrução é composta da operação a ser executada e no máximo 1 operando (arquitetura de 1 endereço). O fluxo de execução das instruções no Neander é semelhante a qualquer outro computador. As instruções e os dados estão na memó- ria RAM. O processador busca a instrução a ser executada na memória (conforme conteúdo do registrador PC), faz a decodificação e a execução da mesma na unidade funcional. Vamos exercitar o que estudamos até aqui? Então... 1. Limpe o acumulador. Desenvolva muitos programas diferentes que façam a mesma coisa: a. Use atribuição direta b. Use subtração c. Use AND d. Use OR e. Use incrementos sucessivos 2. Some duas variáveis de 8 bits em complemento de dois. O primeiro número a somar estará na posição de memória 128 e o segundo na posição 129. O resultado deverá ser colocado na posição de memória 130. 3. Subtraia duas variáveis de 8 bits em complemento de dois, da mesma forma que no exercício anterior (operandos em 128 e 129, resultado em 130). 4. Compare três valores positivos de 8 bits representados em complemento de dois e armazenadas em posições consecutivas na memória (posições 128, 129 e 130). O maior valor deverá ser escrito na próxima posição de memória. (131). Para auxiliar, crie antes um algoritmo para resolução do problema. 69ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES ARQUITETURAS DE ALTO DESEMPENHO Seu computador executa aproximadamente 20 bilhões de operações por segundo. Os computadores mais rápidos do mundo alcançam as marcas de quatrilhões de operações por segundo! Os computadores de antigamente, entre as décadas de 60 a 80, eram dotados de processadores que não aproveitavam, de maneira eficiente, a quantidade de hardware disponível durante a execução das instruções. Posteriormente, com a divisão da execução das instruções em estágios, onde a finali- zação de um estágio por uma instrução permite que uma nova instrução utilize aquele estágio, tornou-se possível executar com uma certa sobreposição várias determinações no mesmo ciclo do processador. Tal técnica foi chamada de pipeline e talvez tenha sido o maior passo na evolução arquitetural dos processadores. Essa mesma técnica continua sendo utilizada nos processadores comerciais mais conhecidos. Com o avanço no desenvolvimento do software, esses hardwares “convencionais” que eram utilizados nesses pro- 70ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES cessadores já não atendiam mais a real necessidade de desempenho das novas e modernas aplicações. Alterações no har- dware eram necessárias e após alguns es- tudos e avaliações, o pipeline foi reestru- turado e ampliado para o que atualmente é conhecido como arquitetura superescalar. Portanto, essas arquiteturas possuem a capacidade de executar instruções com paralelismo simultâneo, além daquele com sobreposição parcial. Os processadores superescalares são representados pela maioria dos proces- sadores disponíveis no mercado, sendo que uma parte deles foram inicialmente (década de 80 e 90) chamados de RISC (Reduced Instruction Set Computer). Para diferenciar dos processadores RISC, os processadores de PC convencionais (Intel e AMD x86) foram chamados de CISC (Complex Instruction Set Computer). A grande diferença das máquinas RISC era a existência de um número reduzido de instruções (de tamanho uniforme) e uma maior velocidade de execução das instru- ções, devido à utilização de mecanismos de exploração de paralelismo ao nível de instrução. Assim, esses microprocessado- res compensavam as restrições impostas ao conjunto de instruções por meio de sua grande capacidade de processamento e velocidade de operação. Como máquinas RISC, podemos citar: PowerPC, Alpha, UltraSparc, entre outros. Todos esses pro- cessadores não equipavam computadores pessoais e sim grandes computadores de centros de pesquisa, indústria e serviços. Já as máquinas CISC utilizavam um grande número de instruções de tama- nho variável, implicando em uma maior facilidade de programação, porém neces- sitando maior quantidade de hardware para a decodificação dessas instruções. O exemplo clássico desse tipo de arquitetura é a família de processadores x86 da Intel. Atualmente, a diferença entre RISC e CISC não pode ser estabelecida com cla- reza, uma vez que os processadores RISC contam com quase o mesmo número de instruções das máquinas CISC, e essas incorporam vários mecanismos de extração de paralelismo que só eram encontrados em máquinas RISC. Além disso, as má- quinas CISC geralmente têm um núcleo de execução RISC. Para atingir o máximo desempenho, esses processadores exploram o paralelismo no nível de instrução (ILP – Instruction Level Parallelism), utilizando, para tal, a execução fora-de-ordem, hierarquia de memória, previsão de desvios, entre outras técnicas. Todas essas técnicas tornaram esses processadores mais complexos, com mais transistorese dissipando cada vez mais energia e calor. Os desenvolvedores de hardware têm, de maneira geral, três opções para tentar melhorar o desempenho de tais processadores: aumentar a frequência de funcionamento do mesmo, tentar explorar mais ILP através de novas técnicas e usar caches cada vez mais rápidas, maiores e próximas ao processador. Técnicas para aumentar a frequência de clock do pro- cessador envolvem, desde o uso de novas técnicas de fabricação, até o aumento no número de estágios do pipeline. Ambas as técnicas esbarram em alguns problemas, como os limites físicos dos processos de fabricação e as quebras do f luxo de instru- 71ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES ções nos pipelines (desvios, misses, etc). A extração de mais ILP envolve técnicas que tentam aumentar o número de instru- ções executadas por ciclo, esbarrando no limite de tamanho dos blocos básicos de um programa, ou seja, 4 a 5 instruções. O emprego de caches maiores e mais próxi- mas aos processadores é outra técnica que visa melhorar o desempenho desses pro- cessadores, tentando diminuir a histórica diferença de velocidade de processador e memória principal. O problema dessas técnicas é que ambas implicam em maiores áreas de silício, maior número de transistores e uma maior dissipação de energia. Além disso, elas não atingem 100% de efici- ência, por exemplo, dobrando o clock de um processador não se atinge o dobro de desempenho. É conhecido que os softwares atuais fazem uso de múltiplas threads ou múlti- plos processos que podem ser executados em paralelo. Esse nível de paralelismo é conhecido como paralelismo no nível de thread (TLP – Thread Level Parallelism). A exploração do TLP é uma das formas de diminuir a distância entre desempenho x custo de um processador/arquitetura. Existem algumas arquiteturas ca- pazes de realizar essa tarefa: as máquinas multiprocessadas e as máquinas que execu- tam mais de uma tarefa, simultaneamen- te (SMT – Simultaneous MultiThread, CMP – Chip MultiProcessor) ou não (MT – MultiThread). Máquinas multiprocessadas já são utilizadas há muito tempo para extrair maior desempenho das aplicações, vis- to que possuem diversos processadores (geralmente superescalares) interligados através de uma “placa-mãe”. Cada uma das tarefas pode ser executada em um dos pro- cessadores simultaneamente. Essas tarefas podem ser threads da mesma aplicação, de diferentes aplicações ou uma tarefa de sistema operacional. Uma vantagem desse tipo de máquina é o conhecimento das técnicas de programação que extraem alto desempenho pelos programadores. Sua principal desvantagem é o alto custo do hardware. Historicamente, a ideia de execução de mais de uma tarefa surgiu dos sistemas operacionais multiprogramados (multita- refas), onde, virtualmente, diversas tarefas executam algo simultaneamente. Para o usuário final, o processador está realmente executando mais de uma tarefa ao mesmo tempo. Nesse caso, o paralelismo é virtual e é obtido pelo sistema operacional pela intercalação das tarefas no tempo, ou seja, cada tarefa tem um tempo no qual real- mente utiliza o processador. Essa quanti- dade de tempo é conhecida por time-slice (fatia de tempo) e é gerenciada pelo sistema operacional, o qual deve garantir que: a fatia de tempo seja pequena o suficiente para que o usuário não note nenhum tipo de degradação no sistema e, por outro lado, seja grande o suficiente para que o pro- grama utilize o processador, realizando trabalho útil. Com o avanço da microeletrônica, foi possível integrar em hardware muito dos recursos utilizados nesses sistemas operacionais multiprogramados. A partir disso, surge uma arquitetura intermediária entre multiprocessadores e processadores 72ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES “simples”, chamada de arquitetura mul- titarefas. O hardware das mesmas possui muitos recursos duplicados, necessários para manter o contexto das diversas ta- refas, e outros compartilhados, tais como caches e unidades funcionais. O pipeline desses processadores multitarefas pode, geralmente, conter em um certo estágio instruções de apenas uma thread. Dessa maneira, as instruções de cada tarefa avançam pelo pipeline de forma “sincronizada”. Na figura a seguir esse comportamento pode ser facilmente identificado. O front-end do pipeline pode despachar quatro instruções por ciclo, para quaisquer das quatro unidades funcionais (ULAs). Contudo, essas quatro instru- ções devem ser de uma mesma thread (ou programa). Logo, cada tarefa ativa está confinada a uma “fatia de tempo”, nesse caso, um ciclo de clock. Assim, o front-end contém múltiplas tarefas em execução e a lógica de despacho alterna entre as mesmas a cada ciclo ao enviar as instruções para execução. Arquitetura Multi Tarefa Com o advento da tecnologia foi possível implementar uma arquitetura multitarefa capaz de busca, despachar e executar instruções de múltiplas tarefas em um mesmo ciclo. Essa arquitetura foi chamada de multitarefas simultâneas e a implementação comercial mais conhecida desse tipo de arquitetura foi chamada de Intel Hyper-Threading. Resumidamente, como mostra a seguinte figura, a grande diferença entre uma arquitetura SMT e uma multitarefa (imagem anterior) é a possibilidade de no mesmo ciclo de clock serem executadas instruções de diferentes f luxos. Já a dife- rença entre ambas e uma superescalar é a possibilidade de existir “realmente” mais de uma tarefa executando no processador. A cada ciclo, o processador SMT seleciona instruções de todas as tarefas ativas para execução (no caso, duas tarefas). Outras ta- refas podem estar em memória, esperando pelo escalonador do sistema operacional torná-las ativa. Ele explora o ILP ao sele- cionar instruções de qualquer tarefa que, potencialmente, pode despachar instru- ções. Assim, após, o processador arranja os recursos de execução dinamicamente entre as instruções, fazendo com que haja uma maior utilização do hardware disponível. Se uma tarefa possui muito ILP dispo- nível, o mesmo será utilizado; se diversas tarefas têm pouco ILP, elas executarão em paralelo, compensando o baixo ILP. Nesse caso, dizemos que o TLP está sendo explorado. 73ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES Arquitetura superescalar (esquerda) vs. Multitarefas Simultânea (direita) O processador que possui a caracte- rística Hyper Threading duplica algumas de suas estruturas internas (mas não todas), a fim de conseguir executar instruções de mais de um programa. Em alguns casos, podendo obter ganhos de desempenho de até 20 a 30% com relação a um processador sem a tecnologia. Para o sistema operacio- nal é como se existissem dois processadores lógicos. Do ponto de vista arquitetural ou de software, programas podem ser alocados para cada um dos processadores lógicos, como se fossem destinados a processadores físicos. Já do ponto de vista de microarqui- tetura, instruções de diferentes processa- dores lógicos executarão, simultaneamente, em unidades compartilhadas. Ainda, é importante ressaltar que em alguns casos pode haver até mesmo queda de desempenho, pois nem sempre o sistema operacional consegue encontrar programas em execução suficientes para aproveitar a disponibilidade dos recursos do Hyper Threading. Com o avanço dos processos de fa- bricação dos processadores, obtendo mais espaço internamente aos chips, os proje- tistas conseguiram colocar dentro de um único chip mais de um núcleo de proces- samento. Surgiram então os CMP (Chip Multi Processor). O exemplo clássico dessa arquitetura é a Core da Intel. Essa técnica, como a anterior, tem por objetivo extrair não só o ILP, mas também o paralelismo entre tarefas (TLP). Como não há mais o que avançar em termos de um processador único, o que essencialmente é realizado, é a inserção de diversos processadores em um único chip, aumentando o desempenho da máquina por permitir que, efetivamente, mais deum programa seja executado ao mesmo tempo. E ainda, cada um desses núcle- os pode contar com a tecnologia Hyper Threading, dando a sensação ao usuário de possuir o dobro de processadores em sua máquina. 74ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES Aglomerados de computadores Uma outra forma de obter maior desempenho dos sistemas computacionais, já bastante comum em grandes corpora- ções, universidades e centros de pesquisa é a união de máquinas por meio de uma rede de comunicação de dados. A esse grupo de máquinas chamamos de cluster. O termo cluster pode ser interpre- tado de três maneiras diferentes: 1. Cluster de Alto Desempe- nho: múltiplas máquinas processando em paralelo como se fossem uma só. 2. Cluster de Balanceamento de Carga: uma máquina (com ou sem backup) que distribui a carga entre um conjunto de servidores. 3. Cluster de Alta Disponibili- dade: duas ou mais máquinas que adicio- nam confiabilidade a um ou mais serviços. Os dois últimos não serão aborda- dos nessa disciplina. Os primeiros fazem parte do que chamamos, de acordo com a taxonomia de Flynn (1972), de MIMD: Multiple Instruction Stream, Multiple Data stream. As máquinas convencionais (PC) são conhecidas por SISD (Single Instruction Single Data Stream). A forma mais simples de cluster de alto desempenho pode ser obtida, por exemplo, em um laboratório de informática de uma universidade. Ali (ou em qual- quer outro laboratório) você encontrará um grupo de máquinas, interconectados por uma rede de dados. Essa é a base do cluster. Para diferenciar de um laborató- rio qualquer, o usuário do cluster precisa enxergar tal grupo de máquinas como se fosse uma só. A fim de realizar essa tarefa, exis- tem diversas soluções no mercado, pagas e gratuitas. A Microsoft, por exemplo, disponibiliza essa opção no pacote Micro- soft HPC Server (https://technet.micro- soft.com/pt-br/library/cc514029(v=ws.11). aspx). Com o sistema operacional Linux, você pode utilizar, por exemplo, o MO- SIX (ou Linux PMI) para transformar os computadores em uma solução distribuída de alto desempenho (embora muitos cha- mem o cluster MOSIX de balanceamento de carga). O software verifica o estado de cada uma das máquinas (através da rede) e passa a migrar os programas em execução para as máquinas que tenham maior poder de processamento e memória disponíveis, de acordo com as configurações desejadas. O usuário de um sistema desses não tem o conhecimento de qual máquina está exe- cutando os seus programas. Ele apenas vê o resultado em sua tela. Outra forma de utilização de clus- ters de alto desempenho, comum em cen- tros de pesquisa, também parte da mesma premissa anterior, um grupo de máquinas ligadas em rede em que o usuário as perce- bam como uma única máquina. Todavia, neste caso, o software que é executado nessa máquina é construído especifica- mente para ela. Também, são utilizadas linguagens 75ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES especiais como MPI (Message Passing Interface) ou OpenMP que permitem que o seu programador “quebre” a solução do problema em partes menores, e que cada uma dessas partes sejam executadas em um computador físico distinto. Ainda, é preciso uma nova forma de pensar para programar com essas linguagens, pois o programa estará distribuído em diferentes máquinas físicas, as quais precisam ser coordenadas e trocar informações para resolver o problema. Existe um ranking na internet cha- mado TOP 500, que reúne as 500 máqui- nas mais poderosas (públicas) do mundo. A lista atual (de novembro de 2016 - ht- tps://www.top500.org/lists/2016/11/) é dominada por Estados Unidos e China, com 171 máquinas. Eles são seguidos pela Alemanha (32), Japão (27), França (20) e Inglaterra (17). Os dois computadores mais rápi- dos são chineses e possuem 10.649.600 e 3.120.000 núcleos (cores ou processado- res), respectivamente. Ambos consomem mais de 15 MW. O mais rápido deles é capaz de realizar 93 quatrilhões de opera- ções de ponto f lutuante por segundo, ou seja, 93 petaflops. Apenas por comparação, um PC equipado com três Intel Core i7 980 XE (12 núcleos) não consegue atingir 20 gigaf lops, ou 0,02 teraf lops. O Brasil está representado com ape- nas três máquinas: duas no laboratório nacional de computação científica (RJ) e um no SENAI CIMATEC (BA). A mais rápida deles consegue a marca de “apenas” 456 teraf lops (ou seja, 456 tri- lhões de operações de ponto f lutuante por segundo) e possui 12.672 GB de memória RAM (a mais rápida do mundo possui 1.310.720 GB). É claro que, apesar da grande parte destas máquinas utilizarem processadores comuns, disponíveis a qualquer indivíduo no mercado, elas fazem uso de redes espe- ciais para troca de dados. Nessas máqui- nas a interconexão entre os nós (cada um 76ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES dos computadores que as formam) estão constantemente trocando informações, o que torna a rede um verdadeiro garga- lo. Uma das redes de interconexão mais utilizadas é a Infiniband (http://www. infinibandta.org). Ela apresenta alta taxa de transferência de dados com baixa la- tência (rapidamente). As três máquinas utilizam infiniband como tecnologia de interconexão. Outro ponto em comum, pratica- mente em todas essas máquinas e que está se tornando habitual em computadores domésticos é a utilização de GPUs (Gra- phical Processing Units), são as CPUs (processadores) das placas de vídeo, em especial do fabricante Nvidia. Esses GPUs são muito eficientes na manipulação de gráficos e no processa- mento de imagens, fazendo com que sua estrutura, altamente paralela, seja muito mais eficiente que os processadores de uso geral (Intel, AMD, etc.) para o processa- mento da grande massa de dados executa- dos de forma paralela (como é o caso nesses supercomputadores). Para explorar toda essa funcionalidade dos GPUs é necessário que o programa seja construído com essa finalidade. Por fim, existem algumas lin- guagens de programação que fazem isso, como por exemplo, o CUDA e OpenCL. Para sintetizar!!!... Os processadores atuais exploram dois níveis de paralelismo (execução de várias instruções ao mesmo tempo): paralelismo no nível de instrução (ILP) e paralelismo no nível de threads (TLP). O primeiro é o paralelismo existente dentro de um mesmo programa ou fluxo de execução, já o segundo, é aquele existente entre os diversos programas em execução num computador. O ILP é explorado pelo que chamamos de arquiteturas superesca- lares, enquanto o TLP é explorado por processadores com tecnologias SMT, como Hyper Threading, e o CMP, como o Intel Core. Contudo, mesmo com todos esses avanços, muitas aplicações somente podem ser “resolvidas” com o uso massivo de força computa- cional. É nesse ponto que encontramos os clusters de alto desempenho, as quais são as máquinas mais poderosas do mundo. Também, são essa máquinas que atuam no ramo da física, da indústria petroleira, bélica e na previsão do tempo, entre outras. Funcionam por meio da junção de diversas máquinas (processadores + memória) através de uma rede de altíssima velocidade. Além de contar com toda a tecnologia dos processadores atu- ais, as referidas máquinas geralmente são montadas com a utilização de GPUs, que são processadores gráficos especializados em executar tarefas em paralelo. Vamos exercitar o que estudamos até aqui? Então... 1. Qual era a diferença entre processadores RISC e CISC? Por que, hoje, não é mais possível fazer essa diferenciação? 2. Qual a diferença entre um processador com a tecnologia CMP (Intel Core) e SMT (Intel HyperThreading)? 3. Por que alguns administradores de sistema preferem desligar a opção SMT dos processadores? 4. Cite quais tipos de cluster existem e diferencie-os. 5. Pesquise e correlacione as tecnologias de cluster e as funcionalidades de cloud computing (computação na nuvem). 6. O que você precisaria para transformar o laboratório de sua faculdade em um cluster de altodesempenho? 79ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES REFERÊNCIAS GONÇALVES, R. A. L.; NAVAUX, P. O. A. A Utili- zação de Buffer de Remessa Unificado em Arquiteturas Supe- rescalares com Fluxos Balanceados de Instruções. In: CONFE- RÊNCIA LATINO AMERICANA DE INFORMÁTICA, CLEI Panel, 24., 1998, Quito, Equador. Anais… [S.l.:s.n.], 1998. GÜNTZEL, J. L., NASCIMENTO, F. A. Introdução aos Sistemas Digitais. Disponível para download em http://minerva. ufpel.edu.br/~guntzel/isd/isd.html. (Acesso em 15/05/2005) MONTEIRO, Mário. Introdução à Organização de Com- putadores. 4ª e 5ª ed. Rio de Janeiro: LTC. 2007. PIZZOL, G. D. Previsão de Desvios em Arquiteturas Multitarefas Simultâneas. Dissertação de Mestrado. PPGC- -UFRGS. 2005. STALLINGS, William. Arquitetura e Organização de Computadores.8ª ed. São Paulo: Pearson Prentice Hall. 2010. VASCONCELOS, Laércio. Hardware na Prática. 3ª ed. Rio de Janeiro. 2009. WEBER, Raul F. Fundamentos de Arquitetura de Com- putadores. Editora Sagra Luzzatto, 2004 INTRODUÇÃO PROJETO DE CIRCUITOS DIGITAIS Álgebra Booleana Portas Lógicas e Circuitos Lógicos Derivação de Expressões Booleanas Simplificação de Expressões Circuitos combinacionais Circuitos sequenciais ESTRUTURA INTERNA DE UM COMPUTADOR – MODELO DE VON NEUMANN Blocos funcionais COMPUTADOR HIPOTÉTICO NEANDER ARQUITETURAS DE ALTO DESEMPENHO