UNIVERSIDADE FEDERAL DE LAVRAS DEPARTAMENTO DE CIÊNCIA DA COMPUTAÇÃO RELATÓRIO FINAL DE PROJETO DE PESQUISA FAPEMIG PROJETO CEX 2832/97 DESENVOLVIMENTO DE UMA UNIDADE PROCESSADORA DISCRETA MICROPROGRAMÁVEL Coordenador: Prof. Wilian Soares Lacerda Lavras, outubro de 2001 RESUMO Este é o relatório final do projeto de pesquisa intitulado "Desenvolvimento de uma Unidade Processadora Discreta Microprogramável", financiado pela FAPEMIG (processo CEX2832/97), iniciado em 05/10/2000 e encerrado em 04/10/2001. Neste documento é apresentado os resultados do projeto, bem como as etapas para o seu desenvolvimento. Inicialmente, é apresentado o processador desenvolvido detalhadamente, tendo como base o estudo bibliográfico do assunto. Em seguida, é mostrado a metodologia e materiais utilizados para a implementação do processador. Finalmente é apresentado exemplos de utilização do processador, provando a eficiência do protótipo desenvolvido. 2 ÍNDICE 1 - Introdução....................................................................................................................4 2 - Objetivo........................................................................................................................7 3 - Proposição....................................................................................................................8 3.1 - Componentes da CPU..........................................................................................13 3.2 - Unidade de dados.................................................................................................14 3.3 - Unidade de controle.............................................................................................18 3.4 - Funcionamento da CPU ......................................................................................21 4 - Metodologia e materiais ............................................................................................23 4.1 - O Hardware .........................................................................................................24 4.2 - Os Softwares ........................................................................................................25 4.2.1 - O Software de Comunicação .........................................................................26 5 - Resultados ..................................................................................................................33 6 - Conclusão...................................................................................................................34 Agradecimentos ..............................................................................................................34 Referências Bibliográficas ..............................................................................................35 Propostas de continuidade..............................................................................................36 ANEXOS: ANEXO A - Esquemas de projeto da CPU ANEXO B - Resultados da simulação da CPU ANEXO C - Esquema da placa ISA ANEXO D - Arquivos de configuração das PAL's ANEXO E - Layout da placa ISA ANEXO F - Datasheet da CPLD ANEXO G - Listagem do software 3 1 - INTRODUÇÃO Atualmente, os computadores digitais fazem parte do nosso cotidiano. Nós os utilizamos desde para extrair um saldo bancário, até mesmo para aquecer alimentos em um forno microondas. A cada dia que passa, o computador se torna mais importante para nós, na medida em que a sua tecnologia avança, tornando-o mais acessível para todos. O "cérebro" do computador é o processador digital (CPU). Este elemento é responsável pela execução das tarefas pré-programadas no computador. Todos os outros componentes do computador (memória, periféricos de entrada, periféricos de saída) dependem do processador para funcionar. O processador coordena e gerencia todos os componentes do computador. Observe a Figura 1.1. CPU Portas de I/O MEMÓRIA Controlador de DMA Figura 1.1: Componentes de um computador Segundo Tokheim [12], “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 tomado 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. 4 Segundo Stalling [9], 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 1.2. Figura 1.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; • 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 [13][4] 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. Hennessy e Patterson [7] descrevem em suas obras detalhes para projeto de processadores mais rápidos, utilizando técnicas de pipeling. O projeto do processador se torna 5 bem mais complexo, para se conseguir este objetivo. No protótipo desenvolvido, esta técnica não foi utilizada por dificuldades de implementaçã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. 6 2 - OBJETIVO 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 outras 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. 7 3 - PROPOSIÇÃ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 [10]. 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 3.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). Figura 3.1: 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 8 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. 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: • Instruções aritméticas • Instruções lógicas • Instruções de transferência de dados • Instruções de desvio • Instruções de chamada de sub-rotina • Instruções de retorno • Instruções de pilha Nas instruções aritméticas temos: • Somar, Somar com vai -um, • Subtrair, Subtrair com vai-um , Empréstimo 9 • Incrementar • Decrementar • Comparar • Negar Nas instruções lógicas temos: • AND • OR • XOR • NOT Nas instruções de transferência e dados temos: • Carregar • Armazenar • Mover • Zerar 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 • Desvio se negativo Nas instruções de pilha temos: • Empilhar • Desempilhar 10 Uma unidade central de processamento, ou CPU, é o principal componente dos computadores digitais. É a parte do computador responsável pela manipulação e transformação dos dados ou informações [4][5]. Desde o primeiro computador digital, até hoje, é utilizado no projeto do processador a topologia denominada arquitetura de von Newmann. O que diferencia a arquitetura dos atuais processadores são a tecnologia de fabricação, velocidade de processamento, complexidade do projeto, dentre outras [6]. Este projeto propõe o projeto de uma CPU simples, que contém as características básicas de um processador digital. D7..D0 A7..A0 CLOCK /MEM /IO /RESET /WR /RD Figura 3.2: A unidade central de processamento proposta A CPU proposta neste projeto possui a seguinte estrutura externa básica, mostrada na Figura 3.2. Os sinais de entrada e saída da CPU proposta possuem as seguintes funções e características: • D7..D0 – Barramento de dados externo (8 bits) • A7..A0 – Barramento de endereço (8 bits) • /MEM – sinal de habilitação da memória, ativa em nível zero • /IO – sinal de habilitação da porta de entrada/saída, ativa em nível zero • /WR – indica ciclo de escrita em porta ou memória, ativa em nível zero • /RD – indica ciclo de leitura em porta ou memória, ativa em nível zero • CLOCK – sinal de sincronismo • /RESET – sinal de inicialização, ativo em nível zero 11 A CPU não é o único componente de um computador. Existem circuitos auxiliares que em conjunto com a CPU formam um sistema de computador. Dentre estes circuitos, existe a memória e as portas de entrada/saída que são conectadas à CPU como é mostrado na Figura 3.3. D7..D0 MEMÓRIA A7..A0 /CS /WR /RD D7..D0 PORTA E/S S7..S0 /CS /WR /RD E7..E0 CPU D7..D0 CLOCK A7..A0 /MEM /RESET /IO /WR /RD Figura 3.3: Um sistema de computador com memória e porta entrada/saída A memória é responsável pelo armazenamento das instruções (ou comandos do processador) e dos dados. Uma memória, em geral, tem uma grande capacidade de armazenamento. Cada informação é armazenada em uma posição da memória que é identificada por um endereço (conjunto de bits). Através deste endereço, é possível recuperar a informação armazenada na memória. As portas de entra/saída são circuitos que permitem a troca de informações entre o computador e o ambiente externo. As portas de entrada enviam dados gerados por circuitos externos para a CPU, que por sua vez pode armazená-los na memória. As portas de saída permitem que a CPU transmita dados para circuitos externos. Para permitir a comunicação da CPU com os circuitos auxiliares, a própria CPU gera os sinais responsáveis pelo controle da memória e das portas de E/S. Os sinais de controle da memória são: • /MEM – habilita a memória para leitura ou escrita, ativo em zero. • /RD – habilita leitura, ativo em zero. • /WR – habilita escrita, ativo em zero. 12 Os sinais de controle da porta de entrada/saída são: • /IO – habilita leitura ou escrita da porta, ativo em zero. • /RD – habilita leitura, ativo em zero. • /WR – habilita escrita, ativo em zero. 3.1 - COMPONENTES DA CPU Para facilitar o projeto e estudo da CPU, ela é dividida internamente em duas unidades fundamentais: • Unidade de dados • Unidade de controle Estas unidades componentes funcionam em conjunto e conectadas entre si. Elas podem ser visualizadas na Figura 3.4, onde se observa a ligação entre elas. A unidade de dados possui as seguintes funções: • Cálculos aritméticos • Funções lógicas • Manipulação de dados • Armazenamento temporário de dados • Recebimento de dados • Envio de dados A unidade de controle possui as seguintes funções: • Geração dos sinais de controle da unidade de dados • Geração dos sinais de controle externos • Sincronização dos sinais de controle • Inicialização do sistema • Geração do endereço de memória 13 • Busca e armazenamento das instruções e dados CPU Barramento de dados interno CLK Sinais de controle internos Unidade de dados Unidade de Controle Status da ULA (flags) /RESET Sinais de controle externos Barramento de dados externo Barramento de endereço Figura 3.4: Unidades da CPU 3.2 - UNIDADE DE DADOS A ULA (Unidade Lógica Aritmética) é a responsável pelas operações lógicas e aritméticas da CPU. A ULA proposta é mostrada na Figura 3.5 com os sinais de entrada e saída. Ela é capaz de realizar as operações descritas na Tabela 3.1, conforme o código da operação gerado pela unidade de controle. FLAGS 1o operando 4 8 Resultado 8 2o operando 8 4 /ULA operação Figura 3.5: ULA 14 Tabela 3.1: Código de operação da ULA Código Op. (binário) Resultado Símbolo 0000 Não faz nada NOP 0001 Soma (1o op. + 2o op.) ADD 0010 Subtrai (1o op. – 2o op.) SUB 0011 1o op. AND 2o op. AND 0100 1o op. OR 2o op. 0101 1o op. XOR 2o op. XOR 0110 Complementa 1o op. NOT 0111 1o op. + 1 INC 1000 1o op. - 1 OR DEC o 1001 Deslocamento 1 op. para direita de 1 bit SHR 1010 Deslocamento 1o op. para esquerda de 1 bit SHL 1011 Nega o 1o op. NEG A ULA é composta internamente por circuitos lógicos somadores, subtratores, deslocadores, e inversores para a realização da operação selecionada. Ela possui os seguintes sinais de entrada e saída: a) Entradas: • 8 bits do 1o operando • 8 bits do 2o operando • 4 bits do código de operação (vide tabela) • 1 bit de habilitação da ULA (ativa em zero) b) Saídas: • 4 bits de “flags”: carry-out, sinal (positivo, negativo), zero, overflow • 8 bits do resultado Se a ULA estiver habilitada, então nos 8 bits do resultado estará o resultado da operação, entre o 1o e 2o operandos, selecionada pelos 4 bits do código de operação. Os quatro sinais de flags identificam o status da ULA de acordo com o resultado obtido pela realização de uma operação. O flag de zero é ativado (colocado em nível lógico 1) 15 se o resultado possue todos os bits em zero. O flag de sinal é ativado se o resultado da ULA é um número negativo em complemento de dois (bit mais significativo do resultado em 1). O flag de carry-out é ativado se ocorre um vai-um no último bit do resultado. E finalmente o flag de overflow é ativado se o resultado da operação realizada pela ULA não é válido. A unidade de dados é composta de ULA, registradores, multiplexadores, buffers tristate e barramentos, conforme é mostrado na Figura 3.6. 8 CLK Registrador de Flags /RF 4 FLAGS 4 CLK ULA A C U M U L A D O R A 8 MUX B 4 /ULA operação 8 /LAC MAC 8 /CLR 8 BUFFER TRI-STATE 8 8 Barramento de dados interno 8 8 CLK A 8 /BAC BUFFER TRI-STATE DR 8 8 MUX /BDI BUFFER TRI-STATE Barramento de dados externo B /BDE MDR /LDR 8 Figura 3.6: Diagrama da unidade de dados Os registradores (acumulador, DR e flags) armazenam o dados temporariamente antes de serem manipulados. O acumulador também é utilizado para o armazenamento do resultado da operação realizada pela ULA. Estes registradores são compostos por flip-flops, onde cada flip-flop é capaz de armazenar um único bit. Os multiplexadores (MUX) são responsáveis pela seleção de um determinado dado que está em suas duas entradas (A e B). Isto permite a opção de escolha de um dado que será 16 disponibilizado na saída do multiplexador, de acordo com o sinal de controle gerado pela unidade de controle. Por exemplo, o registrador acumulador poderá receber um dado proveniente da saída da ULA ou um dado proveniente do barramento de dados interno. O buffers tri-state são simplesmente circuitos que conectam um dos dois dados de entrada na sua saída. Tem como função fazer com que a cada momento apenas um circuito coloque o dado no barramento. Desta forma, o barramento pode ser usado por vários circuitos sem perigo de provocar um curto-circuito. Os barramentos são simplesmente fios condutores por onde os sinais elétricos dos dados trafegam, sendo um fio para cada bit de dado. Os sinais de controle da unidade de dados, os quais provêm da unidade de controle, possuem as seguintes funções: • /ULA – habilita a ULA, ativo em zero • operação – (4 bits) seleciona a operação que a ULA realiza de acordo com a Tabela 3.1 • /RF – habilita a carga do registrador dos flags, ativo em zero, sensível a transição positiva do clock • MAC – seleciona o dado a ser armazenado no acumulador (0 – A, 1 – B) • /LAC – habilita a carga do acumulador, ativo em zero, sensível a transição positiva do clock • /BAC – habilita o buffer do acumulador para envio do dado ao barramento de dados interno, ativo em zero • MDR – seleciona o dado a ser armazenado no Registrador de Dados (0 – A, 1 – B) • /LDR – habilita a carga do Registrador de Dados, sensível a transição positiva do clock • /BDI – habilita buffer do Registrador de Dados para envio do dado ao barramento de dados interno, ativo em zero /BDE – habilita buffer do Registrador de Dados para envio do dado ao barramento de dados externo, ativo em zero 17 3.3 - UNIDADE DE CONTROLE A unidade de controle é composta pelo contador de programa, pelos registradores (de endereço e instruções) e circuito de controle. Isto é mostrado na Figura 3.7. A MUX 8 REGISTRADOR DE ENDEREÇO B 8 8 CLK CONTADOR DE PROGRAMA /LCP /ICP 8 MRE CLK /LRE /RESET 8 Barramento de dados interno 8 8 8 REGISTRADOR DE INSTRUÇÕES UNIDADE DE DADOS /LRI CLK 8 CONTROLE CLK FLAGS 12 CIRCUITO DE CONTROLE /RESET 4 Barramento de dados externo Barramento de endereço 8 /MEM /IO /RD /WR Figura 3.7: Unidade de controle com a unidade de dados Os componentes da unidade de controle possuem as seguintes características e funções: • Registrador de endereço – registrador de 8 bits, com controle de carga (/LRE) e sensível a transição positiva do clock. Tem como função armazenar o endereço da memória que está sendo acessado. 18 • Registrador de instruções – registrador de 8 bits, com controle de carga (/LRI) e sensível a transição positiva do clock. Tem como função armazenar o código da instrução buscada na memória, e que será executada. • Contador de programa – contador crescente de 8 bits, com controles de clear assíncrono (/RESET), incremento síncrono (/ICP), e carga síncrona (/LCP), sensível a transição positiva do clock. Tem como função indicar a posição de endereço de memória onde está armazenado a próxima instrução a ser buscada. • Circuito de controle – máquina sequencial que gera os sinais de controle para a unidade de dados, unidade de controle, porta de entrada/saída e para a memória, de acordo com o dado armazenado no registrador de instruções. Sensível a transição negativa do clock. A máquina sequencial permite que a CPU execute as instruções indicadas na Tabela 3.2. Os sinais de controle da unidade de controle são: • /LCP – habilita a carga do contador de programa, ativo em zero, sensível a transição positiva do clock. • /ICP – habilita a contagem (incremento) do contador de programa, ativo em zero, sensível a transição positiva do clock. • /RESET – limpa (zera) o contador de programa e inicializa o circuito de controle, ativo em zero, assíncrono. • MRE – seleciona o dado a ser armazenado no Registrador de Endereço. • /LRE – habilita a carga do Registrador de Endereço, ativo em zero, sensível a transição positiva do clock. • /LRI – habilita a carga do Registrador de Instruções, ativo em zero, sensível a transição positiva do clock. FLAGS - (4 bits) identifica o status da ULA 19 Tabela 3.2: Código de instruções Código Descrição Símbolo Instrução (hexadecimal) 00 Não faz nada NOP 08 Soma: ACC=ACC+M(X) ADD X 10 Subtração: ACC=ACC-M(X) SUB X 18 ACC=ACC and M(X) AND X 20 ACC=ACC or M(X) ORA X 28 ACC=ACC xor M(X) XOR X 30 Complementa ACC: ACC=/ACC NOT 38 ACC = ACC + 1 INC 40 ACC = ACC - 1 DEC 48 ACC = ACC/2 SHR 50 ACC = ACC*2 SHL 58 ACC = -ACC NEG 80 ACC = 0 CLR 88 ACC = M(X) LDA X 90 M(X) = ACC STA X A0 Pula incondicionalmente para posição X JMP X A8 Pula para posição X se ACC = 0 JEZ X B0 Pula para posição X se ACC positivo ou zero JGE X B8 Pula para posição X se ACC negativo JLZ X C0 Pula para posição X se houve vai-um JMC X C8 Pula para posição X se houve overflow JMO X D0 Lê a porta de entrada e armazena no ACC INP D8 Escreve o conteúdo de ACC na porta de saída OUT FF Pára o processamento HLT X – endereço de memória de 8 bits M - memória ACC – Registrador acumulador 20 3.4 - FUNCIONAMENTO DA CPU A CPU possui o funcionamento descrito a seguir. Inicialmente, o sinal de reset é ativado, fazendo o contador de programa começar com o valor zero. A CPU então está pronta para executar instruções armazenadas na memória, obedecendo dois ciclos de funcionamento: ciclo de busca da instrução (ciclo de fetch), e ciclo de execução. Ciclo de busca da instrução Após a ativação do sinal de reset, é carregado o valor do contador de programa no barramento de endereço. A memória é ativada para leitura, e seu dado é carregado no registrador de instruções. O contador de programa é incrementado automaticamente preparando para ler o próximo dado na memória. Ciclo de execução Após o ciclo de fetch, a instrução carregada é decodificada pelo circuito de controle que gera os sinais de controle em sequência para execução da instrução. Se um dado é buscado na memória na execução da instrução, o contador de programa é atualizado. Quando termina de executar a instrução, o ciclo de fetch é reiniciado com o novo valor do contador de programa. Circuito de controle O circuito de controle é a parte mais complexa da CPU. Existem várias formas para implementação do circuito de controle [13][4]: microprogramado, máquina de estado e contador de sequência. O método proposto é o contador de sequência por ser mais simples. Ele é mostrado na Figura 3.8 e descrito a seguir. 21 Vêm do registrador de Instruções 8 Decodificador de instruções CLK /RESET N O P T0 T1 T2 Contador Deslocador T T T . . . A D D S U B ... Circuito Combinacional H L T Vêm do registrador de Flags 4 Tn T ... Sinais de Controle internos e externos Figura 3.8: Circuito de controle O contador deslocador gera sinais sequenciais a cada pulso de clock (transição negativa) de acordo com as formas de onda mostradas na Figura 3.9. A sua função é marcar o tempo e ordem de ativação dos sinais de controle. O decodificador de instruções ativa a sua saída correspondente a instrução armazenada no registrador de instruções. O circuito combinacional gera os sinais de controle na sequência apropriada para busca da instrução (durante ativação de T0, T1 e T2), e posteriormente gera os sinais de controle para execução da correspondente instrução (durante ativação de T3 à Tn). T0 T1 T2 Tn ... ... ... ... ... ... ... ... Figura 3.9: Sinais gerados pelo contador deslocador 22 4 - METODOLOGIA E MATERIAIS Para a implementação do protótipo do processador proposto foi desenvolvido uma placa ISA (Industry Standart Architecture) para conexão em um computador IBM-PC compatível [3], que contém um CPLD (FLEX10K10©) do fabricante Altera Corporation (vide Anexo F). Por meio desta placa e dos arquivos de configuração do CPLD utilizado, é possível implementar vários circuitos digitais de maneira simples e eficiente através do computador, inclusive o projeto do processador desenvolvido. Os CPLD’s, Circuitos Lógicos Programáveis Complexos (Complex Programmable Logic Devices), seguem a tecnologia dos PLD’s. PLD’s, Dispositivos Lógicos Programáveis (Programmable Logic Devices), são circuitos integrados configuráveis pelo usuário, usados para implementar funções lógicas quaisquer [1]. Sendo assim, os CPLD’s são de arquiteturas mais complexas, mais eficientes e de maiores capacidades em comparação com os PLD’s. Os CPLD’s são fabricados com células RAM ou EEPROM que permitem a sua configuração. Para configurar os CPLD’s existem várias ferramentas (softwares) em computador que geram arquivos de programação, específicos de cada fabricante. Como exemplo tem-se o MAXPLUS© II do fabricante Altera Corporation [2]. Os sinais, ou dados, de configuração são transferidos ao CPLD por meio de memórias previamente gravadas, cabos para download, ou mesmo por um microprocessador. A configuração do CPLD pode ser refeita tantas vezes forem necessárias. O uso de um computador IBM-PC compatível para programar um CPLD torna o processo de configuração mais versátil e rápido, uma vez que os arquivos de programação podem ser gerados por software e transmitidos ao CPLD diretamente. Por isso doi utilizado tal recurso para a implementação desse hardware. Os arquivos de configuração são gerados pelo computador via software (MAXPLUS© II) e são transmitidos ao CPLD por meio do barramento ISA. Os sinais de configuração são gerados por um software de comunicação, desenvolvido em conjunto com a placa. Esse software utiliza de um arquivo de configuração para gerar os sinais corretamente para o hardware. 23 4.1 - O HARDWARE O hardware proposto utiliza o padrão de interfaceamento ISA para conexão a um computador IBM-PC compatível. Esta interface foi escolhida pela facilidade de implementação e facilidade de uso. O componente principal da placa, o CPLD FLEX10K10©, é conectado ao barramento ISA através de buffers. Foi adotado este componente devido ao seu baixo custo e simplicidade de configuração dentre os outros CPLD’s. A comunicação da placa com o computador é controlada por circuitos de controle e de decodificação implementados em circuitos PAL’s (vide Anexo D). O diagrama abaixo (Figura 4.1) mostra a estrutura do hardware proposto. No Anexo C é mostrado o esquema completo da placa. No Anexo E, é mostrado o layout da placa. INTERRUPÇÃO BUFFERS DECODIFICADOR CPLD I S A C O N E C T O E R S REGISTRADOR DE CONTROLE SINALIZAÇÃO Figura 4.1. Estrutura do Hardware Proposto O Barramento ISA é a interface entre o computador e o hardware proposto. Por ele é possível trocar dados e enviar sinais de controle aos blocos endereçáveis (Buffers e CPLD). O barramento também possibilita ao computador receber um sinal de interrupção diretamente do CPLD, otimizando a comunicação com a placa. O circuito Decodificador realiza a decodificação de endereços do Barramento ISA. Os sinais resultantes são enviados para o Registrador de Controle. O Registrador de Controle é o responsável pela geração e armazenamento dos sinais de controle do CPLD. Tal bloco ainda tem a função de controlar a leitura e a escrita de dados 24 entre o CPLD e o computador posteriormente à programação. O Registrador de Controle opera diretamente nos buffers de dados e nos sinais de configuração do CPLD. O circuito de Sinalização é composto por três LED’s ligados diretamente a alguns sinais provenientes do Registrador de Controle. Por meio dessa sinalização visual, tem-se uma idéia do andamento da programação do CPLD. O CPLD recebe toda a programação proveniente do barramento por meio dos Buffers de dados. Após a programação, ele está pronto para operar isoladamente ou em comunicação contínua com o PC através dos próprios Buffers de dados. Sua função dependerá estritamente do conteúdo do arquivo de programação recebido. Estão ligados diretamente ao CPLD três conectores para utilização externa: dois padrão DB25 fêmea e um padrão PS/2. Este conectores podem ser utilizados para entrada e/ou saída de dados digitais. 4.2 - OS SOFTWARES Para obter os arquivos de configuração do CPLD utilizado, é necessário utilizar o software do fabricante (MAXPLUS© II). O circuito digital do processador que se deseja implementar pode ser projetado pelo usuário do software em modo gráfico ou texto. No modo gráfico, são utilizados desenhos de portas lógicas conectadas. No modo texto é utilizado uma linguagem de descrição de hardware de um nível abstrato para um nível concreto, como o VHDL [8] por exemplo. O software se encarrega de compilar o projeto e gerar os arquivos necessários à programação do CPLD. Com o CPLD utilizado, é possível fazer uso de 7.000 a 31.000 portas lógicas com muitas combinações diferentes em um só circuito, representadas em um só arquivo de programação. O software de comunicação desenvolvido (Anexo G), por sua vez, transfere o arquivo de configuração para o CPLD por meio do barramento e buffers. Sinais de controle do barramento e do CPLD são gerados pelo software para esta função. O esquema abaixo (Figura 4.2) ilustra o processo. 25 MAXPLUS II SOFTWARE DE COMUNICAÇÃO COMPILADOR EDITOR Gráfico ou texto Arquivos de Configuração PLACA RECONFIGURÁVEL Sinais de Configuração Figura 4.2. Processo de Configuração do Hardware Após a programação, o CPLD está pronto para ser utilizado pelo usuário, conforme os dados do arquivo de configuração. 4.2.1 - O Software de Comunicação Para o desenvolvimento do Software de Comunicação foi realizada uma pequena modelagem objeto orientada no intuito de facilitar a sua construção. O objetivo foi fazer um software de interface simples para a programação da placa e que funcionasse com eficácia. A modelagem constitui-se basicamente do diagrama de classe e de fluxogramas das partes mais complexas ou mais importantes do software. A implementação foi realizada na linguagem C++, possibilitando a transcrição do modelo. Utilizando o compilador mingw32, versão 2.95.2, o executável foi gerado. Os testes foram realizados logo após a compilação e algumas correções foram necessárias até que o software funcionasse como desejado. A modelagem apresentada já apresenta as correções feitas. Diagrama de Classe O diagrama de classe permite a visualização da estrutura estática do software. Na Figura 4.3 está apresentado o software na íntegra representado nesse diagrama. 26 ifstream Detalhes não mostrados clChipProgramavel – static const TEndereco ENDERECO_nWS = 0x0301 – static const TEndereco ENDERECO_nCS = 0x0302 – static const TEndereco ENDERECO_nCONFIG = 0x0303 – static const TEndereco ENDERECO_nSTATUS = 0x0304 – static const TEndereco ENDERECO_CONF_DONE = 0x0305 – bool nWS – bool nCS – bool nCONFIG – bool nSTATUS – bool CONF_DONE – bool RDYnBSY – bool INIT_DONE – bool IO9_27 – bool IO11_29 – bool IO13_35 – bool IO15_37 – clBarra mentoISA barramento – clBufferLeituraControle bufferLC + void setnWS(void) + void resetnWS(void) + void setnCS(void) + void resetnCS(void) + void setnCONFIG(void) + void resetnCONFIG(void) + void setnSTATUS(void) + void resetnST ATUS(void) + bool getnST ATUS(void) + void setCONF_DONE(void) + void resetCONF_DONE(void) + bool getCONF_DONE(void) + bool getRDYnBSY(void) + bool getINIT_DONE(void) + bool getIO9_27(void) + bool getIO11_29(void) + bool getIO13_35(void) + bool getIO15_37(void) + static const unsigned int TAMANHO_DADO = 14750 clArquivoUPDM clPlacaUPDM – TDado* cabecalho – TDado* conteudo – const char* nome – unsigned int tamanho – unsigned int tamanhoConteudo – unsigned int tamanhoCabecalho – TStatus status + static const T Status CERTO =0 + static const T Status NAO_CRIADO = 1 + static const T Status TAM_MUITO_MAIOR = 2 + static const T Status POUCO_CONTEUDO = 3 + static const T Status CONT EUDO_DEMAIS = 4 + static const T Status TIPO_NOME_INVALIDO =5 + static const unsigned int TAM_VET_CONTEUDO = 16000 – clBufferEscritaDados bufferED – clChipP rogramavel chip – static const unsigned int TBASE =2 – static const unsigned int TIME_OUT = (unsigned int)(50000 / TBASE) – static const unsigned int TCF2WS = 5 – static const unsigned int TCFG =2 – static const unsigned int TCD2UM = 2 – static const unsigned int TCF2S T1 = 4 – static const unsigned int TWSP =1 – static const unsigned int TWS2B =1 – static const unsigned int TBUSY =2 principal – int status + principal(int argC, char** argV) + int getStatus(void) – void enviarMensagemArquivo(T Status estado, const char* nomeArquivo) – void enviarMensagemPlaca(T Sta tus estado) usa 1 1 usa 1 1 – T Status status + static const TStatus CERTO =0 + static const TStatus OCUPADA = 1 + static const TStatus ERRO_setCFG = 2 + static const TStatus ERRO_resetCFG = 3 + static const TStatus ERRO_BUSY_WS = 4 + static const TStatus ERRO_ST_WS = 5 + static const TStatus ERRO_ID_CD = 6 + static const TStatus ERRO_CD_TO = 7 + static const TStatus ERRO_NAO_ESPERADO =8 – void extrairCabecalho(void) – void extrairConteudo(void) – void atualizarStatus(void) + clArquivoUPDM(const char* nomeArquivo) + ~clArquivoUPDM(void) + TDado* getCabecalho(void) + TDado* getConteudo(void) + TStatus getStatus(void) + const char* getNome(void) + unsigned int getTamanho(void) + unsigned int getTamanhoCabecalho (void) + unsigned int getTamanhoConteudo(void) – void aguardar(unsigned int tempo) – void resetar(void) + clPlacaUPDM(void) +bool configurar(const unsigned int tamanhoDado, TDado* dadosConfig) +T Status getStatus(void) 1 1 clBufferLeituraDados – TDado dado – static const TEndereco ENDERECO = 0x0300 – clBarramentoISA barramento clBufferLeituraControle usa 1 1 clBufferEscritaDados – TDado dado – static const TEndereco ENDERECO = 0x0301 – clBarramentoISA barramento – TDado dado – static const TEndereco ENDERECO = 0x0300 – clBarramentoISA barramento + TDado& getDado(void) + void setDado(TDado& d) 1 1 usa 1 + T Dado& getDado(void) 1 clBarramentoISA 1 usa usa 1 – TDado dado – TEndereco endereco 1 +inlineTDado inportb(TEndereco end) +inlinevoid outportb(TEndereco end, TDado d) 1 usa Figura 4.3. Diagrama de Classe do Software de Comunicação 27 Através de representação de atributos e métodos, cada classe do diagrama de classe é construído. Os atributos são as variáveis, tipos e constantes da implementação. Os métodos são as funções e os procedimentos. A classe Principal é a classe que faz a chamada inicial de todo o processamento do programa. Ela é a responsável pelo interfaceamento entre o computador e o usuário. Através do método construtor principal, o programa faz os testes com os argumentos passados na linha de comando, cria o objeto da classe clArquivoUPDM e programa a placa usando um objeto da classe clPlacaUPDM. Eventuais mensagens de erro são enviadas através do objeto dessa classe via console, em linha de comando. A classe clArquivoUPDM é responsável pelos métodos de tratamento do arquivo a ser programado na placa. Ela herda a classe de tratamento de arquivos ifstream da biblioteca padrão do compilador mingw32. Os dados provenientes do arquivo de extensão .rbf, gerado pelo software MAXPLUS© II, são armazenados por essa classe no vetor conteudo; para tanto usa-se o método extrairConteudo. Alguns teste são processados para a previsão de possíveis erros que o usuário possa cometer ao usar a clArquivoUPDM. Através de status é possível obter o possível erro ocorrido e reportá-lo ao usuário, se necessário. A classe clPlacaUPDM contém o método configurar como sendo o principal. Essa é a classe responsável pela programação propriamente dita da placa. A configuração segue as recomendações que o fabricante do chip programável apresenta nos seus manuais. A elaboração de um fluxograma (Figura 4.4) colaborou com a construção do método configurar pois permitiu que se tivesse uma melhor visão do processamento a ser feito. Agregadas à clPlacaUPDM estão as classes clChipProgramavel e a classe clBufferEscritaDados, buffer usado para enviar as palavras de configuração ao chip. A classse clChipProgramavel foi criada para se acessar aos pinos de configuração do CPLD. Essa permite uma representação direta desses pinos de configuraçâo, aumentando a clareza do código e facilitando a construção do software. As constantes de endereço correspondem aos endereços para alcance dos pinos. Ela usa a classe clBarramentoISA para enviar os sinais de configuração ao hardware e a classe clBufferLeituraControle para ler os sinais de controle do chip. As classes clBufferLeituraDados, clBufferEscritaDados e clBufferLeituraControle usam a classe clBarramentoISA para operar. Suas funções são, respectivamente, ler os dados, escrevê-los e ler os dados de controle ou de configuração do chip programável. Cada qual acessa a placa através da classe clBarramentoISA, atribuindo o endereço apropriado. Por fim a classe clBarramentoISA, que faz a ligação do hardware com o software. Através dos métodos inportb e outportb, escritos em assembly, pode-se acessar a interface 28 ISA e os sinais provindos da mesma. Mas ela só opera em versões de sistemas operacionais que permitem o acesso direto à essa interface. Fluxogramas São vários os métodos elaborados nesse software, mas somente de alguns se teve a necessidade da modelagem em fluxogramas para facilitar a programação e a clareza do código. As Figuras 4.3, 4.4, 4.5 e 4.6 mostram esses fluxogramas. O método extrairConteudo, da classe clArquivoUPDM, lê o arquivo de configuração passado como parâmetro e guarda o seu conteúdo no vetor conteudo. O seu fluxograma, na Figura 4.4, mostra a sua realização. início sim tamanho > TAM_VET_CONTEUDO ?? não status ← TAM_MUITO_MAIOR alocar memória posiciona leitura de arquivo em 0 fim i←0 sim fim de arquivo? não ler palavra (1 byte) guardar no vetor em i tamanho ← i fim Figura 4.4. Fluxograma do Método extrairConteudo Para temporização dos tempos de programação em clPlacaUPDM usa-se o método aguardar. Tal método parte do princípio de que todo acesso à interface ISA dure no mínimo 2 microssegundos para executar. Sendo assim, como mostrado no fluxograma da Figura 4.6, cada iteração realizada em aguardar conta o tempo necessário de espera. 29 início nroIteracoes ← tempo/TBASE sim nroIteracoes <= 0? não nroIteracoes ← 1 sim nroIteracoes == 0? não blc.getDado() nroIteracoes-- fim Figura 4.6. Fluxograma do Método aguardar O método configurar, da classe clPlacaUPDM, configura a placa de acordo com os dados dos manuais do chip. Na Figura 4.5 o processo é ilustrado. 30 início resetar ativar nCONFIG sim nSTATUS ou CONF_DONE ativado? não desativar nCONFIG resetar aguardar (TCF2ST1 + TCF2WS) us status ← ERRO_set_CFG false sim nSTATUS ativado? não ativar CS resetar “inicialização do envio de dados” posPalavraCorrente ← 0 status ← CERTO enviaProxima ← true status ← ERRO_reset_CFG false não enviaProxima? sim enviar palavra na posicao posPalavraCorrente status ← ERRO_NÃO_ESPERADO ativar nWS false desativar nWS aguardar TW2B + TBUSY tempoEspera ← 0 sim RDYnBSY ativado? não status ← OCUPADA tempoEspera >= TIME_OUT? sim não enviaProxima ← false status ← ERRO_BSY_WS false status ← CERTO nSTATUS ativado? não não PosPalavraCorrente >= (tamanhoDado – 1)? sim enviaProxima ← false resetar status ← ERRO_ST_WS PosPalavraCorrente++ sim enviaProxima ← true false Figura 4.5.a. Fluxograma do Método configurar (parte 1) 31 continuação tempoEspera ← 0 tempoEspera < TIME_OUT? não sim não enviaProxima ← false CONF_DONE ativado? resetar sim tempoEspera++ status ← ERRO_CD_TO aguardar TCD2UM false INIT_DONE ativado? não enviaProxima ← false sim enviaProxima ← false status ← CERTO resetar true status ← ERRO_ID_TO false Figura 4.5.b. Fluxograma do Método configurar (parte 2) Os demais métodos são de entendimento mais simples, que podem ser vistos diretamente no código do programa. 32 5 - RESULTADOS O projeto do processador descrito no capítulo 3, foi implementado utilizando linguagem VHDL e seus componentes ligados por editor gráfico do software MAXPLUS II. No Anexo A são apresentados as listagens dos arquivos em VHDL e os desenhos gráficos. O projeto, no ambiente do software MAXPLUS II, foi compilado para implementação do circuito do processador na CPLD FLEX10K10. Em seguida o arquivo de configuração da CPLD foi transferido para a placa desenvolvida utilizando o software de comunicação. Imediatamente após a transferência do arquivo de configuração, a CPU desenvolvida estava operando, executando o programa exemplo em sua memória de programa também implementada na CPLD. Os resultados do processamento da CPU puderam ser visualizados na porta de saída da CPU. A CPU, bem como a memória e portas de E/S, foi simulada também utilizando o software MAXPLUS II. No Anexo B são apresentados as formas de onda dos resultados da simulação, quando a CPU executava o programa exemplo, provando a eficiência do projeto. 33 6 - CONCLUSÃO A Unidade Processadora Discreta Microprogramável apresentada neste relatório de pesquisa, mostrou-se simples, eficaz e robusta. Esta unidade contém a mesma arquitetura utilizada pelos mais modernos processadores digitais, porém de uma maneira simples. Assim é possível o seu entendimento e estudo de novas tecnologias de projeto. O uso dos softwares de edição, compilação e programação, combinado com o uso do hardware programável, permite que novas propostas de arquitetura de processadores possam ser testadas e implementados de maneira rápida e eficiente. Dentre as aplicações possíveis para a placa desenvolvida, além da implementação de novos propostas de arquiteturas de processadores (objetivo principal deste projeto de pesquisa), é possível a implementação de quaisquer circuitos digitais, desde que respeitado o limite de portas lógicas disponível na CPLD utilizada. AGRADECIMENTOS Ao Depto de Ciência da Computação da UFLA, pelo apoio dos professores e funcionários para o desenvolvimento do projeto. À FAEPE, pelo apoio à execução e acompanhamento do projeto de pesquisa. Agradecimento especial à FAPEMIG pelos recursos financiados para a execução do projeto e sem a qual seria improvável a realização do mesmo 34 REFERÊNCIAS BIBLIOGRÁFICAS [1] ALTERA CORPORATION. Data Book. San Jose, EUA: January 1998. 885p. [2] ALTERA CORPORATION. MAX+PLUS II: Getting Started. San Jose, EUA: September 1997. 353p. [3] EGGEBRECHT, Lewis C. Interfacing to the IBM Personal Computer. 2.ed. USA: Howard W. Sams and Company, 1990. 345p. [4] HAYES, John Patrick. Computer Architecture and Organization. Singapore: McGraw-Hill International, 2a edição, 1988, 702p. [5] LANGDON Jr, G. G. e FREGNI, E. Projeto de Computadores Digitais. Edgard Blucher Ltda, 1990. [6] MALVINO, A. Microcomputadores e Microprocessadores. McGraw-Hill, São Paulo, 1986. [7] PATTERSON, David A. e HENNESSY, John L. Computer Organization and Design: The Hardware/Software Interface. San Francisco: Morgan Kaufmann, 2a edição, 1998, 980p. [8] PERRY, Douglas. VHDL. 3.ed. New York, EUA: McGraw-Hill, 1998. 493p. [9] STALLINGS, WILLIAM. Computer Organization and Architecture – Designing for Performance. Fourth Edition. Prentice Hall, 1996. [10] TANEMBAUM, Andrew S. Organização Estruturada de Computadores. Rio de Janeiro: Livros Técnicos e Científicos, 1999, 3a edição, 460p. [11] TAUB, Herbert. Circuitos Digitais e Microprocessadores. Editora McGraw-Hill, São Paulo, 1984. 35 [12] TOKHEIM, L. R. Introdução aos Microprocessadores. MacGraw-Hill do Brasil, São Paulo, 1985. [13] ZUFFO, João Antônio. Fundamentos da Arquitetura e Organização dos Microprocessadores. Editora Edgard Blucher Ltda, São Paulo, 1978. [14] 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. PROPOSTAS DE CONTINUIDADE Propõe-se as seguintes idéias para continuação deste projeto: • Melhoria da unidade de dados do processador desenvolvido, utilizando registradores com ponteiros. • Utilização de uma CPLD com maior capacidade para implementação do processador. • Utilização de tipos de pipeline no projeto do processador. • Projeto de placa com barramento PCI, no lugar do barramento ISA. • Implementação da placa com memórias tipo RAM estática para economizar portas lógicas da CPLD. • Acréscimo do número de instruções do processador projetado, com maior complexidade. • Melhoria da ULA, implementando mais operações. • Utilização da placa para a implementação direta de algoritmos. Lavras, outubro de 2001 _______________________________ Wilian Soares Lacerda 36