Você está na página 1de 57

Universidade Católica de Brasília

Curso de Bacharel em Sistemas de Informação

Apostila de Arquitetura de Computadores II

Editada por Eduardo Moresi

Brasília Março 2002


Apostila de Arquitetura de Computadores II 2

Capítulo 1 - Noções de Arquitetura de Computadores


1. INTRODUÇÃO
O alto nível de popularidade atingido pelos computadores nos últimos anos permitiu também quebrar uma série de
barreiras, particularmente no que diz respeito à terminologia associada.
Atualmente, expressões como bits, bytes, hard disk, RAM, e outras, deixaram de fazer parte vocabulário técnico dos
especialistas para compor aquele de grande parte dos usuários destas máquinas.
Entretanto, os aspectos básicos de funcionamento de um computador ainda são reservados aos profissionais da área e
devem assim permanecer indefinidamente.
Neste capítulo pretende-se, a nível de introdução, apresentar alguns aspectos importantes do funcionamento dos
computadores, sendo que as questões mais importantes serão aprofundadas ao longo do curso.
2. PRINCIPAIS COMPONENTES DE UM COMPUTADOR
Numa visão externa de grande parte dos usuários, um computador é composto de CPU, teclado, vídeo e mouse, como
ilustrado pela figura 2.1. Esta é a visão da maior parte da população que tenha algum tipo de interação com o computador,
principalmente porque estes são os elementos de um microcomputador que se deve que transportar, desconectando-os e
reconectando-os para fazer o computador voltar a funcionar.
Embora continuar a ter este tipo de visão dos componentes de um computador não vai afetar profundamente a vida e modo
de utilização destas máquinas pela maior parte da população, é lógico que esta é uma visão extremamente superficial até
para alguns usuários.

Figura 2.1 — Elementos (aspecto externo) de um computador.

2.1. A Unidade Central de Processamento... a CPU


Um primeiro equívoco aparece nesta divisão, ao chamar-se o gabinete do microcomputador, seja ele em formato torre (o
formato vertical) ou desktop (o horizontal), de CPU. O mais correto é chamá-lo mesmo de torre ou gabinete. O nome, ou
melhor a sigla CPU, vem do inglês Central Prossessing Unit, para designar o componente ou o conjunto de componentes
do computador responsável pela execução das instruções dos programas. O nome CPU sugere, então, um elemento
essencial no funcionamento do computador, sem uma CPU, os computadores não poderiam funcionar.
Nas máquinas de primeira e segunda geração, segundo a organização do capítulo anterior, as CPUs eram implementadas
em circuitos de grandes dimensões, utilizando milhares de válvulas ou transistores. A partir dos anos 70, com o
aparecimento do circuito integrado, as CPUs puderam ser implementadas completamente num chip, denominado a partir de
então de microprocessador, nome até hoje utilizado e que incorpora, em sua família, exemplares como o Pentium e o Power
PC entre outros menos populares, mas nem por isso menos poderosos.
Apesar da existência de uma grande diversidade em termos de arquiteturas de computador, pode-se enumerar, num ponto
de vista mais genérico os componentes básicos desta classe de equipamentos. A figura 2.2 apresenta um esquema de um
computador, destacando os elementos que o compõem. Apesar da grande evolução ocorrida na área de informática desde o
aparecimento dos primeiros computadores, o esquema apresentado na figura pode ser utilizado tanto para descrever um
sistema computacional atual como os computadores da década de 40, projetados por engenheiros como John Von Neuman.
Vamos analisar a evolução que as CPUs sofreram ao longo dos anos e quais são os parâmetros a elas associados que
influenciam no desempenho global de um sistema computacional.
Um parâmetro importante é o tamanho da palavra processada pela unidade lógica e aritmética, lembrando que o sistema
de numeração adotado nas arquiteturas de computadores é o binário, o qual tem como unidade básica de informação o bit,
que pode assumir os valores 0 ou 1.
Quanto maior o tamanho da palavra manipulada pelo microprocessador, maior é o seu potencial de cálculo e maior a
precisão das operações realizadas. As primeiras CPUs integradas num único chip, como por exemplo, o 4004 fabricado pela
Intel em 1971 manipulava palavras (dados e instruções) expressas por 4 dígitos binários. Os microprocessadores mais
recentes são capazes de manipular palavras entre 32 bits (caso dos 486) e 64 bits (Pentium e Power PC).
Apostila de Arquitetura de Computadores II 3

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.

Figura 2.3 — Formatos padrão dos microprocessadores.

Figura 2.4 — Aspecto interno de um microprocessador.


Apostila de Arquitetura de Computadores II 5

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

Figura 2.5 — Caminho de dados de um microprocessador.


Entretanto, como forma de explicar, ainda num nível genérico, o funcionamento de um microprocessador, vamos considerar
como visão interna o diagrama apresentado na figura 2.5, o qual será descrito a seguir.
3.1 As principais seções de um microprocessador
Na maior parte dos estudos dos microprocessadores, encontra-se uma divisão clássica de sua estrutura interna considerando
três grandes unidades:
 Unidade Lógica e Aritmética ou ALU (para Aritmethic and Logic Unit), que assume todas as tarefas relacionadas
às operações lógicas (ou, e, negação, etc...) e aritméticas (adições, subtrações, etc.) a serem realizadas no contexto
de uma tarefa realizada através dos computadores; as primeiras ALUs eram de concepção bastante simples,
realizando um conjunto relativamente modesto de operação, com operandos de pequena dimensão (no que diz
respeito ao tamanho da palavra)... com o passar do tempo, eles elementos foram tornando-se sofisticados para
suportar operações mais complexas a maiores tamanhos de palavras de dados para permitir o grande potencial de
cálculo oferecido pelos atuais microprocessadores;
 Seção de Registros, que, como o nome indica, abriga o conjunto de registros dos microprocessadores, essenciais
para a realização das instruções dos programas do computador; de forma mais superficial, pode-se subdividir o
conjunto de registros de um microprocessador em dois grupos: os registros de uso geral, utilizados para
armazenamento de operandos ou resultados de operações executadas pelo microprocessador, os registros de controle,
utilizados como suporte à execução dos programas do computador;
 Unidade de Controle a responsável de tarefas nobres como a interpretação das instruções de máquina a serem
