• Nenhum resultado encontrado

4.4.1 – Transferência de dados genérica entre PC e FPGA

Utilizando um mecanismo USB-EPP idêntico ao previamente estudado na secção 4.3, este projeto baseado no Xilinx SDK está orientado para a receção e envio de palavras de 32 bits usando endereços de até 32 bits. As funções utilizadas permanecem DoPutReg() e

DoGetReg(), da API da aplicação Adept 2, tendo por parâmetros szByte e szRegister para

palavra de dados e de endereço respetivamente. Irá realizar-se de seguida a apresentação do processo de inicialização do código desenvolvido na aplicação Xilinx SDK no microprocessador MicroBlaze.

Figura 96 - Procedimento básico de operação das aplicações criadas usando Xilinx SDK

A figura 96 representa a seguinte sequência de operações:

• A aplicação Xilinx SDK programa o ficheiro “ELF”, relativo ao código produzido na linguagem C para operação usando o microprocessador MicroBlaze, e o ficheiro “BitStream”, relativo ao hardware a instanciar que foi criado na aplicação Xilinx XPS; • Programada a FPGA, a aplicação em funcionamento no IC inicializa as variáveis

90

o serviço de atendimento a interrupções do MicroBlaze de forma a servir o protocolo USB-EPP;

• De seguida é alocada a área de memória interna pretendida para armazenamento de dados, caso seja necessária e esteja configurada essa operação;

• A aplicação entra então num ciclo while que permita que a aplicação não termine, ficando assim disponível a atender as interrupções originadas pelo protocolo USB- EPP.

A configuração do serviço de UART e do serviço de atendimento a interrupções é realizado usando funções das bibliotecas disponibilizadas para MicroBlaze para ambos os serviços. No caso dos diversos projetos apresentados, as bibliotecas usadas foram “xuartns550_l” e “xintc” respetivamente para UART e serviço de atendimento a interrupções, através da associação dos headers de cada biblioteca ao projeto em C. Quanto aos identificadores dos dispositivos instanciados, cujo conhecimento é essencial a esta configuração, podem ser obtidos no header “xparameters.h”. Um exemplo de configuração de ambos os dispositivos está presente no anexo H, onde os identificadores mencionados começam pelo termo “XPAR”.

O serviço de atendimento a interrupções funciona de forma sequencial: dado que as palavras a guardar são de 32 Bit, e cada ciclo de leitura ou escrita de dados através de USB- EPP só é capaz de transmitir 8 Bit, são necessários quatro ciclos para a totalidade da palavra estar disponível à FPGA e durante esse processo receber até 32 Bit de endereço.

Comece-se por conhecer a aplicação que inicia a interrupção, em funcionamento num PC. No caso da operação de escrita de um valor de 32 Bit num determinado endereço, a aplicação de consola em operação no Computador é invocada com três parâmetros:

• O identificador de tipo de operação pretendida (escrita) e o endereço alvo dessa operação;

• O identificador de nome do dispositivo e o nome configurado pelo utilizador ou por omissão para a placa alvo dessa operação;

• O identificador de valor a carregar seguido do mesmo.

Conhecidos e validados os valores introduzidos inicia-se o procedimento de envio de dados. A figura 97 apresenta o procedimento genérico de armazenamento de valores em registos da FPGA, blocos de RAM embutida ou nas memórias periféricas baseadas em SDRAM. Segue-se o procedimento associado ao serviço a interrupções que tem lugar na placa com FPGA:

• É recebido o primeiro par de Bytes de dados e endereço sendo ambos armazenados temporariamente; é realizado um deslocamento à esquerda da informação recebida, até ao Bit 31 (correspondendo aos bits mais significativos);

• É recebido o segundo Byte de dados e endereço e realizados novos deslocamentos à esquerda até ao Bit 23, sendo somados às respetivas variáveis temporárias;

• É recebido o terceiro Byte de dados e endereço e repetido o procedimento anterior até ao Bit 15;

91 • É recebido o quarto e último Byte de dados e endereço: os dados estão presentes na totalidade na FPGA e podem ser armazenados na memória alvo da operação, na posição indicada pelo endereço recebido.

Figura 97 - Envio de 32 bits de endereço e 32 bits de dados para a FPGA

Para o procedimento de leitura as operações são similares. Para a execução da aplicação de consola, em operação num Computador, são fornecidos dois parâmetros à aplicação, a saber:

• O identificador de tipo de operação pretendida (leitura) e o endereço alvo dessa operação;

