Máquinas de Pilha - Arquitecturas de 16 bits


4 - Arquitecturas de 16 bits

A principal razão para existirem máquinas de pilha de 16 bits é que o modelo de programação da linguagem Forth era tradicionalmente de 16 bits.
Normalmente os programas em Forth eram menores do que 32K e as implementações dos primeiros compiladores Forth tinham um intervalo de 64K para os endereços. Estes 64K são normalmente suficientes para um programa de uma máquina de pilha.

O processador descrito neste capítulo, Harris RTX 2000, é direccionado para o mercado de aplicações embutidas. Estas aplicações exigem um processador pequeno com pouca capacidade de memória para satisfazer requisitos de consumo, peso, preço e tamanho. Um processador de 16 bits é muitas vezes um bom compromisso entre performance e custo.

4.1 - Harris RTX 2000

4.1.1 - Introdução

O Harris Real Time Express 2000 é uma máquina de pilha de 16 bits, descendente do Novix NC4016. O RTX 2000 tem um elevado nível de integração. Inclui não só o núcleo do processador como também memórias de pilha, multiplicador em hardware e temporizadores num único chip.

4.1.2 - Diagrama

É possível verificar no diagrama anterior que o Harris RTX 2000 possui, dentro do chip, uma pilha de endereços de retorno de 256 elementos, uma pilha de dados de 256 elementos, um multiplicador de 16x16 bits num único ciclo, 4 temporizadores e um controlador de interrupções por prioridades.

A ALU tem um buffer de dois elementos para os elementos de topo da pilha de dados: T para o elemento de topo da pilha e Y para o segundo elemento de topo. Possui um registo SR para calcular a raiz quadrada de um inteiro e um registo MD para suporte a multiplicações e divisões. A ALU pode efectuar operações com o registo T e um dos registos Y, MD ou SR.

Para permitir o interface com outros processadores não RTX através de memória partilhada, o RTX tem uma unidade de Byte-swapping que lhe permite ler e escrever valores de memória de 16 bits com o bit mais significativo tanto no endereço par como no ímpar.

O RTX 2000 tem a capacidade de saltar entre blocos adjacentes de memória quando efectua saltos condicionais, assim como gere as interrupções causadas por um overflow/underflow da pilha.

4.1.3 - Características

A estrutura interna do RTX 2000 está optimizada para fornecer uma execução de instruções num único ciclo de relógio. Todas as instruções, excepto leitura e escrita de memória executam num único ciclo de memória. O RTX 2000 permite que algumas sequências de instruções Forth possam ser combinadas num única instrução. Uma característica chave é fornecida pelo bit de retorno que permite, em certas situações, combinar retornos de subrotinas com operações da ALU.

4.1.4 - Implementação

O RTX 2000 é implementado com uma tecnologia de 2.0 microns, numa célula CMOS standard, empacotado num Pin Grid Array (PGA) de 84 pinos. O RTX 2000 corre a 10 Mhz. Uma grande vantagem da tecnologia de células é que a RAM e componentes lógicos podem estar no mesmo chip, permitindo que a pilha de endereços de retorno e a pilha de dados sejam colocada no mesmo chip.

Como o RTX 2000 executa a maioria das instruções, incluindo saltos condicionais e chamada a subrotinas, num único ciclo de relógio, existe um período de tempo entre o início do ciclo de relógio e o tempo em que o endereço de memória é válido para obter a próxima instrução. Este tempo é aproximadamente metade do ciclo de relógio, o que implica que a memória tenha de ser aproximadamente duas vezes mais rápida que o ciclo de relógio.

O RTX 2000 obtém muitas das suas capacidades pelo facto de ser construído com uma tecnologia de células em vez de um conjunto de portões lógicos. Ao contrário dos portões lógicos, as células permitem que um conjunto de funções lógicas seja arbitrariamente colocada no silicone. Esta flexibilidade permite a existência de células RAM no próprio chip.

4.1.5 - Áreas de aplicação

