• Nenhum resultado encontrado

Implementação de hardware

8.3 Implementação usando uma FPGA

8.3.3 Implementação de hardware

Há três problemas principais com os quais é necessário lidar quando uma implementação de hardware com uma FPGA é considerada:

• Notação

• Função de activação

• Capacidades do dispositivo FPGA a utilizar.

A notação é um assunto chave na implementação de hardware. É quase consensual que a notação de vírgula flutuante deve ser utilizada se uma resolução elevada for pretendida com um número mais baixo de bits. O problema aqui é a complexidade resultante das operações necessárias (multiplicação, divisão, soma) com esta notação.

A função de activação é particularmente difícil de implementar no caso das funções sigmoidais. A implementação directa, por exemplo, da tangente hiperbólica requereria um somador, um multiplicador e uma função exponencial.

Os problemas indicados podem ser resolvidos se a capacidade do hardware disponí- vel for suficiente, uma vez que são as potencialidades do dispositivo que limitam as soluções possíveis.

Notação

A notação escolhida foi a de vírgula flutuante com 32 bits de acordo com a norma IEEE 754-1985.

Embora fosse afirmado em [130] que “Algumas tentativas foram feitas para im- plementar RNs em FPGAs com pesos em vírgula flutuante. Apesar disso, nenhuma implementação bem sucedida foi apresentada até à data”, e de [131] ter concluído que “a precisão de vírgula flutuante não é ainda praticável em RNs implementadas com FPGAs”, existiam já pelo menos duas aplicações descritas que usaram a notação de vírgula flutuante. Em [127] de 17 bits e em [132] de 24 bits.

A notação de vírgula fixa requereria um número maior de bits para obter a mesma resolução e o mesmo número máximo a ser representado.

Outras soluções poderiam passar pela aritmética de pulse stream [126] ou de bits- tream [133].

8.3. Implementação usando uma FPGA 153 Função de activação

No trabalho actual, a função de activação utilizada foi a tangente hiperbólica (equação 8.3).

f(x) = e

x− e−x

ex+ e−x (8.3)

Esta equação pode ser rearranjada de modo a que tenha somente uma função expo- nencial mas ainda requer as operações de soma, de divisão e o cálculo da exponencial. Percebendo que a implementação directa não é apropriada para a solução actual, a tangente hiperbólica foi estudada de forma a simplificar a sua implementação.

Como o objectivo deste trabalho estava definido desde o início, era possível estabele- cer um erro máximo e usar uma aproximação clássica com uma LUT. Esta possibilidade foi testada, mas rapidamente se verificou que esta solução seria demasiado dispendiosa em termos de hardware.

Uma nova aproximação foi então testada: aproximação linear por secções. Isto corresponde a uma das soluções clássicas para a implementação da função da activação [130], mas neste caso com uma variante importante.

Enquanto a maioria das soluções foram feitas usando somente três secções lineares para aproximar a tangente hiperbólica, a decisão aqui foi de usar tantas secções quantas as necessárias para obter a precisão previamente definida.

Com este objectivo, foi realizado um estudo para preparar as secções lineares e para determinar quantas eram necessárias. Após ter reduzido a tangente hiperbólica à parte essencial que necessita ser representada, foi implementado o seguinte algoritmo:

1o Escolher a primeira secção linear.

2o Comparar esta aproximação linear com a tangente hiperbólica do

MATLAB até o erro máximo permitido ser atingido.

3o Começar uma nova secção linear.

4o Repetir a operação até que a região considerada importante esteja

completamente representada.

Este algoritmo conduziu à representação da tangente hiperbólica com 256 secções lineares e fornece um erro máximo de 0,0000218 nos valores de saída que estão na gama [ - 1 , 1 ].

Este valor pode ser comparado com outras soluções como a que utilizou a série de Taylor em [127], que obteve um erro de 0,51% e a aproximação linear por secções usada em [132], que obteve 0,0254 “de desvio padrão com respeito à forma analítica” da função.

Vale a pena notar que para obter este erro com uma aproximação clássica com LUT seriam necessárias 18110 amostras da função. Estas amostras representadas na notação de 32 bits que foi utilizada requereriam mais do que uma única FPGA do tipo usado, apenas para representar a função de activação.

Plataforma de hardware

A plataforma de hardware usada é a Cyclone EP1C20F324C7 FPGA da ALTERA, no kit cyclone SmartPack da Parallax que pode ser visto na figura 8.2.

Esta FPGA é composta por 20060 elementos lógicos (do inglês Logic Elements - LE), 294912 bits de memória e duas Phase Locked Loops. O kit Cyclone SmartPack inclui um porto RS-232, um porto JTAG (Joint Test Action Group), 8Mbit de memória flash para armazenar a configuração do dispositivo e o conteúdo da memória para arranque após power-up, um oscilador de 50-MHz e 128 pinos de Input/Output.

O desenvolvimento do circuito foi feito no ambiente Quartus II.

Figura 8.2: Imagem do kit do cyclone SmartPack. Implementação

As potencialidades do dispositivo limitam as escolhas que podem ser feitas porque no final, o projecto escolhido tem que caber no hardware.

A elevada resolução escolhida limita a quantidade de hardware que é possível colocar na FPGA e foi decidido reduzir o hardware ao mínimo indispensável para implementar uma FNN.

O ANNP foi desenvolvido usando a linguagem Very High Speed Integrated Circuits Hardware Description Language ( VHDL) e implementa os seguintes componentes:

• Multiplicador de 32 bits em notação de vírgula flutuante. • Somador de 32 bits em notação de vírgula flutuante. • Função de activação.

8.3. Implementação usando uma FPGA 155 • Blocos de memória.

• Três máquinas de estados.

• Comunicação série usando o protocolo RS-232.

Os blocos de memória são usados para guardar os pesos, as entradas e os resultados parciais e finais. As três máquinas de estados são usadas para controlar a operação do ANNP e os dados de entrada e de saída através da porta RS-232.

A estrutura básica é composta por um multiplicador, um somador e uma função de activação (figura 8.3) e tem de ser usada diversas vezes para implementar a RN.

Entradas Multiplicador Pesos Somador e Acumulador Funcão de Activação

Figura 8.3: Estrutura lógica do bloco de processamento básico no ANNP O ANNP está preparado para implementar RNs até 16 neurónios por camada e até 17 camadas.

O número de LEs usado é de 4.446, o que significa 22% do número total de LEs disponível.

A implementação da função de activação usa três ROMs de 256x32 bits, ou seja 24,576 bits, que são implementados em 6 blocos de 256x16 bits.

A implementação completa usa 235,008 bits, que são de facto 285,696 se forem contados os bits de paridade (e outros que são usados para funções especiais), de uma quantidade total de 294,912 bits disponíveis, o que significa que 96,9% dos bits foram usados (somente 2 blocos de 4096 bits não foram utilizados) e esta é a limitação real para implementar uma arquitectura maior que poderia ter sido expandida no número de blocos de processamento básico utilizado ou ampliando a capacidade funcional deste bloco.

Do total da memória, a maior parte foi utilizada para armazenar os pesos, uma vez que o ANNP reservou memória para uma quantidade máxima de 6,416 pesos, incluindo os de deslocamento.

O número máximo de entradas que o ANNP está preparado para processar é de 16. O protocolo de comunicação série, RS-232 está configurado para funcionar a 115200 bps, uma vez que a comunicação é feita com um start bit e um stop bit, isto significa 11520 Bps.