Bacharelado em Ciência da Computação DINF / UFPR Projetos Digitais e Microprocessadores 1 o Semestre de 2006 MICO-v12.r0 07/03/2006 Profs. Luis Allan Künzle e Armando Luiz Nicolini Delgado Atenção: Este texto descreve um trabalho de laboratório que vale 40% da nota da disciplina e que é um trabalho muito extenso. Reserve tempo suficiente, com antecedência à data de entrega, para a sua execução, em especial para a integração e teste dos blocos. 1 Releases - Histórico r0 07 / 03 / 2006 primeira versão r1 29 / 03 / 2006 bug fixes: correção set de instruçoes detalhes sobre Etapa 1 r2 30 / 05 / 2006 mudanças em datas e horários de entrega dos trabalhos r3 13 / 06 / 2006 correção set instruções:pop e SkipCond 2 Formalidades referentes ao trabalho 2.1 Desenvolvimento do trabalho O trabalho deve ser realizado individualmente ou em duplas. O processador deverá ser implementado com a ferramenta TkGate (http://www. tkgate.org). 2.2 Datas de entrega e de apresentação A entrega do trabalho compreende três etapas. Na primeira deverão ser entregues a Unidade Lógica e Aritmética e os Registradores. A data limite para esta etapa é 27 de abril de 2006, 23:59H. A segunda etapa compreende o Sistema de Memória e de Entrada e Saída. A data limite para esta segunda etapa é 01 de junho de 2006, 23:59H. O trabalho completo e integrado com os módulos entregues nas etapas anteriores deverá ser entregue em 19 de junho de 2006, até as 22:00H horas impreterivelmente. Na primeira etapa, a Unidade Lógica e Aritmética deve implementar as operações: soma, subtração, multiplicação (8 bits x 8 bits =16 bits), incremento de 1, decremento de 1, and, or, xor, nand, nor, nxor, not, shift-l, shift-r. Além disso, devem ser produzidos sinais indicando a ocorrência de: resultado negativo, resultado zero, overflow e carry. Não serão aceitos trabalhos fora do prazo. As entregas serão feitas por submissão eletrônica, via e-mail ou ftp, cujas regras serão divulgadas posteriormente.
Cabe aos alunos verificarem periodicamente, na home-page da disciplina as atualizações neste documento. Cada trabalho entregue deverá corresponder a um arquivo com a seguinte denominação: MICO-v12-fulano beltrano-etapa.tar.gz, em que fulano e beltrano são os login name dos participantes no DINF. O conteúdo do arquivo, empacotado com tar e comprimido com gzip, deve conter um diretório com o mesmo nome do arquivo acima, sem a extensão.tar.gz. Ele deve conter, obrigatoriamente: todos os arquivos que sejam necessários para simular os circuitos projetados; vetores de teste usados para a verificação e correção de cada bloco componente do processador; um relatório contendo o projeto de cada módulo e de cada bloco funcional (gerados pelo TkGate); um arquivo contendo o nome dos componentes do grupo. A apresentação dos trabalhos será efetuada nos dias 20 e 22 de junho de 2006. 3 Organização do MICO-v12 A arquitetura do MICO-v12 compreende uma CPU (uma ALU e registradores) e memória (para armazenar programas e dados), com as seguintes características: números binários em complemento de dois; programa armazenado, com palavras de comprimento fixo; 4K palavras de 16 bits de memória principal; instruções com 16 bits, 4 para o opcode e 12 para o endereçamento; um acumulador (AC) de 16 bits; um registrador de instrução (IR) de 16 bits; um registrador de leitura e escrita a memória (MBR) de 16 bits; um contador de programa (PC) de 12 bits; um registrador de pilha (SP) de 12 bits; um registrador de endereçamento de memória (MAR) de 12 bits; um registrador de entrada (InREG) de 8 bits; um registrador de saída (OutREG) de 8 bits. 2
A arquitetura do MICO-v12 está apresentada na Figura 1. A ALU (unidade lógica e aritmética) é a parte da CPU que realiza todas as operações de processamento (aritméticas, decisões lógicas, entre outras). Os registradores são usados para propósitos muito específicos durante a execução de programas. Eles mantêm valores para armazenamento temporário, dados que estão sendo manipulados ou resultados de cálculo. Muitas vezes eles estão implicitamente referenciados em uma instrução, como será visto na seção correspondente ao conjunto de instruções. No MICO-v12 temos oito registradores, descritos a seguir: AC: Acumulador. Um registrador de propósito geral que armazena dados que a CPU precisa para processamento. MAR: Registrador de Endereçamento de Memória. Mantém o endereço de memória dos dados sendo referenciados. MBR: Registrador de Acesso de Memória. Mantém os dados que foram lidos ou que serão escritos na memória. PC: Contador de Programa. Mantém o endereço da próxima instrução a ser executada. IR: Registrador de Instrução. Mantém a próxima instrução a ser executada. SP: Registrador de Pilha. Mantém o endereço da topo da pilha. InREG: Registrador de Entrada. Mantém os dados lidos do dispositivo de entrada. OutREG: Registrador de Saída. Mantém os dados que serão escritos no dispositivo de saída. Os registradores MAR, MBR, PC e IR guardam informações muito específicas e não podem ser usados para nada além dos propósitos estabelecidos. Além deles, há um registrador de status, que mantém informações indicando várias condições, como por exemplo a ocorrência de overflow na ALU. No MICO-v12 não é possível transferir dados ou intruções de e para os registradores sem uso do barramento de dados, que é comum a todos os dispositivos. O caminho de dados no MICO-v12 pode ser visto na figura 2. A implementação deve contemplar todos os mecanismos apresentados no caminho de dados, que permitem acelerar operações importantes da CPU: um acesso direto entre o MAR e a memória, um caminho independente entre o MBR e o AC, um caminho especial entre o MBR e a ALU para permitir que a palavra armazenada no MBR seja usada em operações aritméticas, além de um acesso direto entre o AC e a ALU, independente do barramento. Estes mecanismos permitirão que vários eventos ocorram de forma concorrente na execução do processamento. 3
Endereco Memoria0 ALU STAT AC SP MBR OutREG MAR InREG Memoria Principal PC IR Unidade de Controle CPU Endereco Memoria 4k 1 Figura 1: Arquitetura do MICO-v12 4
Memoria MAR SP PC MBR ALU AC InREG OutREG IR Barramento 16 bits Figura 2: Caminho de Dados no MICO-v12 5
4 Conjunto de Instruções Cada instrução do MICO-v12 consiste de 16 bits. Os quatro bits mais significativos, bits 12 15, correspondem ao opcode que especifica a instrução a ser executada (o que implica o máximo de 16 instruções). Os 12 bits menos significativos, 0 11, formam um endereço, que por sua vez implica um tamanho de memória limitado a 2 12 1. O conjunto de instruções do MICO-v12 pode ser visto na tabela abaixo. Código Instrução Significado 0000 JnS X Armazena em PC o endereço X e salta para X+1. 0001 Load X Lê o conteúdo do endereço X em AC. 0010 Store X Armazena o conteúdo de AC no endereço X. 0011 Add X Adiciona o conteúdo do endereço X em AC e armazena o resultado em AC. 0100 Subt X Subtrai o conteúdo do endereço X de AC e armazena o resultado em AC. 0101 Input Lê um valor do teclado em AC. 0110 Output Envia o valor de AC para o display. 0111 Halt Termina o programa. 1000 SkipCond Se condição, salta a próxima instrução. 1001 Jump X Carrega o endereço X em PC. 1010 Clear Zera o conteúdo de AC. 1011 SetSP Carrega o conteúdo de AC no registrador SP. 1100 JumpI X Salto indireto: usa o valor em X como endereço do lugar para onde saltar. 1101 Push X Carrega o conteúdo do endereço X no topo da pilha. 1110 Pop X Retira o topo da pilha e coloca no endereço X. 1111 Mult X Multiplica o conteúdo de AC (8 bits menos significativos) pelo conteúdo do endereço X (8 bits menos significativos). Armazena o resultado (16 bits) em AC. A instrução Load permite mover palavras da memória para a CPU (via MBR e AC). Todos os dados (o que inclui tudo que não é uma instrução) que saem da memória são movidos inicialmente para o MBR e então para o AC ou para a ALU; não deve haver outras opções nesta arquitetura. Note que a instrução Load não nomina AC como destino final: este registrador está implícito. Outras instruções se referem ao AC de forma semelhante. A instrução Store permite mover dados da CPU para a memória. As instruções Add e Sub adicionam e subtraem, respectivamente, os dados presentes no endereço X, ao ou do valor em AC. O dado localizado no endereço X é copiado para o MBR onde ele é mantido até que a operação aritmética seja executada. As instruções Input e Output permitem ao MICO-v12 se comunicar com o mundo exterior. O comando Halt termina a execução atual do programa. A instrução SkipCond permite realizar salto condicional. Quando esta instrução é executada, o valor armazenado no AC pode ser inspecionado. Dois dos bits de endereçamento (os bits 10 e 6
11) especificam a condição a ser testada. Se o valor desses bits for 00, o significado da instrução é saltar se o valor de AC é negativo. Se o valor for 01, significa saltar se o valor de AC é igual a zero. Finalmente, se o valor for 10, significa saltar se o valor de AC é maior que zero. Saltar corresponde a pular para a próxima instrução, o que corresponde a incrementar o PC por 1, essencialmente ignorando a próxima instrução, que nem mesmo é buscada. A instrução Jump, um salto incondicional, também afeta o PC, que será substituído pelo valor de X, que por sua vez endereça a próxima instrução a ser buscada. A instrução JnS (salte e armazene) permite primeiramente armazenar um ponteiro para uma instrução de retorno e depois carregar o PC com uma outra instrução. Isto possibilita construir chamadas de procedimentos e outras sub-rotinas e retornar ao ponto de chamada no código principal após o término da sub-rotina. A instrução Clear move zero para todos os bits do acumulador. A instruçãoaddi usa um modo de endereçamento indireto. Ao invés de usar o valor encontrado em X com endereço atual, esse valor será o ponteiro para uma nova posição de memória que contém os dados que serão usados na instrução. As instruções SetSP, Push X e Pop X permitem manipular a pilha, cuja localização na memória é definida dinamicamente pelo programa do usuário. A tabela a seguir apresenta o conjunto completo de instruções do MICO-v12 em RTN. 7
Opcode Instruction RTN 0000 JnS X MBR PC MAR X Mem[MAR] MBR MBR X AC 1 AC AC + MBR PC AC 0001 Load X MAR X, AC MBR 0010 Store X MAR X, MBR AC Mem[MAR] MBR 0011 Add X MAR X AC AC + MBR 0100 Subt X MAR X AC AC - MBR 0101 Input AC InREG 0110 Output OutREG AC 0111 Halt 1000 SkipCond If IR[11-10] = 00 then If AC < 0 then PC PC + 1 Else If IR[11-10] = 01 then If AC = 0 then PC PC + 1 Else If IR[11-10] = 10 then If AC > 0 then PC PC + 1 1001 Jump X PC IR[11-0] 1010 Clear AC 0 1011 SetSP SP AC 1100 JumpI X MAR X PC MBR 1101 Push X MAR X SP SP - 1 MAR SP Mem[MAR] MBR 1110 Pop X MAR SP SP SP + 1 MAR X Mem[MAR] MBR 1111 Mult X MAR X 8 AC AC[0-7] * MBR[0-7]