ARQUITECTURA DE COMPUTADORES 3º Trabalho de Laboratório Unidade de Controlo Microprogramada Objectivo: Pretende-se que os alunos compreendam a metodologia usada na implementação, programação e teste de uma Unidade de Controlo Microprogramado de um computador de Ciclo Múltiplo, assim como a familiarização dos conceitos de pilha e subrotina. O trabalho terá uma duração de 2 semanas, devendo o relatório ser entregue na aula de laboratório da segunda semana. O trabalho deverá ser preparado fora do horário de laboratório, destinando-se as 3 horas de laboratório à resolução de eventuais problemas, e à demonstração do trabalho realizado. 1. INTRODUÇÃO Pretende-se programar uma Unidade de Controlo Microprogramado para um computador elementar de Ciclo Múltiplo baseado numa Unidade de Processamento de 6 bits. O computador será integralmente fornecido pelo corpo docente sob a forma de um projecto de Xilinx, sendo o trabalho centrado na microprogramação do conjunto de instruções na ROM da Unidade de Controlo, e numa subrotina e programa principal em código Assembly. A arquitectura do computador encontra-se na figura 1 abaixo. Figura 1- Arquitectura elementar de um computador de ciclo múltiplo Relativamente à identificação de Restantes Sinais Controlo da figura 1, esta corresponde respectivamente a IRW (1bit), DT (1 bit), M Dsel (2 bits), RW (1 bit), AT (1 bit), M Asel (2 bits), BT (1 bit), M Bsel (2 bits), MA (1 bit), MB (2bits), FS (3 bits), FW (1 bit), MW (1 bit), MD (1 bit), MM (2 bits), PCC (2 bits), SPC (2 bits). 2 UNIDADE DE PROCESSAMENTO (UP) A Unidade de Processamento (UP) de 6 bits a controlar assemelha-se àquelas usadas nas sessões de laboratório anteriores. A UP é constituída por uma Unidade de Armazenamento (UA), uma Unidade Funcional (UF) e 2 Muxs. Unidade de Armazenamento (UA). A UA dispõe de 9 registos: R0, R1,..., R7 e Rt com a codificação 000, 001,..., 111 para os registos R0 a R7 respectivamente. Os registos R0 a R7 podem ser endereçados pelas instruções assembly armazenadas na RAM (através do Instruction Register (IR)). Contudo, o registos Rt não. Este destina-se exclusivamente a ser utilizado como armazenamento temporário na execução das instruções microprogramadas guardadas na ROM.
Dito de outra forma, o registo Rt é invisível para o utilizador (uma vez que este não os pode referenciar nas suas instruções assembly). Cada registo tem 6 bits. Quando RW=1, a entrada de dados da UA é armazenada no registo endereçado por Dsel. Quando RW=0, nenhum registo da UA é escrito. O acesso aos registos da UA é feito através das linhas DSEL, ASEL e BSEL de 4 bits (ver figura 1) que estão ligadas ao resto do computador como se mostra na figura 2 abaixo. Figura 2- MUX s de selecção dos bits de controlo ASel, BSel e DSel Note que os 3 bits de menor peso de Asel, Bsel e Dsel podem ter origens diversas (mas provêm sempre de bits contidos no Instruction Register) e são controlados pelos sinais MAsel, MBsel e MDsel gerados na Unidade de Controlo (UC). O bit de maior peso de Asel, Bsel e Dsel é denominado AT, BT e DT, respectivamente. Os sinais AT, BT e DT são também gerados na UC. Note que estas ligações confirmam o funcionamento anteriormente descrito: o utilizador só pode referenciar nas suas instruções assembly os registos R0 a R7; o acesso ao registo Rt exige a manipulação dos bits AT, BT e DT que estão apenas ao alcance da UC. Unidade Funcional (UF). A UF é semelhante à do laboratório 2, com a excepção de que os operandos têm agora 6 bits (e não 4). As linhas FS (Function Selection) determinam qual a micro-operação executada pela UF: Tabela 1- Micro operações realizadas pela unidade funcional A micro-operação executada na UF afecta as flags Negative (N) e Carry (C). Estas flags podem ser guardadas num registo após a execução de cada instrução, consoante o sinal de controlo FW: se FW=1 as flags são armazenadas no registo Reg indicado na figura 1. Muxs. O Mux A selecciona o operando X da UF: quando MA=0, o operando X da UF é o registo da UA escolhido pelas linhas Asel, quando MA=1 o operando X é o dado (Op) contido nos 6 bits menos significativos do Instruction Register - IR[5:0]. O Mux B selecciona o operando Y da UF: quando MB=0, o operando Y é o registo da UA escolhido pelas linhas Bsel; quando MB=1, o operando Y é o dado contido nos 6 bits menos significativos das linhas Dout da RAM; quando MB=2, o operando Y é o registo Stack Pointer (SP). 3 ARQUITECTURA DO COMPUTADOR E DA UNIDADE DE CONTROLO (UC) A arquitectura do computador implementado caracteriza-se essencialmente por possuir uma Unidade de Controlo microprogramado (ROM, CAR, Mux R e Mux C) e uma memória comum para dados, programa e pilha (RAM). Além destas unidades, distinguem-se a UP (constituída pela UA e pela UF), vários Mux s e ainda 3 registos: o Program Counter (PC), o Instruction Register (IR) e o Stack Pointer (SP).
3.1 Formato das Instruções Assembly As instruções de Assembly a utilizar neste computador são de 16 bits e possuem formatos de acordo com o tipo de endereçamento utilizado como indicado na figura 3: em que: Figura 3- Modos de endereçamento e formato das instruções OpCode (4 bits): código da instrução assembly a executar; DR (3 bits): selecciona um dos registos R0 a R7; RB (3 bits): selecciona um dos registos R0 a R7; RA (3 bits): selecciona um dos registos R0 a R7; Op (6 bits): operando constante de 6 bits; Address (6 bits): constante de 6 bits em formato binário com o endereço de uma posição de memória RAM (endereço efectivo); Offset (6 bits): constante de 6 bits em formato de complemento para 2 (permite indicar saltos para a frente ou para trás). 3.2 Memória e Registos auxiliares A memória RAM tem uma dimensão de 64x16 bits, e contém o programa, os dados e a pilha (stack). Dado que os registos da UA têm 6 bits, e que as instruções de programa têm 16, torna-se óbvio que nos endereços em que a memória é utilizada para guardar dados a sua capacidade não é completamente aproveitada, pelo que as operações que guardam e buscam dados na memória só utilizam os bits menos significativos da memória. A este respeito, notar o bloco de concatenação de zeros na figura 1. Dado que a memória é comum, as regiões de código, dados e pilha têm de se apresentar disjuntas no espaço de endereçamento (para evitar sobreposições). Assim: O programa a ser executado deve ser colocado a partir do endereço 0 (e ocupa as posições seguintes de memória); O topo da pilha é o endereço 63 (ou 3Fh), e cada operação que coloca dados na pilha decrementa esse endereço; Os dados ficarão colocados numa área situada entre o programa e a pilha como indicado na figura 4 explicada mais à frente. O acesso à memória é feito a partir do Mux M, da seguinte forma: Se MM=0, o endereço da RAM provém do registo da UA seleccionado por Bsel; Se MM=1, o endereço da RAM provém do registo Stack Pointer (SP). Note que o SP contém o endereço da última posição em que se acedeu à pilha e é inicializado com o valor 00h 1 ; 1 Isto deve-se ao facto de a instrução PUSH começar por decrementar o SP, pelo que a primeira posição a ser utilizada no stack será a 63, ou seja 3Fh (o SP passa de 000000 para 111111)
Se MM=2, o endereço da RAM provém do Program Counter (PC). Note que o PC contém o endereço da instrução do programa a ser executada (i.e., aponta para a instrução a ser executada). É também inicializado com o valor 00h. De notar que as operações CALL e RET, utilizadas para manipular subrotinas, utilizam a pilha para guardar o conteúdo do PC nos 6 bits de menor peso da palavra da memória. O PC e o SP representados no diagrama de blocos não são simples registos, mas sim unidades mais complexas que contêm diversas funcionalidades: O SP é um registo de 6 bits controlado pelo sinal SPC (2 bits). Quando SPC=0, o valor de SP não é alterado (hold). Quando SPC=1, o SP é incrementado de uma unidade (SP SP+1). Quando SPC=2, o SP é decrementado de uma unidade (SP SP-1); O PC é um registo de 6 bits controlado pelo sinal PCC (2 bits). Quando PCC=0, o valor de PC não é alterado. Quando PCC=1, o PC é incrementado de uma unidade (PC PC+1). Quando PCC=2, o registo PC é carregado com os 6 bits menos significativos da RAM (PC address). Quando PCC=3, são adicionados ao PC os 6 bits menos significativos da RAM (PC PC + offset). Atenção que esta informação, offset e address, provém da RAM e não do registo IR. ATENÇÃO que o valor do campo offset e address que devem ser colocados à entrada do PC provêm da memória RAM e não do registo IR. 3.3 Conjunto de Instruções O conjunto de instruções que se pretendem implementar no computador durante a primeira semana estão descritas na tabela 2: Tabela 2- Instruções assembly a implementar na 1ª semana
Os grupos devem programar apenas parte das instruções apresentadas na tabela 2 de acordo com o número do grupo como especificado na tabela 3. Todos os grupos devem implementar as instruções com opcode 0 a 6. Tome atenção ao ponto 4.1.3 porque apesar de não ser necessário microprogramar algumas instruções os alunos devem apresentar os fluxogramas ASM de todas as instruções da tabela. Tabela 3- Distribuição de trabalho para os vários grupos A ROM programada e fornecida pelo corpo docente que os alunos deverão utilizar na segunda semana implementa as instruções descritas na tabela 4: Tabela 4- Instruções assembly fornecidas para a 2ª semana 3.4 Unidade de Controlo Microprogramado A UC é constituída por uma ROM de 64x35 bits, pelo Control Address Register (CAR), que contém o endereço da microinstrução a ser executada e inicializado a 0, e pelos Muxes C e R, cuja função é controlar o sequenciamento das microinstruções contidas na ROM (ver abaixo a descrição mais pormenorizada). O CAR não é um simples registo, mas sim um contador que pode ser incrementado (L/CNT = 1) ou carregado em paralelo (L/CNT =0). A ROM deverá conter os microprogramas que permitem controlar o computador. Cada instrução de assembly contida na RAM contém um OpCode de 4 bits que corresponde aos 4 bits menos significativos do endereço da ROM. A palavra da ROM contida no endereço que é constituído por 01 seguido do OPCODE, marca o início do microprograma que executa essa instrução de assembly. Por exemplo, se a instrução assembly MOVI DR,Op, que carrega o registo DR com a constante Op, tivesse o OpCode = AAAA o início do microprograma que executa essa instrução começaria no endereço 01AAAA da ROM. O formato de cada palavra da ROM de controlo (35 bits) é o seguinte:
Em que: NADR (6 bits): Next Address. Endereço da próxima microinstrução na ROM; MC (1 bit): selecciona endereço a carregar no CAR (0=NADR, 1=01 OpCode); MR (2 bits): Mux de Selecção de Carregamento e Controlo do CAR (00=carrega CAR, 01=incrementa CAR, 0=salta se N=1, 11=salta se C=0); IRW (1bit): controla a escrita no Instruction Register (0=hold; 1=write); DT (1bit): bit mais significativo do sinal Dsel. Permite aceder ao registo Rt quando DT=1; M Dsel (2 bits): selecciona os 3 bits menos significativos do sinal Dsel de acordo com a figura 2; RW (1 bit): controla a escrita nos registos da UA (0=hold; 1=write); AT (1 bit): bit mais significativo do sinal Asel. Permite aceder ao registo Rt quando AT=1; M Asel (2 bits): selecciona os 3 bits menos significativos do sinal Asel de acordo com a figura 2; BT (1 bit): bit mais significativo do sinal Bsel. Permite aceder ao registo Rt quando BT=1; M Bsel (2 bits): selecciona os 3 bits menos significativos do sinal Bsel de acordo com a figura 2; MA (1 bit): selecciona operando X da UF (MA=0: X=registo da UA seleccionado por Asel; MA=1: X=constante proveniente do 6 bits menos significativos do IR); MB (2 bits): selecciona operando Y da UF (MB=00: Y = registo da UA seleccionado por Bsel; MB=01: Y=dado contido na RAM; MB=10: Y=SP); FS (3 bits): selecciona operação a executar na UF de acordo com a tabela 1; FW (1 bit): controla a escrita nos registos que guardam as flags C e N (0=hold; 1=write); MW (1 bit): controla a escrita na RAM (0=read;1=write); MD(1 bit): controla os dados escritos na RAM. Se MD=0 é escrito na RAM o conteúdo do registo ndereçado por ASel. Se MD=1 é escrito na RAM o valor do PC. MM (2 bits): selecciona endereço para RAM (MM=00: endereço provém do registo da UA escolhido por Bsel; MM=01: endereço provém de SP; MM=10: endereço provém do PC); PCC (2 bits): controla a operação do PC (PCC=00: hold; PCC=01: PC PC+1; PCC=10: PC address; PCC=11: PC PC + offset); SPC (2 bits): controla a operação do SP (SPC=00: hold; SPC=01: SP SP+1; SPC=10: SP SP-1). 4 PROJECTO O trabalho consistirá essencialmente no projecto e programação das microinstruções que implementam na UC o conjunto de instruções assembly definido para o computador. O trabalho da segunda semana consiste em fazer um programa utilizando as instruções assembly disponíveis numa ROM previamente programada pelo corpo docente. 4.1 Microprogramação do Conjunto de Instruções (1ª semana) 4.1.1 Identifique justificando, quais das instruções da tabela 2 necessitam de mais que uma microinstrução para ser implementadas (para além do IF e o EX0). 4.1.2 Defina quais os valores das variáveis de controlo da ROM para todas as instruções indicadas na tabela 2 que só necessitam de uma microinstrução para ser implementadas. 4.1.3 Crie os fluxogramas ASM das microrotinas das instruções que necessitam de mais do que 1 microinstrução, indicando mnemónicas, endereços e transferências de registos em cada estado, para todas as instruções indicadas na tabela 2. Os alunos devem ter o cuidado de realizar os diagramas com o mínimo de estados possíveis, correspondendo a cada estado um endereço da ROM. 4.1.4 Note que só é possível armazenar dados nos bits menos significativos da memória RAM. Indique o que devia alterar na estrutura do computador para que fosse possível ter duas microinstruções distintas STRDOWN M[RB],RA e STRUP M[RB],RA em que o armazenamento do registo RA na memória é feito respectivamente nos bits mais significativos (STRUP) ou nos menos significativos (STRDOWN). 4.1.5 Note também que a Unidade Funcional descrita na tabela 1 não possui forma de fazer deslocamentos. No entanto a implementação de um controlo microprogramado alarga a flexibilidade das operações da UF. Indique o fluxograma
ASM da instrução SHL DR, RA (shift à esquerda de RA bits do registo DR) sem alterar a arquitectura definida. Por exemplo, se DR= 000001 e RA = 000010 então após esta instrução o conteúdo de DR será 000100. 4.2 Programação da ROM (1ª semana) 4.2.1 Preencha uma tabela com o conteúdo da ROM (Anexo A) de acordo com as alíneas 4.1.2 e 4.1.3 apenas para as instruções com opcode 0 a 6 e para a instrução especificada na tabela 3 de acordo com o número do grupo e também para as microinstruções Instruction Fetch (IF) e Execute (EX0). Apresente a tabela em binário em que as colunas correspondem a cada variável de controlo. Os endereços da ROM 01000 a 011111 que não forem necessários (porque nenhum grupo irá programar toda a tabela) devem ser deixados a branco. Não se esqueça que todas as indiferenças devem ser assinaladas. 4.2.2 Programe e teste a ROM no Xilinx. 4.3 Programa assembly (2ª semana) Na segunda semana e a partir das instruções da tabela 4 os alunos deverão criar um programa que execute a divisão de números binários de 6 bits (positivos ou negativos no formato complemento para 2). Antes de escrever o código quer do programa principal quer da rotina, os alunos deverão realizar um fluxograma dos mesmos descrevendo a metodologia usada na implementação. 4.3.1 Rotina: Os alunos deverão criar uma rotina em código assembly que execute a divisão inteira de dois números binários de 6 bits (positivos ou negativos no formato complemento para 2). Os operadores devem ser passados à rotina de acordo com a seguinte tabela: Tabela 5- Descrição da subrotina a implementar para os vários turnos Grupos Dividendo Divisor Resultado 1 e 2 M[R7] Stack Stack 3 e 4 R7 R8 Stack 5 e 6 Stack Stack R7 7 e 8 M[R7] M[R8] R7 A divisão deverá ser executada utilizando um algoritmo de somas sucessivas até que a soma parcial ultra-se o valor do dividendo. Deverá passar ambos os argumentos para positivos e ajustar o sinal do resultado de acordo com o sinal original dos operandos. 4.3.2 Programa principal: Os alunos devem criar um programa principal que deverá chamar a rotina especificada anteriormente de forma a executar 3 operações distintas com dados contidos na memória. A programação das memórias de microinstruções (ROM) e de instruções/dados/pilha (RAM) está de acordo com o documento explicativo apresentado no trabalho laboratorial 2. Os dados a multiplicar assim como o seu resultado devem ser colocados na memória RAM de acordo com a figura seguinte: Figura 4- Distribuição de endereços da RAM para dados, programa e pilha
Na aula o docente indicará quais os valores A a F que devem ser colocados nos endereços de memória indicados na figura de forma a testar o correcto funcionamento do programa criado pelos alunos. Pode acontecer que o programa mais as rotina criadas pelos alunos necessitem de mais do que 50 endereços. Nesse caso a figura 4 não será possível de respeitar e os alunos devem deslocar a zona de dados mais para baixo, retirando espaço reservado para a pilha. Os grupos que o fizerem serão penalizados no relatório. 5 FASEAMENTO E RELATÓRIO O trabalho decorrerá durante 2 semanas, devendo ser discutido e apresentado durante a segunda aula de laboratório. As aulas de laboratório destinam-se, essencialmente, à correcção de erros e bugs e a tirar dúvidas que possam existir sobre a implementação do projecto. O trabalho deverá ser planeado e desenvolvido, tanto quanto possível, fora do horário de laboratório, sendo impossível realizá-lo sem qualquer preparação prévia e apenas durante as 3 horas de laboratório. Tendo em consideração estes aspectos, o trabalho desenvolvido será avaliado por fases. Assim: 1ª SEMANA No início da 1ª aula de laboratório os alunos deverão apresentar o trabalho correspondente às alíneas 4.1 e 4.2. Em particular, deve ser apresentada a tabela do ponto 4.2.1, os fluxogramas ASM do ponto 4.1.3 e as respostas às perguntas feitas nos pontos 4.1.4 e 4.1.5. Serão fornecidas várias RAM (ver anexo B) que contêm pequenos programas para testar as instruções assembly microprogramadas na ROM pelo alunos. 2ª SEMANA No início da 2ª aula de laboratório os alunos deverão apresentar o trabalho correspondente à alínea 4.3. Deve ser testado na aula o programa assembly feito pelos alunos. Os alunos devem entregar um relatório no máximo com 10 páginas descrevendo as decisões tomadas no desenvolvimento do projecto, os fluxogramas especificados no ponto 4.3 e o código do programa devidamente comentado. Não se esqueça também de apresentar uma pequena introdução, conclusão e comentários aos testes realizados na 1ª semana. 6 AVALIAÇÃO A avaliação do projecto será realizada parcelarmente e de acordo com os seguintes pontos: Fluxogramas ASM do ponto 4.1.3 (5 val) Respostas às perguntas 4.1.4 e 4.1.5 (2 val) Funcionamento da Unidade de Controlo Microprogramado (5 Val.) Funcionamento do Programa assembly: Rotina + programa principal (6+2 Val.) Nota a prova do correcto funcionamento deve, sempre, incluir um diagrama temporal com um teste completo sobre as funcionalidades em avaliação. 7 BIBLIOGRAFIA [1] Nuno Horta, Manual de Introdução ao Xilinx, 2007 [2] N. Horta, Microprocessadores Unidade de Processamento, Aulas Teóricas, 2007. [3] M. Morris Mano, Charles R. Kime, Logic and Computer Design Fundamentals, 2nd Edition Updated, Prentice- Hall International, 2001. [4] G. Arroz, J. Monteiro, A. Oliveira, Arquitectura de Computadores: dos Sistemas Digitais aos Microprocessadores, IST Press, 2007. [5] J. Delgado, C. Ribeiro, Arquitectura de Computadores, FCA, 2006.