Escolar Documentos
Profissional Documentos
Cultura Documentos
A velocidade de cálculo é outro fator de peso para as arquiteturas de computador, uma vez que ela será determinante para
o tempo de resposta de um sistema computacional com respeito à execução de uma dada aplicação.
Memória
Entrada
Unidade Central de
Processamento (CPU)
Saída
Figura 2.2 — Composição básica de um computador.
A velocidade de cálculo está diretamente relacionada com a freqüência do relógio que pilota o circuito da CPU como um
todo. O microprocessador Intel 4004 era movido por um clock de freqüência igual a 108 KHz (isto mesmo... quilohertz),
enquanto hoje fala-se em microprocessadores com clocks de 200, 233, 266 e até 300 MHz.
Ainda relacionada com a ALU, é possível destacar a quantidade de operações que ela suporta. Os primeiros processadores
suportavam um conjunto relativamente modesto de operações lógicas e aritméticas. Em particular, no que diz respeito às
operações aritméticas, os primeiros processadores suportavam apenas operações de adição e subtração, sendo que as
demais operações tinham de ser implementadas através de seqüências destas operações básicas. Os processadores
suportando um conjunto mais complexo de instruções surgiu de 15 anos para cá, graças à adoção da tecnologia CISC
(Complex Instruction Set Computer).
Embora não seja um aspecto visível ou perceptível internamente, é importante destacar que o aumento do potencial de
cálculo de um computador só foi incrementado devido à evolução da microeletrônica que tem oferecido técnicas de
integração capazes de encapsular uma quantidade cada vez maior de transistores por unidade de área. Só para que se tenha
um parâmetro, o Intel 4004 possuía 23000 transistores integrados no mesmo chip, enquanto dos chips da linha Pentium
abrigam cerca de 6 milhões de transistores.
2.2. A Memória
Todo computador é dotado de uma quantidade (que pode variar de máquina para máquina) de memória a qual se constitui
de um conjunto de circuitos capazes de armazenar (por períodos mais curtos ou mais longos de tempo) as unidades de
dados e os programas a serem executados pela máquina. Nos computadores de uso geral, é possível encontrar diferentes
denominações para as diferentes categorias de memória que neles são encontradas:
a memória principal, ou memória de trabalho, onde normalmente devem estar armazenados os programas e dados a
serem manipulados pelo processador;
a memória secundária que permitem armazenar uma maior quantidade de dados e instruções por um período de
tempo mais longo; os discos rígidos são exemplos mais imediatos de memória secundária de um computador, mas
podem ser citados outros dispositivos menos recentes como as unidades de fita magnética e os cartões perfurados
introduzidos por Hollerith;
a memória cache, conceito introduzido mais recentemente e que se constitui de uma pequena porção de memória
com curto tempo de resposta, normalmente integrada aos processadores e que permite incrementar o desempenho
durante a realização de um programa.
Os circuitos de memória são normalmente subdivididos em pequenas unidades de armazenamento denominadas palavras.
Cada palavra é identificada no circuito por um endereço único, o qual vai ser referenciado pelo processador no momento de
consultar ou alterar o seu conteúdo. Historicamente, cada palavra de memória permitia armazenar 8 dígitos binários (ou
bits), o que introduziu o conceito de byte como sendo uma palavra de 8 bits, unidade até hoje utilizada para medir a
capacidade de armazenamento das memórias e o tamanho dos programas.
As quantidades de memória hoje são definidas em termos de Kbyte (quilobyte) que correspondem a 1024 bytes ou (210
bytes) e Mbyte (megabyte), que correspondem a 1024 Kbyte ou (220 bytes).
O grande desenvolvimento ocorrido na área de software, particularmente no que diz respeito ao uso de interfaces gráficas e,
mais recentemente, das aplicações multimídias, tem forçado os fabricantes de componentes de computador a produzirem
circuitos de memória cada vez mais poderosos.
No que diz respeito aos computadores pessoais, por exemplo, pode-se verificar a que ponto este aspecto evoluiu, tanto na
memória principal, como na memória secundária:
no que diz respeito à memória principal, o Altair 8800, primeiro microcomputador pessoal produzido em 1974,
possuía memória RAM de 256 Kbyte, o IBM-PC quando lançado, já era mais "bem dotado", com uma RAM de 640
Kbyte; os PCs da linha 386, lançados em 1991, vinham de fábrica com memória de 2 ou 4 Mbyte; atualmente, um
microcomputador da linha Pentium deve vir com uma configuração mínima de memória de 32 Mb;
como já foi mencionado no capítulo anterior, os microcomputadores, ou computadores pessoais pioneiros não
vinham dotados de disco rígido, sendo que o usuário era obrigado a manter suas informações armazenadas em
Apostila de Arquitetura de Computadores II 4
disquetes de 5¼", com capacidade para armazenar até 360 Kbyte...em 1985, quando os IBM-XT foram lançados,
estes vinham equipados com discos rígidos de 2 a 5 Mbyte...em 1990, os microcomputadores da linha 386 vinham
equipados com discos rígidos na faixa entre 40 e 100 Mbyte... mais tarde, em 1995, os micros 486 eram adquiridos
com discos de 540 e 850 Mb em média... atualmente, um microcomputador Pentium é adquirido com um disco de no
mínimo 2 Gbyte.
2.3. Dispositivos de entrada/saída
Conhecidos também como I/O (de Input/Output), são os elementos que possibilitam a troca de dados entre o computador e
o seu ambiente (usuário, periféricos, outros equipamentos). Os periféricos mais utilizados nos computadores de uso geral
são o teclado, o mouse, as impressoras, o monitor de vídeo, etc. Os circuitos que possibilitam a troca de dados com o
ambiente externo ao computador são conhecidas sob o nome de portas de E/S, as quais podem implementar a transmissão
das palavras de dados segundo duas diferentes políticas:
a comunicação paralela, onde cada dígito (ou bit) da palavra de dados é conduzido por um fio dedicado, o que
significa que os cabos utilizados para a comunicação paralela são dotados de uma grande quantidade de fios (ou
vias); o exemplo mais clássico de dispositivos que utilizam a comunicação paralela são as impressoras;
a comunicação serial, onde os bits de cada palavra são transmitidos um a um, de forma seqüencial, através de uma
única via, o que explica o fato dos cabos que implementam este tipo de comunicação serem constituídos por uma
pequena quantidade de fios; os exemplos mais conhecidos de dispositivos que fazem uso desta política de
comunicação são o mouse e os modems.
3. INVESTIGANDO OS MICROPROCESSADORES
Como já dissemos, desde o início dos anos 70, os processadores ou microprocessadores, elementos de base dos
computadores, são produzidos em circuitos integrados. A figura 2.3 apresenta duas opções em termos de aspecto externo de
um microprocessador. De um ponto de vista interno, um microprocessador assume um aspecto mais próximo do que é
apresentado na figura 2.4. nesta figura, é apresentado o interior do 4004. Olhando para esta figura, já se pode imaginar o
quanto mais complexo pode ser o aspecto interno de um Pentium.
seção de
A+B registros da
CPU
Unidade
de
registros de Controle
A B
entrada da ALU
ALU
registro de
A+B
saída da ALU
Os processadores contém ainda outros registros que permitem aos programadores o armazenamento de resultados
intermediários.
3.2.2. A execução de uma instrução
De forma simplificada, pode-se descrever os passos que envolvem a execução de um programa, como realizada
internamente pela CPU:
carregamento da instrução a executar para o registro de instrução;
modificação do valor do contador de programa para que ele aponte a palavra de memória seguinte;
decodificação da instrução armazenada no registro de instrução;
localização, em memória, dos eventuais valores utilizados pela instrução;
carregamento dos dados, se necessário, nos registros internos da CPU;
execução da instrução;
armazenamento dos resultados em seus destinos respectivos;
retorno ao passo para execução da instrução seguinte.
A esta seqüência de etapas, chamamos ciclo de carregamento-decodificação-execução, que é o ciclo de base no
funcionamento de todo processador. O fato de se poder escrever um programa que simule o comportamento de uma CPU
para execução de instruções deixa clara a possibilidade de que um programa não seja executado unicamente pelo hardware,
mas também pelo software, num nível superior da estrutura de um computador.
A estes programas, damos o nome de interpretadores e esta possibilidade vai ter grande importância no momento de se
definir a arquitetura de um computador. Por exemplo, a definição de uma determinada linguagem associada a um
determinado nível do computador vai estar intimamente ligada ao conhecimento de que ela seja executada pelo hardware
ou por um interpretador (software).
Apostila de Arquitetura de Computadores II 7
FI
FI FD
UC UP MM
Figura 2.6 — Máquinas SISD.
FD
FI 1
UP1 MM1
FI FI FD
2
UC UP2 MM2
FD
N
FI
UPN MMN
FI
FI1 FI1
UC1 UP1
FI 2 FI 2
UC 2 UP2
MM1 MM 2 MMN
FIN FIN
UCN UPN
FD
FI1 FI2 FI
N
FI 2 FI 2 FD FI2
2
UC 2 UP2 MM 2
FD
FIN FIN N
UC N UPN MM N
FI
N
Todos as complexas operações de um computador digital acabam sendo combinações de simples operações aritméticas e
lógicas básicas: somar bits, complementar bits (para fazer subtrações), comparar bits, mover bits. Estas operações são
fisicamente realizadas por circuitos eletrônicos, chamados circuitos lógicos (ou gates - "portas" lógicas).
Computadores digitais (binários) são construídos com circuitos eletrônicos digitais - as portas lógicas (circuitos lógicos).
Os sistemas lógicos são estudados pela álgebra de chaveamentos, um ramo da álgebra moderna ou álgebra de Boole,
conceituada pelo matemático inglês George Boole (1815 - 1864). Boole construiu sua lógica a partir de símbolos,
representando as expressões por letras e ligando-as através de conectivos - símbolos algébricos.
A álgebra de Boole trabalha com apenas duas grandezas: falso ou verdadeiro. As duas grandezas são representadas por 0
(falso) e 1 (verdadeiro). Nota: nos circuitos lógicos do computador, os sinais binários são representados por níveis de
tensão.
____
NOT --> (uma barra horizontal sobre o termo a ser invertido ou negado).
E ------> . (um ponto, como se fosse uma multiplicação)
OU ----> + (o sinal de soma)
São tabelas que representam todas as possíveis combinações das variáveis de entrada de uma função, e os seus respectivos
valores de saída.
A seguir, apresentamos as funções básicas, e suas representações em tabelas-verdade.
AND - FUNÇÃO E
OR - FUNÇÃO OU
Apostila de Arquitetura de Computadores II 12
Nota: A menos da estranha expressão 1 + 1 = 1, as demais expressões "parecem" a aritmética comum a que estamos
acostumados, onde E substitui "vezes" e OU substitui "mais".
FUNÇÃO NOT
Boole desenvolveu sua álgebra a partir desses conceitos básicos e utilizando apenas os algarismos 0 e 1. Os primeiros
computadores fabricados, como o ENIAC, trabalhavam em DECIMAL. No entanto, a utilização de circuitos eletrônicos que
operassem com 10 diferentes níveis de tensão (para possibilitar detectar as 10 diferentes grandezas representadas no
sistema decimal) acarretavam uma grande complexidade ao projeto e construção dos computadores, tendo por conseqüência
um custo muito elevado. Surgiu então a idéia de aplicar a álgebra de Boole, simplificando extremamente o projeto e
construção dos computadores.
Mas como os conceitos da álgebra de chaveamentos (um ramo da álgebra do Boole) são aplicados ao projeto dos
computadores digitais?
A chave de tudo é um circuito eletrônico chamado CHAVE AUTOMÁTICA. Como funciona uma chave automática?
Vamos imaginar um circuito chaveador com as seguintes entradas:
- uma fonte de alimentação (fornece energia para o circuito)
- um fio de controle (comanda a operação do circuito)
- um fio de saída (conduz o resultado)
No desenho, a chave permanece aberta enquanto o sinal C no fio de controle for 0 (ou Falso). Enquanto não houver um
sinal (sinal 1 ou Verdadeiro) no fio de controle, que mude a posição da chave, o sinal no fio de saída S será 0 (ou Falso).
Quando for aplicado um sinal (sinal 1 ou Verdadeiro) ao fio de controle, a chave muda de posição, tendo como resultado
que o sinal na saída será então 1 (ou Verdadeiro). A posição da chave se manterá enquanto não ocorrer um novo sinal na
entrada.
A chave automática foi inicialmente implementada com relés eletromecânicos e depois com válvulas eletrônicas. A partir
da metade da década de 50, passaram a ser utilizados dispositivos em estado sólido - os TRANSISTORES, inventados em
Stanford em 1947. Os modernos Circuitos Integrados - CI's e os microprocessadores são implementados com milhões de
transistores "impressos" em minúsculas pastilhas.
Apostila de Arquitetura de Computadores II 13
Vamos agora analisar o que ocorreria se nós ligássemos em SÉRIE duas chaves automáticas como as acima, e ligássemos
uma lâmpada ao circuito. O circuito resultante poderia ser representado assim:
A lâmpada acenderia SE - e somente se - as DUAS chaves estivessem na posição LIGADO (ou verdadeiro), o que seria
conseguido com as duas entradas A e B em estado 1 (Verdadeiro). Substituindo CORRENTE (ou chave ligada) por 1 e
AUSÊNCIA DE CORRENTE (ou chave desligada) por 0, como ficaria nossa tabela verdade para LÂMPADA LIGADA = 1
e LÂMPADA DESLIGADA = 0?
A B F
0
0
0
1
</DIV>
Dá para reconhecer a nossa já familiar FUNÇÃO E?
O circuito acima que implementa a função E é chamado de PORTA E (AND GATE).
Vamos agora analisar o que ocorreria se nós ligássemos em PARALELO duas chaves automáticas como as acima, e
ligássemos uma lâmpada ao circuito. O circuito resultante poderia ser representado assim:
A lâmpada acenderia SE QUALQUER UMA DAS-CHAVES estivesse na posição LIGADO (ou verdadeiro), o que seria
conseguido com uma das duas entradas A ou B em estado 1 (Verdadeiro). Substituindo CORRENTE (ou chave ligada) por
1 e AUSÊNCIA DE CORRENTE (ou chave desligada) por 0, como ficaria nossa tabela verdade para LÂMPADA LIGADA
= 1 e LÂMPADA DESLIGADA = 0?
A B L
0 0 0
0 1 1
1 0 1
Apostila de Arquitetura de Computadores II 14
1 1 1
</DIV>
E agora, dá para reconhecer a nossa já familiar FUNÇÃO OU?
O circuito acima, que implementa a função OU, é chamado de PORTA OU (OR GATE).
São dispositivos ou circuitos lógicos que operam um ou mais sinais lógicos de entrada para produzir uma (e somente uma)
saída, a qual é dependente da função implementada no circuito.
Um computador é constituído de uma infinidade de circuitos lógicos, que executam as seguintes funções básicas:
a) realizam operações matemáticas
b) controlam o fluxo dos sinais
c) armazenam dados
Existem dois tipos de circuitos lógicos:
a. COMBINACIONAL - a saída é função dos valores de entrada correntes; esses circuitos não tem
capacidade de armazenamento [casos a) e b) acima].
b. SEQUENCIAL - a saída é função dos valores de entrada correntes e dos valores de entrada no instante
anterior; é usada para a construção de circuitos de memória (chamados "flip-flops" - caso c acima);
esses circuitos não serão estudados neste curso, mas apresentamos uma breve introdução no final do
capítulo.
3.2.1.PORTAS BÁSICAS
PORTA OR (OU)
A porta OR combina dois ou mais sinais de entrada de forma equivalente a um circuito em paralelo, para produzir um único
sinal de saída, ou seja, ela produz uma saída 1, se qualquer um dos sinais de entrada for igual a 1; a porta OR produzirá um
sinal de saída igual a zero apenas se todos os sinais de entrada forem 0.
B) Detector de incêndio com vários sensores (entradas) e uma campainha para alarme (saída). Se QUALQUER UM dos
sensores for acionado (significando que um dos sensores detectou sinal de incêndio), a campainha é ACIONADA. Tabela
verdade:
Uma expressão booleana é uma expressão formada por sinais de entrada (chamados variáveis de entrada) ligados por
conectivos lógicos, produzindo como resultado um único sinal de saída.
Na avaliação de uma expressão Booleana, deverá ser seguida uma ordem de precedência conforme a seguir definido:
1º - avalie NOT
2º - avalie AND
3º - avalie OR
Obs.: respeitando-se sempre os parênteses!
b) CIRCUITO AND
c) CIRCUITO OR
Apostila de Arquitetura de Computadores II 19
Exercício:
Escreva a expressão do circuito abaixo e simplifique.
Solução:
3.5.FORMAS CANÔNICAS
Exemplos:
1) Considere um circuito elétrico composto de uma fonte de energia comercial (a alimentação da empresa de distribuição
de energia, p.ex., a CEB) e um interruptor (nossas entradas ) e uma lâmpada (nossa saída). A lâmpada acenderá se - e
somente se - a) houver energia disponível (se não estiver "faltando luz") e b) o interruptor estiver ligado. Elabore a tabela
Apostila de Arquitetura de Computadores II 20
2) Considere um sistema composto de duas caixas d'água (uma superior e uma cisterna). A cisterna é alimentada pela
entrada de água da "rua", via empresa distribuidora (ex.: CAESB). A caixa superior serve para distribuir a água, por
gravidade, em todo o prédio: bicas, chuveiros, descargas sanitárias, circuitos anti-incêndio, etc, com a água sendo
impulsionada por uma bomba hidráulica através de uma tubulação que liga a cisterna à caixa superior. Considerando que a
bomba queimará se for acionada sem haver água no circuito hidráulico, projete um circuito lógico para acionar a bomba
sempre que a caixa superior estiver vazia, desde que tenha água na cisterna.
3) Considere um circuito elétrico composto de uma fonte de energia comercial (a alimentação da empresa de distribuição
de energia, p.ex., a CEB), uma alimentação auxiliar (um gerador e um no-break, com bateria de acumulação) e um
interruptor (nossas entradas ) e um sistema de computadores (nossa saída). O computador poderá operar se: a) houver
energia disponível (se não estiver "faltando luz") em um dos circuitos de alimentação e b) o interruptor estiver ligado.
Elabore a tabela verdade que representa esse circuito lógico.
3.5.2.FORMAS CANÔNICAS
A partir da tabela verdade produzida conforme item anterior, é possível chegar à expressão que representa o
comportamento do circuito, e em seguida construir o circuito, usando as portas lógicas já estudadas. O processo de
elaboração da expressão usa as chamadas formas canônicas, que consistem em regras para representar as condições de
entrada que:
SET
D Q
D CLK Q
0 0
CLR
Q 1 1
isto é, a expressão poderá ser encontrada aplicando-se alternativamente UMA ou OUTRA das formas.
MINITERMO - são termos somente com AND (termos PRODUTO)
MAXITERMO - são termos somente com OR (termos SOMA).
É produzida construindo:
- um termo (uma sub-expressão) para cada linha da tabela verdade (que representa uma combinação de valores de
entrada) em que a saída é 1,
- cada um desses termos é formado pelo PRODUTO (FUNÇÃO AND) das variáveis de entrada, sendo que:
------ quando a variável for 1, mantenha;
------ quando a variável for 0, complemente-a (função NOT).
- a função booleana será obtida unindo-se os termos PRODUTO (ou minitermos) por uma porta OR (ou seja, "forçando-
se" a saída 1 caso qualquer minitermo resulte no valor 1).
Dessa forma, ligando os termos-produto (também chamados minitermos) pela porta OR, caso QUALQUER UM dos
minitermos seja 1 (portanto, caso qualquer uma das condições de valores de entrada que produz saída 1se verifique), a
saída pela porta OR será também 1. Ou seja, basta que se verifique qualquer uma das alternativas de valores de entrada
expressos em um dos minitermos, e a saída será também 1, forçada pelo OR. Caso nenhuma dessas alternativas se
verifique, produz-se a saída 0.
Exemplo:
Apostila de Arquitetura de Computadores II 21
É produzida construindo:
- um termo (uma sub-expressão) para cada linha da tabela verdade (que representa uma combinação de valores de
entrada) em que a saída é 0,
- cada um desses termos é formado pela SOMA (FUNÇÃO OR) das variáveis de entrada, sendo que:
------ quando a variável for 0, mantenha;
------ quando a variável for 1, complemente-a (função NOT).
- a função booleana será obtida unindo-se os termos SOMA (ou maxitermos) por uma porta AND (ou seja, "forçando-
se" a saída 0 caso qualquer minitermo resulte no valor 0).
Dessa forma, ligando os termos-soma (também chamados maxitermos) pela porta AND, caso QUALQUER UM dos
minitermos seja 0 (portanto, caso qualquer uma das condições de valores de entrada que produz saída 0 se verifique), a
saída pela porta AND será também 0. Ou seja, basta que se verifique qualquer uma das alternativas de valores de entrada 0
expressos em um dos maxitermos, e a saída será também 0, forçada pelo AND. Caso nenhuma dessas alternativas se
verifique, produz-se a saída 1.
Exemplo:
Se ambas as formas canônicas produzem expressões equivalentes, como escolher qual a representação a utilizar? Escolha a
que resultar em menor número de termos, produzindo uma expressão mais simples. Por esse método, pode-se encontrar a
expressão que represente qualquer tabela verdade.
Após se encontrar uma expressão que represente o comportamento esperado, é possível que não seja uma expressão
simples que possa ser construída com poucas portas lógicas. Antes de projetar o circuito, é útil SIMPLIFICAR a expressão,
de forma a possibilitar construir um circuito mais simples e portanto mais barato.
Portanto, o fluxo de nosso procedimento será:
DESCRIÇÃO VERBAL ---> TABELA VERDADE ---> FORMA CANÔNICA --->
--->FUNÇÃO SIMPLIFICADA ---> CIRCUITO
3. 6. MAPA DE KARNAUGH
O Mapa de Karnaugh é uma ferramenta de auxílio à minimização de funções booleanas. O próprio nome mapa vem do fato
dele ser um mapeamento biunívoco a partir de uma tabela-verdade. Vejamos como é feito este mapeamento.
ou seja (veja que a variável A, em verde, está indicando que a função em questão só possui uma variável independente):
1. Acrescenta-se mais uma coluna à tabela-verdade original. Esta coluna tem por função enumerar as
linhas, a partir de zero (0).
2. Constroi-se tantos quadrículos quantas forem as linhas da tabela-verdade, enumerando-os com o
número da linha correspondente no canto superior esquerdo de cada quadrículo (números em preto).
3. Coloca-se os valores das variáveis do lado de fora de cada quadrículo (números em azul).
4. Coloca-se os valores da função no centro de cada quadrículo, respeitando-se o número da linha
correspondente (números em vermelho).
Note que, a partir do Mapa de Karnaugh para funções três ou mais variáveis independentes, há uma anotação das filas
(linhas ou colunas) de quadrículos onde a variável independente não muda de valor. Também observe que, de uma fila de
quadrículos para outra fila, só há uma mudança de valor nas variáveis. Observe que a ordem de numeração das linhas e
colunas, representativas de combinações de variáveis, obedece o Código de Gray (Gray Code), às vezes chamado de Código
Refletido.
Apostila de Arquitetura de Computadores II 24
<BIG><BIG>Exemplos de Uso</BIG></BIG>
Do lado da equação booleana, e pelo Teorema 11, visto anteriormente, a redução é evidente. Do lado do Mapa de
Karnaugh, os dois quadrículos contíguos, contendo o valor lógico 1 cada, indicam que:
1A variável A não muda de valor lógico nos dois quadrículos contendo o valor lógico 1 da função F (1 acima da tabela):
mantenha a variável A.
2A variável B muda de valor lógico nos dois quadrículos contendo o valor lógico 1 da função F (0 e 1 à esquerda da
tabela): elimine a variável B.
Por não ser trivial a conclusão obtida com o mapa de Karnaugh, aí segue a prova,
Como pode ser visto, o mapa de Karnaugh é uma ferramenta eficiente para simplificar funções booelanas.
Uma simplificação algébrica alternativa da função acima fica como exercício. Note que no mapa de Karnaugh acima, os
quatro quadrículos contíguos (linha 0 - coluna 11; linha 0 - coluna 10; linha 1 - coluna 11; linha 1 - coluna 10),
contendo o valor lógico 1 cada, indicam que a variável A não muda de valor lógico nos quatro quadrículos contendo o valor
lógico 1 da função F. Esta é a razão de manter-se a variável A (primeiro termo da simplificação). A variável A muda de
valor lógico nos dois quadrículos contendo o valor lógico 1 da função F: elimine a variável A, mantendo B e C
complementadas (segundo termo da simplificação).
Ex.3 - Considere, agora, a função lógica do exemplo 2. Faremos sua minimização através do conceito de maxtermos. Para
isso, complete as lacunas com o dígito 0,
Apostila de Arquitetura de Computadores II 25
Note que, agora, estamos destacando os 0's adjacentes, e não os 1's adjacentes, como no exemplo 2. Para melhor
compreensão do que isso significa, construa a tabela verdade da função F e também de sua negação, F',
Donde você pode concluir que os mintermos (ou maxtermos) que aparecem em F não aparecem em F', e vice-versa,
Significa que minimizar a função F, via mintermos, é equivalente a minimizar sua negação, F', via maxtermos. Se você
minimizar F', via mapa de Karnaugh através de mintermos, e, então, calcular F (negando F'), você também resolveu o
problema do exemplo 2. O mapa de Karnaugh para F' é,
3.7.1.CIRCUITOS ARITMÉTICOS
1+0=1
1 + 1 = 0 e vai um
vem 1 + 1 + 1 = 1 e vai um
Lembram-se do algoritmo da soma? Para somar dois números (em qualquer base, binários ou não), soma-se os algarismos
dos números, coluna a coluna, transportando o "vai um" para a próxima coluna, quando for o caso.
Bom, difícil não pode ser, já que vimos fazemos somas desse jeito desde o curso primário...
A - B = A + ( - B)
E a multiplicação? A multiplicação é obtida de duas formas: por somas sucessivas (por exemplo, A + A = 2A) e pela
movimentação de bits. Lembremo-nos que quando quando queremos multiplicar um número decimal por 10, basta
acrescentar um zero à direita do número. Como nesse caso a base é 10, isso equivale a MULTIPLICAR PELA BASE.
Generalizando, para multiplicar um número pela base, basta acrescentar um zero à direita do número, ou seja, movemos
todos os algarismo de um número para a esquerda de uma posição (uma ordem de grandeza), preenchendo a última ordem à
direita (que ficaria vaga) com um zero. Isso, portanto, equivale a multiplicar esse número pela base.
Por exemplo, na base 10, tomando 50 e fazendo 500 (movendo 50 para a esquerda uma posição e colocando um zero para
preencher a posição mais à direita) equivale a multiplicar 50 por 10 (a base)!
Atenção: devemos ler esse número como: um zero zero vezes um zero = um zero zero zero. Para ficar ainda mais claro,
vamos lembrar que, passando para decimal, 100(2) é 4(10), 10(2) é 2(10) e portanto teríamos em decimal: 4 x 2 = 8). Lembrem-se:
10 só é dez em decimal! Agora, sempre que estivermos usando uma base diferente de 10, vamos sempre ler 10 como um-
zero! E como base decimal não é usada em computadores digitais, DEZ, a partir de agora, fica banido de nosso vocabulário!
As mesmas propriedades, aplicadas no sentido contrário, valem para a divisão! Desta forma, podemos ver que
O COMPUTADOR PODE REALIZAR TODAS AS OPERAÇÕES ARITMÉTICAS
USANDO APENAS SOMAS!
Com esta introdução, podemos agora estudar alguns exemplos dos circuitos aritméticos usados em computadores.
O circuito meio-somador SOMA DOIS BITS (sem levar em conta bit de carry).
Entrada - os dois bits a serem somados - A e B
Apostila de Arquitetura de Computadores II 27
Como descrevemos anteriormente, uma função lógica produz uma e apenas uma saída. Portanto, sendo duas as saídas,
serão necessárias duas funções diferentes, ou um circuito composto, podendo haver interseção de portas lógicas.
c. Construir a tabela
d. Forma canônica
e. Simplificação (não há o que simplificar)
d. Circuito
Seleção
O circuito somador completo SOMA DOIS BITS (considerando na soma o bit de carry in que veio da soma anterior).
Entrada - os dois bits a serem somados e o bit de carry in - A, B e Ci
Saída - a soma dos bits e o bit de carry out ("vai um") - S e Co
a. Construir a tabela
b. Forma canônica
c. Simplificação
Apostila de Arquitetura de Computadores II 28
d. Circuito
e. Representação esquemática
MINI UAL (um circuito capaz de fazer somas e subtrações de dois números)
Vamos construir uma mini-UAL para números de 4 bits; o mesmo esquema pode ser usado para UAL's de 8 bits, 16 bits,
etc.
Apostila de Arquitetura de Computadores II 29
SOMADOR
A entrada do somador receberá 8 bits, sendo quatro bits de cada número (A e B) a ser somado, variando de 0000 a 1111(2)
ou, se representarmos na base 10, de 00 a 15 (10).
A saída terá também 4 bits para o resultado da operação matemática (soma). Porém, existe a possibilidade de que a soma
ultrapasse a capacidade do nosso somador (neste caso, 4 bits). Para isso, precisamos incluir um 5º bit, um bit de overflow.
Como são 2 variáveis, cada uma com 4 bits, teríamos 24 = 16 combinações para cada variável = 16 x 16 = 256 (também
podemos fazer 2 variáveis por 8 bits = 28 = 256) combinações possíveis, dando saída a 5 bits. Bem, isso resultaria em uma
tabela verdade BEM GRANDINHA que daria "UM POUCO" de trabalho para solucionar ... Quem quiser se aventurar,
asseguro que daria um bom exercício ... físico.
Bom, sorte nossa que isso pode ser evitado. Basta nos lembrarmos de como é o algoritmo da soma.
Assim, usando o circuito somador completo que construimos anteriormente, podemos ligar vários somadores completos em
cascata (sem "cascatas") e assim conseguir um somador de n bits. Bastaria ligar cada par de bits da entrada (A0 e B0, A1 e
B1, etc) às entradas de cada somador, e ligar os somadores cada um ao seguinte ... pelos bits de carry! O carry out de um
somador é então o carry in do próximo!
Obs.: Como o somador de entrada não deve receber nenhum bit de carry in, é preciso forçar que o Ci desse
somador seja zero.
Repare que todos os circuitos são alimentados ao mesmo tempo, mas seu funcionamento deve ser seqüencial, porque o Ci
que é entrada de um circuito é um resultado do processamento no circuito anterior (é o Co do anterior).
3.8.1.TRATAMENTO DA SUBTRAÇÃO
Levando em conta um bit extra para sinalizar a operação, podemos ter uma soma ou uma subtração. Para construir a
subtração, vamos também usar uma propriedade já conhecida:
UMA SUBTRAÇÃO É UMA SOMA EM COMPLEMENTO! Ou seja,
A - B = A + ( - B)
O algoritmo de complemento em binário é também conhecido, e bastante simples de implementar:
Conforme anteriormente convencionamos,
para POSITIVO (OU SOMA), S = 0
para NEGATIVO (OU SUBTRAÇÃO), S = 1.
que é uma função XOR. Portanto, para resolver a subtração, basta incluir portas XOR tendo como entradas B0 ...
Bn e S.
Até agora, estamos fazendo a operação em complemento a 1 (C1). Se quisermos fazer em complemento a dois
(C2), basta somar um ao complemento a um (e não somar nada quando não for feito o complemento). Ou seja:
se for uma soma (portanto o sinal é zero), nada precisa ser feito;
se for subtração (portanto o sinal é um), e portanto uma soma em complemento, basta somar 1 ao complemento a
1.
Isso pode ser conseguido SOMANDO O SINAL na entrada (Ci), pois caso o sinal seja 0 (soma) nada será feito e caso o
sinal seja 1 (significando uma subtração, portanto B deve ser complementado) então será somado 1 na entrada.
3.8.3.TRATAMENTO DE OVERFLOW
Caso na última coluna da soma resulte valor maior que a base-1, haverá overflow. Como nossa representação só
vai até o quarto bit, é necessário sinalizar a ocorrência do overflow para sinalizar resultados errados.
O algoritmo estudado (ver Representação em Ponto Fixo) diz:
SE houver VAI UM para o penúltimo bit (C3=1) E TAMBÉM para o último bit (C4=1) OU
SE não houver VAI UM para o penúltimo bit (C3=0) NEM PARA o último bit (C4=0)
NÃO HÁ OVERFLOW
SE houver VAI UM para o penúltimo bit (C3=1) E NÃO para o último bit (C4=0) OU
SE não houver VAI UM para o penúltimo bit (C3=0) E SIM para o último bit (C4=1)
HÁ OVERFLOW
Analisando esta tabela verdade, podemos verificar que é uma função XOR entre C3 e C4.
Aplicando os circuitos de tratamento de subtração em complemento a dois e de sinalização de overflow ao
circuito somador, a seguir é mostrado o circuito da mini-UAL.
Apostila de Arquitetura de Computadores II 31
3.9.1. INTRODUÇÃO
Vimos anteriormente o funcionamento de uma lógica combinacional, ou ainda, uma lógica para a qual a saída é
pré-determinada de forma unívoca pelas entradas. Estes circuitos apresentam um grave problema, que é a ausência de
memória sobre os estados anteriores. Todo o desenvolvimento computacional e de comunicações digitais está suportado
pela concepção de memória. Este computador onde voce está acessando este texto depende da existência de contadores,
osciladores, somadores e toda uma lógica que depende, fundamentalmente, da existência de conhecimento sobre os estados
anteriores do sistema em função do tempo, ou seja, memória.
Existem distintos tipos de memória, porém, a lógica de todas elas está associada a circuitos oscilantes, chamados
de flip-flop, que podem alternar sua saída (estados flip ou flop, p.e.) em função dos parâmetros de entrada e do tempo
decorrido.
O conceito de tempo está associado a pulsos de um relógio (clock), que vai alternar estados entre 0 e 1, com uma
frequência pré-determinada, e será utilizado na propagação temporal da informação. O objetivo fundamental deste grupo de
experimentos é a compreensão de como podemos armazenar informação em uma estrutura eletrônica, e como retransmitir
esta informação em tempos (pulsos de clock) posteriores.
3.9.2 - FLIP-FLOP
Uma memória de um bit é o elemento fundamental para desenvolver qualquer outra memória. Estas memórias de um bit
podem "guardar" estados "1" (Q=1) ou estados "0" (Q=0). Uma estrutura básica de uma memória, ainda não associada a
qualquer pulso externo de clock, pode ser obtida a partir de dois NANDs associados, conforme visto a seguir.
Se buscamos uma memória, desejamos que seja possível escrever o valor na memória, não nos serve de nada uma
memória na qual não possamos controlar seu conteúdo! Uma das formas de controlar o conteúdo de uma memória é
associar às entradas uma lógica inversora, utilizando ANDs. A utilização dos ANDs permite que a memória fique estável
em várias situações, i.e., mantendo seu valor, independente do que aconteça na entrada. Somente quando o pulso de clock
(Ck) for positivo, é que o sinal poderá ser modificado dentro do flip-flop. Este flip-flop é chamado de SR (set e reset),
explique por que dos nomes, a partir da discussão sobre sua tabela verdade.
Você deve perceber, em sua análise, que o flip-flop SR ainda apresenta situações onde as entradas e os resultados
na saída são indefinidos. Uma das formas de corrigir este problema é desenvolver outro tipo de flip-flop, chamado de JK,
onde as saídas realimentam as entradas.
3.9.2.1. Flip-Flop SR
S R Ck Q
1 1 Q0
0 1 1
1 0 0
0 0 Inválido
x x Não Muda
Apostila de Arquitetura de Computadores II 32
3.9.2.2. Flip-Flop JK
J K CLK Q
0 0 Q0
0 1 0
1 0 1
___
1 1 Q0
O D vem da palavra dados, é o tipo de flip-flop mais utilizado. Possui uma arquitetura simples com uma entrada
D e um CLOCK. Este flip-flop é resultado de dois latches D ligados de forma sequencial, onde suas entradas enable são
complementares. No flip-flop tipo D, o que interessa é a transição negativa, e sempre que esta ocorre a saída é atualizada.
Exercício: dado o FF abaixo, operando no modo comutado, assuma Q = 0 inicialmente e determine a forma de onda Q.
SET
D Q
1KHz
CLR
Q
3.9.4 - CONTADORES
Contadores são um dos dispositivos mais comuns, sejam em equipamentos eletrônicos autônomos, operando
como controladores de frequência, geradores de rampa para conversores tipo ADC (analog to digital converter), qualquer
sistema de controle de transmissão de dados por rede, etc. Os contadores são baseados no uso de algumas propriedades de
memória dos flip-flops.
Como exemplo, vamos analisar a tabela verdade de um flip-flop JK. É interessante observar que, quando estamos
utilizando um dispositivo que depende do tempo para operar, é necessária uma definição de, em que tempo, será analisada
a lógica de entrada do sistema. Imagine que um dos sinais de entrada de um flip-flop qualquer é um sinal que apresenta
variações temporais abruptas. Temos que definir onde se dará a análise do tempo na lógica, i.e. onde os valores de entrada
serão analisados. Para tanto, em geral estes componentes dinâmicos são sensíveis à variação da tensão, operando na borda
de subida ou de descida (mais frequente).
Isto significa que, todas as modificações no valor do sinal serão desconsideradas, a menos que aconteçam em um
intervalo de tempo curto, no qual (espera-se) que os dados não sofram modificações, a fim de que a lógica possa ser
aplicada.
Apostila de Arquitetura de Computadores II 33
Tabela-Verdade
flip-flop tipo JK
T J K Q
0 X X Não muda
1 0 0 Q0
1 1 0 1
1 0 1 0
1 1 1
___
Q0
O gráfico a seguir exemplifica como o sistema irá operar, lembrando da tabela verdade e de que este flip-flop é
sensível à borda de descida.
Discuta como se dará a contagem em função do tempo para este contador de 3 bits, i.e., identifique quais serão os
valores obtidos, em função dos valores de Q0 a Q02.
Antes de conectar os fios, que valores são possíveis e impossíveis nesta combinação? Existem valores
indeterminados?
_
A B Q Q
0 0
0 1
1 0
1 1
Apostila de Arquitetura de Computadores II 34
3.9.5. MEMÓRIAS
Buffers de
Entrada E R/W
0 - Escrita
1 - Leitura
0
1 Registrador 0
Registrador 1
2 Registrador 2
A5
A4
A3 Decodificador 6 -
A2 para - 64
A1 CS - Seleção de Chip
61 1 - Habilita o chip para
A0 62
Registrador 61
Registrador 62 leitura ou escrita
Entradas de 63
Registrador 63
Endereço
Buffers de
Saída E
O 3 O 2 O 1 O0
Saída de Dados
Dificilmente, a capacidade e tamanho de palavra desejados podem ser obtidos utilizando um único chip. Diversos chips são
combinados para fornecer a capacidade e tamanho de palavra desejados. A expansão do tamanho da palavra é conseguida
com os chips ligados as mesmas linhas de endereço e controle e ligados as linhas de dados diferentes. A expansão da
capacidade é realizada com a decodificação de endereços utilizando a entrada CS.
Na expansão do tamanho da palavra, é desejável um tamanho de palavra maior do que o disponível. Os chips
necessários para compor a palavra desejada são ligados as linhas de endereço e controle de forma que todos estão
selecionados ao mesmo tempo. As linhas de entrada/saída da RAM são ligadas as linhas de dados do processador, de forma
que cada chip seja responsável por armazenar parte da palavra.
Apostila de Arquitetura de Computadores II 35
AB3
DE ENDEREÇO
BARRAMENTO
AB2
AB1
AB0
R/W
CS
A3 A2 A1 A0 A3 A2 A1 A0
RAM - 0 RAM - 1
R/W
16 x 4 R/W
16 x 4
CS CS
I/O3 I/O2 I/O1 I/O0 I/O3 I/O2 I/O1 I/O0
DB7
DB6
BARRAMENTO
DB5
DE DADOS
DB4
DB3
DB2
DB1
DB0
Na expansão da capacidade de memória, o total de palavras armazenadas em cada chip disponível não é suficiente. A
combinação é feita de forma que as linhas de entrada/saída dos chips sejam ligadas ao barramento de dados. Somente um
chip é selecionado em um determinado instante de tempo. As linhas de endereço menos significativas são ligadas a todos os
chips. As linhas de endereço mais significativas são utilizadas para selecionar qual chip estará ativo (CS).
AB4
DE ENDEREÇO
BARRAMENTO
AB3
AB2
AB1
AB0
R/W
A3 A2 A1 A0 A3 A2 A1 A0
RAM - 0 RAM - 1
R/W
16 x 4 R/W
16 x 4
CS CS
I/O3 I/O2 I/O1 I/O0 I/O3 I/O2 I/O1 I/O0
DB3
BARRAMENTO
DE DADOS
DB2
DB1
DB0
A12
A11
A10..A0
O3
A1 O2
A0 O1
O0
Decodificador
2 para 4 A0 - A10 A0 - A10 A0 - A10 A0 - A10
CS CS CS CS
O0 - O7 O0 - O7 O0 - O7 O0 - O7
D7..D0
O circuito multiplex é utilizado para enviarmos as informações contidas em vários canais(fios), a um só canal
(fio). Esquematizando o multiplex, temos :
A entrada de seleção tem como finalidade escolher qual das informações de entrada, ou qual dos canais de
informações deve ser ligado à saída. Um circuito elementar que efetua uma multiplexação é uma chave seletora de 1 pólo e
n posições, esquematizada na figura abaixo.
Apostila de Arquitetura de Computadores II 37
Montando a tabela, relacionamos os valores assumidos pela saída para cada possibilidade das variáveis de
seleção, obtendo, a partir disso, o respectivo produto canônico.
Variáveis de Seleção: Situação na saída:
Caso 0 0 (P0 = A . B ) S= I0
Caso 0 1 (P1= A . B ) S= I1
Caso 1 0 (P2= A . B ) S= I2
Caso 1 1 (P3 = A . B ) S= I3
Em função destas expressões, esquematizamos o circuito. A figura 8.6 mostra o circuito do multiplex de 4 canais
proposto.
Apostila de Arquitetura de Computadores II 38
Para entendermos o funcionamento do circuito, vamos analisar um dos casos possíveis, por exemplo, o caso em
que as variáveis de seleção estiverem na condição A=1 e B=0. Quando ocorrer este caso, o gerador de produtos canônicos
apresentará P2=1, com isso, a porta E ligada à saída P2, estará com um dos terminais em nível lógico 1, logo, na sua saída,
teremos o valor que I2 assumir, ou seja, se I2 for igual a 0, a saída desta será 0; se I2 for igual a 1, a saída será 1. Sabendo-se
que neste caso todas as outras entradas da porta OU estarão em 0, concluímos que, quando as variáveis de seleção
estiverem na condição 10 (AB), S será igual a I2. Para analisarmos os outros casos, basta procedermos de forma análoga. O
circuito foi esquematizado dessa maneira para maior compreensão, normalmente, é representado como mostra a figura
abaixo.
Vamos agora, como exemplo, elaborar o circuito de um multiplex de 16 canais segundo o mesmo processo. Para
comutarmos 16 entradas necessitamos de 4 variáveis de seleção. O número de informações que as entradas de seleção
podem comutar é 2n, onde n é o número de entradas de seleção. Assim sendo, montamos a tabela da verdade:
O funcionamento deste circuito é análogo ao de 2 variáveis. Podemos notar que cada informação de entrada
possui apenas uma combinação das variáveis de seleção que a conecta à saída, portanto, se quisermos conectar à saída uma
determinada informação, precisamos injetar nas entradas de seleção sua respectiva combinação. A essa combinação damos
o nome de endereço, conceito facilmente compreensível, pois, ao injetarmos as variáveis de seleção, estamos endereçando
através de um código binário, a informação que deve ser conectada à saída.
Apostila de Arquitetura de Computadores II 41
Ao entrarmos com o endereço 00 ( A . B ) , encontramos na saída a informação I0. Como podemos notar, no
circuito, quando B for igual a 0, as saídas intermediárias S0 e S1 estarão com as informações, I0 e I2 respectivamente.
Quando A for 0, teremos na saída S somente o valor de saída intermediária S0, que neste caso estará com o valor I0, logo, ao
injetarmos neste circuito o endereço 00, teremos na saída a informação I0. Podemos analisar de modo análogo os outros
endereços:
Endereço 01(A . B): a saída assumirá o valor de I1.
Endereço 10 (A .B): a saída assumirá o valor de I2.
Endereço 11(A . B): a saída assumirá o valor de I3.
Dentro da série de circuitos integrados comerciais, também encontramos circuitos multiplex de 8 canais de
informações (3 variáveis de seleção). Com a utilização destes blocos, seguindo este processo, podemos formar circuitos
multiplex com muito maior capacidade.
Para ilustrar, vamos elaborar a seguir, um exemplo de confecção de circuito multiplex com capacidade superior a
8 canais. Vamos efetuar a confecção de um multiplex de 16 canais, utilizando blocos de 8 canais de informação.
Para isso, devemos conectar os blocos da maneira vista na figura abaixo:
Apostila de Arquitetura de Computadores II 42
Nos blocos multiplex 1 e 2, as variáveis B, C e D irão selecionar os 2 canais de entrada, que possuem endereços
iguais (BCD), nas saídas S0 e S1. O multiplex 3, por possuir as entradas de seleção curto-circuitadas, apresentará somente
os endereços 000 (A=0) ou 111 (A=1), logo, este bloco efetuará a seleção final através de variável A, complementar ao
endereço. Podemos observar que no multiplex 3, as saídas S0 e S1 deverão ser ligadas nas entradas cujos endereços são 000 e
111, pois devido ao tipo de ligação das variáveis de seleção, as outras entradas jamais serão endereçadas. Após esta
análise, concluímos que o conjunto executa a função de um sistema multiplex de 16 canais de informação.
Podemos utilizar um multiplex que apresente, sequencialmente na saída, os dados correspondentes aos canais de
informação. Para isso, basta conectarmos às entradas de seleção um circuito contador que gere a sequência de contagem
desejada. Para ilustrar este procedimento, a figura abaixo mostra um multiplex de 8 canais com seleção sequencial feita por
um contador de 0 a 7 (8 estados).
Uma das utilidades deste sistema é a conversão de uma informação paralela em uma informação série, pois se o
contador gerar a sequência binária, teremos sequencialmente na saída, as informações I0 , I1 , I2 até In-1. Essa configuração,
porém, não faz com que o multiplex funcione obrigatoriamente como sendo um conversor paralelo-série, pois dado o
endereço de um canal de entrada, a saída irá variar de acordo com a variação deste, logo, se surgir na entrada um trem de
pulsos, este será recolhido na saída.
O circuito multiplex pode ser utilizado também para a montagem de circuitos combinacionais quaisquer. Para
isso, basta montar a tabela da verdade do circuito.
As saídas que o circuito deve apresentar em cada uma das possibilidades devem ser injetadas nos canais de
informação. Assim, quando ocorrer uma das possibilidades, as variáveis de seleção irão endereçar a respectiva informação,
que terá o seu valor definido de acordo com a tabela da verdade.
Para exemplificar, vamos esquematizar o circuito que executa a tabela 8.4, utilizando blocos multiplex.
Vamos, agora, estabelecer os valores dos canais de informação de cada um dos multiplex, que irão apresentar as
saídas S1 e S2:
Partindo da tabela, vamos escrever os valores que as informações de entrada devem assumir:
MUX 1: I0=I3=I5=I6=0 I1=I 2=I4=I7=1
Vamos, então, injetar esses valores nos respectivos canais de informação. O esquema do circuito, nesta situação,
é visto na figura 8.19.
Apostila de Arquitetura de Computadores II 44
Este circuito irá apresentar as saídas S1 e S2 de acordo com as variáveis de seleção de entrada, seguindo a tabela
da verdade. Para verificarmos o funcionamento do circuito, vamos analisar um dos casos, pois os outros serão análogos.
Analisaremos, por exemplo, o caso das entradas ABC iguais a 011, respectivamente.
Ambos os multiplex irão endereçar o canal de informação I3, logo, nas saídas S1 e S2, teremos respectivamente 0 e
1, que estão colocados respectivamente nas entradas.
Este exemplo mostra que podemos esquematizar um circuito combinacional através da utilização de blocos
multiplex. A vantagem do emprego do multiplex está na facilidade de esquematização de circuitos, principalmente quando
temos um número elevado de variáveis. Por exemplo, quando tivermos 8 variáveis, teremos 256 possibilidades, o que
implicará numa grande dificuldade de simplificação do circuito. Utilizando este processo, basta injetarmos os valores 1 e 0
nos canais de informação, de acordo com as variáveis de seleção, conforme a tabela da verdade.
3.10.2 - DEMULTIPLEX
Imagine um número de fontes onde são geradas palavras e um número de receptores. Vamos supor ainda, que
queremos poder transmitir uma palavra de qualquer fonte para qualquer receptor. Para se conseguir isto, seria construindo
um barramento, bus, separado de cada fonte até cada receptor (com o número desejado de linhas igual ao número de bits
por palavra). Isto teóricamente, mas na prática não compensa, pois você teria que ter vários barramentos. Então se usa a
multiplexação, o que nos permite a utilização de um barramento para várias fontes, mas também precisaremos de um
demultiplexador, pois é necessário que uma estrutura lógica que receba uma palavra do barramento e a dirija ao receptor
selecionado.
4.1. INTRODUÇÃO
Uma análise detalhada dos sinais disponíveis nos pinos de um microprocessador permite conhecer os
seus diferentes modos de funcionamento (lógico e elétrico) e as suas possibilidades em termos de interfaces.
Os sinais externos dos computadores são organizados em três grupos: os sinais de endereço, os sinais de
dados e os sinais de controle. A cada um destes grupos é associada uma linha de comunicação (ou um barramento),
respectivamente, o barramento de endereços, o barramento de dados e o barramento de controle. Estes barramentos
permitirão conectar os pinos do microprocessador aos pinos de mesma função dos circuitos de memória ou de E/S.
Um exemplo de funcionamento é o carregamento de uma instrução. O microprocessador inicialmente
carrega o endereço da instrução no barramento de endereços; em seguida, ele ativa um sinal no barramento de controle para
especificar à memória uma operação de leitura; em resposta, a memória vai colocar, no barramento de dados, a palavra
representando a instrução requisitada e previne o microprocessador (com um sinal no barramento de controle); ao perceber
o sinal de validação, o microprocessador lê a palavra no barramento de dados e a armazena num de seus registros internos.
Em alguns casos, será necessária a leitura de outras palavras no barramento de dados para que a instrução possa ser
executada. Nestes, casos, o processo descrito acima se repetirá pelo número de vezes correspondente ao número de palavras
a serem lidas.
Apostila de Arquitetura de Computadores II 46
O valor do sinal elétrico num pino de um microprocessador (ou linha do barramento) indica se o sinal
está ativo ou não. Alguns sinais são ativos no nível alto (ou seja, em 5 v), enquanto outros são ativos em nível baixo (ou
seja, 0 v).
Dois parâmetros podem ser associados à performance de um microprocessador: o número de linhas do
barramento de endereços e o número de linhas do barramento de dados.
Um microprocessador dotado de m linhas de endereço pode endereçar até 2m palavras de memória. Os
valores correntes de m são 16, 20, 24 ou 32. Da mesma forma, um microprocessador que dispõe de n linhas de dados pode
ler ou escrever uma palavra de n bits numa única operação. Os valores correntes de n são 8, 16 ou 32.
Um microprocessador que tenha um barramento de dados de 8 bits vai necessitar de quatro operações
de leitura para acessar uma palavra de 32 bits.
Um microprocessador de 32 bits vai obter a mesma informação numa única operação e ele será,
naturalmente mais rápido. Além das linhas de dados e de endereços, um microprocessador dispõe de linhas de controle.
Estas permitem garantir a sincronização, a regulação e o controle das trocas de dados no barramento entre o
microprocessador e o seu ambiente. Outros sinais são ainda encontrados disponíveis, como a alimentação (5 V), o relógio e
o terra.
Embora cada microprocessador terá definido seus sinais específicos, é possível, de uma maneira mais
geral, classificá-los em seis categorias: controle do barramento, interrupções, controle de acesso ao barramento, estados
funcionais, etc.
4.3.1. Registros
Controle
Interrupções
Dados
4.3.2. Barramentos
Um barramento é constituído de um conjunto de fios sobre os quais vão transitar sinais em paralelo. Os
barramentos internos de um microprocessador são bem mais simples que os barramentos constituindo a arquitetura de um
computador, pois eles conectam, em 99% dos casos unicamente dois componentes em modo ponto a ponto, o que significa
que não existe a necessidade de se definir linhas de endereço e o número de linhas de comando é bastante reduzido. A
transmissão de informação nos barramentos internos é feita em paralelo para aumentar a eficácia do processamento.
Um barramento pode ser unidirecional (a informação transita num único sentido) ou bidirecional (a
informação vai transitar nos dois sentidos, de maneira alternativa, é claro!). Geralmente, os componentes conectados aos
Apostila de Arquitetura de Computadores II 47
barramentos podem se conectar e se desconectar eletricamente. Estas conexões-deconexões são feitas num tempo muito
curto (da ordem de nanosegundos). Um barramento que apresente estas propriedades é chamado um barramento de três
estados, ou seja, cada uma de suas linhas pode assumir os valores lógicos 0, 1 e flutuante. Os barramentos a três estados
podem ser utilizados quando se necessita conectar diversos componentes que poderiam trocar dados através do barramento.
Em geral, os registros são conectados via barramentos conectando suas entradas e suas saídas. Um
exemplo disto é mostrado na figura 4.2.
Barramento de Entrada
I7 I6 I5 I4 I3 I2 I1 I0
CLK
OE
O7 O6 O5 O4 O3 O2 O1 O0
Barramento de Saída
O registro é composto de 8 flip-flops do tipo D. Suas saídas são conectadas através de circuitos a três
estados. O registro dispõe de dois sinais de comando: o sinal de relógio CK permite realizar o carregamento do registro; o
sinal OE permite ativar os sinais de saída, colocando o conteúdo do registrador à disposição no barramento de saída.
Normalmente, os sinais CK e OE estão em repouso (inativos). Com CK inativo, o conteúdo do registro
não é afetado pelas informações circulando no barramento de entrada.
Quando CK é ativado, o registro vai armazenar a informação presente no barramento de entrada, que
vai compor então o conteúdo do registrador. Com OE em repouso, o registro é considerado “desconectado eletricamente” do
barramento de saída. Quando OE é ativado, o conteúdo do registro será colocado no barramento de saída.
Desta maneira, se as saídas de um registro R1 estiverem conectadas às entradas de um registro R2, é
possível copiar o conteúdo de R1 em R2. O sinal OE de R1 é ativado e mantido assim até a ativação do sinal CK de R2.
Este tipo de operação é muito frequente em programação.
O multiplexador apresenta 2n entradas e uma única saída. Um grupo de linhas de seleção permite
selecionar uma das 2n entradas (uma simples linha ou um barramento) para ser dirigida à saída.
Apostila de Arquitetura de Computadores II 48
CARRYn
unidade
A lógica
S0
S1
decodificador somador
CARRY n+1
Nos esquemas de microprocessadores, os multiplexadores são simbolizados por MUX. A figura 4.4 apresenta um
multiplexador de 2 entradas e 1 saída e um decodificador de 4 entradas por 16 saídas. Um circuito complementar, o
demultiplexador realiza a função inversa do multiplexador, ou seja, sua função corresponde a dirigir a única entrada a uma
das 2n saídas, em função dos valores binários das linhas de seleção.
A entradas B entradas
saídas saídas
4.3.5. Relógio
A maior parte dos circuitos compondo a arquitetura de um computador são circuitos lógicos síncronos,
controlados por um relógio. O relógio é um circuito capaz de transmitir regularmente, segundo uma periodicidade
determinada, pulsos elétricos, que permitem definir ciclos de máquina.
O intervalo de tempo entre dois pulsos é chamado período do relógio ou tempo de ciclo. As freqüências
de relógio estão geralmente entre 1 e 300 MHz, o que equivale a períodos de relógio entre 10 s e 0,3 s. Cada ciclo de
máquina determina uma atividade de base no computador, como por exemplo, a busca de uma instrução, a execução de
uma instrução, etc...
Numa CPU, uma atividade de base é variada e na maior parte das vezes complexa; algumas vezes, é
necessário que um ciclo de relógio seja decomposto em vários sub-ciclos de maneira a organizar e sincronizar as ações do
ciclo principal.
A figura 4.5 mostra um circuito de relógio que fornece quatro sinais na saída. O primeiro sinal (CK0)
corresponde à saída principal, ou seja, o relógio de referência; os demais sinais (CK1, CK2 e CK3) são derivados do
primeiro, cada um deles sofrendo um atraso diferente. A largura de pulso do sinal de referência é igual a 1/4 do ciclo de
Apostila de Arquitetura de Computadores II 49
relógio. Cada um dos sinais sofre um atraso, respectivamente de uma, duas e três vezes a largura de pulso do sinal. Desta
forma, é possível obter um circuito que divide um ciclo de relógio em quatro ciclos de mesma largura, defasados de uma
largura de pulso.
CLK CLK 0
atraso 1 CLK 1
atraso 2 CLK 2
atraso 3 CLK 3
1 ciclo
Assim, para obter a realização de quatro eventos em quatro diferentes subciclos é preciso apenas efetuar uma
operação “and” com uma das saídas de relógio e o evento a ativar. O primeiro evento seria associado ao relógio principal
(CK1), o segundo evento a CK2, e assim por diante.
Barramento A
PC Barramento B
Barramento C
AC
SP
IR
TIR
+1
-1
AMASK
SMASK
F
M0
L0 buffer A buffer B L1
Saída Endereços
Endereços MAR
Entrada Dados
Dados MBR
A0 AMUX
M1 M2 M3
F0 ALU N
F1 Z
S0
DESLOC
S1
Saída Dados
A micromáquina disporia então de um registro de comando de 61 bits que permitira controlar, através
dos valores dos bits, as operações a serem efetuadas pelo microprocessador.
Pode-se ainda reduzir o número de bits necessários para definir uma instrução, com um pequeno
aumento no hardware interno da máquina.
Com o uso de decodificadores para endereçar os 16 registros em cada um dos barramentos (A, B e C) o
número de bits necessários para este fim cai de 48 para 12, o que reduz o número total de bits de 61 para 25. L0 e L1
podem, de fato utilizar sinais já fornecidos pelo relógio, uma vez que estes serão ativados em ciclos bem precisos da
execução_logo, são menos dois sinais (23).
O número de bits, por outro lado, é aumentado se considerarmos que vamos necessitar de um sinal
especial para autorizar ou não o carregamento de um registro sobre C com o resultado de uma operação (sabendo que
algumas vezes a operação vai ser executada simplesmente para ativar os sinais N e Z)... 24 sinais serão necessários. M2 e
M3 podem ser comandados por RD e WR... assim, uma microinstrução do microprocessador poderá ser composta de 22
bits.
A figura 4.7 apresenta o formato das microinstruções da micromáquina definida na figura 4.6. Como
pode ser visto, ela é composta de diversas partes, chamadas campo, onde cada campo vai ter um significado especial para a
operação da micromáquina. Podemos observar ali 13 campos, dos quais onze são definidos a seguir:
VALC
MBR
MAR
ALU
WR
RD
A B C END
É evidente que estas etapas devem ser realizadas de maneira sequencial e não simultaneamente, o que impõe uma
certa ordenação no tempo. Isto significa que é preciso dispor de um circuito de reológio que gere diferentes sinais (4
subciclos, por exemplo) que vão definir as diferentes fases da execução de uma microinstrução.
As ações que seriam executadas nos quatro sub-ciclos seriam as seguintes:
Carregamento da microinstrução num registro particular, chamado registro de microinstrução (RMI);
Transferência do conteúdo dos registros selecionados sobre os barramentos A e B, e após carregamento dos
dados correspondentes nos buffers A e B;
Execução da operação pela ALU;
Terminada a operação, o dado de saída (resultado da operação) vai ser carregado, ou num registro geral ou no
registro MBR.
A figura 4.8 apresenta um esquema completo da micromáquina, sobre o qual podemos distinguir dois
subconjuntos de circuitos: à esquerda o caminho dos dados que foi analisado anteriormente; à direita, uma unidade de
comando que será analisada a seguir. A memória de controle é a parte mais importante desta unidade pois é ela que vai
conter as microinstruções da micromáquina. Na maioria das máquinas, esta memória é uma ROM.
1
16 Decodificador C 4
16 Decodificador B 4
16 Decodificador A 4
barramento B
barramento A
Registros
CLK3
Gerais
CLK2
CLK1
RELÓG IO
CLK0
MMUX
contador
incremental MPC
buffer A buffer B
endereços MAR
MEMÓRIA DE CO NTRO LE 256 x 32
dados MBR
AMUX
MICROSEQ
N
DESLOC
AMUX
COND
VALC
MAR
MBR
ALU
WR
RD
ALU Z
C B A END
2
DESLO C 2
2
WR
RD
Por outro lado, o buffer B estará sempre conectado à entrada direita da ALU. O tempo de cálculo da
ALU pode variar segundo a operação a efetuar. No nosso caso, a operação mais longa é a de adição. De maneira paralela
aos tratamentos efetuados pela ALU e pelo registro de deslocamento, o registro MAR pode ser carregado com o valor
contido no buffer B se o campo MAR indicar assim. Durante o subciclo 4 (o último), o dado que se encontra sobre o
barramento C vai ser carregado num dos 16 registros gerais ou no registro MBR, segundo as indicações dos campos VALC
e MBR da microinstrução.
O registro MAR será também carregado no subciclo 4 se o campo MAR indicar. Os sinais de comando
RD e WR são difundidos para a memória principal e para o registro MBR, durante todo o tempo em que eles estejam
estáveis no registro RMI.
Acabamos de analizar a execução de uma única microinstrução. Vejamos agora como um conjunto de
microinstruções é executado. Na maioria dos casos, as microinstruções são executadas de modo sequencial, ou seja, a
microinstrução encontra-se no endereço que sucede o da que está sendo processada. Em certos casos, portanto, é necessário
romper o sequenciamento normal das microinstruções, pela introdução de ordens de quebra deste sequenciamento. Isto é
feito graças aos dois campos adicionais da microinstrução (que não haviam sido definidos até então) que são os campos
END e COND.
O campo END (8 bits) permite (em caso de quebra do sequenciamento normal de execução) indicar o
endereço da eventual microinstrução a executar. O campo COND vai permitir indicar qual será a próxima instrução a
executar: ou a instrução em MPC + 1 ou a instrução em END. Desta forma, cada microinstrução vai conter a possibilidade
de um salto condicional (ou não).
Em nossa micromáquina, a escolha da microinstrução a executar é definido por um circuito especial (o
microsequenciador) durante o subciclo 4 uma vez que os bits N e Z estão estáveis na saída da ALU. A saída deste
microsequenciador é conectada à entrada de um multiplexador MMUX, que vai carregar o registro MPC seja com MCP +
1, seja com END, segundo o que estiver definido pelo campo COND:
MMUX = L R N + L R Z + L R = RN + LZ + LR
Assim MMUX será igual a 1 nas seguintes condições:
Alguns exemplos de microinstrução comuns na nossa microarquitetura são apresentadas na figura 4.9.
DESLO C
COND
AMUX
VALC
MBR
MAR
END
ALU
WR
RD
O PERAÇ ÃO
C
1 0 3 0 0 0 0 0 0 1 1 0 00 ac = inv(mbr)
0 0 0 0 0 0 1 0 1 2 2 7 00 sp = sp -1; rd;
0 0 0 0 0 0 0 0 1 0 6 0 00 pc = pc + 1;
As referências aos dados poderão ser feitos segundo três diferentes maneiras:
o modo direto, onde as instruções serão compostas de um endereço absoluto de 12 bits, correspondente à
posição do dado na memória; é o modo de endereçamento mais indicado para fazer acesso a variáveis
globais do programa;
o modo indireto, onde o endereço é obtido por cálculo, sendo o resultado do cálculo armazenado no registro
AC; uma aplicação típica deste modo é o acesso a componentes de vetores ou tabelas em programas que
utilizem tais estruturas;
o modo local, que permite localizar uma informação na área de pilha do programa, com relação ao endereço
apontado pelo registro SP; com este modo de endereçamento, é possível realizar acesso a dados presentes na
pilha, particularmente, parâmetros de rotinas.
Código Descrição
LODD end Carrega em AC o dado posicionado na posição indicada por end
STOD end Armazena o conteúdo do acumulador no endereço indicado por end
ADDD end Adiciona o dado posicionado em end ao conteúdo do acumulador
SUBD end Subtrai o dado posicionado em end do conteúdo do acumulador
JPOS end Salto condicional para end se conteúdo do acumulador é positivo
JZER end Salto condicional para end se conteúdo do acumulador é zero
JUMP end Salto incondicional para end
LOCO dado Carrega acumulador com valor indicado por dado
LODL x Carrega o acumulador com dado posicionado a x posições do SP
STOL x Armazena o conteúdo do acumulador na pilha a SP + x
ADDL x Adiciona o conteúdo do acumulador com dado armazenado em SP + x
SUBL x Subtrai o dado armazenado em SP + x do conteúdo do acumulador
JNEG end Salto condicional para end se conteúdo do AC é negativo
JNZE end Salto condicional para end se conteúdo do AC é diferente de zero
CALL end Chamada de subrotina localizada em end
PSHI Transfere para a pilha o conteúdo de memória apontado pelo AC
POPI Transfere o conteúdo da pilha para a posição apontada por AC
PUSH Transfere para a pilha o conteúdo do registro AC
POP Transfere o conteúdo da pilha para o registro AC
RETN Retorno de subrotina
SWAP Troca os conteúdos do AC e da pilha
INSP y Incrementa o SP de y unidades
DESP y Decrementa o SP de y unidades
Para um melhor entendimento do significado das instruções da linguagem, são apresentados, na próxima tabela,
os códigos em binário e as operações realizadas sobre os registros da microarquitetura.
Código Binário Operação
LODD end 0000 xxxx xxxx xxxx ac = m[x]
STOD end 0001 xxxx xxxx xxxx m[x] = ac
ADDD end 0010 xxxx xxxx xxxx ac = ac + m[x]
SUBD end 0011 xxxx xxxx xxxx ac = ac - m[x]
JPOS end 0100 xxxx xxxx xxxx if ac > 0 then pc = x
JZER end 0101 xxxx xxxx xxxx if ac = 0 then pc = x
JUMP end 0110 xxxx xxxx xxxx pc = x
LOCO dado 0111 xxxx xxxx xxxx ac = x , 0 x 4095
LODL x 1000 xxxx xxxx xxxx ac = m[sp+x]
STOL x 1001 xxxx xxxx xxxx m[sp+x] = ac
ADDL x 1010 xxxx xxxx xxxx ac = ac + m[sp+x]
SUBL x 1011 xxxx xxxx xxxx ac = ac - m[sp+x]
Código Binário Operação
JNEG end 1100 xxxx xxxx xxxx if ac < 0 then pc = x
JNZE end 1101 xxxx xxxx xxxx if ac 0 then pc = x
CALL end 1110 xxxx xxxx xxxx sp = sp - 1; m[sp] = pc; pc = x
PSHI 1111 0000 0000 0000 sp = sp - 1; m[sp] = m[ac]
POPI 1111 0010 0000 0000 m[ac] = m[sp]; sp = sp + 1;
PUSH 1111 0100 0000 0000 sp = sp - 1; m[sp] = ac
POP 1111 0110 0000 0000 ac = m[sp]; sp = sp + 1;
RETN 1111 1000 0000 0000 pc = m[sp]; sp = sp + 1
SWAP 1111 1010 0000 0000 tmp = ac; ac = sp; sp = tmp
INSP y 1111 1100 yyyy yyyy sp = sp + y , 0 x 255
DESP y 1111 1110 yyyy yyyy sp = sp - y , 0 x 255
4.5.4. O Microprograma
Um aspecto interessante a ser destacado aqui é o que define a linguagem de máquina da microarquitetura
considerada. Um fator determinante para a especificação da linguagem de máquina é sem dúvida a própria
microarquitetura, pois esta vai limitar as operações que poderão ser realizadas em função de seus componentes.
Por outro lado, o que dará à máquina o poder de interpretar e executar as instruções de máquina definidas na
linguagem é o microprograma que estará armazenado na memória de controle. O microprograma atua como um
interpretador que controla todos os componentes da microarquitetura no sentido de realizar todos os passos da execução de
um programa em linguagem de máquina. As operações básicas realizadas pelo interpretador são:
Como já foi discutido, esta seqüência de passos é executada num ciclo eterno, o que permite dar ao
microprocessador a capacidade de executar seus programas em binário, instrução por instrução como estabelece o fluxo de
controle de cada programa.
Nas seções a seguir, será explicada, através de exemplos, como são implementados, no interpretador, cada um
dos passos citados acima.
Considerando que o código das instruções a executar (armazenado em IR) é binário e que cada instrução é
composta de uma parte mais significativa da palavra que indica o tipo de operação a ser executada, a decodificação das
instruções é feita através da realização de operações de deslocamento (para a esquerda) da palavra que representa este
código. Dependendo do resultado do deslocamento, pode-se então encaminhar (através de comandos go to) o
microprograma para a seção de microinstruções que implementa a instrução identificada.
Na realidade, a decodificação das instruções é realizada através de um conjunto seqüencial de testes (if-then-else)
onde a condição testada é a pertinência do código a um dado intervalo de valores (o que especifica o tipo de operação a
realizar). Em caso positivo, o controle é transferido para uma região do microprograma onde o microcódigo relativo àquele
grupo de instruções está implementado; caso contrário, o controle é transferido para uma outra região de teste do
microprograma (para verificar a pertinência da instrução a um outro grupo de instruções).
No exemplo a seguir, vemos um trecho de microprograma capaz de interpretar duas diferentes instruções: a
instrução de carregamento de um dado constante (LOCO dado) e uma instrução de rotação do conteúdo do acumulador para
a esquerda (ROL). O código de máquina da instrução LOCO dado é 0111 xxxx xxxx xxxx, onde os 12 bits a x
identificam o valor do dado a ser carregado no acumulador. Em hexadecimal, considerando que o dado a carregar é A30, o
código de máquina desta instrução fica 7A30. A instrução ROL não foi definida anteriormente. Por isso, podemos definir
seu código como sendo E008.
O microcódigo mostrado a seguir ilustra a situação de decodificação onde apenas uma das duas instruções pode
estar presente no programa em linguagem de máquina. Na linha 4, é realizada uma operação de AND lógico entre o
conteúdo do registro IR (o código da instrução) e o registro AMASK. Este registro da micromáquina contém uma constante
cujo valor é 0000 1111 1111 1111 (ou 0FFF em hexadecimal) cuja função é retirar, do código da instrução a executar, os
12 bits menos significativos. Continuando com a análise da linha 4, o objetivo da operação é verificar se o código sob
análise é da operação de rotação ou da operação nula (0000 em hexadecimal). Nesta linha, está explícito que, se o
resultado do AND lógico for zero, então o controle do programa deve ser transferido para a linha 0. Neste caso, está se
considerando que o código pertence à instrução nula e não deve, então ser feito nada, retornando para ir buscar a próxima
instrução. Caso contrário, o controle do microprograma é transferido para a linha seguinte que deve implementar a
instrução de rotação.
Vamos aproveitar o exemplo da instrução de rotação para ilustrar como as instruções de máquina são
implementadas em microcódigo. A seqüência de microinstruções a seguir será comentada no sentido de explicar esta
implementação. Esta instrução de rotação à esquerda permite indicar, através do valor contido no registro A, de quantos
bits será realizado o deslocamento.
Na linha 5, é realizada efetivamente o deslocamento para a esquerda do conteúdo do acumulador, expressa pela
função lshift(ac). No entanto, para que a rotação se caracterize (e não um deslocamento), é preciso garantir que o bit
mais significativo da palavra seja transferido para o bit menos significativo após a rotação, como mostra a figura 4.10.
antes da rotação após a rotação
1 0 1 1 0 0 1 0 0 1 1 0 0 1 0 1
rotação à esquerda
Este é o papel das instruções que seguem a partir da linha 5. Na própria instrução 5, o resultado da rotação é
verificado através do sinal N. Caso N seja 1, o que significa que o bit mais significativo da palavra é 1, o controle do
microprograma é transferido para a linha 7, onde o conteúdo do registro AC é adicionado a 1. Caso contrário, o controle
passa para a linha 6, que, por sua vez, provoca um salto para a linha 8. A partir da linha 8, é feito o controle do número de
vezes que será feito o deslocamento. O controle é feito, decrementando-se o conteúdo do registro A e comparando o
resultado do decremento com zero. Se o resultado for zero, não deverá haver mais rotação e a operação é considerada
encerrada (if z then goto 0); se o resultado do decremento não for zero, o controle do microprograma é transferido
mais uma vez para a linha 5 para que seja efetuada uma nova rotação de um bit para a esquerda (goto 5).
Apostila de Arquitetura de Computadores II 57
O microprograma capaz de interpretar e executar todas as instruções descritas na seção 4.3 é apresentado a
seguir. Os comentários, separados por uma barra inclinada, auxiliam na compreensão do mesmo.