UNIVERSIDADE FEDERAL DE LAVRAS DEPARTAMENTO DE CIÊNCIA DA COMPUTAÇÃO Orientador: Prof Wilian Soares Lacerda Desenvolvimento de uma Unidade Processadora Discreta Microprogramável Bolsista: Edna Mie Kanazawa Relatório Final apresentado à Universidade Federal de Lavras, como parte das exigências do PIBIC/CNPq, referente ao período de setembro/1999 à julho/2000. LAVRAS MINAS GERAIS – BRASIL AGOSTO/2000 UNIVERSIDADE FEDERAL DE LAVRAS DEPARTAMENTO DE CIÊNCIA DA COMPUTAÇÃO Desenvolvimento de uma Unidade Processadora Discreta Microprogramável RESUMO DOS OBJETIVOS E RESULTADOS Atualmente, com os computadores digitais fazendo parte do nosso cotidiano, se faz necessário o perfeito entendimento de seu funcionamento tanto interno, como sua interação com o mundo externo. Mais e mais desenvolvem-se tecnologias para que se obtenha processamentos mais velozes. Mas entre todas as tecnologias já desenvolvidas, observa-se que a arquitetura dos computadores digitais atuais segue a arquitetura dos primeiros computadores eletrônicos: Arquitetura de Von Newmann. Neste projeto, objetivou-se o estudo e o desenvolvimento de um protótipo de processador utilizando-se esta arquitetura, para a implantação de novas técnicas de processamento. O projeto dividiu-se em: estudo das arquiteturas existentes, desenvolvimento do processador com base no estudo realizado, elaboração dos circuitos eletrônicos, simulação dos circuitos, estudo e criação das instruções do processador, montagem em wire-wrap utilizando-se chips comerciais e teste do protótipo. Os circuitos dividiram-se em: Contador de programa e Apontador de pilha, Contador em anel, Gerador de clock e inicialização, Registrador de endereço de memória, Microprogramação, Unidade lógica aritmética e Portas de entrada e saída. Utilizou-se o software de simulação MAXPLUS II da ALTERA, para verificar o perfeito funcionamento dos circuitos desenvolvidos. As instruções implementadas em microprograma dividiram-se em: Instruções aritméticas (ADI, SUB, INC, DEC e CMP), Instruções lógicas (ANI, ORI, XRI, XRA e CMA), Instruções de transferência de dados (LDA, LDI e STA), Instruções de desvio (JMP, JZ, JEQ, JS, JNZ, JNEQ e JNS) e Instruções de chamadas e retorno de subrotinas (CALL e RET). Através destas instruções desenvolveu-se programas em assembly para execução no protótipo. O protótipo montado tem atendido as expectativas esperadas conforme a simulação, além de poder proporcionar um método de estudo e desenvolvimento de novas técnicas de arquiteturas de processadores digitais. ___________________________ Prof. Wilian Soares Lacerda Orientador ___________________________ Edna Mie Kanazawa Bolsista 2 AGRADECIMENTOS Ao orientador, Wilian Soares Lacerda que tornou possível o desenvolvimento da Unidade Processadora Discreta Microprogramável. Aos professores, que ajudaram de diversas formas a implementar e a construir o protótipo. 3 Índice 1 Introdução 06 2 Revisão de Literatura 08 3 Caracterização do Problema e sua Importância 09 4 Objetivos 09 5 Metodologia 10 6 Resultados e Discussões 10 6.1 Funcionamento 10 6.2 Unidade de Controle 13 6.3 Memória 13 6.4 Unidade Lógica Aritmética 14 6.5 Registrador de Endereços 15 6.6 Contador de Programa e Apontador de Pilha 15 6.7 Descrição simplificada dos componentes utilizados no projeto 16 6.7.1 Descrição do CI 74161 16 6.7.2 Descrição do CI 74191 18 6.7.3 Descrição do CI 74173 19 6.7.4 Descrição do CI 74157 19 6.7.5 Descrição do CI 74181 20 6.8 Tabela de instruções 20 6.9 Descrição dos sinais ativos durante o ciclo de busca 22 6.10 Descrição dos sinais ativos durante a instrução ADI <valor> 23 6.11 Descrição dos sinais ativos durante a instrução LDA <endereço> 26 6.12 Descrição dos sinais ativos durante a instrução STA <valor> 27 6.13 Descrição dos sinais ativos durante a instrução SUBI <valor> 29 6.14 Descrição dos sinais ativos durante a instrução INC A 30 6.15 Descrição dos sinais ativos durante a instrução DCR A 30 6.16 Descrição dos sinais ativos durante a instrução LDI <valor> 30 6.17 Descrição dos sinais ativos durante a instrução ANI <dado> 30 6.18 Descrição dos sinais ativos durante a instrução ORI <dado> 31 6.19 Descrição dos sinais ativos durante a instrução XRI <dado> 31 6.20 Descrição dos sinais ativos durante a instrução XRA 31 4 6.21 Descrição dos sinais ativos durante a instrução CMA 31 6.22 Descrição dos sinais ativos durante a instrução JMP < endereço > 32 6.23 Descrição dos sinais ativos durante a instrução JZ, JC, JS,JEQ <endereço> 32 6.24 Descrição dos sinais ativos durante a instrução CALL < endereço > 33 6.25 Descrição dos sinais ativos durante a instrução RET 33 6.26 Descrição dos sinais ativos durante a instrução CMP <dado> 33 6.27 Descrição dos sinais ativos durante a instrução ADD < endereço > 34 6.28 Descrição dos sinais ativos durante a instrução SUB <endereço> 34 6.29 Descrição dos sinais ativos durante a instrução INA 34 6.30 Descrição dos sinais ativos durante a instrução IND 34 6.31 Descrição dos sinais ativos durante a instrução OUTA 35 6.32 Descrição dos sinais ativos durante a instrução OUTD 35 6.33 Descrição dos sinais ativos durante a instrução HALT 35 6.34 Descrição dos sinais ativos durante a instrução PUSH 35 6.35 Descrição dos sinais ativos durante a instrução POP 35 7 Referências Bibliográficas 37 Anexos A - Esquemas dos circuitos eletrônicos B - Tabelas de códigos das instruções C - Resultados da simulação D - Folha de dados dos componentes eletrônicos 5 1 Introdução A Unidade Processadora Discreta Microprogramável é um protótipo desenvolvido dentro do estudo de várias arquiteturas de processadores digitais. Neste estudo observou-se que a maioria das arquiteturas segue a arquitetura dos primeiros computadores eletrônicos, ou seja, na Arquitetura de von Neumann. O objetivo do projeto baseia-se no desenvolvimento de um protótipo de um microprocessador com uma arquitetura simples e de fácil entendimento, para o desenvolvimento de tecnologias mais avançadas. Na figura 1 apresentamos blocos com as partes básicas que constituem o protótipo do microprocessador. Observa-se que o processador gerencia todos os componentes externos (portas de entrada /saída e memória). Figura1 – Componentes que constituem o protótipo do microprocessador Em geral o computador básico constitui-se de 3 partes: Unidade Central de Processamento (CPU), Portas de Entrada /Saída e Memórias. A CPU contém elementos de armazenamento (registradores), circuitos computacionais representado pela Unidade Lógica Aritmética (ULA), Circuitos de Controle e Temporização. As funções primárias da CPU são: - Buscar, decodificar, e executar instruções do programa armazenado na memória; - Transferir dados da e para memória e para portas de entrada e saída; - Prover os sinais de controle e temporização para todo o sistema. A Unidade Lógica Aritmética da CPU executa operações como somar, deslocar, rodar, comparar, incrementar, decrementar, negar, AND, OR, XOR, complementar e zerar. Para a execução de uma operação de soma, a ULA utiliza dois registradores (Acumulador e Temporário). O conteúdo do Acumulador é somado com o conteúdo do registrador temporário e o resultado é enviado ao acumulador. De grande importância para o programador é o registrador de código de condição dos flags. Os flags incluem indicadores de zero, de resultado negativo, de vai-um, etc. Os flags são usados para tomadas de decisão quando posteriormente, se usam instruções de desvio. Os registradores temporário e acumulador podem ser considerados parte da ULA. 6 A seção de CONTROLE E TEMPORIZAÇÃO é a parte mais complexa e afeta todos os eventos da CPU no microcomputador. Cada instrução do programa pode ser dividida em estágios de busca, decodificação e execução. Esses pequenos estágios ainda podem ser subdivididos em outros passos que podem ser chamadas de microprograma. O microprograma para cada instrução reside na seção de decodificação de instruções e é executado pela seção de controle e temporização da CPU. A sequência de busca-decodificação-execução de instrução é fundamental para a operação do computador. A primeira instrução buscada da memória de programa é tomada como sendo o código de operação da primeira instrução e é colocada no registrador de instruções pela seção de controle da CPU. O código, é então, interpretado pelo decodificador de instrução. O decodificador de instruções identifica o microprograma que a seção de controle e temporização deve seguir para executar uma instrução específica. Existe um conjunto de instruções que o microprocessador pode executar. As instruções podem ser classificadas de diversas maneiras: 1. Instruções aritméticas 2. Instruções lógicas 3. Instruções de transferência de dados 4. Instruções de desvio 5. Instruções de chamada de sub-rotina 6. Instruções de retorno 7. Instruções de pilha 1. 2. 3. 4. 5. 6. Nas instruções aritméticas temos: Somar, Somar com vai -um Subtrair, Subtrair com vai-um , Empréstimo Incrementar Decrementar Comparar Negar 1. 2. 3. 4. Nas instruções lógicas temos: AND OR XOR NOT 1. 2. 3. 4. Nas instruções de transferência e dados temos: Carregar Armazenar Mover Zerar 1. 2. 3. 4. 5. 6. Nas instruções de desvio temos: Desvio Incondicional Desvio de zero Desvio se não zero Desvio se igual Desvio se desigual Desvio se positivo 7 7. Desvio se negativo Nas instruções de pilha temos: 1. Empilhar 2. Desempilhar 2 Revisão de Literatura Segundo Tokheim, “Em relação à Eletrônica, o estudante de hoje ou o especialista de amanhã deve ter um conhecimento de microprocessadores e de sistemas baseados em microprocessadores. Isto inclui conhecimentos tanto em software como de hardware. O microprocessador é a base de toda uma linguagem de máquinas e dispositivos inteligentes. O microprocessadores serão encontrados em diversos produtos: de brinquedos a processadores de palavras; de computadores de bolso a eletrodomésticos; de robôs industriais a termostatos. Com o advento de microprocessadores microprogramáveis espera-se no futuro uma aceleração do desenvolvimento das máquinas inteligentes. ” Nosso cotidiano está sendo domado cada vez mais por máquinas inteligentes e para desenvolvimento de máquinas mais velozes e mais eficientes temos que ter um conhecimento básico de como a informação é processada por essas máquinas. Vários autores [TOKHEIM, TAUB, MALVINO] descrevem as seguintes arquiteturas: 8080/8085 da Intel e 6800 da Motorola, pois não apresentam tanta sofisticação e apresentam-se adequadas para apresentação introdutória a microprocesadores Segundo Stalling, a organização básica de um sistema de computador constitui-se de Unidade Central de Processamento conectada aos barramentos de dados, endereços e controle, como ilustrado na figura 2. Figura 2 – Organização básica de um computador A estrutura é o caminho pelo qual os componentes são relacionados e a função é operar cada componente individualmente como parte da estrutura. Operações básicas em um computador: - Processamento de dados; - Armazenamento de dados; - Transferência de dados; - Controle. A estrutura deve compor-se de 4 componentes: - Unidade Central de Processamento (CPU); - Memória Principal; 8 - I/O – Transfere dados entre o computador e o meio externo; Sistema de comunicação. A parte mais complexa do processador (CPU) é a sua unidade de controle responsável pela geração dos sinais de sincronismo de todos os circuitos do processador. Na literatura [ZUFFO, HAYES] temos descrito várias soluções para implementação da unidade de controle. Algumas técnicas permitem que a unidade de controle seja mais versátil para modificações e ampliação, como a técnica de microprogramação. Por isto o processador desenvolvido é microprogramável. Hennessy e Patterson descrevem em suas obras detalhes para projeto de processadores mais rápidos, utilizando técnicas de pipeling. O projeto do processador se torna bem mais complexo, para se conseguir este objetivo. No protótipo desenvolvido, esta técnica não foi utilizada por dificuldades de implementação. 3 Caracterização do Problema e sua Importância O desenvolvimento do protótipo da Unidade Processadora Discreta Microprogramável, divide-se em diversas partes funcionais tais como: Contador de Programa e Apontador de Pilha, Contador em Anel, Gerador de Clock, Registrador de Endereço, Microprogramação, Unidade Lógica Aritmética e Portas de Entrada/Saída. Cada parte foi devidamente estudada, esquematizada, simulada e implementada dando origem ao sistema. Esta divisão é importante, pois ao analisar o processamento de uma instrução é possível identificar quais partes estão sendo envolvidas para execução da instrução. A compactação das arquiteturas de computadores atuais e a velocidade com que as informações são processadas, dificulta a visualização e o entendimento do seu funcionamento. Com o Desenvolvimento da Unidade Processadora Microprogramável, que possui uma arquitetura simples e onde a velocidade e a compactação dos circuitos não são itens essenciais, é possível verificar e entender como as informações são processadas. Com o protótipo em funcionamento, torna-se possível este entendimento básico de processamento e muitos caminhos poderão ser abertos para o desenvolvimento de outras arquiteturas com tecnologias mais avançadas, pois o requisito básico já foi fixado. 4 Objetivos O presente projeto tem como meta os seguintes objetivos: - Estudo das técnicas de arquitetura para processador digital. Desenvolvimento de um protótipo de processador digital. Implementação de várias técnicas de arquitetura de processadores digitais. Testes de novas técnicas de arquitetura. Divulgar o estudo e pesquisa na área de arquitetura de processadores digitais dentro e fora do departamento. Formar uma equipe de pesquisa no departamento para atuar na área de arquitetura de processadores e computadores. Propor novas pesquisas na área de projetos e desenvolvimentos de arquitetura de processadores e computadores. 9 5 Metodologia Para atender os objetivos do presente projeto, foi adotado a seguinte metodologia: a) O estudo das técnicas de arquitetura de processadores foi realizado através de pesquisa bibliográfica em livros, artigos, revistas, e internet. Também foram feitos contatos com pesquisadores da área para troca de informações, visando um intercâmbio e aproximação com pessoas da área. b) O projeto do protótipo do processador digital desenvolveu-se inicialmente através do detalhamento em diagrama de circuitos eletrônicos. O circuito eletrônico foi desenhado em computador PC utilizando-se a ferramenta específica denominada Tango. c) Com o circuito definido, passou-se para a fase de simulação em computador utilizandose software com esta finalidade (Maxplus II). d) Retornou-se a etapa de projeto para correção dos circuitos, devido a alguns problemas apresentados durante a simulação. e) Sanados todos os problemas de simulação, iniciou-se a fase de implementação do circuito eletrônico utilizando-se montagem em placas de wire-wrap. f) Terminado a montagem, passou-se para a etapa de testes em laboratório com o uso de instrumentos de medição (multímetros, osciloscópios). g) Problemas ocorridos durante os teste em laboratório, fez rever e corrigir a simulação e a etapa de projeto. 6 Resultados e Discussões Estudou-se várias arquiteturas de processadores já existentes e sua evolução, observando as características de cada arquitetura concluiu-se que a maioria seguem a arquitetura de Von Newmann. Após estudos realizados, foram feitos diagramas que descrevem o funcionamento geral e um diagrama detalhado de cada bloco. Abaixo segue a descrição do funcionamento. 6.1 Funcionamento Na figura 3 temos o diagrama em blocos do protótipo do processador. 10 Figura 3 – Diagrama em blocos do protótipo Os sinais gerados pelo circuito de sincronismo afeta todos os eventos da CPU. Por isso antes de explicar o funcionamento do projeto daremos uma breve explicação no circuito de sincronismo. O Gerador de Clock e Contador em Anel fazem parte do circuito de sincronismo. Na figura 4 temos o diagrama em blocos do circuito de sincronismo, e também os sinais gerados em cada bloco. O Gerador de Clock possui duas opções: clock automático, onde temos um onda quadrada de 1kHz, e o clock manual onde pulsos são gerados através de uma chave. Com o clock manual podemos executar uma instrução passo a passo. No Contador em Anel temos as saídas T1, T2, T3, T4 que determinam o ciclo de busca e execução da instrução. A saída do Contador em Anel pode ser visualizada na figura 5. Observe que T4 permanece em nível alto até que as microinstruções da instrução sejam executadas. 11 Figura 4 – Diagrama em blocos do circuito de Sincronismo Figura 5 – Formas de onda dos sinais de sincronismo Em T1 o endereço apontado pelo Contador de Programa é armazenado no registrador de endereços. Em T2 o Contador de Programa é incrementado, ou seja aponta para o endereço da próxima instrução. Em T3 o endereço armazenado no Registrador de Instruções é transferido para o barramento de endereços e a memória é habilitada para leitura. O conteúdo da memória deve corresponder a um código de uma instrução, cujo valor é armazenado no Registrador de Instruções. T4 corresponde ao ciclo de execução da instrução. O ciclo de execução pode durar até 13 ciclos de clock, controlados por um contador, ou seja em T4 são executadas as microinstruções de uma instrução. A sequência de microinstruções é executada até que o sinal de controle FIM seja ativado pelo circuito de microprogramação, e um novo ciclo de busca e execução é iniciado. No circuito de microprogramação projetado podemos ter 127 instruções diferentes. Cada instrução pode desenvolver-se dentro de 13 ciclos de microinstruções. O ciclo de busca, corresponde à três ciclos de clock. Se o bit mais significativo do código da instrução estiver ativo, ou seja em 1 (um) teremos instruções de desvio condicional. 12 6.2 Unidade de Controle A Unidade de Controle é composta pelo Registrador de Instruções, Contador Síncrono e por Memórias Eprom’s, conforme figura 6. Em T1 o contador é zerado e em T4 a instrução é carregada no registrador de instruções. O bit MA11 = 1 indica que temos uma instrução de desvio condicional será executada. E o bit MA4 indicará o estado do flag que estará sendo analisado. Pelas linhas MA5 e MA6 estaremos selecionando o flag desejado. MA5 0 0 1 1 MA6 0 1 0 1 Flag /VAI-UM IGUAL /ZERO SINAL O Multiplexador foi colocado para minimizar os endereços redundantes apresentados quando uma instrução de desvio for executada. Sinais de controle: - /RICARGA – Armazena o conteúdo do barramento de dados, no registrador de instruções, na transição positiva do /CLOCK e quando T4 estiver ativo. Figura 6 – Diagrama em blocos da Unidade de Controle 6.3 Memória No circuito da Memória RAM é possível programá-la por meio de chaves. Assim é possível o armazenamento de programas. Além disso temos 8 páginas de memórias que podem ser selecionadas por meio de chaves. Sinais de controle: - MEMHAB – Habilita a memória - MEML/E – Em nível alto temos leitura, onde o conteúdo do endereço selecionado é transferido para o barramento de dados, caso contrário temos escrita em memória, onde o conteúdo do barramento de dados é armazenado no endereço indicado. As linhas de endereço de A7 à A10 determinam as páginas de memória. 13 Figura 7 – Diagrama em blocos da Memória 6.4 Unidade Lógica Aritmética A Unidade Lógica Aritmética, mostrada na fugura 8, é responsável em realizar as diversas operações do processador. Sinais de controle: - /RACARGA – Habilita a transferência do conteúdo do barramento de dados para o Acumulador, quando houver uma transição positiva do /CLOCK. - /RBCARGA - Habilita a transferência do conteúdo do barramento de dados para o Acumulador, quando houver uma transição positiva do /CLOCK. - MODOULA – Define o modo (aritmético = 1 ou lógico = 0) de operação da ULA. - S0, S1, S2 – define o tipo de operação a ser realizada. - /FLAG – Armazena o estado dos flags no registrador de flags. - /UM – Define o carry-in. - /ULALER – Habilita a transferência do resultado para barramento de dados. Figura 8 – Diagrama em blocos da Unidade Lógica Aritmética 14 6.5 Registrador de Endereços No Registrador de Endereços (figura 9) temos armazenado o conteúdo do Contador de Programa. Sinais de controle: - /RECARGA – Habilita o armazenamento do dado no registrador. - /RELER – Habilita a transferência do conteúdo armazenado para o barramento de endereços. Figura 9 – Diagrama em blocos do Registrador de Endereços 6.6 Contador de Programa e Apontador de Pilha O Contador de Programa indica o endereço da próxima instrução a ser executada. O Apontador de Pilha indica o endereço da pilha onde foi armazenado o valor do Contador de Programa antes dele iniciar uma subrotina. Ele também é utilizado nas instruções de PUSH e POP, onde os dados são armazenados e/ou retirados de uma pilha. Vide figura 10. Sinais de controle: - /CPCARGA – Carrega o contador com o dado do barramento de dados. - CPHAB – Habilita a contagem. - /CPLER – Habilita a transferência do dado do contador para o barramento de dados. - /LIMPA – O contador é zerado. - /APCARGA - Carrega o apontador de pilha com dado do barramento de dados. - APD/I – Habilita contagem crescente ou decrescente. - /APLER – Habilita a transferência do dado do contador para o barramento de dados. 15 Figura 10 - Diagrama em blocos do Contador de Programa e Apontador de Pilha Baseado no resultado acima obtido, realizou-se um estudo de quais tipos e especificações de componentes poderiam ser utilizados na elaboração da Unidade Processadora Discreta Microprogramável. Tendo todos os dados necessários para o detalhamento do diagrama dos circuitos eletrônicos e utilizando-se a ferramenta TANGO, esquematizou-se todos os circuitos necessários para o funcionamento da Unidade Processadora Discreta Microprogramável. Os esquemas dos circuitos eletrônicos encontram-se no ANEXO A. Na fase de simulação, utilizou-se a ferramenta MAXPLUS II. Simulou-se cada circuito separadamente, controlando as linhas de controle manualmente. Muitos problemas encontrados na simulação, foram corrigidos aperfeiçoando-se os circuitos. Devido a correção de muitos erros na simulação, obteve-se uma maior facilidade na montagem dos circuitos. Encontrou-se problemas de atrasos provocados pelos componentes reais, que não foram detectados durante a simulação, e que foram sanados com o estudo de outros componentes que foram inseridos para correção dos erros reais. Atualmente o protótipo encontra-se montado e em funcionamento, conforme previsto. Foram realizados testes com a implementação das instruções a nível de microprogramação. 6.7 Descrição simplificada dos integrados utilizados no projeto 6.7.1 Descrição do CI 74161 – Contador binário de 4 bits crescente préestabelecível Figura 11 – Principais pinos do CI 74161 16 A, B, C, D QA, QB, QC, QD CLK CLR LOAD ENP, ENT Entrada da contagem inicial Saída da contagem Entrada de clock ; sensível a transição positiva Entrada de controle; ativa em nível lógico zero; quando ativado leva as saídas a nível lógico zero; não depende do clock Entra de controle; ativo em nível lógico zero; quando ativado desabilita a contagem e carrega as saídas com o valor das entradas na transição positiva do clock Entradas de controle; ativo em nível alto; ambas devem estar ativadas para habilitar a contagem; ENT desativado força a saída RCO para nível lógico zero Tabela 1 – Descrição dos principais pinos do CI 74161 17 6.7.2 Descrição do CI 74191 – Contador de 4 bits crescente/decrescente préestabelecível sensível à transição positiva do clock Figura 12 - Principais pinos do CI 74191 /CTEN D/U LOAD MAX/MIN /RCO QA, QB, QC, QD A, B, C, D entrada de controle; nível lógico zero habilita contagem; nível lógico um desabilita a contagem; trocas de nível devem ser feitas apenas quando a entrada de clock está em nível um entrada de controle; nível lógico zero a contagem é crescente; nível lógico um a contagem é decrescente; deve-se evitar troca de nível enquanto o clock está em nível lógico zero entrada de controle; nível lógico zero faz com que o dado de entrada seja carregado na saída independente do clock saída; produz nível lógico um com um período ciclo de clock quando a contagem é 0000 ou 1111; é utilizado para permitir “look - ahead”para operação alta velocidade saída; produz um nível lógico zero com uma largura igual a porção nível zero do clock quando a saída é 0000 ou 1111; é utilizado para ligar dois mais contadores em cascata através de CTEN ou CLK; poderá ocorrer um falso RCO se o clock e CTEN são zero e D/U é um durante um pulso de LOAD saída de contagem, 4 bits, flips-flops mestre escravo; muda de estado na transição positiva do clock entrada de dados; é carregado para a saída quando a entrada LOAD vai para nível lógico zero Tabela 2 – Descrição dos principais pinos do CI 74161 18 6.7.3 Descrição do CI 74173 – Registrador de 4 bits Figura 13 - Principais pinos do CI 74173 D Q CLK CLEAR G1, G2 M, N Entrada de dados saída e dados Entrada de clock; sensível a transição positiva Entrada de controle; ativo em nível alto; limpa as saídas de daos; não depende do clock Entradas de seleção; o dado só será registrado ne transição positiva do clock se estas duas entradas estiverem em nível lógico zero Entradas de controle; ativas em nível lógico um; se uma destas entradas for para um, então as saídas Q irão para tree-state. Tabela 3 – Descrição dos principais pinos do CI 74173 6.7.4 Descrição do CI 74157 – Multiplexador 2x1 Figura 14 - Principais pinos do CI 74157 19 Y A B G A/B Saída de dados (4 bits) Entrada de dados (4 bits) Entrada de dados (4 bits) Entrada de controle; ativo em nível baixo; responsável pela seleção do chip; em nível alto força as saídas Y para nível zero Entrada de controle; seleciona qual entrada de dados será aplicada na saída Tabela 4 – Descrição dos principais pinos do CI 74157 6.7.5 Descrição do CI 74LS181 – Unidade Lógica Aritmética Figura 15 - Principais pinos do CI 74181 A0 – A3 B0 – B3 S0 – S3 F0 – F3 Cn Cn+4 A=B M Entrada de dados Entrada de dados a partir destas entradas seleciona-se as operações Saídas de dados Carry de entrada Carry de saída Indica o estado do carry de igualdade Um nível lógico alto desabilita o carry interno Tabela 5 – Descrição dos principais pinos do CI 74181 Os componentes utilizados têm seus dados descritos com mais detalhes nas folhas de dados dos componentes no Anexo C. 6.8 Tabela de Instruções Na Tabela 6 temos descritas as instruções desenvolvidas para o protótipo, bem como seu código e sua descrição. No Anexo B apresenta-se com todas as palavras de controle geradas pela Unidade de Controle por cada uma das instruções desenvolvidas. 20 Instrução ADI, <valor> SUBI, <valor> INC A DCR A LDI <valor> LDA <endereço> STA <endereço> ANI <dados> ORI <dados> XRI <dados> XRA CMA JMP <endereço> JZ <endereço> JC <endereço> JS <endereço> JEQ <endereço> JNZ <endereço> JNC <endereço> JNS <endereço> JNEQ <endereço> CALL endereço RET CMP <dado> ADD <endereço> SUBD <endereço> INA IND OUTA OUTD HALT Código 05 06 07 08 04 09 10 11 12 13 14 15 16 82 91 A7 E5 B3 C1 D6 F4 17 18 19 20 21 22 23 24 25 26 Descrição A <- A + <valor> A <- A - <valor> A <- A + 1 A <- A - 1 A <- <valor> A <- conteúdo do endereço <endereço> <- conteúdo do acumulador A <- A AND <dados> A <- A OR <dados> A <- A XOR <dados> A <- A XOR A (zera o acumulador) A <- complemento de A PC <- endereço se /ZERO = 0 PC <- endereço se /VAI-UM = 0 PC <- endereço se SINAL = 1 PC <- endereço se IGUAL =1 PC <- endereço se /ZERO =1 PC <- endereço se /VAI-UM = 1 PC <- endereço se SINAL = 0 PC <- endereço se IGUAL = 0 PC <- endereço PC <- endereço / AP <- PC CP <- AP compara A com <dado> e seta flag de igual se A = dado A <- A + conteúdo do endereço A <- A - conteúdo do endereço A <- entrada analógica A <- entrada digital saída analógica <- A saída digital <- A Parada Tabela 6 – Tabela de Instruções 21 6.9 Descrição dos sinais ativos durante o ciclo de busca No ciclo de busca o código da instrução é carregado no Registrador de instruções para que as microinstruções sejam executadas. A seguir descreve-se as fases do ciclo de busca. Primeira fase do ciclo busca, sinais ativos: - /CPLER – o conteúdo do contador de programa é transferido para o barramento de dados - /RECARGA – o dado disponível no barramento de dados é carregado no registrador de endereços Segunda fase do ciclo busca, sinais ativos: - CPHAB – o contador de programa é incrementado Terceira fase do ciclo busca, sinais ativos: - /RELER – o conteúdo armazenado no registrador de endereços é transferido para o barramento de endereços - MEMHAB – habilita a memória RAM para leitura, transferindo o conteúdo do endereço disponibilizado para o barramento de dados (o conteúdo corresponde ao código de uma instrução) - /RICARGA – o dado é carregado no registrador de instruções Após a execução do ciclo de busca executa-se as microinstruções da instrução carregada no registrador de instruções. Na Figura 16a, 16b, 16c é possível visualizar os sinais ativos do ciclo de busca a cada ciclo de clock. 22 16a – Primeira fase do ciclo de busca 16b – Segunda fase do ciclo de busca 16c- Terceira fase do ciclo de busca 6.10 Descrição dos sinais ativos durante a instrução ADI <valor> Na instrução ADI <valor> o valor indicado é imediatamente somado ao conteúdo do acumulador. A seguir descreve-se as microinstruções executadas a cada ciclo de clock da instrução ADI <valor>. Primeira microinstrução da instrução ADI <valor>, sinais ativos: - /CPLER – o conteúdo do contador de programa é transferido para o barramento de dados - /RECARGA – o dado disponível no barramento de dados é carregado no registrador de endereços 23 Segunda microinstrução da instrução ADI <valor>, sinais ativos: - /RELER – o conteúdo armazenado no registrador de endereços é transferido para o barramento de endereços - MEMHAB - habilita a memória RAM para leitura, transferindo o conteúdo do endereço disponibilizado para o barramento de dados - /RBCARGA – o dado disponível no barramento de dados é transferido para o registrador B Terceira microinstrução da instrução ADI <valor>, sinais ativos: - S0, S1, S2, S3 – são setados para realizar a operação de soma, que corresponde ao código 9 em binário, ou seja 1001 - /MODOULA – modo de operação da ULA (1 – Lógico e 0 – Aritmético) - /FLAG – armazena-se no registrador de flags o estados destes ao realizar a operação Quarta microinstrução da instrução ADI <valor>, sinais ativos: - S0, S1, S2, S3 – são setados para realizar a operação de soma, que corresponde ao código 9 em binário, ou seja 1001 - /MODOULA – modo de operação da ULA (1 – Lógico e 0 – Aritmético) - /ULALER – o resultado da operação é transferido para o barramento de dados - /RACARGA – armazena-se no acumulador o resultado da operação Quinta microinstrução da instrução ADI <valor>, sinais ativos: - CPHAB – o contador de programa é incrementado Sexta microinstrução da instrução ADI <valor>, sinais ativos: - FIM – finalização da instrução, início de um novo ciclo de busca Na Figura 17a, 17b, 17c, 17d, 17e é possível visualizar os sinais ativos da instrução ADI <valor>. 24 17a – Primeira microinstrução da instrução ADI <valor> 17b – Primeira microinstrução da instrução ADI <valor> 17c – Segunda microinstrução da instrução ADI <valor> 17d – Terceira microinstrução da instrução ADI <valor> 17e – Quarta microinstrução da instrução ADI <valor> 25 6.11 Descrição dos sinais ativos durante a instrução LDA <endereço> Na instrução LDA <endereço>, o conteúdo pertencente ao endereço especificado é transferido para o acumulador. A seguir descrevemos as microinstruções executadas a cada ciclo de clock da instrução LDA <endereço>. Primeira microinstrução da instrução LDA <endereço>, sinais ativos: - /CPLER – o conteúdo do contador de programa é transferido para o barramento de dados - /RECARGA – o dado disponível no barramento de dados é carregado no registrador de endereços Segunda microinstrução da instrução LDA <endereço>, sinais ativos: - /RELER – o conteúdo armazenado no registrador de endereços é transferido para o barramento de endereços - MEMHAB - habilita a memória RAM para leitura, transferindo o conteúdo do endereço disponibilizado para o barramento de dados - /RECARGA – o dado disponível no barramento de dados é carregado no registrador de endereços Terceira microinstrução da instrução LDA <endereço>, sinais ativos: - /RELER – o conteúdo armazenado no registrador de endereços é transferido para o barramento de endereços - MEMHAB - habilita a memória RAM para leitura, transferindo o conteúdo do endereço disponibilizado para o barramento de dados - /RACARGA – o dado disponível no barramento de dados é carregado no acumulador Quarta microinstrução da instrução LDA <endereço>, sinais ativos: - CPHAB – o contador de programa é incrementado Quinta microinstrução da instrução LDA <endereço>, sinais ativos: - FIM – finalização da instrução, início de um novo ciclo de busca Na Figura 18a, 18b, 18c, 18d é possível visualizar os sinais ativos da instrução LDA <endereço>. 26 18a – Primeira microinstrução da instrução LDA <endereço> 18b – Segunda microinstrução da instrução LDA <endereço> 18c – Terceira microinstrução da instrução LDA <endereço> 18d – Quarta microinstrução da instrução LDA <endereço> 6.12 Descrição dos sinais ativos durante a instrução STA <endereço> Na instrução STA <endereço>, o conteúdo do acumulador é transferido para o endereço especificado. A seguir descrevemos as microinstruções executadas a cada ciclo de clock da instrução STA <endereço>. Primeira microinstrução da instrução STA <endereço>, sinais ativos: - /CPLER – o conteúdo do contador de programa é transferido para o barramento de dados - /RECARGA – o dado disponível no barramento de dados é carregado no registrador de endereços 27 Segunda microinstrução da instrução STA <endereço>, sinais ativos: - /RELER – o conteúdo armazenado no registrador de endereços é transferido para o barramento de endereços - MEMHAB - habilita a memória RAM para leitura, transferindo o conteúdo do endereço disponibilizado para o barramento de dados - /RECARGA – o dado disponível no barramento de dados é carregado no registrador de endereços Terceira microinstrução da instrução STA <endereço>, sinais ativos: - /RELER – o conteúdo armazenado no registrador de endereços é transferido para o barramento de endereços - /RALER – disponibiliza o conteúdo do acumulador para o barramento de dados - MEMHAB - habilita a memória RAM - MEML/E – habilita a memória TAM para escrita Quarta microinstrução da instrução STA <endereço>, sinais ativos: - CPHAB – o contador de programa é incrementado Quinta microinstrução da instrução STA <endereço>, sinais ativos: - FIM – finalização da instrução, início de um novo ciclo de busca Na Figura 19a, 19b, 19c, 19d é possível visualizar os sinais ativos da instrução STA <endereço>. 28 19a – Primeira microinstrução da instrução STA <endereço> 19b – Segunda microinstrução da instrução STA <endereço> 19c – Terceira microinstrução da instrução STA <endereço> 19d – Quarta microinstrução da instrução STA <endereço> 6.13 Descrição dos sinais ativos durante a instrução SUBI <valor> Na instrução SUBI <valor>, temos o conteúdo pertencente ao acumulador subtraído ao valor especificado. Na Tabela 7 temos os sinais ativos em cada microinstrução da instrução SUBI <valor>. 1a 2a 3a /CPLER /RELER S0...S3 = 6 /RECARGA MEMHAB MODOULA = 0 /RBCARGA /FLAG /UM 4a 5a 6a S0...S3 =6 CPHAB FIM MODOULA = 0 /ULALER /RACARGA /UM Tabela 7 – Sinais ativos das microinstruções da instrução SUBI <valor> 29 6.14 Descrição dos sinais ativos durante a instrução INC A Na instrução INC A temos o conteúdo pertencente ao acumulador incrementado de 1. Na Tabela 8 temos os sinais ativos em cada microinstrução da instrução INC A. 1a 2a 3a S0...S3 = 0 S0...S3 = 0 FIM /UM /UM /FLAG /ULALER /RACARGA Tabela 8 – Sinais ativos das microinstruções da instrução INC A 6.15 Descrição dos sinais ativos durante a instrução DCR A Na instrução DCR A temos o conteúdo pertencente ao acumulador decrementado de 1. Na Tabela 9 temos os sinais ativos em cada microinstrução da instrução INC A. 2a 3a 1a S0...S3 = 15 S0...S3 = 15 FIM /FLAG /ULALER /RACARGA Tabela 9 – Sinais ativos das microinstruções da instrução DCR A 6.16 Descrição dos sinais ativos durante a instrução LDI <valor> Na instrução LDI <valor> o valor especificado transferido para o acumulador. Na Tabela 10 temos os sinais ativos em cada microinstrução da instrução LDI <valor>. 1a 2a 3a 4a /CPLER /RELER CPHAB FIM /RECARGA MEMHAB /RACARGA Tabela 10 – Sinais ativos das microinstruções da instrução LDI <valor> 6.17 Descrição dos sinais ativos durante a instrução ANI <dado> Na instrução ANI <dado> realiza-se a operação lógica E com o conteúdo do acumulador e o dado especificado. Na Tabela 11 temos os sinais ativos em cada microinstrução da instrução ANI <dado>. 1a 2a 3a 4a 5a 6a /CPLER /RELER S0...S3 = 11 S0...S3 = 11 CPHAB FIM /RECARGA MEMHAB MODOULA = 1 MODOULA = 1 /RBCARGA /FLAG /ULALER /RACARGA Tabela 11 - Sinais ativos das microinstruções da instrução ANI <dado> 30 6.18 Descrição dos sinais ativos durante a instrução ORI <dado> Na instrução ORI <dado> realiza-se a operação lógica OU com o conteúdo do acumulador e o dado especificado. Na Tabela 12 temos os sinais ativos em cada microinstrução da instrução ORI <dado>. 1a 2a 3a 4a 5a 6a /CPLER /RELER S0...S3 = 14 S0...S3 = 14 CPHAB FIM /RECARGA MEMHAB MODOULA = 1 MODOULA = 1 /RBCARGA /FLAG /ULALER /RACARGA Tabela 12 – Sinais ativos das microinstruções da instrução ORI <dado> 6.19 Descrição dos sinais ativos durante a instrução XRI <dado> Na instrução XRI <dado> realiza-se a operação lógica XOR com o conteúdo do acumulador e o dado especificado. Na Tabela 13 temos os sinais ativos em cada microinstrução da instrução XRI <dado>. 1a 2a 3a 4a 5a 6a /CPLER /RELER S0...S3 = 6 S0...S3 = 6 CPHAB FIM /RECARGA MEMHAB MODOULA = 1 MODOULA = 1 /RBCARGA /FLAG /ULALER /RACARGA Tabela 13 – Sinais ativos das microinstruções da instrução XRI <dado> 6.20 Descrição dos sinais ativos durante a instrução XRA Na instrução XRA realiza-se a operação lógica XOR com o conteúdo do acumulador e seu próprio conteúdo, ou seja o conteúdo do acumulador é zerado. Na Tabela 14 temos os sinais ativos em cada microinstrução da instrução XRI <dado>. 1a 2a 3a 4a /RALER S0...S3 = 6 S0...S3 = 6 FIM /RBCARGA MODOULA = 1 MODOULA = 1 /FLAG /ULALER /RACARGA Tabela 14 – Sinais ativos das microinstruções da instrução XRA 6.21 Descrição dos sinais ativos durante a instrução CMA Na instrução CMA, o conteúdo do acumulador é complementado. Na Tabela 15 temos os sinais ativos em cada microinstrução da instrução CMA. 31 1a 3a 4a S0...S3 = 0 S0...S3 = 0 FIM MODOULA = 1 MODOULA = 1 /FLAG /ULALER /RACARGA Tabela 15 – Sinais ativos das microinstruções da instrução CMA 6.22 Descrição dos sinais ativos durante a instrução JMP <endereço> Na instrução JMP <endereço> temos um salto incondicional. Na Tabela 16 temos os sinais ativos em cada microinstrução da instrução JMP <endereço>. 1a 2a 3a /CPLER /RELER FIM /RECARGA MEMHAB /CPCARGA Tabela 16 – Sinais ativos das microinstruções da instrução JMP <endereço> 6.23 Descrição dos sinais ativos durante a instrução JZ, JC, JS, JEQ <endereço> Na instrução JZ <endereço> temos um salto condicional. Se o flag /ZERO = 0 teremos o salto para o endereço especificado, ou seja, o contador de programa passa a executar a instrução que estará no endereço especificado, caso contrário, se /ZERO = 1 o contador de programa será incrementado executando a próxima instrução. Na Tabela 17 e 18 temos os sinais ativos em cada microinstrução da instrução JZ <endereço>. 1a 2a 3a /CPLER /RELER FIM /RECARGA MEMHAB /CPCARGA Tabela 17 – Sinais ativos das microinstruções da instrução JZ <endereço>, se o flag /ZERO = 0 1a 2a CPHAB FIM Tabela 18 – Sinais ativos das microinstruções da instrução JZ <endereço>, se o flag /ZERO = 1 Na instrução JC <endereço> (flag /VAI-UM) teremos as mesmos sinais ativos da Tabela 17 se o flag /VAI-UM = 0 e a próxima instrução a ser executada estará no endereço especificado. Teremos os sinais ativos da Tabela 18 se o flag /VAI-UM = 1, onde a próxima instrução a ser executada será o próximo endereço do contador de programa. Na instrução JS <endereço> (flag de SINAL) teremos os sinais ativos da Tabela 17 se o flag SINAL = 1, e o salto para o endereço especificado ocorrerá, caso contrário, se SINAL = 0 teremos os sinais ativos descrita na Tabela 18, observando que o salto não ocorrerá. Na instrução JEQ <endereço> (flag IGUAL) teremos os sinais ativos da Tabela 17 se o flag IGUAL =1, ocorrendo o salto para o endereço especificado, caso contrário, se o 32 flag IGUAL = 0 teremos os sinais ativos descrita na Tabela 18, observando que o salto não ocorrerá. Para a instrução JEQ <endereço> deve-se primeiro realizar a instrução CMP <dado>, ou seja deve haver uma comparação entre dois dados para que o flag IGUAL seja ativado. 6.24 Descrição dos sinais ativos durante a instrução CALL <endereço> Na instrução CALL <endereço> teremos uma chamada a uma subrotina. O endereço apontado pelo contador de programa é armazenado na pilha e a próxima instrução a ser executada estará no endereço especificado. Na Tabela 19 temos os sinais ativos em cada microinstrução da instrução CALL <endereço>. 1a 2a 3a 4a 5a 6a 7a /APHAB /APLER /RELER /CPLER /RELER /APHAB FIM /RECARGA /CPLER /RECARGA MEMHAB MEMHAB /CPCARGA MEML/E Tabela 19 – Sinais ativos das microinstruções da instrução CALL <endereço> 6.25 Descrição dos sinais ativos durante a instrução RET Na instrução RET teremos o retorno ao programa principal. O endereço armazenado na pilha quando executa-se a instrução CALL <endereço> retorna ao contador de programa, assim teremos o retorno ao programa principal. Na Tabela 20 temos os sinais ativos em cada microinstrução da instrução RET. 1a 2a 3a 4a 5a /APHAB /APLER /RELER /CPHAB FIM APD/I = 0 /RECARGA MEMHAB /CPCARGA Tabela 20 – Sinais ativos das microinstruções da instrução RET 6.26 Descrição dos sinais ativos durante a instrução CMP <dado> Na instrução CMP <dado> teremos o conteúdo do acumulador sendo comparado com o dado especificado. Na realidade teremos uma subtração sendo executada. O objetivo desta instrução é setar o flag IGUAL se o resultado da operação é igual a zero. Na Tabela 21 temos os sinais ativos em cada microinstrução da instrução CMP <dados>. 1a 2a 3a 4a 5a /CPLER /RELER S0...S3 = 6 /CPHAB FIM /RECARGA MEMHAB /FLAG /RBCARGA Tabela 21 – Sinais ativos das microinstruções da instrução CMP <dados> 33 6.27 Descrição dos sinais ativos durante a instrução ADD <endereço> Na instrução ADD <endereço> teremos o conteúdo do acumulador somada com o conteúdo do endereço especificado, colocando-se o resultado no acumulador. Na Tabela 22 temos os sinais ativos em cada microinstrução da instrução ADD <endereço>. 1a 2a 3a 4a 5a 6a 7a /CPLER /RELER /RELER S0...S3 = 9 S0...S3 = 9 CPHAB FIM /RECARGA MEMHAB MEMHAB MODOULA=0 MODOULA=0 /RECARGA /RBCARGA /FLAG /ULALER /RACARGA Tabela 22 – Sinais ativos das microinstruções da instrução ADD <endereço> 6.28 Descrição dos sinais ativos durante a instrução SUB <endereço> Na instrução SUB <endereço> teremos o conteúdo do acumulador subtraída do conteúdo do endereço especificado, colocando-se o resultado no acumulador. Na Tabela 23 temos os sinais ativos em cada microinstrução da instrução SUB <endereço> 1a 2a 3a 4a 5a 6a 7a /CPLER /RELER /RELER S0...S3 = 6 S0...S3 = 6 CPHAB FIM /RECARGA MEMHAB MEMHAB MODOULA=0 MODOULA=0 /RECARGA /RBCARGA /FLAG /ULALER /RACARGA Tabela 23 – Sinais ativos das microinstruções da instrução ADD <endereço> 6.29 Descrição dos sinais ativos durante a instrução INA Na instrução INA teremos a leitura do dado da entrada analógica e armazenado no acumulador. Na Tabela 24 temos os sinais ativos em cada microinstrução da instrução INA. 1a 2a /BEALER FIM /RACARGA Tabela 24 – Sinais ativos das microinstruções da instrução INA 6.30 Descrição dos sinais ativos durante a instrução IND Na instrução IND teremos a leitura do dado da entrada digital e armazenado no acumulador. Na Tabela 25 temos os sinais ativos em cada microinstrução da instrução IND. 1a 2a /BEDLER FIM /RACARGA Tabela 25 – Sinais ativos das microinstruções da instrução IND 34 6.31 Descrição dos sinais ativos durante a instrução OUTA Na instrução OUTA teremos o conteúdo do acumulador transferido para a saída analógica. Na Tabela 26 temos os sinais ativos em cada microinstrução da instrução OUTA. 1a 2a /RALER FIM /RSACARGA Tabela 26 – Sinais ativos das microinstruções da instrução OUTA 6.32 Descrição dos sinais ativos durante a instrução OUTD Na instrução OUTD teremos o conteúdo do acumulador transferido para a saída digital. Na Tabela 27 temos os sinais ativos em cada microinstrução da instrução OUTD. 1a 2a /RALER FIM /RSDCARGA Tabela 27 – Sinais ativos das microinstruções da instrução OUTD 6.33 Descrição dos sinais ativos durante a instrução HALT Na instrução HALT teremos o clock interrompido. Na Tabela 28 temos os sinais ativos em cada microinstrução da instrução halt. 1a /PARAR Tabela 28 – Sinais ativos das microinstruções da instrução HALT 6.34 Descrição dos sinais ativos durante a instrução PUSH Na instrução PUSH teremos o conteúdo do acumulador transferido para o endereço indicado pelo Apontador de Pilha. Na Tabela 29 temos os sinais ativos em cada microinstrução da instrução push. 1a /APHAB 2a /APLER /RECARGA 3a /RELER MEMHAB MEML/E = 0 /RALER 4a FIM Tabela 29 – Sinais ativos das microinstruções da instrução PUSH 6.35 Descrição dos sinais ativos durante a instrução POP Na instrução POP teremos o conteúdo do endereço apontado pelo Apontador de Pilha transferido para o acumulador. Na Tabela 30 temos os sinais ativos em cada microinstrução da instrução pop. 35 1a /APLER /RECARGA 2a /RELER MEMHAB MEML/E = 1 /RACARGA 3a /APHAB APD/I = 1 4a FIM Tabela 30 – Sinais ativos das microinstruções da instrução POP 36 7 Referências Bibliográficas STALLINGS, WILLIAM. Computer Organization and Architecture – Designing for Performance. Fourth Edition. Prentice Hall, 1996. HENNESSY, J. L. & PATTERSON, D. A. Computer Organization and Design – The Hardware/Software Interface. Second Edition. Morgan Kaufmann Publishers, Inc, 1998. PATTERSON, D. A. & HENNESSY, J. L. Computer Architecture a Quantitative Approach. Second Edition. Morgan Kaufmann Publishers, Inc, 1990,1996. TOKHEIM, L. R. Introdução aos Microprocessadores. MacGraw-Hill do Brasil, São Paulo, 1985. ZUFFO, João Antônio. Fundamentos da Arquitetura e Organização Microprocessadores. Editora Edgard Blucher Ltda, São Paulo, 1978. dos ZUFFO, João Antônio. Microprocessadores: Dutos de Sistema, Técnicas de Interface e Sistemas de Comunicação de Dados. Editora Edgard Blucher Ltda, São Paulo, 1981. TAUB, Herbert. Circuitos Digitais e Microprocessadores. Editora McGraw-Hill, São Paulo, 1984. LANGDON Jr, G. G. e FREGNI, E. Projeto de Computadores Digitais. Edgard Blucher Ltda, 1990. MALVINO, A. Microcomputadores e Microprocessadores. McGraw-Hill, São Paulo, 1986. TANEMBAUM, A. S. Organização Estruturada de Computadores. Prentice Hall do Brasil, São Paulo, 1984. HAYES, John P. Computer Architecture and Organization. McGraw-Hill, São Paulo, 1988. 37