executadas pelo computador, a sincronização destas instruções, o atendimento a eventos de hardware, etc. Esta
unidade assume toda a tarefa de controle das ações a serem realizadas pelo computador, comandando todos os
demais componentes de sua arquitetura, garantindo a correta execução dos programas e a utilização dos dados
corretos nas operações que as manipulam. É a unidade de controle quem gerencia todos os eventos associados à
operação do computador, particularmente as chamadas interrupções, tão utilizadas nos sistemas há muito tempo.
3.2. Os microprocessadores e a execução de programas
Na seção anterior, vimos que a CPU é considerada o "cérebro" do computador. Ela é encarregada da execução dos
programas armazenados na memória central, através do carregamento das instruções, sua decodificação e execução
seqüencial. Ela é composta de uma unidade de controle, responsável do carregamento e decodificação das instruções e de
uma unidade lógica e aritmética (ALU) que efetua operações tais como a adição, a função booleana "E" (AND), etc... A
CPU contém também uma memória de alta velocidade que permite o armazenamento de valores intermediários ou
informações de comando. Esta memória é composta de registros, na qual cada registro tem uma função própria.
3.2.1. Papel dos registros na execução das instruções
O registro mais importante da memória é o contador de programa ou PC de (Program Counter), cuja função é armazenar
o endereço da instrução que deve ser executada num dado instante. O PC funciona como uma espécie de apontador, que
indica, a todo instante, em que posição de memória encontra-se a próxima instrução a executar. Por esta razão, este registro
é identificado pela sigla IP (de Instruction Pointer).
Outro registro de importância é o registro de instruções ou IR (Instruction Register) que armazena o código binário da
instrução em execução.
Apostila de Arquitetura de Computadores II 6

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

Capítulo 2 - Conceituação Básica


1. UMA CLASSIFICAÇÃO DAS ARQUITETURAS DE COMPUTADORES
1.1. Linguagem de Máquina e Tipos de Instrução
A realização das tarefas a serem automatizadas por qualquer computador é formalizada através de um programa, o qual, no
final da escala de produção, transforma-se num conjunto de bits que define as instruções de máquina que o
microprocessador deve executar.
As instruções executadas pela CPU podem ser organizadas em três principais categorias:
 as instruções registro-memória permitem o tratamento de dados armazenados em memória para transferi-los aos
registros da CPU. Estes dados poderão, em seguida, ser tratados por outras instruções como dados de entrada da
ALU;
 as instruções registro-registro se caracterizam pela transferência de dados contidos nos registros da CPU aos
registros de entrada da ALU, a realização de uma operação sobre estes dados e a transferência do resultado para um
registro da CPU;
 as instruções memória-memória obtém os operandos diretamente na memória e os armazenam nos registros de
entrada da ALU. Após ter efetuado uma operação sobre os dados, o resultado será armazenado em memória.
A linguagem de máquina constitui um conjunto de instruções capazes de ser executada por um dado microprocessador. O
conjunto de instruções varia muito de um microprocessador para outro, mas é comum, no caso de famílias de
microprocessadores como (os microprocessadores da Intel, por exemplo) que um microprocessador suporte o conjunto de
instruções de seus predecessores. A linguagem de máquina de um microprocessador pode ter de 20 a 300 instruções. Um
grande número de instruções não é necessariamente o melhor, sendo em muitos casos o contrário.
1.2. Fluxo de Dados
Na organização interna da CPU da figura 2.5 pode-se distinguir um fluxo de dados, formado pelos registros e a ALU. Os
valores armazenados nestes registros podem ser transferidos aos registros de entrada da ALU (por exemplo, os registros
identificados por A e B) durante a realização de um tratamento de dados por parte desta.
A ALU é responsável das operações de adição, subtração e outras operações sobre os dados de entrada. Os dados
correspondentes aos resultados destas operações são armazenados no registro de saída da ALU e podem, em seguida, ser
transferidos para um outro registro da CPU antes de serem armazenados em memória.
O caminho dos dados é um aspecto importante do funcionamento de uma CPU, pois ele vai definir o que uma máquina vai
poder efetuar em termos de operações.
1.3. A Classificação de Flynn
Desde o início dos trabalhos na área da informática, os fabricantes de computadores tentam construir máquinas mais
poderosas e, principalmente, mais velozes. Um caminho para atingir este objetivo é a fabricação de componentes de maior
desempenho em termos de velocidade. No entanto, o que se tem visto é que este caminho conduz, na maioria dos casos, a
uma série de obstáculos e limitações.
No entanto, outras formas de se obter um melhor desempenho na execução de programas podem ser resultado da própria
política de concepção da arquitetura da máquina.
Segundo, Michael Flynn, um pesquisador e professor da Universidade de Stanford que, as arquiteturas de computador
podem ser assim classificadas:
 SISD - Simples fluxo de Instruções, Simples fluxo de Dados
 SIMD - Simples fluxo de Instruções, Múltiplos fluxos de Dados
 MISD - Múltiplos fluxo de Instruções, Simples fluxos de Dados
 MIMD - Múltiplos fluxos de Instruções, Múltiplos fluxos de Dados
1.3.1. As Máquinas SISD
A maioria das máquinas disponíveis atualmente enquadram-se nesta classificação. As instruções são executadas de modo
sequencial, embora algum grau de paralelismo pode ser obtido neste caso, como por exemplo, através da técnica de
pipelining. Uma máquina SISD pode ser caracterizada por mais de uma unidade funcional, sendo que estas serão
controladas por uma única unidade de controle. O diagrama geral de funcionamento de uma máquina SISD é apresentado
na figura 2.6.
1.3.2. As Máquinas SIMD
O caso mais típico de máquinas enquadrando-se nesta classificação é aquele das máquinas vetoriais. Estas máquinas, cujo
esquema de funcionamento geral é ilustrado na figura 2.7, são caracterizadas por um conjunto de elementos de
processamento, supervisionados por uma mesma unidade de controle.
Apostila de Arquitetura de Computadores II 8

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

Figura 2.7 — Máquinas SIMD.


FD

FI1 FI1
UC1 UP1

FI 2 FI 2
UC 2 UP2
MM1 MM 2 MMN

FIN FIN
UCN UPN
FD
FI1 FI2 FI
N

Figura 2.8 — Máquinas MISD.


FI1 FI1 FD FI1
1
UC 1 UP1 MM1

FI 2 FI 2 FD FI2
2
UC 2 UP2 MM 2

FD
FIN FIN N
UC N UPN MM N
FI
N

Figura 2.9 — Máquinas MIMD.


Todas as unidades de processamento (UPs) recebem, por broadcast, o mesmo conjunto de instruções, sendo que as
operações a serem realizadas no contexto de cada instrução envolvem um conjunto diferente de dados (para cada UP).
1.3.3. As Máquinas MISD
Estas são caracterizadas pela disponibilidade de n unidades de processamento, cada uma recebendo instruções distintas que
operam sobre um mesmo conjunto de dados. Os resultados (saída) de uma unidade de processamento podem ser a entrada
de uma outra unidade, compondo assim o que se denomina uma macropipe.
Na maioria das apresentações da classificação de Flynn, esta categoria é quase sempre omitida por ser considerada de
difícil implementação prática, sendo que não se conhece nenhuma máquina que tenha adotado esta estrutura.
1.3.4. As Máquinas MIMD
Esta categoria de máquinas tem como principal ilustração as máquinas a multiprocessadores, que são caracterizadas pela
existência de múltiplas unidades de processamento, as quais executam diferentes programas, no caso (múltiplos fluxos de
instruções) sobre conjuntos distintos de dados.
Uma subclassificação destas máquinas é relacionada com a intensidade das interações entre as unidades de processamento
compondo estas máquinas. Os sistemas fortemente acoplados são aqueles onde as interações entre as unidades de
processamento são de alta intensidade (frequência). Em outro caso, as máquinas são ditas fracamente acopladas.
2. ALGUNS CONCEITOS RELACIONADOS AOS COMPUTADORES
Para finalizar, vamos apresentar uma descrição sucinta dos principais conceitos relacionados às arquiteturas de
computadores e ao funcionamento dos microproces-sadores. A lista de conceitos não é exaustiva e muitos destes conceitos
serão aprofundados ao longo do curso, mas é importante que se tenha uma apresentação inicial para o caso destes serem
citados nos capítulos que seguem.
Apostila de Arquitetura de Computadores II 9

