-
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
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.
- 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
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.
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).
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
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).
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
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.
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