Algumas das possíveis aplicações deste processador incluem impressoras laser, placas gráficas, telecomunicações, reconhecimento óptico, processamento de sinal e aplicações militares de controlo.

4.1.6 - Formato das instruções

4.1.6.1 - Chamada a subrotinas

Bit 15 tem sempre o valor 0.
Bits 0-14 contêm o endereço da subrotina, limitando os programas a palavras de memória de 32K.

4.1.6.2 - Saltos condicionais

Bits 13-15 têm o valor constante 100, que especifica uma instrução condicional.
Bits 11 e 12 seleccionam o tipo de salto.
Bits 9 e 10 controlam um incrementador/decrementador para os 6 bits mais altos do endereço destino para permitir saltar na mesma página de memória de 512 bytes, para páginas adjacentes ou para a página 0.
Bits 0-8 especificam o endereço destino.

4.1.6.3 - Operações da ALU

Bits 12-15 e bit 4 têm valor constante 1010 e 0, indicando uma operação normal da ALU.
Bits 8-11 indicam o tipo de operação.
Bit 7 controla se o resultado da ALU é ou não invertido.
Bit 6 não é usado.
Bit 5 indica retorno de uma subrotina. Isto permite que os retornos de subrotinas sejam combinados com operações anteriores da ALU.
Bits 0-3 controlam a operação de shift a realizar no resultado proveniente da ALU.

4.1.6.4 - Operações da ALU em modo multi-step

Este modo é usado nos passos repetidos de operações de multiplicação e divisão.

Bits 12-15 e bit 4 têm valor constante 1010 e 1, indicando uma operação multi-step da ALU.
Bits 9-11 indicam o tipo de operação.
Bit 8 selecciona entre os registos MD e SR.
Bit 6 e 7 campo de funções de controlo.
Bit 5 indica retorno de uma subrotina.
Bits 0-3 controlam a operação de shift a realizar no resultado proveniente da ALU.

4.1.6.5 - Acesso à memória

Bits 13-15 têm valor constante 111, indicando acesso à memória.
Bits 12 selecciona entre um acesso por bytes ou por palavra.
Bits 8-11 indicam a operação a executar na ALU.
Bits 6 e 7 indicam se é uma operação de leitura ou escrita.
Bit 5 indica retorno de uma subrotina.
Bits 0-4 especificam uma pequena constante que pode ser adicionada ou subtraída ao valor do registo T para efectuar uma operação de endereçamento.

Estas instruções demoram dois ciclos de relógio: um para a obtenção da instrução e outra para leitura ou escrita do operando. O endereço de memória é sempre obtido a partir do registo T.

4.2 - Outras máquinas de pilha de 16 bits

Várias outras máquina de pilha de 16 bits foram desenhadas, entre as quais saliento:

WISC CPU/16 - é uma máquina de 16 bits que proporciona uma memória de microcódigo totalmente programável pelo utilizador, daí o nome Writable Instruction Set Computer. É um processador simples, rápido e bastante flexível. O uso de RAM para memória de microcódigo e o formato simples da instruções tornam o processador bastante interessante para estudo das máquinas de pilha.

MISC M17 - processador desenvolvido pela Minimum Instruction Set Computer, Inc. orientado para o mercado das aplicações embutidas. De forma a conseguir um baixo custo o M17 mantém as suas duas pilhas na memória do programa com alguns registos de topo da pilha dentro do chip. Foi desenhado para aplicações embebidas de controlo de grandes dimensões em que um processador de baixo custo e elevada performance é exigido.

Novix NC4016 - é um processador de 16 bits desenhado para executar primitivas da linguagem de programação Forth. Foi o primeiro processador Forth a ser desenhado e foi seguido por muitas outras implementações de máquinas de  pilha. Foi desenvolvido para aplicações de controlo em tempo real e executar rapidamente programas em Forth. Usa memórias dedicadas, fora do chip, para as pilhas de dados e de endereços de retorno. Estas duas pilhas e o bus de dados da RAM estão ligados por três grupos separados de pinos, permitindo a execução da maioria das instruções num único ciclo de relógio.