2.1. Arquitetura de Computadores


2.1.1. CPU
Sigla americana para Unidade Central de Processamento, ou microprocessador, que corresponde ao chip capaz de realizar
as instruções num computador. Exemplos mais recentes de CPU são o Pentium e Power PC.
2.1.2. Memória
Nome genérico dado a todo dispositivo de armazenamento dos computadores. Engloba as memórias RAM (Random Access
Memory), ROM (Read Only Memory). Outros dispositivos, como o disco rígido e os já obsoletos periféricos de cartão
perfurado e fitas de papel podem também ser designados como memória (secundária).
2.1.3. Memória Cache
Classe de memória associada aos microprocessadores, utilizada para armazenar temporariamente parte dos dados e das
instruções manipuladas nos programas num dado instante. A disponibilidade de uma grande quantidade de memória cache
num computador propicia um ganho de desempenho na execução dos programas.
2.1.4. Memória Virtual
Mecanismo implementado a nível de sistemas operacionais que permite que sistemas computacionais contendo pouca
quantidade de memória de trabalho (RAM) possam executar programas mais exigentes em termos de memória. Neste
mecanismo, o sistema operacional aloca uma porção do disco rígido para fins de armazenamento do programa a ser
executado e seus dados. Esta porção constitui a memória virtual e a execução do programa é realizada pelo computador
graças à troca de dados e instruções entre o disco e a memória RAM, numa operação denominada swap. A maior parte dos
sistemas operacionais atuais utiliza este recurso. No entanto, é importante destacar que o uso de memória virtual, apesar de
permitir executar programas de grande porte, não permite a execução dos programas com tanta eficiência quanto num
computador com configuração suficiente em termos de RAM.
2.1.5. Entradas/Saídas
Nome genérico dado a todo dispositivo relacionado à comunicação entre o computador ou o microprocessador e os demais
elementos de seu ambiente. As operações de comunicação entre computador e impressora ou microprocessador e as portas
seriais e paralelas são exemplos de operações de E/S.
2.2. Microprocessadores
2.2.1. ALU
Ou Unidade Lógica e Aritmética, é a parte de um microprocessador responsável pela realização das operações lógicas e
aritméticas embutidas nas instruções de um programa.
2.2.2. Unidade de Controle
Conjunto de componentes internos de um microprocessador que realizam as funções de controle do funcionamento de um
microprocessador. O mecanismo de execução das instruções de um programa, o tratamento de interrupções, a sincronização
de componentes, são exemplos de operações atribuídas a este elemento.
2.2.3. Registros
Elementos internos de um microprocessador que constituem uma memória interna deste componente. Os registros podem
ser acessíveis pelo programa de usuário para fins de armazenamento temporário de dados durante seu processamento, ou
então pela Unidade de Controle que manipula estes registros para fins de controle da execução de um programa.
2.2.4. Contador de Programa
Registro específico dos microprocessadores que opera como um "apontador" para as instruções que estão armazenadas na
memória do computador. Os valores armazenados no PC (Program Counter) ou IP (Instruction Pointer) são endereços (ou
porções de endereços) que correspondem à posição da próxima instrução a ser executada.
2.2.5. Registro de Instrução
Registro componente da Unidade de Controle dos microprocessadores responsável do armazenamento do código da
instrução que será executada num dado instante. O valor do código é manipulado para fins de decodificação.
2.2.6. Stack
Área da memória do computador alocada para fins de armazenamento temporário de dados. Exemplos de dados que
utilizam o stack são parâmetros de subrotinas e endereços de retorno para a finalização de subrotinas. O stack é também
conhecido pela denominação de pilha, tradução para o Português do termo americano.
2.2.7. Stack Pointer
Registro específico que funciona como apontador para a área de stack. O SP pode ser acessado diretamente pelos
programas de aplicação do computador ou alterado automáticamente em conseqüência da execução de instruções de
manipulação (por exemplo, uma instrução de chamada ou de retorno de subrotina).
Apostila de Arquitetura de Computadores II 10

2.2.8. Barramento de dados


Corresponde às vias de comunicação entre a CPU e os demais elementos compondo a arquitetura de um computador. Como
o nome indica, este barramento é utilizado para permitir a troca de dados bidirecional entre o microprocessador e os demais
elementos da arquitetura do computador como memória e dispositivos de E/S. O barramento de dados de um
microprocessador é acessível através de pinos presentes em seu chip. Os pinos compondo o barramento de dados de um
microprocessador podem ser identificados através de consulta ao manual do fabricante.
2.2.9. Barramento de endereços
O barramento de endereços de um microprocessador é o conjunto de pinos presentes em sua interface através dos quais este
elemento informa aos demais componentes da arquitetura do computador os endereços nos quais uma operação de
comunicação será realizada. Por exemplo, durante um ciclo de leitura em memória, um dos passos é a colocação, neste
barramento, do endereço de memória onde está armazenado o dado a ser lido. Da mesma forma que no caso do barramento
de dados, os pinos deste barramento podem ser identificados através de consulta ao manual do fabricante.
2.2.10. Capacidade de endereçamento
Está relacionada com a máxima quantidade de memória que um computador pode suportar. A capacidade de
endereçamento é uma propriedade do microprocessador que depende do tamanho (em número de bits) do barramento de
endereços. Quanto maior o tamanho do barramento de endereços, maior será a capacidade de endereçamento do
microprocessador.
2.2.11. Interrupção
Mecanismo implementado em praticamente todos os microprocessadores para o tratamento de eventos relacionados à
operação de um computador. O mecanismo implica na possibilidade de interromper a execução de uma seqüência de
instruções de programa para executar uma rotina de tratamento, a partir da ativação por hardware (modificação do estado
de um sinal digital num pino do microprocessador) ou por software (instrução específica de chamada). A digitação de uma
tecla, a realização de operações de entrada saída, o tratamento de erros de sistema, são exemplos de eventos tratados
através do mecanismo de interrupção.
2.2.12. Pipelining
Mecanismo implementado em alguns microprocessadores mais recentes onde a execução de instruções de um programa são
antecipadas de modo a se obter um melhor desempenho do sistema.
Apostila de Arquitetura de Computadores II 11

