You are on page 1of 0

9-1

Capítulo
NOVE
Elementos básicos de organização
9. 1 Introdução
Um computador pode ser projetado e/ou descrito em diversos níveis de abstração. Assim,
pode-se descrever inteiramente um computador através de equações booleanas ou o seu
equivalente em portas lógicas E, OU e NOT. Devido à complexidade dos computadores
atuais, entretanto, tal nível de abstração não é prático, por envolver milhares de equações.
Uma das soluções empregadas para diminuir o número de elementos a serem manipulados
envolve o uso de níveis de abstração mais elevados, tal como o nível de transferência entre
registradores (em inglês Register Transfer, ou RT). Este capítulo aborda os principais
elementos utilizados neste nível.
9. 2 Portas lógicas e equações booleanas
A álgebra booleana é definida sobre um conjunto de dois elementos, denominados de
verdadeiro e falso, ou 0 e 1. Em sistemas digitais, estes dois valores são dois níveis de
tensão pré-fixados aos quais são associados os nomes 0 e 1.
O complemento de uma variável booleana é definido pela tabela-verdade indicada na Tabela
9.1. Basicamente tem-se uma alternância entre os dois valores.
Entrada a Saída s
0 1
1 0
Tabela 9.1 - Tabela-verdade da operação de complemento
Em termos de portas lógicas, esta operação é realizada por uma porta NOT (ou NÃO), com a
representação gráfica lustrada na Figura 9.1. Nas equações a serem utilizadas neste livro será
usado o símbolo de apóstrofe (’) para indicar a operação de complementação. Assim, a’
indica o complemento da variável a.
aa s
Figura 9.1 - Porta NOT
Existem duas operações básicas na álgebra booleana, que são chamadas de AND (E) e OR
(OU). As tabelas-verdade destas duas operações podem ser vistas nas Tabelas 9.2 e 9.3,
respectivamente. Nas equações utiliza-se o símbolo ‘.’ para a operação AND e o símbolo ‘+’
para a operação OR. Assim, a equação (a e b) ou c será descrita como a.b + c, ou até de
forma mais simples como ab + c (omitindo o ‘.’ da operação AND e simplesmente
escrevendo-se as duas variáveis juntas).
9-2
Entrada a Entrada b Saída s
0 0 0
0 1 0
1 0 0
1 1 1
Tabela 9.2 - Tabela verdade da operação AND
Entrada a Entrada b Saída s
0 0 0
0 1 1
1 0 1
1 1 1
Tabela 9.3 - Tabela verdade da operação OR
Em termos de portas lógicas, as operações de AND e OR são representadas pelas portas
mostradas nas Figuras 9.2 e 9.3, respectivamente. As portas lógicas implementam
exatamente a função booleana correspondente, mas possuem um atributo adicional: elas não
são instantâneas, mas necessitam de um certo tempo para operar. Isto faz que uma mudança
em uma das entradas não se reflita instantaneamente na saída, mas somente vá ocorrer após
um determinado tempo, denominado de tempo de propagação. Quanto menor for este tempo,
mais rápido o circuito irá responder às mudanças nas suas entradas, e por conseqüência
maior será sua freqüência de operação.
Note-se que nas Figuras 9.2 e 9.3 considerou-se somente portas de duas entradas. Na
realidade, o número de entradas de uma porta pode ser variável. O número de portas é
aumentado simplesmente usando-se a propriedade associativa das operações AND e OR.
a
b
s
Figura 9.2 - Porta lógica AND de duas entradas
a
b
s
Figura 9.3 - Porta lógica OR de duas entradas
Um determinada expressão lógica pode ser expressa em termos de uma tabela-verdade, de
uma equação booleana ou até mesmo em termos de portas lógicas. A Tabela 9.4 ilustra a
tabela-verdade e as portas lógicas para a equação booleana a + b.c’.
a b c s
0 0 0 0
0 0 1 0
0 1 0 1
0 1 1 0
1 0 0 1
1 0 1 1
1 1 0 1
1 1 1 1
Tabela 9.4 - Tabela-verdade da função a+bc’
9-3
c c’
b
a
s
b.c’
Figura 9.4 - Portas lógicas para a função a+bc’
A construção de uma tabela-verdade é bem simples. Constrói-se inicialmente uma tabela,
considerando-se todas as combinações possíveis das variáveis de entrada (a, b e c na Tabela
9.4). A seguir, para cada linha calcula-se o valor booleano da saída (ou saídas, se existirem
mais de uma). Note-se que o número de linhas de uma tabela é a potência de dois do número
de variáveis de entrada. Assim, no caso da Tabela 9.4, tem-se 3 entradas e,
consequentemente, 8 linhas.
A obtenção de um diagrama de portas lógicas a partir de uma equação booleana também é
simples. Para cada operador da equação (e, ou, complemento) existe uma relação direta em
termos de portas lógicas (AND, OR, NOT). Note-se que, quanto mais simples for a equação
booleana, menor o número de portas lógicas necessárias. Portanto, é muito importante
simplificar uma equação antes de transformá-la em portas lógicas. A Tabela 9.5 e a Figura
9.5 ilustram este processo. Para facilitar a compreensão, foram adicionadas colunas à tabela-
verdade, que representam os valores intermediários (parciais) da equação.
a b a’ b’ a’+b’ b(a’+b’) a+b(a’+b’)
0 0 1 1 1 0 0
0 1 1 0 1 1 1
1 0 0 1 1 0 1
1 1 0 0 0 0 1
Tabela 9.5 - Tabela verdade da função a+b(a’+b’)
a a’
b’ b
b(a’+b’)
a’+b’
a+b(a’+b’)
Figura 9.5 - Portas lógicas para a função a+b(a’+b’)
Tanto por observação da tabela-verdade da Tabela 9.5 como por simplificação da equação
booleana chega-se na equação a+b, que pode ser implementada através de uma única porta
OR e representa uma grande economia de portas em relação à implementação. Existem
inúmeras técnicas de simplificação de equações booleanas, o que, entretanto, não será tratado
neste livro. A minimização de uma equação booleana é importante em sistemas digitais por
diversos motivos. Entre os principais destacam-se:
• redução do número de portas lógicas necessárias para implementação da função – quanto
menos portas lógicas forem utilizadas, mais econômico será o circuito.
9-4
• redução do número de entradas de uma porta lógica – portas com menor número de
entradas são mais econômicas; assim, por exemplo, uma porta AND de três entradas é
melhor que uma porta AND de quatro entradas (e uma de duas entradas é melhor ainda!).
• redução da potência consumida pelo circuito.
• redução da área física necessária para o circuito.
• diminuição do tempo necessário para que uma mudança em um ou mais entradas se
manifeste na saída do circuito (tempo de propagação).
Além das portas tradicionais (AND, OR, NOT), ainda são utilizadas diversas outras. De
especial interesse são as portas NAND (não-e), NOR (não-ou), XOR (ou exclusivo) e
XNOR (não-ou exclusivo). As tabelas-verdade para estas portas estão mostradas nas Tabelas
9.6 a 9.9, respectivamente.
Entrada a Entrada b Saída s
0 0 1
0 1 1
1 0 1
1 1 0
Tabela 9.6 - Tabela-verdade da operação NAND
Entrada a Entrada b Saída s
0 0 1
0 1 0
1 0 0
1 1 0
Tabela 9.7 - Tabela-verdade da operação NOR
Entrada a Entrada b Saída s
0 0 0
0 1 1
1 0 1
1 1 0
Tabela 9.8 - Tabela-verdade da operação XOR
Entrada a Entrada b Saída s
0 0 1
0 1 0
1 0 0
1 1 1
Tabela 9.9 - Tabela-verdade da operação XNOR
Em termos de portas lógicas, a porta NAND é simplesmente uma porta AND seguida de um
inversor, como ilustrado na Figura 9.6, assim como uma porta NOR é uma porta OR
seguida de um inversor, como mostrado na Figura 9.7. Estas duas portas possuem grande
interesse na área de sistemas digitais porque, dependendo da tecnologia empregada para a
fabricação de circuitos integrados, elas podem ser implementadas de forma mais simples e
econômica que as portas AND e OR.
b
a
a.b s=(a.b)’
b
a
s=(a.b)’
Figura 9.6 - Porta lógica NAND de duas entradas e seu equivalente em termos de AND e
NOT
9-5
b
a
a+b s=(a+b)’
b
a
s=(a+b)’
Figura 9.7 - Porta lógica NOR de duas entradas e seu equivalente em termos de OR e NOT
A operação de ou-exclusivo (Figura 9.8) é derivada do ou, mas com saída em zero no caso
das duas entradas terem valor um. Esta pequena diferença torna o ou-exclusivo uma porta
com características únicas. Sua função pode ser interpretada como soma em módulo 2 (onde
o carry-out é desprezado), ou como gerado de paridade par, ou simplesmente como o
operador diferença.
b
a
a⊕b
b
a
s=(a⊕b)’
Figura 9.8 - Porta lógica XOR de duas entradas e porta lógica XNOR de duas entradas
9. 3 Equivalência de portas lógicas
Uma porta lógica pode ser substituída por um conjunto de portas equivalentes, ou seja, um
conjunto de portas que desempenha exatamente a mesma função booleana. Assim, por
exemplo, uma porta NAND é equivalente a uma porta AND seguida de um inversor (porta
NOT). A Tabela 9.10 ilustra algumas destas equivalências.
Expressão ou porta Expressão equivalente
a + b (a’ . b’)’
a’ nand b’
a . b (a’+ b’)’
a’ nor b’
a xor b a.b’ + a’.b
a’ (a.a)’, a nand a
(a+a)’, a nor a
a xor 1
a xnor b a.b + a’.b’
Tabela 9.10 - Equivalência de funções booleanas e portas lógicas
Estas equivalências permitem que uma equação booleana qualquer possa ser descrita somente
com o uso de AND e NOT, por exemplo. Onde fosse necessário utilizar o operador OR, ele
seria substituído pelo seu equivalente. Com isto obtêm-se os vários conjuntos mínimos de
funções. Entre eles podem ser citados:
• somente portas NAND - a partir do NAND pode-se obter um inversor, e a partir deste
uma porta AND e posteriormente uma porta OR.
• somente portas NOR - a partir do NOR obtém-se o inversor, o OR e o AND, pelo
mesmo raciocínio utilizado para as portas NAND acima.
• somente portas AND e NOT
• somente portas OR e NOT
• somente portas AND e XOR
Dependendo de quais portas lógicas são utilizadas, existem várias formas de representação
de uma mesma equação booleana. Duas formas são particularmente úteis, por serem
facilmente minimizáveis utilizando-se álgebra booleana, e por produzirem uma estrutura de
portas lógicas bem regular: a soma de produtos e o produto de somas.
9-6
Na soma de produtos, as variáveis de entrada são agrupadas inicialmente em termos-produto
(portas AND), e estes termos são posteriormente somados (portas OR) para compor a
equação final. No produto de somas, as variáveis de entrada são agrupadas em termos-soma
(portas OR) e depois multiplicadas (portas AND) para formar a equação final. Tanto nos
termos-produto como nos termos-soma, as variáveis de entrada podem aparecer ou na forma
normal ou na forma complementada. A forma de soma de produtos, assim como a de
produto de somas, pode ser facilmente derivada de uma tabela verdade, como ilustra o
procedimento abaixo:
1. Construir a tabela-verdade com as entradas e saídas do circuito.
2. Acrescentar uma coluna que contenha, para cada uma das linhas das possíveis
combinações de entrada, um termo-produto formado pelo ‘e’ lógico de todas as variáveis
de entrada. Se o valor da variável de entrada for igual a zero (naquela linha da tabela), ela
aparece complementada no termo-produto. Se o valor da variável de entrada for igual a
um, ela aparece na forma normal (sem ser complementada) no termo-produto.
3. Construir uma soma de produtos, na qual aparecem todos os termos-produto
correspondentes a valores de saída iguais a 1.
4. Simplificar a expressão obtida, aplicando as propriedades da álgebra booleana.
O procedimento para a formação de um produto de soma é análogo, conforme pode ser visto
no procedimento abaixo:
1. Construir a tabela-verdade com as entradas e saídas do circuito.
2. Acrescentar uma coluna que contenha, para cada uma das linhas das possíveis
combinações de entrada, um termo-soma formado pelo ‘ou’ lógico de todas as variáveis
de entrada. Se o valor da variável de entrada for igual a zero (naquela linha da tabela), ela
aparece na forma normal no termo-soma. Se o valor da variável de entrada for igual a
um, ela aparece complementada no termo-soma.
3. Construir um produto de somas, na qual aparecem todos os termos-soma
correspondentes a valores de saída iguais a 0.
4. Simplificar a expressão obtida, aplicando as propriedades da álgebra booleana.
A Tabela 9.11 apresenta um exemplo ao qual são aplicados os dois procedimentos descritos
acima.
a b c s termos-produto termos-soma
0 0 0 1 a’.b’.c’ a+b+c
0 0 1 0 a’.b’.c a+b+c’
0 1 0 1 a’.b.c’ a+b’+c
0 1 1 0 a’.b.c a+b’+c’
1 0 0 1 a.b’.c’ a’+b+c
1 0 1 0 a.b’.c a’+b+c’
1 1 0 1 a.b.c’ a’+b’+c
1 1 1 0 a.b.c a’+b’+c’
Tabela 9.11 - Exemplo de formação de soma de produtos e produto de somas
Formando-se a soma de produtos, obtém-se:
s = a’.b’.c’ + a’.b.c’ + a.b’.c’+ a.b.c’
Para o produto de somas, obtém-se:
s = (a+b+c’).(a+b’+c’).(a’+b+c’).(a’+b’+c’)
Ambas equações podem agora ser simplificadas, e em ambos os casos chega-se a mesma
forma mínima:
s = c’
9-7
Observe-se que a forma soma de produtos pode ser implementada utilizando-se somente
portas NAND no lugar das portas AND e OR, como pode ser visto na Figura 9.9. Da mesma
forma, o produto de somas pode ser implementado com portas NOR no lugar das portas
AND e OR.
a
c
d
b
s
a
c
d
b
s
Figura 9.9 - Soma de produtos através de portas NAND
9. 4 Circuitos combinacionais
Circuitos combinacionais são aqueles que não possuem memória ou quaisquer outros
elementos de armazenamento. Suas saídas são função única e exclusivamente das entradas.
São construídos por portas lógicas sem realimentação, isto é, o valor das saídas não é
utilizado em qualquer outra parte do circuito.
Dois circuitos combinacionais bem simples, bastante utilizados em sistemas digitais, são os
multiplexadores e os decodificadores. Uma unidade lógica e aritmética (ULA ou UAL), por
outro lado, é bem mais complexa, e será vista em seções posteriores.
Um multiplexador (ou seletor) é um circuito combinacional que possui m entradas e uma
saída. A cada instante de tempo, o valor da saída é igual ao valor de uma das entradas,
conforme determinado por um conjunto de linhas de controle (ou linhas de seleção). A
Tabela 9.12 ilustra alguns casos de multiplexadores.
Multiplexador Número de entradas Número de linhas de seleção
2-para-1 2 1
4-para-1 4 2
8-para-1 8 3
16-para-1 16 4
Tabela 9.12 - Multiplexadores típicos
Um multiplexador pode ser descrito através de um comando case:
case seleção of
0: saída := entrada
0
;
1: saída := entrada
1
;
2: saída := entrada
2
;
. . .
m: saída := entrada
m
;
end;
No caso mais simples de um multiplexador de 2-para-1, a descrição também pode ser feita
através de um comando if-then-else:
if seleção=0
then saída := entrada
0
else saída := entrada
1
;
9-8
Em termos de equação booleana ou portas lógicas, um multiplexador é bem simples. A
seguir é ilustrado o caso de um multiplexador de 2-para-1; os demais podem ser construídos
utilizando-se exatamente a mesma metodologia.
Entrada
0
(a) Entrada
1
(b) Seleção (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
Tabela 9.13 - Tabela-verdade de um multiplexador de 2-para-1
Extraindo-se da Tabela 9.13 a equação booleana através de uma soma de produtos, obtém-
se:
s = a’.b.sel + a.b’.sel’ + a.b.sel’ + a.b.sel
A implementação através de portas lógicas iria necessitar de 3 inversores, quatro ANDs de
três entradas e um OR de quatro entradas. Simplificando-se a equação, entretanto, obtém-se:
s = (a’.b + a.b).sel + (a.b’ + a.b).sel’
s = a.sel’ + b.sel
Esta equação pode ser implementada através de 2 postas AND de duas entradas, 1 porta OR
de duas entradas e 1 inversor, conforme mostra a Figura 9.10.
a
sel
b
s
Figura 9.10 - Portas lógicas de um multiplexador de 2-para-1
É interessante notar que uma tabela-verdade pode ser simplificada se for utilizado um novo
valor – o don’t care, ou “não interessa”, representado por um ‘X’. Uma linha da tabela onde
uma variável apresenta o valor X indica que, para o caso desta linha, o valor da variável não
interessa para a saída, ou seja, a variável não influencia o valor da saída neste caso.
A Tabela 9.14 mostra a tabela-verdade de um multiplexador 2-para-1 utilizando-se este novo
valor.
Entrada0 (a) Entrada1 (b) Seleção (sel) Saída (s)
0 X 0 0
1 X 0 1
X 0 1 0
X 1 1 1
Tabela 9.14 - Tabela-verdade de um multiplexador de 2-para-1
9-9
Variáveis com X não participam de um termo-produto quando a soma de produtos é extraída
da tabela. Note-se que, no caso ilustrado na Tabela 9.14, a equação booleana derivada da
tabela já é diretamente a equação booleana simplificada.
Um multiplexador é representado como indicado na Figura 9.11. As duas representações são
possíveis; a literatura especializada usa inclusive outras representações. Neste livro serão
utilizadas indistintamente qualquer uma destas duas representações.
a
b
sel
s
a
b
sel
s
Figura 9.11 - Representação simbólica de um multiplexador de 2-para-1
Um multiplexador pode ser expandido para trabalhar com entradas de n bits, ao invés de
entrada de 1 bit como foi o caso até agora. Basta utilizar n multiplexadores em paralelo, com
a linha de seleção sendo comum a todos os multiplexadores. O desenho utilizado é o mesmo,
mas agora as linhas de entrada e saída representam n bits, ao invés de um só. Para melhor
compreensão, a dimensão de cada linha, em bits, é indicada na figura. A Figura 9.12 ilustra
o caso de um multiplexador de 4-para-1 para dados de 8 bits.
sel
s
b 8
a
8
c 8
d 8
2
8
sel
s
a
8
b
8
c
8
d
8
2
8
Figura 9.12 - Representação de um multiplexador de 4-para-1, de 8 bits
Outro circuito combinacional de interesse para a organização de computadores é o
decodificador. Na sua forma mais geral, é um circuito com n entradas e 2n saídas. Se o valor
codificado nas entradas é b, então todas as saídas estão em nível zero e somente a saída de
índice b está em nível um. Um decodificador aparece mais comumente nas formas de 2-para-
4, 3-para-8 e 4-para-16. A Tabela 9.15 mostra a tabela-verdade de um decodificador de 2-
para-4, e a Figura 9.13 mostra uma possível implementação.
Entrada 0 Entrada 1 Saída 0 Saída 1 Saída 2 Saída 3
0 0 1 0 0 0
0 1 0 1 0 0
1 0 0 0 1 0
1 1 0 0 0 1
Tabela 9.15 - Tabela-verdade de um decodificador de 2-para-4
9-10
entrada 1
entrada 0
saída 0
saída 1
saída 2
saída 3
Figura 9.13 - Implementação de um multiplexador de 2-para-4
Um decodificador é comumente empregado para transformar informação codificada em 1, 2,
3 ou 4 bits em 2, 4, 8 ou 16 linhas, respectivamente. O exemplo mais típico do seu emprego
é na decodificação de uma instrução.
9. 5 Circuitos seqüenciais
Circuitos seqüenciais são aqueles que possuem memória. Suas saídas são função tanto das
entradas como dos valores da saída. Dito de outra maneira, nos circuitos seqüenciais o novo
valor da saída dependo do estado atual destas saídas.
Dois circuitos seqüenciais bastante utilizados são os registradores e os contadores. Ambos
são construídos com flip-flops, ou seja, registradores capazes de armazenar um único bit.
Dependendo da maneira exata como é controlado, um flip-flop recebe várias denominações
distintas.
O flip-flop mais simples é o tipo RS. Possui duas entradas, R (de reset, ou desligar) e S (de
set, ou ligar). A ativação do sinal S coloca a saída do flip-flop em nível 1, e a ativação do
sinal R leva a saída ao nível lógico 0. A Figura 9.14 mostra duas possíveis implementações
de um flip-flop RS, uma com portas NOR e outra com portas NAND. Note-se que para
portas NOR a ativação de R e de S se faz com nível lógico 1, enquanto que com portas
NAND a ativação de R e de S se faz com nível lógico 0 (o que é indicado pelo uso de R’ e
S’).
S’
Q
R
Q
S
Q’
R’
Q’
Figura 9.14 - Flip-flop RS com portas NAND e portas NOR
9-11
A Tabela 9.16 mostra a variação dos valores dos sinais de saída (Q e Q’) de acordo com os
sinais de entrada (R e S) ao longo de nove intervalos de tempo. A Figura 9.15 reproduz a
mesma informação em um diagrama de tempos.
t R S Q Q’
1 0 0 0 1
2 0 1 1 0
3 0 0 1 0
4 1 0 0 1
5 0 0 0 1
6 1 0 0 1
7 0 0 0 1
8 0 1 1 0
9 0 0 1 0
Tabela 9.16 - Variação de sinais em um flip-flop RS
R
S
Q
Q’
t 1 2 3 4 5 6 7 8 9
Figura 9.15 - Diagrama de tempos em um flip-flop RS
Observe-se que, quando as entradas não estão ativas, um flip-flop RS mantém seu estado
anterior, ou seja, memoriza o último valor lógico que foi armazenado nele, seja via um
comando S (set) ou R (reset). Note-se também que a ativação de ambas as entradas
simultaneamente leva a resultados imprevisíveis. Assim, o funcionamento de um flip-flop
RS pode ser resumido de acordo com a Tabela 9.17, onde Q
t
indica o estado atual e Q
t+1
indica o próximo estado.
R S Q
t+1
Resultado
0 0 Q
t
Estado fica inalterado
0 1 1 Estado passa para 1
1 0 0 Estado passa para 0
1 1 Indeterminado Condição de erro
Tabela 9.17 - Tabela de um flip-flop RS
Um flip-flop RS pode armazenar um valor, mas o seu controle é complicado pelo fato de ser
sempre sensível a qualquer variação de valor nas entradas R e S. Isto levou à criação de um
flip-flop que pudesse ser insensível às entradas em determinados momentos. Para isto foi
introduzida uma terceira entrada, denominada de controle, clock (relógio) ou carga.
Enquanto a entrada de controle estiver desabilitada (C=0), o estado do flip-flop ficará
indiferente às entradas R e S. A idéia deste flip-flop é sincronizar a mudança do seu estado,
isto é, restringi-la a certos instantes. Uma implementação possível para este flip-flop pode
ser vista na Figura 9.16.
9-12
S
Q
Q’
R
C
Figura 9.16 - Flip-flop RS com controle
Para eliminar a situação não permitida de R e S ativos simultaneamente, pode-se interligá-los
através de um inversor, como mostra a Figura 9.17. Neste caso R e S sempre terão sentidos
opostos. Elimina-se a situação de R e S ativos simultaneamente, mas também se elimina a
situação de R e S ambos estarem inativos. O resultado é um flip-flop que copia o valor lógico
da entrada D (de Dado) quando o controle estiver ativo.
D
Q
Q’
C
Figura 9.17 - Flip-flop D sensível ao nível
Com o flip-flop D tem-se o elemento básico de armazenamento, que copia o valor da entrada
(D) quando o sinal de controle ou carga (C) é ativado. No caso do flip-flop da Figura 9.17,
enquanto o valor da entrada de controle C for igual a 1, o valor da entrada D é copiado (ou
armazenado) para o flip-flop. Se a entrada D variar enquanto C=1, o valor armazenado
também varia. Quando C=0, o flip-flop mantém seu valor, independente de variações em D.
Com isto tem-se um flip-flop sensível ao nível, ou um latch.
Considerando o instante de ativação do sinal de controle, podem ser definidos quatro tipos
distintos:
• Sensível ao nível 1 - o sinal de controle é ativo enquanto apresentar nível 1, e por
todo o tempo que permanecer neste nível.
• Sensível ao nível 0 - o sinal de controle é ativo enquanto apresentar nível 0, e por
todo o tempo que permanecer neste nível.
• Sensível à borda de subida - o sinal de controle é ativo quando realizar uma
transição do nível 0 para o nível 1, e somente neste instante de tempo.
• Sensível à borda de descida - o sinal de controle é ativo quando realizar uma
transição do nível 1 para o nível 0, e somente neste instante de tempo.
9-13
Flip-flops sensíveis à borda são mais complexos que os sensíveis ao nível. A Figura 9.18
ilustra o caso de um flip-flop D sensível à borda de subida.
Q
Q’
D
C
Figura 9.18 - Flip-flop D sensível à borda
Além do flip-flop tipo D, também são bastante utilizados o flip-flop tipo T (toggle), que
muda de estado a cada ativação do sinal de controle, e o flip-flop JK, que possui duas
entradas (J e K). A Tabela 9.18 ilustra o comportamento de cada um destes três flip-flops.
Note-se que o sinal de controle “ativo” pode significar qualquer uma das quatro situações
analisadas acima.
Tipo D Tipo T Tipo JK
D C Q
t+1
C Q
t+1
J K C Q
t+1
X inativo Q
t
inativo Q
t
X X inativo Q
t
D ativo D ativo Q
t
’ 0 0 ativo Q
t
0 1 ativo 1
1 0 ativo 0
1 1 ativo Q
t

Tabela 9.18 - Flip-flops D, T e JK
Um conjunto de n flip-flops pode ser interconectado para formar um registrador de n bits, ou
seja, um registrador capaz de armazenar n bits. Um registrador deste tipo é obtido usando
entradas D independentes para cada bit e um sinal de controle comum para todos os bits,
como mostra a Figura 9.21. Neste caso denomina-se este registrador de registrador de carga
e saída paralelas.
9-14
Dn-1 Dn-2
Qn-1 Qn-2
C
. . . . . . .
. . . . . . .
Flip-flop
D
Flip-flop
D
D1
Q1 . . . . . . .
Flip-flop
D
D0
Q0
Flip-flop
D
Figura 9.19 Registrador de n bits de carga e saída paralelas
Um registrador, além de armazenar um conjunto de bits, também pode ser utilizado para
efetuar algumas operações sobre estes dados. Para isto existem registradores especiais, como
o registrador de deslocamento (shift-register) e o registrador contador (counter). Eles podem
ser facilmente implementados com flip-flops. Para isto basta interligar-se adequadamente as
entradas e saídas dos flip-flops, ou no máximo adicionar-se alguma lógica combinacional na
entrada dos flip-flops.
A Figura 9.20 ilustra um registrador de deslocamento que a cada ativação do sinal de
controle desloca todos os bits de uma posição para a direita. O novo valor do bit mais
significativo é fornecido pela entrada E. Este tipo de registrador também é conhecido como
um registrador de entrada e saída seriais. Um registrador de deslocamento para a esquerda
seria construído de maneira análoga a da Figura 9.20, basta ligar a saída de cada flip-flop na
entrada do flip-flop imediatamente à esquerda.
E
C
. . . . . . .
Flip-flop
D
Flip-flop
D
S
Flip-flop
D
Flip-flop
D
Figura 9.20 - Registrador de n bits de carga e saída seriais
Também é extremamente fácil fazer um registrador de deslocamento de entrada serial e saída
paralela; basta disponibilizar as saídas de todos os flip-flops internos do registrador. Para um
registrador de deslocamento com entrada paralela, é necessário acrescentar um multiplexador
na entrada de cada flip-flop, que selecionaria entre o dado a ser deslocado e o dado a ser
carregado no registrador.
Um registrador contador, ou simplesmente contador, é um registrador que, com a ativação
do sinal de controle, incrementa (ou decrementa) o seu valor de uma unidade. Dependendo
do tipo de contagem desejada (binária, BCD, etc) o contador apresenta uma estrutura interna
particular. Além disto, o contador pode ser projetado de tal forma que, ao atingir o valor n-1,
ele volta a zero no controle seguinte. Neste caso, diz-se que o contador é módulo n, ou seja,
ele divide por n.
9-15
Para contadores é útil o uso de flip-flop sensíveis à borda, para que a contagem se realize em
um instante de tempo bem preciso. A Figura 9.21 ilustra um contador binário de n bits
utilizando flip-flops tipo T. A contagem binária é obtida conectando-se a saída de um bit na
entrada do flip-flop seguinte. Observe-se que, para facilitar o desenho, o bit menos
significativo está a esquerda e o mais significativo a direita.
Q0 Q1
C
. . . . . . .
Flip-flop
T
Flip-flop
T
Qn-2 Qn-1 . . . . . . .
Flip-flop
T
Flip-flop
T
Figura 9.21 - Contador binário de n bits
Se os flip-flops do contador da Figura 9.21 fossem sensíveis à borda de subida, teríamos um
contador decrescente. Sendo eles sensíveis à borda de descida, tem-se um contador
crescente. Assim como os registradores de deslocamento, os contadores também podem
apresentar entrada de dados paralela. Neste caso também é necessário adicionar-se na entrada
de cada flip-flop um multiplexador para selecionar entre a carga de dados e a contagem.
Observe-se que, para contadores complexos, os flip-flops tipo JK são os mais utilizados,
por apresentarem controle mais complexo e assim possibilitarem contagens mais complexas.
9. 6 Unidade Aritmética e Lógica
Uma das partes essenciais de um computador é a Unidade Aritmética e Lógica, abreviada
comumente para UAL ou ULA. Esta unidade é responsável pela execução de somas,
subtrações, funções booleanas, comparações, etc. Sua complexidade é diretamente
proporcional à complexidade do conjunto de instruções do computador. Computadores
simples possuem ULAs simples, com cerca de 4 funções distintas. Computadores
complexos possuem ULAs complexas, com 8 a 16 funções distintas.
Operações booleanas podem ser implementadas com portas lógicas simples, do tipo AND,
OR e NOT. Além disto, elas não apresentam nenhuma interdependência entre os bits
vizinhos, o que permite que uma operação lógica sobre n bits seja implementada por n
operadores independentes.
Operações aritméticas, por outro lado, requerem uma implementação mais complexa. Um
somador binário simples (meio-somador), de um bit, soma dois operandos de um bit (A e B)
e produz um bit de resultado (S) e um bit de carry-out (C). O meio-somador possui a tabela-
verdade mostrada na Tabela 9.19, e pode ser implementado através de um ou-exclusivo (para
a soma) e uma porta AND (para o carry-out), como é mostrado na Figura 9.22.
A B S C
0 0 0 0
0 1 1 0
1 0 1 0
1 1 0 1
Tabela 9.19 - Tabela-verdade de um meio-somador
9-16
B
A
S = a⊕b
C = a.b
A
B
S
C
Meio
Somador
Figura 9.22 - Meio-somador
O somador completo possui uma terceira entrada (carry-in), que corresponde ao carry out do
bit menos significativo. Sua tabela-verdade pode ser vista na Tabela 9.20. A Figura 9.23
mostra a implementação em termos de portas lógicas, e uma implementação através de meio-
somadores pode ser vista na Figura 9.24.
A B Ci S Co
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
Tabela 9.20 - Tabela-verdade de um somador completo
B
A
Co = AB+Ci(A⊕B)
Ci
S = A⊕B⊕Ci
A
Figura 9.23 - Somador completo implementado com portas lógicas
A
B S
C
Meio
Somador
Co
Ci
S
C
Meio
Somador
S
Figura 9.24 - Somador completo implementado com meio-somadores
9-17
Um somador completo realiza a soma de um bit. Para somar n bits, é necessário agrupar n
somadores completos, onde o carry-out de cada um é transportado para o carry-in do
somador imediatamente à esquerda, conforme pode ser visto na Figura 9.25.
Sn-1 Sn-2
. . . . . . .
Somador
completo
Somador
completo
. . . . . . .
C
An-1 Bn-1 An-2 Bn-2
S1 S0
Ci=0
. . . . . . .
Somador
completo
Somador
completo
A1 B1 A0 B0
Figura 9.25- Somador binário de n bits
O somador de n bits da Figura 9.25 é relativamente simples, mas apresenta um grande
problema: o grande atraso provocado pela propagação do carry entre os vários somadores. O
somador de índice j deve esperar que todos os j somadores anteriores (j= 0,1,... i-1)
terminem de calcular os bits de soma de carry-out, antes de que possa considerar o sinal de
carry-in como válido. Com n somadores, o tempo de propagação é n vezes maior do que o
tempo de um somador de um bit. Esta interconexão entre somadores recebe o nome de ripple
carry. Somadores mais complexos diminuem este atraso usando técnicas de carry look-
ahead.
A operação de subtração pode ser efetuada implementando-se o circuito de um subtrator
completo, ou então utilizando-se a técnica de complemento do subtraendo (a-b = a + not(b) +
1).
B A
A + B
A and B
Ci=0
S
Sel
Somador
not(A)
A or B
2
Figura 9.26 - ULA com 4 operações
9-18
Se uma ULA realiza diversas funções, uma forma simples de realizar sua implementação é
projetar individualmente cada uma destas funções, e depois simplesmente reuni-las através
de um multiplexador, que seleciona qual o valor a ser apresentado na saída. Por exemplo,
suponha-se que uma ULA deva realizar as operações de ADD, AND, OR e NOT. A
implementação desta ULA com um multiplexador de 4-para-1 pode ser vista na Figura 9.26.
Todas as linhas, com exceção de Ci e Sel, são de n bits.
Assim como qualquer outro circuito, também para a ULA vale o compromisso entre
desempenho e custo. Embora a ULA da Figura 9.26 tenha baixo custo, pois só utiliza
elementos padrões, não tem alto desempenho, pois não foi otimizada para isto.
9. 7 Memória
Assim como um registrador de n bits pode ser visto como um array de n flip-flops, uma
memória de m posições pode ser vista como um array de m registradores. Logicamente, o
funcionamento de uma memória pode ser visto na figura 1.27. Observe-se, entretanto, que
este é um modelo lógico, e não um modelo da estrutura física da memória. Na operação de
escrita as linhas de endereço selecionam, através de um circuito decodificador, em qual
registrador o dado deve ser escrito. A saída de decodificador, juntamente com o sinal de
Write, formam o sinal de carga nos registradores. Na operação de leitura as mesmas linhas
de endereço selecionam, através de um multiplexador, qual o registrador que terá o seu
conteúdo levado até a saída. A habilitação do dado na saída é realizada pelo sinal Read.
A implementação dos circuitos de memória atuais é diferente do modelo apresentado na
Figura 9.27. Este modelo é muito simplificado, e visa somente explicar o funcionamento
geral da memória. Observe-se inclusive que os tempos necessários para a realização de uma
operação de escrita ou leitura não estão modelados na figura.
8
2
Endereço
Write Dado de Entrada
Posição 0
Posição 1
Posição 2
Posição 3
8
8
8
8
2
Leitura
Dado de
Saída
8
8
8
8
carga
carga
carga
carga
Figura 9.27 - Estrutura lógica de uma memória de 4 posições