• Nenhum resultado encontrado

4.2 Implementação

4.2.1 MIPSfpga

Para a implementação do MIPSfpga na placa FPGA foi utilizado o tutorial dispo-nibilizado pela ((IMAGINATION, 2015)). No entanto, o tutorial fora desenvolvido para implementação nos kits Nexys4 DDR e DE2-115, enquanto que o kit utilizado para este projeto é oDE1-SoC. Algumas modificações foram realizadas nos códigos fornecidos como pode ser visto a seguir:

∙ Um arquivoTop-Level foi criado para conectar o núcleo do MIPSfpga a placa FPGA.

O arquivo criado pode ser visto na Figura 19, onde fica visível a possibilidade de o MIPSfpga utilizar periféricos da placa, como os 10 switches, os 4 pushbuttons e os 10 LEDs vermelhos.

∙ O tamanho da memória RAM de reset e da usada nos programas do MIPSfpga foram diminuídas de acordo com o disponibilizado pelo kit DE1-SoC. Pelo arquivo mipsfpga ahb const o parâmetro da memória de reset foi diminuído de 15 para 14, o que significa que 214 palavras, ou 64KB, agora serão usadas. Já o parâmetro da memória usada nos programas foi diminuído de 16 para 15, ou seja, 215 palavras, representando 128KB.

∙ Um arquivoconstraintscontendo o mapeamento dos sinais aos seus respectivos pinos precisa ser criado. Para tanto foi gerado um arquivo *.qsf que utiliza o endereço dos pinos para mapear os sinais de acordo com o descrito.

Após as alterações realizadas e para efeito de teste, os arquivos ram reset init.txt e ram program init.txt, que são fornecidos, foram adicionados a pasta de arquivos do MIPSfpga e modificados. Estes arquivos são os responsáveis por informar ao processador MIPSfpga as instruções a serem executadas. Os testes realizados podem ser observados no Anexo A.

4.2. Implementação 45

Figura 19: Top-Level do MIPSfpga.

4.2.1.1 Adição de Periféricos ao MIPSfpga

Instruções de como adicionar periféricos ao MIPSfpga são nessa seção descritas. As instruções aqui contidas se limitam a adição dos displays de 7 segmentos, para amostragem da FHR estimada, e de um pino GPIO, que servirá como o pino TX da UART, mas elas podem ser utilizadas para acrescentar quaisquer outros periféricos disponíveis no DE1-SoC.

4.2.1.1.1 Modificação do top-level do MIPSfpga

O top-level do MIPSfpga é a parte de mais alto nível deste sistema e, portanto, é nela que se encontram os elementos de entrada e saída de acesso aos periféricos e ao processador. Para adicionar periféricos é necessário que se crie saídas para os displays de 7 segmentos e para o pinoGPIO. Tendo em vista que oDE1-SoC possui 6displays, foram criados 6 vetores de saída com 7 elementos cada: [6:0]HEX0 a [6:0]HEX5 e, como estamos interessados apenas no envio da informação através de um protocolo UART, foi criada uma saída TX para esse fim. O módulo mipsfpga sys é instanciado pelotop-level, o que nos refere a acrescentar as saídas criadas ao módulo instanciado. Já o módulo mipsfpga sys instancia o módulo mipsfpga ahb, o qual as saídas também devem ser acrescentadas.

Novamente há uma instanciação, mas agora para o módulo mipsfpga ahb gpio, ao qual

46 Capítulo 4. Sistema Proposto e Implementação

as saídas são também adicionadas. O módulo mipsfpga ahb gpio merece uma atenção especial e as modificações feitas nele serão descritas na próxima sessão.

4.2.1.1.2 Mapeamento de memória

Ao se escrever o código em C para funcionar no MIPSfpga deve-se indicar o ende-reço de memória que foi designado as entradas e saídas para que assim os valores indicados no código possam ser alocados a esses endereços. Portanto, para que os números desejados apareçam nos displays e para que um valor seja enviado pelo TX da UART, um endereço de memória deve ser criado para cada componente. O arquivo mipsfpga ahb const.vh arma-zena o endereço dos periféricos. Linhas são acrescentadas a esse arquivo a fim de declarar o endereço dos periféricos, ao acrescentar a linha “‘define H 7SEG ADDR (32’h1f800010)