Capítulo 3 - Nível da Lógica Digital


3.1.CONCEITOS DE LÓGICA DIGITAL

3.1.1.CIRCUITOS LÓGICOS E GATES

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.

3.1.2. OPERADORES LÓGICOS

Os conectivos ou OPERADORES LÓGICOS ou FUNÇÕES LÓGICAS são:


- E (ou AND) - uma sentença é verdadeira SE - e somente se - todos os termos forem verdadeiros;
- OU (ou OR) - uma sentença resulta verdadeira se QUALQUER UM dos termos for verdadeiro;
- NÃO (ou NOT) - este operador INVERTE um termo.

Os operadores lógicos são representados por:

____
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)

3.1.3. TABELA VERDADE

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

Obs.: a inversão em binário funciona como se fizéssemos 1 - A = X. Ou seja, 1 - 0 = 1 e 1 - 1 = 0.

3.1.4. APLICAÇÃO DA ÁLGEBRA DE BOOLE AOS COMPUTADORES DIGITAIS

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).

3.1.5.PORTA LÓGICA OU 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. CIRCUITOS LÓGICOS

3.2.1.PORTAS BÁSICAS

PORTA NOT (NÃO)


A porta NOT inverte o sinal de entrada (executa a NEGAÇÃO do sinal de entrada), ou seja, se o sinal de entrada for 0 ela
produz uma saída 1, se a entrada for 1 ela produz uma saída 0.

PORTA AND (E)


A porta AND combina dois ou mais sinais de entrada de forma equivalente a um circuito em série, para produzir um único
sinal de saída, ou seja, ela produz uma saída 1, se todos os sinais de entrada forem ; caso qualquer um dos sinais de entrada
for 0, a porta AND produzirá um sinal de saída igual a zero.
Apostila de Arquitetura de Computadores II 15

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.

PORTA NAND (NÃO E)


A porta NAND equivale a uma porta AND seguida por uma porta NOT, isto é, ela produz uma saída que é o inverso da
saída produzida pela porta AND.

PORTA NOR (NÃO OU)


A porta NOR equivale a uma porta OR seguida por uma porta NOT, isto é, ela produz uma saída que é o inverso da saída
produzida pela porta OR.

PORTA XOR (OU EXCLUSIVO)


A porta XOR compara os bits; ela produz saída 0 quando todos os bits de entrada são iguais e saída 1 quando pelo menos
um dos bits de entrada é diferente dos demais.
Apostila de Arquitetura de Computadores II 16

Exemplo de circuitos utilizando portas lógicas:


A) Uma campainha que toca (saída) se o motorista der a partida no motor do carro (entrada) sem estar com o cinto de
segurança afivelado (entrada). Se a ignição for ACIONADA (1) e o cinto estiver DESAFIVELADO (1), a campainha é
ACIONADA (1). Caso contrário, a campainha não toca. Tabela Verdade:
Ignição Cinto Campainha
0 0 0
0 1 0
1 0 0
1 1 1
</DIV>
Basta incluir uma porta AND.

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:

Sensor 1 Sensor 2 Campainha


0 0 0
0 1 1
1 0 1
1 1 1
</DIV>
Basta incluir uma porta OR.

3.3. ÁLGEBRA DE BOOLE

As operações básicas da Álgebra de Boole são:

3.3.1.AVALIAÇÃO DE UMA EXPRESSÃO BOOLEANA

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!

Ex.: Avalie a expressão:


Apostila de Arquitetura de Computadores II 17

3.3.2. EQUIVALÊNCIA DE FUNÇÕES LÓGICAS


Duas funções Booleanas são equivalentes se - e somente se - para a mesma entrada, produzirem iguais valores de saída .
PORTANTO, DUAS FUNÇÕES LÓGICAS EQUIVALENTES TÊM A MESMA TABELA VERDADE.

Ex.: Verifique se as funções lógicas a seguir representam funções equivalentes:

3.3.3.PROPRIEDADES DA ÁLGEBRA DE BOOLE

Exercício: Simplifique a seguinte expressão:

3.3.4.PROPRIEDADES DA FUNÇÃO EXCLUSIVE OR (XOR)


Apostila de Arquitetura de Computadores II 18

3.4.REPRESENTAÇÃO DE CIRCUITOS COM AS FUNÇÕES NAND E NOR


Usando as propriedades apresentadas, todo e qualquer circuito pode ser representado usando exclusivamente as função
NAND ou as função NOR.
Para que serviria tal artimanha, além da dor de cabeça aos estudantes? Há neste caso uma razão maior que a comodidade
ou a aparente dificuldade: a razão econômica. Por diversas razões construtivas, fica mais barato construir TODOS os
circuitos de um computador usando APENAS UM ÚNICO TIPO DE CIRCUITO. Aceitando essa afirmação, vamos
enfrentar a tarefa de represntar os nossos circuitos já conhecidos usando apenas funções NAND ou os NOR.
a) CIRCUITO INVERSOR

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:

Este circuito implementa a função XOR, usando apenas portas NAND!

3.5.FORMAS CANÔNICAS

3.5.1.REPRESENTAÇÃO DE UM CIRCUITO ATRAVÉS DE UMA TABELA VERDADE


Os circuitos de um computador realizam funções de grande complexidade, cuja representação geralmente não é óbvia. O
processo para realização de uma função através de um circuito começa na descrição verbal do circuito (descrição do
comportamento de suas possíveis saídas, em função das diversas combinações possíveis de seus sinais de entrada), a partir
do que é possível montar sua tabela verdade.

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

verdade que representa esse circuito lógico.

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:

a) produzirão saída 1 (e portanto as demais condições produzirão saída 0) ou alternativamente,

b) produzirão saída 0 (e portanto as demais condições produzirão saída 1).


São portanto duas as formas canônicas: uma representa as condições que produzem saída 1 (SOMA DOS MINITERMOS) ,
a outra representa as condições que produzirão saída 0 (PRODUTO DOS MAXITERMOS). Essas formas são alternativas,

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).

3.5.3. SOMA DOS MINITERMOS

É 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

3.5.4. PRODUTO DOS MAXITERMOS

É 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:

O MESMO COMPORTAMENTO (A MESMA TABELA VERDADE) PODE SER IGUALMENTE


REPRESENTADA POR QUALQUER DAS FORMAS CANÔNICAS.
Exemplo:
Apostila de Arquitetura de Computadores II 22

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.

3.6.1. <BIG><BIG>Mapa de Karnaugh para 1 Variável</BIG></BIG>

Considere a tabela-verdade, já vista, de uma função NOT,


A f(A) = A
0 1
1 0
Para se fazer um Mapa de Karnaugh a partir desta tabela-verdade, realiza-se a construção ilustrada na figura abaixo,

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).

3.6.2. <BIG><BIG>Mapa de Karnaugh para 2 Variáveis</BIG></BIG>

Veja para função de duas varáveis (por exemplo, a função AND),


Apostila de Arquitetura de Computadores II 23

3.6.3. <BIG><BIG>Mapa de Karnaugh para 3 Variáveis</BIG></BIG>

Para funções de três variáveis independentes,

3.6.4. <BIG><BIG>Mapa de Karnaugh para 4 Variáveis</BIG></BIG>

Para funções de quatro variáveis independentes,

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>

Ex.1 - Considere a seguinte função lógica de duas variáveis, F(A,B),

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.

Ex.2 - Considere, agora, a função de três variáveis, F(A,B,C),

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',

A B C F F' Mintermos Maxtermos


0 0 0 1 0 m0=A'B'C' M0=A+B+C
0 0 1 0 1 m1=A'B'C M0=A+B+C'
0 1 0 0 1 m3=A'BC' M0=A+B'+C
0 1 1 0 1 m4=A'BC M0=A+B'+C'
1 0 0 1 0 m5=AB'C' M0=A'+B+C
1 0 1 1 0 m6=AB'C M0=A'+B+C'
1 1 0 1 0 m7=ABC' M0=A'+B'+C
1 1 1 1 0 m8=ABC M0=A'+B'+C'

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.CONSTRUÇÃO DE CIRCUITOS REAIS DE COMPUTADORES

3.7.1.CIRCUITOS ARITMÉTICOS

Vamos lembrar a aritmética de ponto fixo, para a soma de dois bits.


0+0=0
0+1=1
Apostila de Arquitetura de Computadores II 26

1+0=1
1 + 1 = 0 e vai um

Se houver vai um na soma anterior, teremos:

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.

Como fazemos para somar dois números de n algarismos?


Na prática, representamos os dois números a serem somados, um sobre o outro, e somamos coluna a coluna; quando o valor
da soma de dois algarismos supera a base, somamos um à próxima coluna (isto é, fazemos resultado + base, sendo base
igual a 10 para qualquer base). O "VAI UM" de uma coluna (uma ordem) é o "VEM UM" da próxima coluna. Fácil? Não?
Se a explicação complicou, basta vermos um exemplo prático para concluir o quanto é simples:

NA BASE 10 NA BASE 2 NA FORMA GERAL, somando A + B


110 11010 Ci4.Ci3.Ci2..Ci1. "vem 1" (carry in)
085 01101 ......A3..A2...A1...A0 parcela
+16 01101 ......B3..B2....B1...B0 parcela
101 11010 ......R3...R2...R1...R0 soma
011 01101 ....Co3.Co2..Co1.Co0 "vai 1" (carry out)

Bom, difícil não pode ser, já que vimos fazemos somas desse jeito desde o curso primário...

E para fazer uma subtração? Lembrando também o estudado anteriormente,

UMA SUBTRAÇÃO É UMA SOMA EM COMPLEMENTO! Ou seja,

A - B = A + ( - B)

No computador, fazemos a subtração através de uma soma em complemento.

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)!

Idem na base 2: 100 x 10 = 1000

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.

3.7.2 CIRCUITO MEIO-SOMADOR (HALF ADDER)

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

Saída - a soma dos bits e o bit de carry out ("vai um") - S e Co

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

Entrada Demultiplexador Saídas

Seleção

3.7.3. CIRCUITO SOMADOR COMPLETO (FULL ADDER)

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

3.8. CIRCUITOS ARITMÉTICOS - CONSTRUÇÃO DE UMA MINI-UAL

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!

Esquematicamente, o circuito ficaria como segue:

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.

Portanto, para diferenciar de soma ou subtração, fazemos:


se S = 0 ---> B (MANTÉM O VALOR DO BIT)
se S = 1 ---> B (COMPLEMENTA O BIT)

Então, fazendo a tabela verdade para mostrar esse comportamento, teremos:


Apostila de Arquitetura de Computadores II 30

que é uma função XOR. Portanto, para resolver a subtração, basta incluir portas XOR tendo como entradas B0 ...
Bn e S.

3.8.2.TRATAMENTO PARA COMPLEMENTO A 2

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

Construindo a tabela verdade, temos:

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. FLIP-FLOP, REGISTRADORES E CONTADORES

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.

Como pode ser observado no esquema ao lado, existem duas saídas Q e


Q negado que realimentam a entrada. Esta realimentação associada aos NANDs faz
com que, independente dos valores de entrada, as únicas saídas possíveis para esta
montagem são opostas entre sí, ou seja, os valors de Q e Q negado serão iguais a 0
e 1 ou 1 e 0, respectivamente.

Obtenha a tabela verdade do circuito ao lado

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

O flip-flop SR síncrono segue a tabela-verdade abaixo:.

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

O Flip-flop JK síncrono tem as seguintes características:


- entradas de controle não apresentam condição inválida;
- J = K = 1 resultam numa inversão do estado do Flip-Flop ;
- seu funcionamento obedece a tabela-verdade abaixo

J K CLK Q

0 0  Q0

0 1  0

1 0  1

___
1 1  Q0

3.9.2.3. Flip-Flop Tipo D

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

Um contador operando com flip-flops é mostrado na figura abaixo.

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.

Latch formado por NANDS

Esta é a unidade básica mais fundamental na montagem de um flip-flop.


Qual será a tabela verdade para este circuito?

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

A Arquitetura de uma RAM estática apresenta as seguintes características:


- conjunto de registradores, cada um armazenando uma palavra de dados (dependendo do número de FFs que o compõe)
e possuindo um único endereço por registrador
- a capacidade é medida por 1K x 4, 16K x 8, 32K x 16, 128M x 8
- Capacidade de RAM em um computador pode ser expandida pela combinação de chips (blocos).

A organização interna de uma RAM 64x4 é a seguinte:


Uma memória pode ser expandida de duas formas: expansão do tamanho da palavra e da capacidade de uma Memória.
Entrada de Dados
I3 I 2 I1 I 0

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

Outra possibilidade para a expansão da capacidade de memória é a apresentada a seguir:


Apostila de Arquitetura de Computadores II 36

A12
A11
A10..A0

O3
A1 O2
A0 O1
O0
Decodificador
2 para 4 A0 - A10 A0 - A10 A0 - A10 A0 - A10

ROM - 0 ROM - 1 ROM - 2 ROM - 3


2K x 8 2K x 8 2K x 8 2K x 8

CS CS CS CS
O0 - O7 O0 - O7 O0 - O7 O0 - O7

D7..D0

3.10. MULTIPLEXADORES E DEMULTIPLEXADORES

3.10.1. MULTIPLEXADOR - MUX

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

PROJETO DO CIRCUITO DE UM MULTIPLEX

Para projetarmos um multiplex, devemos relacionar, principalmente, a possibilidade de que as entradas de


seleção irão assumir com a informação de entrada que deve ser conectada à saída. Para isso, montamos uma tabela da
verdade onde serão colocadas todas as possibilidades de seleção e as respectivas informações que devem aparecer na saída.
Para mostrarmos passo a passo a elaboração de multiplex, vamos iniciar, efetuando o projeto de um multiplex de 4 canais
ou entradas de informações. Para que possamos conectar aleatoriamente 4 entradas à saída, necessitamos de 2 variáveis de
seleção. Com isso, podemos montar a tabela da verdade:

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.

Representando o multiplex obtido em bloco, temos:


Apostila de Arquitetura de Computadores II 39

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 circuito que executa esta função é visto na figura abaixo.


Apostila de Arquitetura de Computadores II 40

Representando apenas em bloco, temos:

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

Ampliação da Capacidade de um Sistema Multiplex


Podemos, a partir de circuitos multiplex de baixa capacidade, formar outros para um maior número de
informações de entrada. Para entendermos o processo, vamos montar um multiplex de 4 canais de informação, a partir de
outros de apenas 2 canais de informação. A figura abaixo mostra, em blocos, o multiplex obtido.

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.

Endereçamento Sequencial em um Sistema Multiplex

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.

Utilização do Multiplex na Construção de Circuitos Combinacionais


Apostila de Arquitetura de Computadores II 43

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

MUX 2: I0=I1=I2=I4= 0 I3=I 5=I6=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.

Um demultiplexador é um circuito que permite encaminhar seletivamente a informação aplicada numa


única entrada para uma de várias saídas.
Um demultiplexador de 1 para 2N tem uma entrada, 2N saídas e N entradas de seleção. Realiza a
função inversa de um multiplexador, conforme se evidencia na figura.
Imaginemos várias linhas de entrada e uma única linha de saída, e entre eles uma chave que varia a entrada
ocasionando várias respostas. Cada entrada tem seu nível lógico ou sinal próprio. A chave é controlável, sendo assim o
controle determina qual será a linha de entrada escolhida. Se pode implementar um multiplexador com portas lógicas,
tendo em vista que através da chave se habilita ou não uma porta.
Apostila de Arquitetura de Computadores II 45

Capítulo 4 MICROARQUITETURA E MICROPROGRAMAÇÃO

4.1. INTRODUÇÃO

Uma característica extremamente fascinante nos microprocessadores é a sua capacidade de interpretar e


executar instruções de programa.
Na arquitetura de qualquer sistema computacional, o microprocessador é o elemento que define a
potencialidade da máquina, a partir de sua velocidade de processamento, o tamanho da palavra manipulada, a quantidade
de memória interna (registros) e seu conjunto de instruções.
A maior parte destes fatores está intimamente ligada à forma como os diferentes componentes do
microprocessador estão associados e como estes são controlados internamente. A esta organização é dado o nome de
microarquitetura.
Cada microprocessador possui sua microarquitetura específica e, como conseqüência disto, sua própria
linguagem de máquina.
O objetivo deste capítulo é introduzir o conceito de microarquitetura e de microprogramação como
fatores determinantes dos aspectos de execução de um microprocessador.
Dada a grande diversidade de configurações em termos de microarquitetura e a grande complexidade
dos fatores associados a ela, será feito uso de um exemplo didático, mas bastante representativo de alguns casos reais.

4.2. OS MICROPROCESSADORES E OS SINAIS EXTERNOS

Os microprocessadores são geralmente circuitos integrados dispostos em pastilhas onde o número de


pinos varia de 40 a 132. Como ilustrado na figura 4.1, os sinais associados a estes pinos permitirão ao microprocessador a
troca de informação com o seu ambiente, ou seja, memória e circuitos de E/S.

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. COMPONENTES DE UM MICROPROCESSADOR

Nesta seção, apresentaremos as principais características dos componentes da arquitetura de um


microprocessador, em particular, os registros, os barramentos, a ALU, os multiplexadores e decodificadores, o deslocador,
os relógios, e a memória principal.

4.3.1. Registros

Um registro é um dispositivo capaz de memorizar uma informação. Na arquitetura de um


microprocessador, os registros, geralmente numerosos, são utilizados para assegurar o armazenamento temporário de
informações importantes para o processamento de uma dada instrução.
Endereços
Alimentação

Controle

Interrupções
Dados

Relógio Estados Funcionais


Figura 4.1 - Configuração externa de um microprocessador.

Conceitualmente, registro e memória são semelhantes... são a localização, a capacidade de armazenamento e os


tempos de acesso às informações que os diferenciam. Os registros se localizam no interior de um microprocessador,
enquanto a memória é externa a este. Um registro memoriza um número limitado de bits, geralmente uma palavra de
memória.
Quanto mais complexos e mais potentes os microprocessadores, mais registros eles contém. No caso de
pequenos computadores e pouco potentes, a memória principal é utilizada para armazenar valores intermediários em função
do número reduzido de registros.
Os registros de um microprocessador constituem uma memória local, privada ou uma memória “bloco
de notas” para o microprocessador. A memória central é considerada uma memória global compartilhada.

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

