trabalho de conclusão  /  engenharia de computação, univasf

Reconhecimento de imagens num chip feito do zero

Inferência de CNNs INT8 num RISC-V com acelerador sistólico.

Celulares e câmeras cada vez mais rodam inteligência artificial no próprio aparelho, sem mandar dados para a nuvem. Neste TCC eu montei, numa placa FPGA de baixo custo, um pequeno sistema que faz isso: um processador RISC-V coordena e um acelerador que eu desenhei em VHDL faz as contas pesadas da rede neural. Tudo com números de 8 bits, para caber no hardware.

placa
Terasic DE2-115, Cyclone IV E
processador
NEORV32 (RISC-V), 50 MHz
acelerador
Arranjo sistólico 8×8, INT8
status
Em andamento, 2026
01

O problema, em linguagem simples

IA fora da nuvem

Rodar o modelo no próprio dispositivo (a "borda") protege a privacidade e responde na hora, sem internet. Só que esses dispositivos têm pouca memória e pouca energia.

Muita conta para um processador comum

Classificar uma única imagem de 28×28 pixels com esta rede exige 4,24 milhões de multiplicações seguidas de soma. Um processador simples faz uma de cada vez.

A ideia: 64 multiplicadores em grade

O acelerador é uma grade de 8×8 células. Cada uma guarda um peso da rede, multiplica pelo dado que chega e passa o resultado adiante. Assim, até 64 contas acontecem ao mesmo tempo.

Números de 8 bits

Em vez de números com vírgula (32 bits), a rede usa inteiros de -128 a 127. O modelo fica 4 vezes menor e o hardware muito mais simples, perdendo quase nada de acurácia.

02

Experimente

Desenhe no quadro ou escolha uma amostra. A rede roda aqui no seu navegador com exatamente a mesma aritmética inteira do firmware da placa: conferi camada por camada contra as saídas de referência, e os 120 de 120 estágios testados batem bit a bit.

desenhe um dígito

o que vai para a placa:
28×28 bytes

    –aguardando uma imagem

      Barras: saída INT8 de cada classe (o que o firmware imprime na serial), convertida em probabilidade.

      Camada 1 · 32 filtros 3×3 · cada quadrado é um "detector" de traço
      Camada 2 · 64 filtros · combinações dos traços em formas
      03

      Como o acelerador faz as contas

      Um arranjo sistólico funciona como uma linha de montagem. Os pesos da rede ficam parados, um em cada célula (weight-stationary). Os dados entram pela esquerda, um ciclo de atraso por linha, e as somas parciais descem pelas colunas. A cada batida do clock, todas as células trabalham ao mesmo tempo.

      O firmware em C, no RISC-V, quebra cada camada em blocos de 8×8 pesos (tiling), carrega o bloco no acelerador pelo barramento Wishbone e recolhe os resultados.

      camadalinhas de dadosblocos 8×8multiplicações
      Ilustração: a onda diagonal é o dado atravessando a grade. Célula acesa = multiplicação acontecendo naquele ciclo.
      04

      Da rede ao silício

      1. TreinoCNN pequena em PyTorch: duas convoluções e duas camadas densas.
      2. QuantizaçãoPesos e ativações viram INT8, com escala e zero-point por camada.
      3. EnvioO app desktop grava o firmware e manda 422 KB de pesos pela UART para a SDRAM.
      4. Firmware CNo NEORV32: im2col, tiling 8×8, requantização e argmax.
      5. AceleradorGrade 8×8 em VHDL, mapeada em memória pelo Wishbone B4.
      6. ResultadoClasse prevista e pontuações na serial e no LCD da placa.
      05

      O que a quantização custou

      conjuntofloat32INT8 (firmware)
      MNIST (dígitos)98,72%98,20%
      Fashion-MNIST (roupas)91,78%91,85%

      Passar de 32 para 8 bits custou meio ponto percentual nos dígitos e nada nas roupas. Os pesos caíram para 422 KB, o que cabe na SDRAM da placa. Os dois modelos usam a mesma arquitetura, então trocar de tarefa é só trocar os pesos e as escalas, sem mudar o hardware.

      INT8 medido na simulação bit-exata do firmware, em 2.000 imagens do conjunto de teste.

      06

      Como validei e o que falta

      • Referência bit-exata: uma simulação em numpy reproduz inference.c e o driver do acelerador, e gera as ativações esperadas de cada camada. A placa precisa produzir os mesmos bytes, e esta página também produz.
      • Teste na placa: o app desktop envia imagens de teste com classe conhecida e confere a resposta do firmware.
      • Em andamento: a escrita dos resultados de desempenho (ciclos por camada e ganho em relação ao RISC-V sozinho) e do uso de recursos da FPGA.