• O identificador de nome do dispositivo e o nome configurado pelo utilizador ou por omissão para a placa alvo dessa operação.

Inicia-se o procedimento de leitura de dados. Neste exemplo, ilustrado pela figura 98, os endereços e os dados serão de 32 Bit:

• A aplicação realiza as três operação iniciais de leitura enviando os três primeiros Bytes do endereço;

• Atingida a quarta operação estará disponível todo o endereço para utilização; é realizada a operação de leitura na memória alvo das aplicações;

• Na mesma iteração é retornado, através do canal USB-EPP, o Byte mais significativo da palavra de 32 Bit lida; esse valor é recebido na aplicação de consola que opera no PC, sendo armazenado numa variável temporária e deslocado até ao Bit 31.

• São repetidos os procedimentos de envio de dados, sendo os dados que correspondem à iteração da operação retornados ao PC; concluída a receção o valor é armazenado ou mantido numa variável temporária e impresso para leitura pelo utilizador.

92

Figura 98 - Envio de 32 bits de endereço e receção de 32 bits de dados da FPGA

Este é o procedimento genérico de escrita e leitura em memórias voláteis, incluindo a memória interna da FPGA na forma de blocos RAM e as memórias SDRAM e DDR2-SDRAM presentes na Nexys 2 e Atlys respetivamente. Se no caso da memória interna é possível realizar armazenamento e leitura através da alocação de memória, usando para tal a função “malloc()” da biblioteca de ANSI C “stdlib”, no caso das memórias externas voláteis é possível escrita e leitura usando funções da biblioteca “xio” disponibilizada para MicroBlaze: “xio_out32()” para escrita de valores de 32 bits e “xio_in32()” para leitura, por exemplo.

Estas funções são utilizadas igualmente para escrita e leitura das memórias não voláteis sendo no entanto incluídas em funções mais complexas. De facto a escrita e leitura destes periféricos obrigam à escrita e leitura de palavras de comando que inicializam as memórias Flash nos modos de leitura ou escrita. Nas secções onde serão apresentados os projetos que realizam comunicações que usam as memórias Flash presentes em ambas as placas serão introduzidos os procedimentos para o seu acesso.

Faça-se uma referência final ao facto de que a utilização de todas as iterações de envio ou leitura de dados e endereço do modelo apresentado não serem implementados em todos os projetos. Isto acontece porque as memórias que são endereçadas não têm uma dimensão que o justifique. No caso da memória interna os projetos endereçam um número reduzido de posições de memória, exclusivamente para validação do mecanismo de transferência de dados, totalizando 256 posições de 32 bits cada. No caso das memórias externas da placa Nexys 2 e da Flash presente na Atlys, todas com 128 Mbits, é possível realizar o endereçamento de forma alinhada ao Byte. No primeiro caso são suficientes 8 bits de

93 endereço e no segundo são suficientes 24 bits, algo que se reflete nos projetos implementados.

Quando aos comandos de escrita e leitura dos diversos projetos que usam comunicação USB-EPP, e que dependem de aplicações de consola operando num PC, deverão ser utilizados da seguinte forma:

• Operação de escrita de uma palavra: “’executavel.exe’ –p XXX –d YYY –b WWW”

onde “XXX” representa o endereço onde a palavra será escrita, “YYY” representa o dispositivo alvo (podendo ser “DOnbUsb” ou “Atlys” para Nexys 2 e Atlys respetivamente, por omissão) e “WWW” representa o valor de até 32 bits que se pretende escrever;

• Operação de leitura:

“’executavel.exe’ –g XXX –d YYY”

onde os valores são idênticos aos apresentados para a operação de escrita; • Operação de leitura de várias palavras de um ficheiro:

“’executavel.exe’ –s XXX –d YYY –b WWW –f ZZZ”

onde “XXX” representa o endereço inicial onde se começarão a escrever as palavras, “WWW” é a quantidade de palavras a escrever e “ZZZ” representa o nome do ficheiro do qual serão lidas as palavras a escrever na memória alvo;

• Operação de escrita num ficheiro de várias palavras presentes na memória alvo: “’executavel.exe’ –r XXX –d YYY –b WWW –f ZZZ” onde os valores são idênticos aos já apresentados para a operação de leitura de várias palavras de um ficheiro.

Conclui-se assim a apresentação do procedimento genérico de comunicação entre PC e FPGA usando o serviço de atendimento a interrupções disponível no microprocessador MicroBlaze, e que implementa um protocolo USB-EPP.

4.4.2 – Implementação de microprocessador Microblaze na