Figura 4.2 - Um registro de 8 bits conectado a dois barramentos (entrada e 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.

4.3.3. Unidade Lógica e Aritmética (ALU)

Os computadores utilizam diversos componentes específicos para efetuar os cálculos ou o tratamento de


informação. O circuito de cálculo mais simples é o somador, que adiciona dois números de n bits. A ALU é o circuito que
efetua diversas operações aritméticas e lógicas entre dois operandos.
O tipo de tratamento a efetuar deve ser informado através de sinais de seleção de operação. A figura 4.3
mostra a composição de uma ALU, capaz de realizar quatro diferentes operações com dois números binários A e B: A e B,
A ou B, Complemento de B ( B ) e A+B, a escolha das operações sendo feitas segundo o valor dos dígitos F0 e F1.

4.3.4. Multiplexadores e Decodificadores

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

Figura 4.3 - ALU de quatro operações sobre 1 bit.

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

controle MULTIPLEXADOR 2 x 1 DECODIFICADOR 4 x 16

saídas saídas

Figura 43.4 - Multiplexador 2 x 1 e Decodificador 4 x 16.

O decodificador compreende n entradas e 2n saídas, ordenadas de 0 a 2 n-1 . Se o valor presente sobre as


entradas é k, apenas a saída de ordem k será ativa. O decodificador analisa a informação nas suas entradas e fornece na
saída, de maneira exclusiva, a indicação ou significado desta informação dentre várias possibilidades.

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

Figura 4.5 - Circuito de relógio e seu cronograma.

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.

4.4. CONCEITO DE MICROARQUITETURA

Uma vez revisto o funcionamento dos diferentes componentes de um microprocessador, é importante


estudar como estes podem ser combinados de modo a obter um circuito capaz de interpretar e executar um dado conjunto de
instruções de programa.
A arquitetura interna do microprocessador vai estabelecer o primeiro nível de linguagem que será
implementada pelos circuitos constituintes.

4.4.1. Um exemplo de micromáquina

A figura 4.6 apresenta um exemplo de arquitetura interna de um microprocessador e a maneira como a


informação será conduzida. Nas seções a seguir será feita a descrição dos seus diferentes elementos e os sinais utilizados
para conduzí-los.
Apostila de Arquitetura de Computadores II 50

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

Figura 4.6 - Exemplo de microarquitetura.


Na micromáquina da apresentada, o caminho dos dados é composto de 16 registros gerais de 16 bits (A,
B, C, PC, SP, AC, etc.), uma ALU e diversos barramentos (A, B e C). Cada registro pode transimitir seus dados aos
barramentos A ou B e pode receber as informações sobre o barramento C.
Os barramentos A e B vão alimentar a ALU com operandos de 16 bits para realizar uma das quatro
operações: A+B, A e B, A e complemento de A ( A ). A seleção da operação a realizar será indicada pelos bits F0 e F1.
Dois outros bits, N e Z, indicam, respectivamente, se o resultado da operação é negativo ou zero (estes sinais são ativados
após uma operação da ALU).
A saída da ALU é conectada à entrada de um registrador de deslocamento, DESLOC, que efetua sobre o
operando ou uma simples transferência, ou um deslocamento para a direita ou para esquerda, os bits utilizados para indicar
a maneira de transmitir o dado sendo S0 e S1.
Os barramentos A e B não são conectados diretamente às entradas da ALU, servindo-se para isto de
buffers A e B (manter estabilidade dos dados na entrada).
A troca de dados com a memória principal do microprocessador é feita graças a dois outros registros
MAR e MBR. MAR pode ser carregado com um dado do barramento B, o carregamento deste registro sendo comandado
pelo sinal M0.
Um dado na saída do registro de deslocamento pode ou ser carregado num dos 16 registros gerais, ou
ser enviado à memória principal via registro MBR, o sinal utilizado para comandar o carregamento do registro sendo M1.
M2 e M3 permitem comandar, respectivamente as operações de escrita e leitura em memória. Um dado
lido na memória pode ser carregado diretamente como entrada da ALU, segundo a seleção efetuada pelo multiplexador
AMUX, A0 sendo o sinal utilizado para o controle.
O controle do caminho dos dados do microprocessador vai necessitar então de 61 sinais:

 16 para comandar a descarga dos registros sobre o barramento A


Apostila de Arquitetura de Computadores II 51

 16 para comandar a descarga dos registros sobre o barramento B


 16 para comandar a carga dos registros a partir do barramento C
 2 sinais de carregamento dos buffers A e B (L0 e L1)
 2 sinais para definir a operação a executar (F0 e F1)
 2 sinais para o comando do registrador de deslocamento (S0 e S1)
 4 sinais para comandar os registros MAR e MBR (M0, M1, M2 e M3)
 2 sinais para indicar a operação de leitura ou escrita com a memória principal
 1 sinal para controlar o multiplexador

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.

4.4.2. Formato das microinstruções

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:

AMUX (1 bit) - controle do multiplexador


ALU (2 bits) - seleção da operação da ALU
DESLOC (2 bits) - controle do sentido de deslocamento de reg. desl.
MBR (1 bit) - controle de carregamento de MBR
RD (1 bit) - leitura na memória
WR (1 bit) - escrita em memória
VALC (1 bit) - autorização de carregamento dos registros
C (4 bits) - endereçamento dos registros para o barramento C
B (4 bits) - endereçamento dos registros para o barramento B
A (4 bits) - endereçamento dos registros para o barramento A

Os campos COND e END serão definidos mais adiante.

4.4.3. Ciclo de execução de uma instrução

A execução de uma microinstrução pelos diversos componentes da micromáquina deve obedecer a um


ciclo bem definido. O ciclo de execução de uma instrução pela ALU é composto das seguintes etapas:
 carregamento dos operandos nos buffers A e B
 fornecimento de tempo suficiente para a ALU e o registro de deslocamento para realizar suas funções
 carregamento do resultado da operação num registro geral ou no registro MBR.
1 2 2 2 1 1 1 1 1 4 4 4 8
DESLOC
COND
AMUX

VALC
MBR
MAR
ALU

WR
RD

A B C END

Figura 4.7 - Formato de uma microinstrução da micromáquina exemplo.


Apostila de Arquitetura de Computadores II 52

É 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

Figura 4.8 - Micromáquina completa.

No exemplo considerado, as microinstruções são codificadas em palavras de 32 bits. A memória de


comando selecionada, vai ter a capacidade de armazenar até 256 palavras de 32 bits (256 x 32 bits).
A memória de comando dispõe de um registro de endereços (MPC) e de um registro de dados (MRI). O primeiro
registro permite endereçar a microinstrução a ser executada e o segundo armazená-la.
A memória de comando atua no primeiro subciclo da execução de uma instrução, fazendo a carga da
microinstrução apontada por MPC no registro RMI. No subciclo 2 o conteúdo de RMI é estável, sendo que as informações
contidas nos campos da microinstrução vão agir no caminho de dados, particularmente os campos A e B que vão determinar
quais as informações deverão ser carregadas nos barramentos A e B (sendo que os decodificadores vão realizar a
decodificação , suas saídas agindo sobre as entradas OE dos registros selecionados).
Ainda no subciclo 2, o relógio permite carregar as informações sobre os barramentos A e B nos buffers,
respectivamente A e B. Assim, para os subciclos seguintes, os dados de entrada da ALU estarão estáveis nestes buffers.
Durante esta operação, o registro MPC é incrementado de um por um circuito especial — o contador
incremental, o que permite preparar o carregamento da próxima microinstrução no RMI, aumentando assim a velocidade de
execução do microprograma.
No subciclo 3, a ALU e o registro de deslocamento vão executar as operações sobre os dados, segundo
os os valores dos campos ALU e DESLOC. Além disso, o campo AMUX que comanda o multiplexador AMUX vai permitir
indicar se o dado a ser carregado na entrada esquerda da ALU deve ser o conteúdo do buffer A ou o conteúdo do registro
MBR.
Apostila de Arquitetura de Computadores II 53

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.

4.4.4. Sequenciamento das microinstruções

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:

COND = 0 sem quebra de sequenciamento --- MPC = MPC + 1


COND = 1 quebra de sequenciamento se N = 1
COND = 2 quebra de sequenciamento se Z = 1
COND = 3 quebra de sequenciamento incondicional

O microsequenciador implementa a seguinte equação booleana, levando em conta as saídas da ALU, N e Z e o


campo COND, que é aqui representado pelos bits L (da esquerda) e R (da direita):

MMUX = L R N + L R Z + L R = RN + LZ + LR
Assim MMUX será igual a 1 nas seguintes condições:

• LR = 012 e N = 1 • LR = 102 e Z = 1 • LR = 112

4.4.5. Exemplos de microinstrução

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

0 0 2 0 0 0 1 1 0 0 0 0 00 mar = pc; rd;

0 2 2 0 0 0 0 0 0 0 0 1 22 alu=c; if z then go to 22;

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;

Figura 4.9 - Exemplos de microinstruções.


Apostila de Arquitetura de Computadores II 54

4.5. LINGUAGEM DE MÁQUINA E MICROCÓDIGO

4.5.1. Características básicas do microprocessador

O programador do microprocessador considerado vê o componente como uma máquina composta de 8


Kb de memória e de três registros específicos: o contador de programa (PC), o acumulador (AC) e o apontador de pilha
(SP).

4.5.2. Modos de endereçamento de dados

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.

4.5.3. Conjunto de Instruções da Microarquitetura

A linguagem de máquina da microarquitetura considerada é composta de 23 instruções. A tabela a


seguir apresenta cada uma das instruções da linguagem, juntamente com uma breve descrição de sua operação.

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

Na descrição dos códigos das instruções na tabela, os operandos apresentados correspondem ao


seguinte:
 end são endereços expressos em 12 bits;
 dado são valores expressos em 12 bits;
 x são deslocamentos expressos em 12 bits;
 y são deslocamentos expressos em 8 bits.
Apostila de Arquitetura de Computadores II 55

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:

 a busca do código da instrução a executar;


 a decodificação da instrução;
 a execução propriamente dita da instruçã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.

4.5.5. O ciclo de busca de uma instrução

O ciclo de busca de uma instrução envolve um pequeno conjunto de registros da microarquitetura,


particularmente, o PC, o MAR e o IR. Os passos básicos deste ciclo são:

 Carregamento do conteúdo do registro PC no registro MAR;


 Incremento do registro PC;
 Cópia do conteúdo da posição de memória apontada por MAR (código da instrução a executar) no registro IR;

Traduzindo estes passos para a sintaxe da linguagem de microprogramação, pode-se escrever o


seguinte:

0: mar := pc; rd; / carregamento do MAR


1: pc := pc + 1; rd; / incremento do PC
2: ir := mbr; if n then goto 28; / código no IR
Apostila de Arquitetura de Computadores II 56

4.5.6. A decodificação das instruções

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.

4 : a := band(ir, amask); if z then goto 0; / rotação esq.

4.5.7. A implementação das instruções

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.

5 : ac := lshift(ac); if n then goto 7;


6 : goto 8;
7 : ac := ac + 1;
8 : a := a + -1; if z then goto 0;
9 : goto 5;

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

Figura 4.10 - Ilustração da operação de 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

4.5.8. O microprograma completo

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.

0: mar := pc; rd; / loop principal


1: pc := pc + 1; rd; / incremento do PC
2: ir := mbr; if n then goto 28; / salva e decodifica MBR
3: tir :=lshift(ir + ir); if n then goto 19;
4: tir :=lshift(tir); if n then goto 11; / 000x ou 001x?
5: alu := tir; if n then goto 9; / 0000 ou 0001?
6: mar := ir; rd; / 0000 = LODD
7: rd;
8: ac := mbr; goto 0;
9: mar := ir; mbr := ac; wr; / 0001 = STOD
10: wr; goto 0;
11: alu := tir; if n then goto 15; / 0010 ou 0011?
12: mar:= ir; rd; / 0010 =ADDD
13: rd;
14: ac := mbr + ac; goto 0;
15: mar:= ir; rd; / 0011 = SUBD
16: ac := ac + 1; rd; / Obs: x-y = x+1 + not(y)
17: a := inv(mbr);
18: ac := ac + a; goto 0;
19: tir :=lshift(tir); if n then goto 25; / 010x ou 011x?
20: alu :=tir; if n then goto 23; / 0100 ou 0101?
21: alu :=ac; if n then goto 0; / 0100 = JPOS
22: pc := band (ir, amask); goto 0; / realiza o salto
23: alu := ac; if z then goto 22; / 0101 = JZER
24: goto 0; / sem salto
25: alu:= tir; if n then goto 27; / 0110 ou 0111?
26: pc := band(ir, amask); goto 0; / 0110 = JUMP
27: ac :=band(ir, amask); goto 0; / 0111 = LOCO
28: tir :=lshift(ir + ir); if n then goto 40; / 10xx ou 11xx?
29: tir :=lshift(tir); if n then goto 35; / 100x ou 101x?
30: alu := tir; if n then goto 33; / 1000 ou 1001?
31: a :=ir + sp; / 1000 = LODL
32: mar :=a; rd; goto 7;
33: a:=ir + sp; / 1001 = STOL
34: mar := a; mbr:= ac;wr; goto 10;
35: alu := tir; if n then goto 38; / 010 ou 1011?
36: a :=ir + sp; / 1010 = ADDL
37: mar := a;rd; goto 13;
38: a :=ir + sp; / 1011 = SUBL
39: mar :=a;rd; goto 16;
40: tir :=lshift(tir); if n then goto 46; / 110x ou 111x?
41: alu :=tir; if n then goto 44; / 1100 ou 1101?
42: alu := ac; if n then goto 22; / 1100 = JNEG
43: goto 0;
44: alu := ac; if z then goto 0; / 1101 = JNZE
45: pc := band(ir, amask); goto 0;
46: tir :=lshift(tir); if n then goto 50;
47: sp := sp + -1 ; / 1110 = CALL
48: mar := sp; mbr:= pc;wr;
49: pc := band(ir, amask);wr; goto 0;
50: tir := lshift(tir);if n then goto 65; / 1111, busca endereço
51: tir := lshift(tir); if n then goto 59;
52: alu := tir; if n then goto 56;
53: mar :=ac;rd; / 1111000 = PSHI
54: sp :=sp + -1 ;rd;
55: mar := sp;wr;goto 10;
56: mar := sp; sp:= 1 + sp;rd; / 1111001 = POPI
57: rd;
58: mar :=ac;wr;goto 10;
59: alu :=tir; if n then goto 62;
60: sp :=sp + -1 ; / 1111010 = PUSH
61: mar := sp;mbr := ac; wr;goto 10;
62: mar := sp;sp := 1 + sp;rd; / 1111011 = POP
63: rd;
64: ac:= mbr; goto 0;
65: tir := lshift(tir); if n then goto 73;
66: alu := tir; if n then goto 70;
67: mar := sp;sp := 1 + sp;rd; / 1111100 = RETN
68: rd;
69: pc := mbr; goto 0;
70: a := ac;
71: ac := sp;
72: sp := a; goto 0;
73: alu := tir; if n then goto 76;
74: a := band(ir, smask); / 1111110 = INSP
75: sp := sp + a; goto 0;
76: a:= band(ir, smask); / 1111111 = DESP
77: a:= inv(a);
78: a:= a + 1; goto 75;

Você também pode gostar