” e “‘define H TX ADDR (32’h1f800014) ” estamos declarando o endereço físico dos dis-plays e do TX em 0x1f800010 e 0x1f800014, enquanto o endereço virtual é automatica-mente declarado em 0xbf800010 e 0xbf800014. O endereço virtual é o utilizado dentro do código em C. Outras linhas devem ser acrescentadas ao arquivo e elas são “‘define H 7SEG IONUM (4’h4) ” e “‘define H TX IONUM (4’h1) ”. Devido as definições feitas anteriormente, quando o código em C passar o endereço reservado aos displays ou ao TX, a variável HADDR vai receber o valor de H 7SEG IONUM ou de H TX IONUM depen-dendo de qual endereço for chamado. O arquivo mipsfpga ahb gpio possui uma estrutura case que verifica o valor da variável HADRR e que precisa ser acrescentada a essa estru-tura o que deve acontecer caso HADDR seja igual H 7SEG IONUM ou H TX IONUM.

Um registrador chamado SEGMENTOS foi criado para lidar com essa situação. O regis-trador SEGMENTOS recebe o valor da variável HWDATA, que armazena em binário o valor que deve ser mostrado nos displays. Como no presente trabalho o valor que deve aparecer nos displays é o mesmo que deve ser enviado via UART pelo pino TX, o registra-dor SEGMENTOS também é utilizado para obtenção do valor binário a ser transmitido via UART.

4.2.1.1.3 Descrição dehardware do periférico

No arquivo mips ahb gpio o registrador SEGMENTOS possui o valor que se deseja escrever tanto nos displays quanto na UART. Por isso, dois novos módulos são criados e instanciados na intenção de se desenvolver as tarefas para cada um dos periféricos. O módulo para o display de 7 segmentos é o mipsfpga ahb sevensegtimer e nele acontece uma decodificação da informação de binário para BCD e, então, de BCD para os 7 seg-mentos. As 6 saídas desse módulo instanciado são passados para as variáveis HEX0[6:0] a HEX5[6:0] que são passadas de volta, módulo a módulo, até chegar no top-level, onde são mapeadas para os displays de 7 segmentos. O módulo para a UART e seu pino TX é o

4.2. Implementação 47

mipsfpga ahb uartTX e nele deve-se observar a frequência com que vai ocorrer a comuni-cação entre a placa FPGA com o meio externo. Para o projeto o baud rateescolhido foi o de 9600 bps e, portanto, um prescaler foi estabelecido para que essa taxa seja alcançada.

A partir do prescaler ocorre a comunicação enviando pelo pino TX os 10 bits necessários, sendo o primeiro deles o bit que indica o início da palavra e o último deles o de término da palavra, os outros 8 bits são a palavra a ser passada. A saída IO-TX desse módulo é da mesma forma que as variáveis HEX0[6:0] a HEX5[6:0] passadas módulo a módulo até o top-level para que seja mapeada.

4.2.1.2 Execução de Códigos em C no MIPSfpga

Para a execução de um programa em C no MIPSfpga é necessário que dois arquivos .txt sejam gerados. Esses arquivos são o ram reset init.txt e o ram program init.txt. Os arquivos são instruções que descrevem o funcionamento da memória. Para a geração desses dois arquivos é necessário que em um sistema operacional Windows sejam instalados dois programas, o OpenOCD e o Codescape. A fim de se compilar o código em C usando o software Codescape é necessário que se nomeie o arquivo com o código como main.c e o coloque em uma pasta com os arquivos de boot do sistema. Os arquivos iniciais e de boot são fornecidos e são eles: boot.h, boot.S, fpga.h, init caches.S, init cp0.S, init gpr.S, init tlb.S, Makefile. Em seguida, abrir um terminal (cmd.exe), navegar até a pasta com estes arquivos e dar um comandomake. Alguns arquivos são gerados. Em seguida, oscript createMemfiles, também fornecido, deve ser executado e receber como parâmetro a pasta onde se encontra o arquivomain.c. Estescriptirá gerar uma pasta chamadaMemoryFiles contendo os arquivos ram reset init.txt e ram program init.txt. O código em C utilizado para demonstrar esta funcionalidade pode ser encontrado no Anexo B.

Documentos relacionados