Este repositório contém o projeto de um coprocessador gráfico dedicado ao Redimensionamento de Imagens (Zoom Digital e Downscale) implementado em Verilog para a FPGA Cyclone V SE da placa de desenvolvimento DE1-SoC. O sistema opera como um processador gráfico autossuficiente (co-processador), realizando todo o processamento de imagens diretamente na FPGA. O controle do zoom é feito através de chaves e botões a bordo, e a imagem final é exibida em tempo real via saída VGA.
O sistema foi desenvolvido para atender aos seguintes algoritmos de redimensionamento em passos de 2X:
- Ampliação (Zoom in - 2X):
- Vizinho Mais Próximo (Nearest Neighbor Interpolation).
- Replicação de Pixel (Pixel Replication / Block Replication).
- Redução (Zoom out - 2X):
- Decimação / Amostragem (Nearest Neighbor for Zoom Out).
- Média de Blocos (Block Averaging / Downsampling with Averaging).
As imagens são tratadas em escala de cinza, onde cada pixel é representado por um número inteiro de 8 bits. O projeto também prevê compatibilidade com o Hard Processor System (HPS) ARM da DE1-SoC, visando futuras etapas de desenvolvimento.
| Componente | Detalhe | Finalidade no Projeto |
|---|---|---|
| Placa de Desenvolvimento | DE1-SoC | Plataforma principal de implementação. |
| FPGA | Altera Cyclone V SE 5CSEMA5F31C6N | Fabric Lógica para o co-processador gráfico. |
| Memória | M10k block | Armazenamento do framebuffer para a imagem original e a imagem processada (escala de cinza 8-bit). |
| Saída de Vídeo | VGA DAC (ADV7123) | Conversor Digital-Analógico de 8 bits para a saída VGA (15-pin D-SUB). Permite exibição em modos de alta resolução como SXGA ( |
| Controles de Usuário | Chaves Deslizantes (SW[9:0]) | Seleção do algoritmo de redimensionamento. SW[9:0] estão conectados ao FPGA e fornecem nível lógico alto (UP) ou baixo (DOWN). |
| Controles de Usuário | Botões de Pressão (KEY[3:0]) | Ações de controle (ex: Reset e Redimensionamento de Imagem (Zoom-in e Zoom-out)). KEY[3:0] estão conectados ao FPGA e são debounced por Schmitt Triggers, sendo ideais para uso como clock ou reset. |
| Software | Versão | Uso |
|---|---|---|
| Linguagem de Descrição de Hardware | Verilog | Código fonte de todos os módulos lógicos. |
| Ambiente de Desenvolvimento | Intel/Altera Quartus Prime | Compilação do código, pin assignment e geração do arquivo de configuração .sof. |
O design do sistema segue uma arquitetura baseada em Sicronismo de Clock e Memória de Buffer para garantir o processamento em tempo real dos pixels.
A lógica de controle do co-processador gráfico é implementada através de uma Máquina de Estados Finita (FSM). Essa FSM gerencia o ciclo de vida completo de cada operação de redimensionamento, desde a inicialização e leitura dos controles até o processamento de pixel e o commit dos dados na memória.
O ciclo de operação é dividido nos seguintes estados:
| Estado | Função |
|---|---|
| IDLE | Estado inicial e de espera. O processador aguarda o sinal de início de operação, geralmente disparado pela ativação de um botão ou chave. |
| LOAD_OP | Estado de carregamento da operação. O processador lê os valores atuais dos botões e chaves para determinar qual algoritmo de zoom (operação) deve ser executado e qual o pixel inicial a ser lido. |
| READ_PIXEL | O processador envia o endereço à Memória para ler o valor do pixel (ou bloco de pixels) que será processado. |
| WAIT_READ | Estado de espera. É crucial para aguardar o tempo de latência da memória e garantir que o pixel (ou os pixels) solicitados estejam disponíveis antes de iniciar o processamento. Esse estado só é ativado caso seja necessário ler pixels além do disponível pelo endereço do contador. |
| EXECUTE | O valor do pixel carregado é enviado para a Unidade Lógica e Aritmética (ULA), onde o processamento do zoom (vizinho mais próximo, replicação, decimação ou média de bloco) é realizado com base na operação definida em LOAD_OP. |
| WRITE | Estado de escrita. O pixel que acabou de ser processado é escrito na memória secundária para a geração da imagem de saída. |
| NEXT_PIXEL | O endereço de memória é avançado para que o próximo pixel no ciclo de processamento seja buscado. O sistema verifica se atingiu o fim da imagem. |
| END_INSTRUCTION | Estado final da operação de redimensionamento. As flags de controle são atualizadas e resetadas, e o sistema retorna ao estado IDLE para aguardar a próxima instrução. |
| Algoritmo | Opcode (binário) |
|---|---|
| REPLICACAO_PIXEL | 100 |
| VIZINHO_MAIS_PROXIMO | 101 |
| MÉDIA_DE_BLOCOS | 010 |
| DECIMAÇÂO | 011 |
| RESET_IMAGEM | 111 |
Essa arquitetura sequencial garante que a leitura da memória, o cálculo na ULA e a escrita do resultado sejam realizados de forma coordenada para cada pixel, controlando o fluxo de dados em tempo real.
-
Módulo de Controle VGA (VGA Controller): Gera os sinais de sincronismo padrão VGA (VGA_HS, VGA_VS, VGA_CLK) para a taxa de atualização e resolução desejada (ex:
$320 \times 240$ a 25MHz). Este módulo é o mestre do tempo e responsável pela exibição da imagem. - Módulo de Leitura da Memória: Endereça e lê os dados de pixel (8-bit) dos blocos de memória da FPGA. O endereço é calculado com um contador de 76800 endereços. As memórias possuem 76800 endereços de 1 Byte, ou seja, 8 bits. Também é usado uma fila para evitar que o vga acesse diretamente a memória. Ela possui 512 espaços de 8 bits.
- Módulo Co-Processador Gráfico (Zoom Processor): O coração do sistema. Ele recebe o pixel lido da memória e a operação com base no botão e a chave seletora, aplicando a lógica do algoritmo selecionado (Nearest Neighbor, Pixel Replication, Decimação, ou Block Averaging) para calcular o valor do pixel de saída no novo tamanho. Este módulo implementa a lógica combinacional e sequencial específica para cada método.
- Módulo de Saída de Vídeo (VGA Output): Envia os dados de pixel processados para uma memoria de processamento, para que futuramente eles entrem na fila de exibição.
O fator de escala de 2X simplifica a lógica de interpolação:
-
Nearest Neighbor (Zoom In): Para cada pixel original
$(x, y)$ , quatro pixels de saída$(x', y')$ são mapeados. A lógica utiliza a divisão inteira das coordenadas de saída$(\lfloor x'/2 \rfloor, \lfloor y'/2 \rfloor)$ para determinar o pixel original a ser replicado. -
Pixel Replication (Zoom In): Idêntico ao Nearest Neighbor para o fator 2X, onde o valor de cada pixel original é simplesmente replicado em um bloco de
$2 \times 2$ pixels na imagem ampliada. -
Decimação (Zoom Out): Apenas um pixel a cada bloco de
$2 \times 2$ pixels da imagem original é amostrado e mantido na imagem reduzida. A lógica utiliza o módulo ($\text{mod}$ ) das coordenadas de leitura para selecionar apenas os pixels com$x \text{ mod } 2 = 0$ e$y \text{ mod } 2 = 0$ . -
Block Averaging (Zoom Out): Para cada pixel de saída
$(x', y')$ , o módulo calcula a média aritmética dos$2 \times 2$ pixels da área correspondente da imagem original. Para garantir um resultado em 8 bits (sem ponto flutuante), a soma dos 4 pixels é feita e o resultado é deslocado em 2 bits para a direita ($\text{soma} / 4$ ).
O projeto requer o uso de múltiplos sinais de relógio, derivados do Clock Generator (Si5350C) a bordo da DE1-SoC, para sincronizar as diferentes operações. A placa DE1-SoC fornece quatro fontes de clock de 50 MHz diretamente ao FPGA.
| Sinal de Clock | Frequência | Origem/Propósito | Módulo/Uso | Pin Assignment FPGA |
|---|---|---|---|---|
CLOCK_50 |
50 MHz | Clock primário do sistema. Usado para gerar clocks derivados via PLL. | Módulo Top-Level, PLL. | PIN_AF14 |
CLK_PIXEL |
25.175 MHz | Frequência padrão para resolução VGA CLOCK_50 pelo módulo divisor de clock por 2. |
Módulo Controlador VGA, Módulos de Processamento. | N/A (reg Output) |
CLOCK_WRITE |
75 MHz | Clock de alta velocidade para a interface com a memória. Gerado internamente por uma PLL a partir de CLOCK_50. |
Controlador SDRAM. | N/A (PLL Output) |
Metodologia do Clock:
- O
CLOCK_50é o sinal de referência. - O
CLOCK_25MHzé gerado pelo módulo de divisor de clock. Ele está diretamente ligado ao VGA e ao sincronismo do sistema. - Um
CLOCK_75MHzé gerado pelo PLL para escrita de dados de forma mais rápida, ele garante que os dados sejam escritos antes de avançar para o próximo pixel.
O controle do sistema é feito usando as chaves deslizantes (SW) para seleção de modo e os botões de pressão (KEY) para acionamento. A saída de vídeo utiliza o conector VGA D-SUB (J9).
| Sinal | Direção | Recurso (Board) | FPGA Pin No. |
|---|---|---|---|
VGA_R[7:0] |
Saída | VGA Red (8 bits) | PIN_A13 - PIN_F13 (Tabela 3-17) |
VGA_G[7:0] |
Saída | VGA Green (8 bits) | PIN_J9 - PIN_E11 (Tabela 3-17) |
VGA_B[7:0] |
Saída | VGA Blue (8 bits) | PIN_B13 - PIN_J14 (Tabela 3-17) |
VGA_CLK |
Saída | VGA Clock | PIN_A11 (Tabela 3-17) |
VGA_HS |
Saída | VGA Horizontal Sync | PIN_B11 (Tabela 3-17) |
VGA_VS |
Saída | VGA Vertical Sync | PIN_D11 (Tabela 3-17) |
SW[9:0] |
Entrada | Chaves Deslizantes | PIN_AE12 - PIN_AB12 (Tabela 3-7) |
KEY[3:0] |
Entrada | Botões de Pressão | PIN_Y16 - PIN_AA14 (Tabela 3-8) |
CLOCK_50 |
Entrada | Clock 50 MHz | PIN_AF14 (Tabela 3-6) |
Este repositório serve como a Etapa 1 do projeto. As próximas etapas podem incluir:
- Integração com HPS: Permitir que o HPS carregue imagens para o processamento gráfico via co-processador FPGA.
- Interface Gráfica (GUI): Desenvolvimento de uma aplicação Linux/QT no HPS para controlar o zoom e exibir o status do sistema via terminal.
PATTERSON, D. A.; HENNESSY, J. L. Computer organization and design : the hardware/software interface, ARM edition / Computer organization and design : the hardware/software interface, ARM edition.
Cyclone V Device Overview. Disponível em: https://www.intel.com/content/www/us/en/docs/programmable/683694/current/cyclone-v-device-overview.html.
FPGAcademy. Disponível em: https://fpgacademy.org.
TECHNOLOGIES, T. Terasic - SoC Platform - Cyclone - DE1-SoC Board. Disponível em: https://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&No=836.
.gif)



