Skip to content

Latest commit

 

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 

Repository files navigation

Biblioteca de Comunicação HPS–FPGA para Coprocessador Matricial

Sumário

  • Introdução

  • 👥 Equipe

  • Requisitos do Problema

  • Recursos Utilizados

  • Desenvolvimento

  • Arquitetura Geral do Projeto

  • Comunicação via Ponte Lightweight

  • Biblioteca Assembly

  • Integração com Código C

  • Implementação FPGA em Verilog

Introdução

Este projeto implementa uma biblioteca em Assembly para estabelecer a comunicação entre o processador HPS (Hard Processor System) e um coprocessador matricial desenvolvido em Verilog e implementado no FPGA da placa DE1-SoC.

O objetivo é permitir que o HPS delegue operações com matrizes (como soma, subtração, multiplicação escalar, transposição, entre outras) para um hardware dedicado, otimizando o desempenho e reduzindo o tempo de execução dessas tarefas. A comunicação entre os dois lados é feita por meio de registradores mapeados em memória, acessíveis via instruções Assembly diretamente pelo HPS.

👥 Equipe

Requisitos do Problema

  • O código da biblioteca deve ser escrito em linguagem Assembly
  • A biblioteca deve conter as funções essenciais para que seja possível utilizar as operações matriciais implementadas no coprocessador
  • A biblioteca deve seguir as recomendações descritas em: https://github.com/MaJerle/c-code-style

Recursos Utilizados

Quartus Prime

O Quartus Prime foi a principal ferramenta de desenvolvimento utilizada para síntese, compilação e implementação do projeto em Verilog HDL. As funções desempenhadas pelo software incluem:

  • Síntese e Análise de Recursos: Tradução do código Verilog para circuitos lógicos, permitindo a avaliação de recursos da FPGA, como LUTs e DSPs.
  • Compilação e Geração de Bitstream: Compilação do projeto e geração do arquivo necessário para programar a FPGA.
  • Gravação na FPGA: Programação da FPGA utilizando a ferramenta Programmer e o cabo USB-Blaster.
  • Pinagem com Pin Planner: Ferramenta para mapear sinais de entrada e saída do projeto aos pinos físicos da FPGA, como LEDs, switches, botões e displays.

FPGA DE1-SoC

A FPGA DE1-SoC foi a plataforma utilizada para a implementação e testes do coprocessador. Essa placa combina um FPGA da Intel com diversos periféricos integrados, oferecendo uma solução robusta para sistemas embarcados e aplicações de hardware reconfigurável.

  • Dispositivo FPGA: Cyclone® V SE 5CSEMA5F31C6N.
  • Memória Embarcada: 4.450 Kbits e 6 blocos DSP de 18x18 bits.
  • Entradas e Saídas: Utilização de 4 botões de pressão, 10 chaves deslizantes e 10 LEDs vermelhos de usuário.

Para mais informações técnicas, consulte o Manual da Placa DE1-SoC (PDF).

Desenvolvimento

Arquitetura Geral do Projeto

O projeto consiste na integração entre um programa rodando no processador HPS (ARM Cortex-A9) da DE1-SoC e um coprocessador desenvolvido em Verilog que executa operações matriciais. A comunicação entre os dois se dá por meio da ponte HPS-to-FPGA Lightweight, utilizando dois registradores de 32 bits (entrada e saída) controlados por um protocolo de handshake.

Fluxo geral:

1- O HPS envia dados e comandos via registrador data_in

2- A FPGA interpreta os dados e executa a operação selecionada

3- O resultado é devolvido pelo registrador data_out, com sinalização de overflow se necessário

Comunicação via Ponte Lightweight

O código Assembly realiza mapeamento de memória para a ponte Lightweight, utilizando os arquivos /dev/mem e mmap. Dois registradores principais são definidos:

  • data_in_ptr: registrador de controle e envio (HPS → FPGA)

  • data_out_ptr: registrador de resposta e status (FPGA → HPS)

O protocolo de handshake garante que a comunicação seja segura mesmo em domínios de clock distintos, utilizando os bits de controle e ack (bit 31 para ambos os lados).

Biblioteca Assembly

A biblioteca matrix_io.s expõe as seguintes funções, que são utilizadas pelo código em C:

  • init_hw_access() — Inicializa o mapeamento de memória entre o HPS e a FPGA

  • send_all_data() — Envia os dados da operação (matrizes A, B, opcode, tamanho, escalar) com protocolo de handshake

  • read_all_results() — Lê os dados de saída da FPGA e verifica se houve overflow

  • close_hw_access() — Libera o mapeamento e fecha os descritores abertos

As operações suportadas são codificadas nos bits superiores dos dados enviados, conforme o seguinte layout de 32 bits:

[31] Controle | [30] Start | [29] Reset | [28:24] Reservado | [23:21] Scalar | [20:19] Size | [18:16] Opcode | [15:8] MatB | [7:0] MatA

Integração com Código C

O código main.c apresenta uma interface interativa com menu via terminal, onde o usuário pode escolher a operação, o tamanho da matriz e o valor escalar (se aplicável). Ele realiza:

  • Chamada à função init_hw_access

  • Envio de dados à FPGA via send_all_data

  • Leitura dos resultados com read_all_results

  • Impressão das matrizes e indicação de overflow

As estruturas são definidas no cabeçalho interface.h, utilizando a struct Params.

Implementação FPGA em Verilog

A lógica de hardware na FPGA é composta pelos seguintes módulos:

  • Coprocessor.v — Módulo superior que conecta a ControlUnit e submódulos de operação

  • ControlUnit.v — Unidade de controle FSM que interpreta os sinais do HPS, decodifica os dados recebidos e executa a operação correspondente

  • ghrd_top.v — Top-level do projeto, integrando os módulos Verilog ao soc_system.qsys

  • soc_system.qsys — Arquivo de sistema gerado no Platform Designer (Qsys), conectando os PIOs com a ponte Lightweight

As operações matriciais suportadas pelo coprocessador são:

Código Operação 0 Soma de matrizes 1 Subtração de matrizes 2 Multiplicação de matrizes 3 Multiplicação escalar 4 Determinante 5 Transposição 6 Matriz oposta

Referências

About

Integração de HPS para FPGA por meio de Biblioteca Assembly na Cyclone V

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages