61
Christian Kazuyoshi Miyoshi Jean René Joseph Canteneur Implementação de rede neural convolucional em FPGA para classificação de imagem Brasil 2018

Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Christian Kazuyoshi MiyoshiJean René Joseph Canteneur

Implementação de rede neural convolucionalem FPGA para classificação de imagem

Brasil

2018

Page 2: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Christian Kazuyoshi MiyoshiJean René Joseph Canteneur

Implementação de rede neural convolucional em FPGApara classificação de imagem

Monografia apresentada à Escola Politécnicade Universidade de São Paulo como requisitopara a obtenção do grau de Bacharel em Enge-nharia Elétrica com Ênfase em Computação.

Universidade de São Paulo

Escola Politécnica

Programa de Graduação

Orientador: Edson Satoshi GomiCoorientador: Bruno de Carvalho Albertini

Brasil2018

Page 3: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meioconvencional ou eletrônico, para fins de estudo e pesquisa, desde que citada a fonte.

Catalogação-na-publicação

Miyoshi, Christian Kazuyoshi Implementação de rede neural convolucional em FPGA para classificaçãode imagem / C. K. Miyoshi, J. R. J. Canteneur -- São Paulo, 2018. 60 p.

Trabalho de Formatura - Escola Politécnica da Universidade de SãoPaulo. Departamento de Engenharia de Computação e Sistemas Digitais.

1.Redes Neurais 2.Circuitos FPGA 3.VHDL I.Universidade de São Paulo.Escola Politécnica. Departamento de Engenharia de Computação e SistemasDigitais II.t. III.Canteneur, Jean René Joseph

Page 4: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Christian Kazuyoshi MiyoshiJean René Joseph Canteneur

Implementação de rede neural convolucional em FPGApara classificação de imagem

Monografia apresentada à Escola Politécnicade Universidade de São Paulo como requisitopara a obtenção do grau de Bacharel em Enge-nharia Elétrica com Ênfase em Computação.

Edson Satoshi GomiOrientador

Bruno de Carvalho AlbertiniCoorientador

Brasil2018

Page 5: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Dedico este trabalho primeiramente a Deus, que sempre foi a luz para o meucaminho nas etapas difíceis da vida e tem me guiado nos momentos de necessidade; dedicoao meu pai Paulo, por ser o meu maior exemplo na vida de honestidade e comprometimento;dedico à minha mãe Rosa pelo seu carinho e suporte ao longo de toda a minha vida; dedicoaos meus irmãos que me auxiliaram nessa etapa da vida.

Page 6: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Agradecimentos

Agradeço ao Jean Canteneur por ter trabalhado comigo durante um ano nesteprojeto e contribuído significativamente nas discussões e implementações dos componentesdo sistema.

Agradeço ao professor Edson Gomi por ter nos guiado durante todo o processo daconcepção até a finalização do projeto com grande envolvimento para propor melhorias esugestões.

Agradeço ao professor Bruno Albertini por ter auxiliado algumas etapas de dificul-dade durante a implementação do projeto com sugestões importantes para a realizaçãodeste projeto.

Page 7: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

ResumoO objetivo deste projeto foi desenvolver um hardware especializado no processamento doalgoritmo da rede neural para classificação de imagens. Foi buscado na literatura quaiseras as formas de representar os componentes da rede neural convolucional e quais eramos algoritmos que poderiam ser utilizados em hardware. Após esse estudo, o grupo propôsuma arquitetura para o sistema e a implementou em VHDL para ser executada em umaFPGA de forma que ela pudesse ser adaptada a diversos tipos de redes. Os testes foramrealizados através de software de simulação de circuitos digitais e na FPGA. Apesar dosbons resultados nas simulações, houveram alguns problemas durante os testes na placae, por causa disso, o grupo levantou algumas considerações importantes para futurasmodificações.

Palavras-chaves: FPGA, VHDL, Redes Neurais Convolucionais, Machine Learning

Page 8: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

AbstractThe aim of this project was to develop a specialized hardware for processing the classificationof images with convolutional neural networks. We did some research to find out the waysto represent the components of the convolutional neural network and the algorithms thatcould be used in hardware. After this study, the group developed an architecture for thesystem and implemented it in VHDL so that different types of network could be loadinto FPGA. The tests were carried out through digital circuit simulation software and inthe FPGA. Even though the simulations showed good results, there were some problemsduring the test with the board. As a result, the group made some important considerationsfor future modifications.

Keywords: FPGA, VHDL, Convolutional Neural Network, Machine Learning

Page 9: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Lista de ilustrações

Figura 1 – Camadas totalmente conectadas . . . . . . . . . . . . . . . . . . . . . . 16Figura 2 – Modelo de um Neurônio . . . . . . . . . . . . . . . . . . . . . . . . . . 17Figura 3 – Camadas da rede neural convolucional . . . . . . . . . . . . . . . . . . 18Figura 4 – Convolução bidimensional . . . . . . . . . . . . . . . . . . . . . . . . . 19Figura 5 – Diagrama de blocos de uma Adaptive Logic Module . . . . . . . . . . . 20Figura 6 – Kit de desenvolvimento Terasic De1-SoC (TERASIC) . . . . . . . . . . 21Figura 7 – Interface do ModelSim . . . . . . . . . . . . . . . . . . . . . . . . . . . 24Figura 8 – Simulação no ModelSim . . . . . . . . . . . . . . . . . . . . . . . . . . 25Figura 9 – Interface no Quartus Lite Prime Edition . . . . . . . . . . . . . . . . . 25Figura 10 – Interface do Signal-Tap . . . . . . . . . . . . . . . . . . . . . . . . . . . 26Figura 11 – Interface do Eclipse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27Figura 12 – Arquitetura do sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . 33Figura 13 – Arquitetura da camada totalmente conectada . . . . . . . . . . . . . . 34Figura 14 – Entradas e saídas da entidade neurônio . . . . . . . . . . . . . . . . . . 35Figura 15 – Entradas e saídas da entidade de multiplicação . . . . . . . . . . . . . 35Figura 16 – Entradas e saídas dado controlador do neurônio . . . . . . . . . . . . . 36Figura 17 – Entradas e saídas da entidade do controlador da ROM . . . . . . . . . 36Figura 18 – Entradas e saídas da entidade do controlador da RAM . . . . . . . . . 37Figura 19 – Entradas e saídas da entidade ReLU . . . . . . . . . . . . . . . . . . . 37Figura 20 – Entradas e saídas da entidade da camada totalmente conectada . . . . 38Figura 21 – Algoritmo da convolução . . . . . . . . . . . . . . . . . . . . . . . . . . 38Figura 22 – Valores dos pesos e entradas na memória ao fazer a convolução . . . . . 39Figura 23 – Entradas e saídas da entidade da convolução . . . . . . . . . . . . . . . 40Figura 24 – Entidade que armazena os pesos do kernel de convolução . . . . . . . . 41Figura 25 – Entradas e saídas da entidade do controlador da camada convolucional 41Figura 26 – Entradas e saídas da FIFO da convolução . . . . . . . . . . . . . . . . 42Figura 27 – Entradas e saídas da entidade da camada convolucional . . . . . . . . . 42Figura 28 – Entradas e saída da camada max-pooling . . . . . . . . . . . . . . . . . 43Figura 29 – Valores dos pesos e entradas na memória ao fazer o max-pooling . . . . 43Figura 30 – Entradas e saídas da entidade SelectMax . . . . . . . . . . . . . . . . . 44Figura 31 – Rede neural totalmente conectada para teste . . . . . . . . . . . . . . . 46Figura 32 – Valores na memória no início da simulação . . . . . . . . . . . . . . . . 47Figura 33 – Valores na memória após o cálculo da primeira camada . . . . . . . . . 47Figura 34 – Valores na memória após o cálculo da segunda camada . . . . . . . . . 47Figura 35 – Waveform após o cálculo da segunda camada . . . . . . . . . . . . . . 48Figura 36 – Waveforms do Signal-Tap no momento em que ocorreu uma leitura . . 49

Page 10: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Figura 37 – Waveforms do Signal-Tap no momento em que ocorreu uma escrita . . 49Figura 38 – Configurações do NIOS II . . . . . . . . . . . . . . . . . . . . . . . . . 56Figura 39 – Componente writeBurstMaster . . . . . . . . . . . . . . . . . . . . . . 57Figura 40 – Componente readBurstMaster . . . . . . . . . . . . . . . . . . . . . . . 57Figura 41 – Waveforms dos componentes readBurstMaster e writeBurstMaster . . . 58

Page 11: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Lista de abreviaturas e siglas

ALM Adaptive logic module

ALUT Adaptive LUTs

CNN Convolutional neural network

CPU Central processing unit

FIFO First In, First Out

FPGA Field Programmable Gate Array

GPU Graphics Processing unit

IP Intellectual Property

LUT Look-up table

PLL Phase-locked loop

ReLU Rectified linear unit

SDRAM Synchronous dynamic random-access memory

SoC System-on-a-chip

SRAM Static Random Access Memory

Page 12: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Sumário

Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

1 ASPECTOS CONCEITUAIS . . . . . . . . . . . . . . . . . . . . . . 161.1 Redes neurais artificiais . . . . . . . . . . . . . . . . . . . . . . . . . . 161.2 Deep Learning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181.3 Redes neurais convolucionais (CNN) . . . . . . . . . . . . . . . . . . 181.4 FPGA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191.5 SoC FPGA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201.6 Notações em ponto-fixo . . . . . . . . . . . . . . . . . . . . . . . . . . 21

2 TECNOLOGIAS UTILIZADAS . . . . . . . . . . . . . . . . . . . . . 232.1 ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232.2 NIOS II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232.3 Avalon Switch Fabric . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232.4 VHDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232.5 Verilog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242.6 ModelSim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242.7 Quartus Lite Prime Edition . . . . . . . . . . . . . . . . . . . . . . . . 252.8 Signal-Tap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262.9 Eclipse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262.10 Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272.11 Memória SDRAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282.12 Controlador da SDRAM . . . . . . . . . . . . . . . . . . . . . . . . . . 28

3 METODOLOGIA . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303.1 Propósito da pesquisa . . . . . . . . . . . . . . . . . . . . . . . . . . . 303.2 Fontes de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303.3 Alternativa de solução . . . . . . . . . . . . . . . . . . . . . . . . . . . 303.4 Implementação da solução . . . . . . . . . . . . . . . . . . . . . . . . 30

4 REQUISITOS DO SISTEMA . . . . . . . . . . . . . . . . . . . . . . 32

5 IMPLEMENTAÇÃO . . . . . . . . . . . . . . . . . . . . . . . . . . . 335.1 Arquitetura do sistema . . . . . . . . . . . . . . . . . . . . . . . . . . 335.2 Camada totalmente conectada . . . . . . . . . . . . . . . . . . . . . . 345.2.1 Neurônio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345.2.2 Entidade multiplicadora do neurônio . . . . . . . . . . . . . . . . . . . . 35

Page 13: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

5.2.3 Controlador do neurônio . . . . . . . . . . . . . . . . . . . . . . . . . . 355.2.4 Controlador da memória ROM . . . . . . . . . . . . . . . . . . . . . . . 365.2.5 Controlador da memória RAM . . . . . . . . . . . . . . . . . . . . . . . 365.2.6 Relu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375.2.7 Entidade da camada totalmente conectada . . . . . . . . . . . . . . . . . 375.3 Camada convolucional . . . . . . . . . . . . . . . . . . . . . . . . . . . 385.3.1 Entidade da convolução . . . . . . . . . . . . . . . . . . . . . . . . . . . 405.3.2 Entidade dos pesos do kernel . . . . . . . . . . . . . . . . . . . . . . . . 405.3.3 Controlador convolução . . . . . . . . . . . . . . . . . . . . . . . . . . . 415.3.4 FIFO da convolução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425.3.5 Camada de convolução . . . . . . . . . . . . . . . . . . . . . . . . . . . 425.4 Camada max-pooling . . . . . . . . . . . . . . . . . . . . . . . . . . . 435.5 Camada de Seleção . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445.6 Controlador da SDRAM . . . . . . . . . . . . . . . . . . . . . . . . . . 445.7 Dual-ported RAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

6 TESTES E AVALIAÇÃO . . . . . . . . . . . . . . . . . . . . . . . . 466.1 Tesbench da camada totalmente conectada . . . . . . . . . . . . . . 466.2 Testes da rede totalmente conectada com a memória SDRAM na

FPGA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

7 CONSIDERAÇÕES FINAIS . . . . . . . . . . . . . . . . . . . . . . . 507.1 Modificações no projeto . . . . . . . . . . . . . . . . . . . . . . . . . . 507.2 Sugestões de melhorias . . . . . . . . . . . . . . . . . . . . . . . . . . 50

8 CONCLUSÃO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

REFERÊNCIAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

APÊNDICES 55

APÊNDICE A – CONFIGURAÇÃO DO SISTEMA NO PLAFTORMDESIGNER . . . . . . . . . . . . . . . . . . . . . . 56

A.1 NIOS II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56A.2 Altera Phase-Locked Loop (PLL) . . . . . . . . . . . . . . . . . . . . 56A.3 Controlador da SDRAM . . . . . . . . . . . . . . . . . . . . . . . . . . 57A.4 Avalon burst read master e avalon burst write master . . . . . . . . 57A.5 SCFIFO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

Page 14: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

13

Introdução

As redes neurais artificiais têm sido um dos temas mais recorrentes no mundoacadêmico e na indústria, pois elas se mostraram extremamente eficientes em analisarpadrões em conjunto de dados e fazer previsões baseado em dados históricos. Diversosalgoritmos que seriam complexos de serem desenvolvidos por programadores têm encontradoas redes neurais como solução e o crescente aumento no interesse das redes neurais trazindícios que esse algoritmo continuará a ser utilizado no futuro.

O advento do uso dessas redes foi certamente impulsionado pelo aumento no poderde processamento dos sistemas computacionais, pois a etapa de treinamento da rede exigeum número elevado de cálculos. Do mesmo modo, o número de operações para fazerpredições após ter a rede treinada pode ser considerável se a rede for complexa.

Apesar do número elevado de operações, a maioria delas são muito simples ese resumem a adições, multiplicações e aplicação de função não linear. Entretanto, aquantidade de processamento pode ser suficientemente elevada a tal ponto que dificultariaa execução do algoritmo de rede neural em processadores de propósito geral, uma vez queo processamento seria feito sequencialmente e não otimizado para redes neurais.

A proposta deste projeto é elaborar um hardware em VHDL para cálculo de redesconvolucionais que possa satisfazer a necessidade desse sistema e as aplicações possamser integradas com outras tecnologias modernas de acordo com a área de interesse daindústria: IoT, segurança por reconhecimento de imagens, reconhecimento de áudio, etc.

Assim, este documento abordará alguns temas relevantes sobre as redes neurais,mas dará mais enfoque na forma de implementação em hardware dos componentes da redeneural convolucional.

Page 15: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Introdução 14

ObjetivoO objetivo foi fazer um hardware que possa realizar o reconhecimento de padrões

e classificação de imagens. O hardware alvo é um FPGA, que consiste em um chip comgrande poder de reconfiguração que pode ser programado no nível de portas lógicas. Ohardware deve ser capaz de receber os pesos e as características da rede neural treinadapelo usuário e o tipo de classificação será baseada no treinamento que foi dado a essa rede.

MotivaçãoA principal motivação do projeto é fazer um hardware com alta velocidade de

processamento e menor consumo energético. Apesar dos algoritmos de redes neurais seremcomplexos, há uma quantidade elevada de cálculos e isso dificulta o uso de processadoresde propósito geral. As GPUs se mostraram como uma alternativa devido à possibilidadede paralelizar o cálculo, mas elas têm um consumo elevado de energia, pois elas sãoapropriadas para processamento gráfico e não estão otimizadas para redes neurais.

Ademais, há motivações pessoais para o desenvolvimento do projeto. A área demachine learning com redes neurais foi uma das que mais evoluíram ao longo dos anose ainda tem muito a ser explorado nos próximos anos. Assim, o entendimento maisaprofundado do funcionamento de uma rede neural permite sugerir modificações paraaprimorar o algoritmo e conseguir resultados melhores e mais eficientes.

Organização do trabalhoNo primeiro capítulo, serão explicados alguns assuntos teóricos que serão extrema-

mente importantes ao longo do relatório: as redes neurais artificiais, as FPGAS e o sistemade notação. Para as redes neurais, será dado um enfoque especial no funcionamento doalgoritmo da rede neural artificial e quais são os tipos de camadas que podem compô-las.As operações matemáticas serão detalhadas para enfatizar as operações básica do sistemaque será proposto. Com relação ao sistema de notação, será dado uma breve explicação darepresentação em ponto-fixo.

No segundo capítulo, o enfoque será apresentar todas as tecnologias utilizadas noprojeto de forma resumida e objetiva afim de familiarizar o leitor com as ferramentasutilizadas no projeto quando elas forem citadas no decorrer do documento. Essas tecnologiasincluem não somente o hardware, mas todos os softwares que foram essenciais para aconcepção da solução.

No terceiro capítulo, será especificado quais foram os requisitos de projeto identifi-cados e apresentar quais foram as considerações iniciais do projeto. Esses requisitos foram

Page 16: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Introdução 15

definidos no começo do projeto.

No quarto capítulo, será apresentado o detalhamento do projeto. Em especial,será apresentado a arquitetura da rede neural projetada para o sistema e quais foram asconsiderações de projeto. Não somente isso, mas o comportamento dos sinais será enfatizadopara explicar como funcionam os sinais com descrição detalhada de cada componente quecompõe a arquitetura de forma que fosse possível reproduzir o projeto.

No quinto capítulo, os testes realizados no simulador e na FPGA serão detalhados.Em particular, dois testes serão explicados de forma mais clara para explicar como oscomponentes foram testados e quais os resultados obtidos.

No último capítulo, o grupo irá fazer uma síntese dos principais resultados obtidosno desenvolvimento do projeto e explicar quais foram os pontos negativos na concepçãoque poderiam ser melhorados em versões posteriores do sistema.

Page 17: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

16

1 Aspectos Conceituais

1.1 Redes neurais artificiaisNas últimas décadas, houve um aumento significativo dos estudos com redes neurais

artificiais, pois elas se mostraram ser um artifício poderoso para classificar quantidadesmassivas de dados sem a necessidade de implementar algoritmos elaborados e extremamenteespecíficos para aquela aplicação. Como resultado, muitos modelos distintos de redes jáforam estudados assim como as suas respectivas formas de implementação.

Uma definição de rede neural artificial foi dada por (HAYKIN, 2009) e traduzida aseguir de forma livre:

Uma rede neural é um processador distribuído paralelo massivo feitode unidades de processamento simples que tem propensão natural paraarmazenar conhecimento experimental e fazê-lo disponível para o uso.Ele lembra o cérebro em dois aspectos: conhecimento é adquirido pelarede em um ambiente através de um processo de aprendizado; a força deconexão entre os neurônios, conhecido como peso sináptico, é usado paraarmazenar conhecimento adquirido.

Figura 1 – Camadas totalmente conectadas

O neurônio é a unidade de processamento fundamental da rede neural. A figura 2mostra um modelo de um neurônio. Os seus componentes básico são:

1. Um conjunto de conexões sinápticas representadas pelos pesos;

2. Um somador para adicionar as entradas multiplicadas pelos pesos;

3. Uma função de ativação para limitar a amplitude da saída dos neurônios.

Page 18: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Capítulo 1. Aspectos Conceituais 17

Figura 2 – Modelo de um Neurônio

Logo, a função matemático que descreve o neurônio é dada por:

uk =m∑

n=1wkn.xn + bk (1.1)

yk = f(uk) (1.2)

Onde x1, x2, ..., xn são os sinais de entrada, wk1, wk2, wkm são os pesos sinápticosdo neurônio k. bk é um bias, f é uma função de ativação, e yk é a saída do neurônio.

Existem diversas funções de ativações e cada uma tem as suas vantagens e des-vantagens. A função ReLU (Rectified Linear Unit) tem se mostrado muito eficientes emredes neurais profundas por se simples do ponto de vista computacional, por resolver oproblema do vanish gradient que algumas outras funções de ativação tem e por ter umaconvergência rápida. (XU et al., 2015). Formalmente,a função ReLU é definida como:

f(x) =

x, se x ≥ 0.

0, senão.(1.3)

Com a estrutura da rede artificial definida, é necessário passar ao próximo passo:o treinamento. Um dos mais populares é o aprendizado supervisionado: um conjunto dedados é apresentado a rede e a sua saída é analisada. Para minimizar o erro cometido eatualizar os pesos, a rede é otimizada com o método Stochastic Gradient Descent baseadonos gradientes calculados pelo método backpropagation. Da última camada até a primeira,o erro é propagado e os valores de pesos são corrigidos para diminuir esse erro. O processose repete até atingir uma margem de erro desprezível.

Apesar de parecer melhor, o treinamento indefinido acarreta em uma consequênciaindesejável: o overfitting. Conforme a rede é treinada, o modelo vai se adequando progressi-vamente ao conjunto de dados de tal forma que o seu desempenho em outros dados tendea diminuir. Para evitar isso, deve-se utilizar amostras grandes e métodos de validação paracomparar o desempenho da rede com dados diferentes do treino.

Page 19: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Capítulo 1. Aspectos Conceituais 18

1.2 Deep LearningO deep learning ou aprendizado profundo, é um conjunto de técnicas que visam

modelar arquiteturas mais complexas com modelos mais abrangentes que conseguemrepresentar melhor o conjunto de dados. O elemento principal do deep learning é a redeneural artificial. O modelo que combina diversas camadas recebe o nome de rede neuralprofunda. (NG; KATANFOROOSH, )

As maiores aplicações das redes neurais profundas são para processamento deimagens e processamento de linguagem natural. Entretanto, ainda há diversas outras áreasque buscam soluções com o uso dessas redes.

1.3 Redes neurais convolucionais (CNN)A rede neural convolucional é um tipo de arquitetura baseada em uma rede com

muitas camadas que explora o conceito de redes neurais profundas e convolução paraentradas bidimensionais tais como imagens. Ela é largamente utilizada em aplicações comclassificação e reconhecimento de padrões e objetos em imagens digitais. (FARABET etal., 2009)

Figura 3 – Camadas da rede neural convolucional

A convolução de duas funções discretas f e g é dada por:

(f ∗ g)(n) =+∞∑

m=−∞f(n)g(n−m) (1.4)

Contudo, as redes neuras convolucionais normalmente não utilizam a convolução,mas a correlação cruzada (KAO, ). Na prática, a diferença é que não há a inversão de umadas funções. A formula da correlação cruzada é dada por:

(f ∗ g)(n) =+∞∑

m=−∞f(m)g(n + m) (1.5)

Page 20: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Capítulo 1. Aspectos Conceituais 19

Para o caso bidimensional, a correlação cruzada é definida como:

(f ∗ g)(i, j) =+∞∑

m=−∞

+∞∑n=−∞

f(m, n)g(i + n, j + m) (1.6)

Figura 4 – Convolução bidimensional

1.4 FPGAAs FPGAs (Field Programmable Gate Array) são circuitos com lógica não pré-

configuradas que formam uma matriz de componentes e portas lógicas reconfiguráveis. Oalto grau de customização do circuito permite projetar componentes com processamentoparalelizável, pois as unidades lógicas podem ser configuradas individualmente. Logo, essescircuitos são indicados para realizar tarefas específicas com alto grau de paralelismo e quelevariam muito tempo com processadores convencionais. (INTEL, 2018c)

A programação da FPGA é feita com uma linguagem HDL (Hardware DescriptionLanguage). Esse tipo de linguagem permite descrever a arquitetura do hardware e ela éutilizada pelos softwares de síntese para geração do arquivo binário para programação.Existem diversas linguagens, mas as duas mais conhecidas na indústria são o VHDL e oVerilog.

Os blocos de programação da FPGA Cyclone V são formados por unidades chamadasALMs. O ALM contém uma entidade chamada LUT, que consegue representar uma funçãobooleana combinatória e, consequentemente, simular conexões entre portas lógicas. Nocaso desta FPGA, a LUT é representada por componentes similares a uma SRAM cujobits são alterados quando a FPGA é programada. Caso a energia seja interrompida, osdados nessa LUT são deletados.

Page 21: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Capítulo 1. Aspectos Conceituais 20

Figura 5 – Diagrama de blocos de uma Adaptive Logic Module(INTEL, 2018c)

Após a compilação e síntese do projeto com o software adequado, o resultado éum arquivo binário que pode ser usado para programar o FPGA alvo configurado nosoftware. Cada fabricante tem as suas especificações e arquiteturas. Assim, o binário decada fabricante e FPGA também é diferente.

1.5 SoC FPGASoC FPGA são dispositivos que integram processadores de propósito geral com

FPGA em uma única pastilha de silício. Isso permite obter uma integração mais eficientecomo menor consumo energético, placas de circuito impresso menores e alta capacidade decomunicação entre os dois componentes.

A maior vantagem dessa família de componentes é o uso dos pontos fortes decada tecnologias para conseguir um melhor desempenho no sistema. Os processadoressão eficientes para fazer cálculos de operações mais complexas e que precisa trabalharcom muitas entradas e saídas. As FPGAs são ideais em projetos com análises de sinais eprocessamento paralelo. Logos, as duas podem ser utilizadas em conjunto para realizartarefas distintas e conseguir melhores resultados. A arquitetura mais comum encontradasno FPGA SoC é a ARM, pois é uma arquitetura bem difundida na indústria. (INTEL,2018a)

A placa de desenvolvimento que está sendo utilizada é a DE1-SoC produzida pelaTerasic. Esta placa contém uma FPGA Cyclone V SoC 5CSEMA5F31C6N, que possuium processador ARM Cortex-A9 Dual Core SoC. Nos manuais da Altera, o processador énormalmente referido pela sigla HPS (Hard Processor System) para enfatizar a diferença

Page 22: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Capítulo 1. Aspectos Conceituais 21

entre ele, que é fixo no silício, e o softcore (NIOS II), que é implementado em circuitosde lógica programável como a FPGA. Este processador ARM possui suporte a algumasdistribuições de Linux, o que disponibiliza diversos drivers e softwares para as funçõesbásicas do sistema.

Figura 6 – Kit de desenvolvimento Terasic De1-SoC (TERASIC)

As características mais relevantes da placa e da FPGA para este projeto são:

1. FPGA com capacidade de até 85k logic elements

2. Memória SDRAM para a FPGA de 64 MB

3. Memória SDRAM para o HPS de 1GB DDR3

4. Memória embarcada na FPGA de 4,450 Kbit

O desenvolvimento de todo o projeto em FPGA foi feito com duas linguagens dedescrição de hardware: VHDL (VHSIC Hardware Description Language) e Verilog. Amaior vantagem do uso dessas linguagens é a possibilidade de se trabalhar com diversosníveis de abstração, podendo ir de uma abordagem comportamental até uma descrição nonível de portas lógicas. O projeto e todos os principais componentes foram escritos somentecom VHDL, pois era a linguagem mais conhecida pelos integrantes do grupo e, devido asua tipagem forte, permite detectar erros em tempo de compilação mais facilmente. Comodiversos exemplos e templates disponíveis para a placa foram desenvolvidos em Verilog,alguns componentes estão escritos nesta linguagem.

1.6 Notações em ponto-fixoUma palavra é formada por um conjunto de N bits que consegue representar 2N

estados. Contudo, o significado da palavra escrita com esses N bits depende completamente

Page 23: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Capítulo 1. Aspectos Conceituais 22

da interpretação dada a eles. O uso mais comum é a representação de números inteirospositivos, mas ela não é a única. A representação dos números em bits pode ser interpretadacomo um subconjunto dos números racionais, ou seja, que podem ser escritos na formaa/b com a pertencente Z e b pertencente Z>0. O subconjunto considerado será os valoresracionais com b = 2n. Além disso, é imposta a restrição de que o número de dígitos bináriosé igual para todos os elementos assim como a posição da vírgula. Essa representação recebeo nome de ponto-fixo. (YATES, 2013)

Uma palavra de N bits interpretada como número em ponto fixo positivo podeassumir os valores do subconjunto P dados por:

P = {p/2b|0 ≤ p ≤ 2N − 1, p ∈ Z} (1.7)

Onde P será denotado U(a, b) com a = N − b. Para o caso de número em ponto-fixorepresentado em complemento de 2:

P = {p/2b| − 2N−1 ≤ p ≤ 2N−1, p ∈ Z} (1.8)

A partir dessas definições, pode-se levantar algumas regras que permitem deduzir ointervalo das operações matemáticas fundamentais e definir a quantidade de bits necessáriaspara não haver perda de informação.

A forma de notação dos números é importante neste projeto, pois será necessárioadotar uma representação que seja implementável em uma FPGA sem haver grandesperdas de precisão e desempenho. A vantagens da notação ponto-fixo é que os cálculos sãosimilares às operações inteiras e, por isso, muitos componentes são idênticos.

Page 24: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

23

2 Tecnologias utilizadas

Neste capítulo, serão apresentadas todos as tecnologias utilizadas no projeto.Primeiramente, serão abordadas informações relativa ao hardware do sistema, as linguagensde descrição de hardwares, softwares de simulação, software de síntese, ambiente deprogramação e software para controle de versionamento.

2.1 ARMO ARM é um processador RISC de 32 ou 64 bits que possui grande aplicação

na área de sistemas embarcados por ter um bom desempenho em sistemas com poucoprocessamento e consumo de energia. O processador disponível no kit é um ARM Cortex-A9 Dual-core. Ele é um processador com 2 núcleos e dispõe de uma memory managementunit (MMU), o que lhe permite executar um sistema operacional como o Linux. (ARM,2018)

2.2 NIOS IIO NIOS II é um softcore desenvolvido pela Altera, um processador cuja arquitetura

foi planejada para ser implementada a em blocos lógicos da FPGA. Ele tem um conjuntode instruções de 32 bits baseado em uma arquitetura RISC e possui total integração coma interface Avalon para integrar com outros componentes. (INTEL, 2018d)

2.3 Avalon Switch FabricO Avalon Switch Fabric é um barramento desenvolvido pela Intel que permite

conectar periféricos e dispositivos que utilizam a interface Avalon. Esta interface é apro-priada para fazer transferência de dados, leitura e escrita de registradores e acesso amemória. Além disso, ela permite integrar IPs e módulos customizáveis desenvolvidos pelaIntel ou outras empresas de forma mais simples e padronizada, o que agiliza a etapa deimplementação do projeto. (INTEL, 2018b)

2.4 VHDLO VHDL (Very High Speed Integrated Circuit Hardware Description Language) é

uma linguagem desenvolvida do departamento de defesa dos Estados Unidos. (GAISLER,2018). Inicialmente, seu foco era para simulação de circuitos digitais, mas se desenvolveu

Page 25: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Capítulo 2. Tecnologias utilizadas 24

para fazer a síntese dos circuitos também. O VHDL suporta dois tipos de design: estruturale comportamental. No designer comportamental, a projetista especifica o comportamentodo sistema, mas não especifica a forma de implementação do circuito. Na descriçãoestrutural, o projetista descreve as conexões dos componentes, mas não a sua função(WALKER, 2018). Em geral, o processo de concepção tende a começar com uma abstraçãomais comportamental que é refinada sucessivamente até atingir o nível estrutural.

2.5 VerilogA linguagem Verilog foi desenvolvida em 1985 na Gateway Design Automation

para ser utilizada como um simulador de circuito lógicos para o seus chips. A empresafoi posteriormente adquirida pela Cadence Design Sustem em 1989. Com o crescimentodo VHDL, a Cadence decidiu colocar o Verilog em domínio público. Em 1995, a primeiraversão padronizada pelo IEEE e outras versões com melhorias foram padronizadas em2001 e 2005. O Verilog se baseia no design em módulos encapsulados em uma hierarquia epode ser usado para simulações, análises e testes.

2.6 ModelSimO ModelSim é um software para simulações de circuitos descritos em VHDL ou

Verilog. Essa ferramenta permite elaborar testes individuais para cada componentes dosistema através de testbench e fazer a simulação de forma extremamente rápida. Assim, adetecção de erros antes da síntese do circuito ocorre de modo mais rápido e eficiente.

Figura 7 – Interface do ModelSim

Ao fazer a simulação, o ModelSim permite analisar todos os sinais de entrada esaída do sistema, mas ele permite também analisar os sinais internos do sistema. Issoé algo extremamente útil, pois fazer a depuração pode ser algo muito complexo. Outraferramenta útil no ModelSim é o visualizador de memória. A ferramenta identifica no

Page 26: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Capítulo 2. Tecnologias utilizadas 25

projeto as estruturas que representam memórias e permite visualizar e alterar os seusvalores de forma muito simples e em diferentes bases numéricas.

Figura 8 – Simulação no ModelSim

Outro ponto ponto que precisa ser ressaltado é a importância simulação semproblemas de timing, hardware ou ruídos. Como a simulação acontece no caso ideal, ouseja, sem atrasos e instabilidade de sinais, é possível fazer os testes com mais segurançaque os problemas são exclusivamente devido ao design.

2.7 Quartus Lite Prime EditionO Quartus é um software para síntese, análise e programação de dispositivos lógicos

programáveis desenvolvida pela Altera, que foi adquirida pela Intel. O software permitedesenvolver sistemas para qualquer FPGA da Intel/Altera e oferece diversas ferramentaspara auxiliar no desenvolvimento do projeto. As principais ferramentas são: Signal-Tap,Platform Designer, catálogo de IPs e o Eclipse com as ferramentas de desenvolvimento doNIOS II.

Figura 9 – Interface no Quartus Lite Prime Edition

Page 27: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Capítulo 2. Tecnologias utilizadas 26

O Quartus aceita as linguagens VHDL, Verilog e esquemáticos de um circuitológico. Além disso, ele permite gerar waveforms que funcionarão como estímulos para osistema para fazer uma análise considerando ou não os atrasos dos sinais. A complexidadedo processo de síntese e compilação pode ser alta dependendo do tipo de projeto.

2.8 Signal-TapO Signal-Tap é uma ferramenta para auxiliar na depuração de projetos e está

integrado com o Quartus. Ele consiste em um analisador lógico que permite verificar eamostrar os sinais do sistema que ocorrem antes ou depois de um trigger configurável. Osdados são armazenados na memória interna do FPGA e são enviados ao Signal-Tap pelainterface JTAG. Os dados são, então, organizados em waveforms que podem ser analisadospara identificar falhas de sincronismo, problemas de design ou verificar o resultado. O usodo Signal-Tap se torna imprescindível em projetos complexos, pois permite ver os sinaisinternos e dos pinos sem precisar de um analisador lógico externo ou osciloscópio (INTEL,2018e).

Figura 10 – Interface do Signal-Tap

As condições de trigger podem ser variadas, podendo ser configuradas com níveislógicos ou bordas dos sinais. A amostragem pode ser configurada para captar os sinais antes,durante ou depois do trigger e a quantidade de dado amostrado depende da quantidadede memória reservada para o Signal-Tap.

2.9 EclipseO Eclipse é uma ambiente de programação que suporta diversas linguagens de

programação. Ele é um software de código livre que foi desenvolvido pela IBM e lançadoem 2001. Assim, a Intel integrou no Quartus uma versão do Eclipse com ferramentaspróprias para compilação, execução e depuração de softwares no NIOS II. O programa tem

Page 28: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Capítulo 2. Tecnologias utilizadas 27

um template específico para projetos gerados com o Platform Designer que inclui diversasbibliotecas e constantes para facilitar o desenvolvimento dos projetos.

Figura 11 – Interface do Eclipse

Uma das funções mais interessantes no Eclipse é a capacidade de depurar osprogramas do NIOS pela interface JTAG. Com ela, é possível ter acesso a um terminalserial para imprimir dados enquanto o programa é executado no NIOS II. Todavia, aprincipal ferramenta do Eclipse exploradas nos testes do nosso projeto foi a inspeção damemória, pois ela permite ver facilmente os valores com base nos endereços. Como nãoé possível ter acesso fácil à SDRAM e às memórias embarcadas da FPGA, seria difícilverificar a exatidão dos cálculos da rede neural sem essa ferramenta.

2.10 GitO Git é um sistema de controle de versionamento de arquivos. Com essa ferramenta,

diversos desenvolvedores conseguem trabalhar em cima de um mesmo projeto sem terdificuldade de rastrear as modificações de cada integrante. Quando algum problema oubug é detectado em uma versão posterior, basta analisar quais foram as modificaçõesintroduzidas para identificar o erro.

Além do controle de versão dos arquivos, o Git oferece diversas ferramentas parafazer a fusão dos arquivos de diferentes versões do projeto ao rastrear as mudanças maisrecentes e as mudanças conflitantes. Ademais, o Git oferece uma forma simples de testardiferentes versões de um projeto sem alterar o código principal do projeto.

Por fim, a ferramenta do Git permite fazer backups de forma simples em servidorescomo o GitHub. O backup do repositório na nuvem permite que todos os integrantesacessem a versão mais atualizada do software e postem as suas modificações. Desdeque alguém tenha uma cópia do repositório, é possível recuperar todas as modificaçõesrealizadas.

Page 29: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Capítulo 2. Tecnologias utilizadas 28

2.11 Memória SDRAMAs memórias SDRAM (Synchronous Dynamic Random-Access Memory) são dis-

positivos voláteis de armazenamento de dados com leitura e escrita sincronizado comum clock externo. Além disso, elas são dinâmicas, ou seja, as células de memórias sãoformadas por capacitores e os bits são determinados pelas cargas contidas neles. Como acarga nos capacitores diminui ao longo do tempo, é necessário que a carga seja regeneradaperiodicamente. Em razão disso, os chips da memória dinâmica são desabilitados emintervalos periódicos com a finalidade de fazer essa regeneração. Existem diversas formasde organizar o arranjo físico da memória, mas a representação na forma de uma matriz éuma opção interessante quando se deseja reduzir o número de pinos de endereçamento.Assim, as palavras são buscadas pelos endereços de linha e coluna utilizando os mesmospinos. Não somente isso, mas a memória também é usualmente fabricada com diversosbancos independentes de armazenamento, pois isso permite acessar os dados em diversaspastilhas simultaneamente e acelerar consideravelmente a taxa de transferência de dados.(ÅKESSON)

Devido à complexidade de controlar a memória SDRAM pelos seus pinos, asoperações de escrita e leitura são feitas através de um controlador de SDRAM. Essecircuito é responsável por gerar os sinais de controle para a memória e fornecer umainterface mais simples e similar a um SRAM para o sistema.

Apesar da alta densidade de células de memória, as memórias SDRAM são maislentas que as memórias SRAM porque estas não precisam de processos constantes deregeneração do sinal e o endereço não é multiplexado. Logo, a SDRAM não é normalmenteutilizada para acessar palavras isoladas na memória, mas sequência de dados com o modoburst. Por isso o acesso por meio de bancos é fundamental para diminuir as latências deleitura e escrita. Neste projeto, será utilizada a memória disponível na placa DE1-SoC,que é a IS42/45VM16320D da Issi. Ela é uma memória de 512Mb organizada em 4 bancosde 8M palavras de 16 bits, opera com frequência de 143, 166 ou 200 MHz, precisa deregeneração do sinal a cada 64 ms e ela demora 8192 ciclos para regenerar.

2.12 Controlador da SDRAMO controlador da SDRAM deve fornecer uma interface simples para que o sistema

faça as leituras e escritas. Esses sinais são: endereço do dado, barramento de dados, sinalpara iniciar a operação e sinal para escolher entre leitura ou escrita. Todos os sinais deentrada e saída da SDRAM devem ser conectados ao controlador e ele fará a arbitragempara controlar os ciclos de operação e ciclos de regeneração. No datasheet da memóriaSDRAM, existe uma máquina de estado da memória e seu funcionamento será brevementeexplicado.

Page 30: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Capítulo 2. Tecnologias utilizadas 29

1. Quando é fornecida energia para a memória, ela precisa de alguns ciclos de pré-cargaantes de chegar ao estado inicial;

2. Quando ela está no estado inicial, duas operações são possíveis: regeneração dossinais e operação de escrita/leitura.

3. Se é escolhida a regeneração, a memória entra no modo de self-refresh e amplifica osinal de cada linha da matriz. Novamente, esta operação deve ser feita a cada 64 ms.

4. Se a operação de escrita ou leitura for selecionada, a linha da matriz correspondentesao endereço especificado será ativada e estará pronta para armazenar ou ler osdados. Enquanto a linha está ativa, as colunas podem ser rapidamente acessadaspelo endereçamento e diversas operações podem ser realizadas antes de desativar alinha. Quando a linha é desativada, ela retorna ao estado inicial após alguns ciclosnecessários para finalizar a operação.

Um aspecto importante ao fazer um controlador para SDRAM é a latência CAS.Ela corresponde ao tempo necessário para que a memória comece a acessar uma coluna damatriz quando a linha está ativa. Para o caso de SDRAM, essa latência é normalmentedada em número de ciclos e, para a SDRAM da placa DE1-SoC, ela é igual a 2 ou 3ciclos dependendo de outros parâmetros. Essa informação é relevante porque essa diferençapode interferir no funcionamento da memória, pois ela exige que os sinais estejam estáveisquando houver uma borda de subida no clock. Por isso, recomenda-se que seja utilizado umPLL (phase-locked loop) para alterar a fase do clock da SDRAM em relação ao restantedo sistema para compensar os atrasos dos sinais.

Page 31: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

30

3 Metodologia

Neste capítulo, será abordado quais foram os passos seguidos durante a pesquisa.Em especial, será sintetizado a importância da pesquisa e o motivo da escolha da FPGA.Em seguida, serão explicitadas quais serão as considerações durante a concepção daarquitetura que seria implementada para a rede neural.

3.1 Propósito da pesquisaNesta etapa, o grupo reconheceu que as redes neurais convolucionais possuem

grande aplicação em diversas áreas e, por consequência, seu algoritmo pode ser utilizadoem diversas situações. Assim, a pesquisa possui caráter exploratório, pois ela visa oaprofundamento no tema de redes neurais e na sua implementação em hardware.

3.2 Fontes de dadosAs fontes primárias do projeto foram artigos e dissertações escritas por outros

pesquisadores nos temas. As referências principais são: (FARABET et al., 2009) e (LI;MEDHAT; AREIBI, 2006),

3.3 Alternativa de soluçãoDentre as tecnologias estudadas ao longo da formação acadêmica, a implementação

em FPGA foi a que melhor se adequou ao propósito da pesquisa. Os FPGAs são dispositivoscom grande eficiência energética se comparado aos processadores convencionais, pois elespodem ser configurados para exercer de forma eficiente tarefas extremamente específicas.Não somente isso, mas são ideais para tarefas que podem ser paralelizadas para que ohardware possa fazer as operações em componentes distintos no FPGA. Logo, a escolha foifeita com base nesses dois argumentos e em artigos que também evidenciam as vantagensdo uso de FPGA no processamento de redes neurais artificiais.

3.4 Implementação da soluçãoA implementação da solução seguiu uma abordagem top-down. Nesta abordagem, a

descrição do comportamento de cada componente é priorizada de forma a ter uma primeiraversão do protótipo mais rapidamente. Após iterações sucessivas de refinamento do projeto,

Page 32: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Capítulo 3. Metodologia 31

as estruturas dos componentes são detalhadas até atingir o nível mais baixo de abstraçãoque seria, no caso, com portas lógicas.

Primeiramente, o planejamento projetou quais seriam os componentes fundamentaisdo projeto e quais seriam os seus requisitos de funcionamento. Em especial, foi planejadocomo seria a arquitetura do projeto para calcular as saídas para cada tipo de camada darede. Para isso, foram analisados alguns artigos de formas de implementação em hardware.

Em um segundo momento, foram realizadas algumas pesquisas em relação acodificação dos valores em notação de ponto fixo, pois ela foi escolhida como a maisadequada para a implementação. Em especial, desejava-se obter quais seriam as quantidadesde bits necessárias para diminuir o erro devido à perda de precisão. A notação em ponto-fixofoi escolhida.

A próxima etapa é a descrição em VHDL comportamental dos principais compo-nentes da rede neural. Todos os códigos foram testados apenas no simulador sem validaçãona placa.

A etapa seguinte foi pesquisar e implementar a interface entre os componentes darede neural com a SDRAM. Primeiro, foram feitos testes da SDRAM com componentesmais simples apenas para validar o desempenho das leituras e escritas.

A próxima etapa são os primeiros testes na placa. Cada componente será testadoindividualmente com um testbench próprio para identificar problemas de sincronismos.Após a validação deles, o sistema integrando todas as partes será testado e validado.

Page 33: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

32

4 Requisitos do sistema

O sistema deve calcular de forma eficiente o algoritmo da rede neural convolucional.Assim, a partir de uma imagem, ele deve selecionar a classe correspondente da imagembaseada no treinamento prévio.

A entrada do sistema será imagens e a saída será mostrada em um monitor coma imagem e a respectiva classificação em texto. O sistema poderá fazer o cálculo paradiversas configurações da rede. Assim, o número de camadas convolucionais, pooling ecamadas totalmente conectadas poderá ser configurado de acordo com a necessidade dousuário. Contudo, somente a função de ativação ReLU poderá ser utilizada.

O armazenamento dos pesos da rede treinada será feito em uma parte da memóriaembarcada da FPGA. Não somente o peso, mas todas as informações essenciais tais comoa estrutura da rede serão armazenadas dessa forma.

A economia do número de elementos lógicos é um dos requisitos importantes, poisdeseja-se que o circuito seja reduzido para integrar mais componentes. Logo, as estruturase o espaço utilizado para as camadas estão sendo minimizados para que não ocupe toda aárea da FPGA de desenvolvimento.

O tempo de execução do algoritmo é também importante. Como o objetivo é aexecução do algoritmo com vídeo, o cálculo em todas as camadas deve ser rápido paraatender essa necessidade.

Page 34: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

33

5 Implementação

5.1 Arquitetura do sistemaA arquitetura da rede neural foi organizada de forma a separar os quatro tipos

de camadas em entidades independentes. Existirá uma camada de cada tipo e elas serãoreutilizadas conforme a necessidade, pois isso permitirá criar redes neurais profundas comnúmero de camadas arbitrário.

Figura 12 – Arquitetura do sistema

O número de camadas e de neurônios em cada camada deverá ser especificado namemória ao iniciar o sistema. Uma vez terminado, o processador poderá enviar os dadosda imagem para a SDRAM da FPGA e iniciar o processo por meio de um sinal. Quando arede receber esse sinal, ela inicia os cálculos.

As redes neurais em FPGA são limitadas pela quantidade de blocos lógicos que ocircuito comporta. Além do número elevado de multiplicações, a rede neural pode precisarde funções não lineares que seriam custosas dado o número elevado de neurônios. Para quea implementação de redes maiores seja possível, existem algumas sugestões que permitiriamaumentar o número de neurônios. Primeiramente, a redução de blocos paralelos.

Executar tarefas concorrentemente exigem muitos blocos lógicos e, por isso, aimplementação sequencial em algumas partes é mais conveniente apesar da redução doprocessamento. Outro ponto é a precisão dos valores. A redução do número de bits para ospesos e entradas reduziria o tamanho das entradas e reduziria o número de blocos lógicos.Por outro lado, isso poderia influenciar no cálculo. Outra técnica usada é o uso intenso detabelas e memória para armazenar a constantes e valores da função de ativação e acelerar

Page 35: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Capítulo 5. Implementação 34

os cálculos apesar da necessidade de mais memória. Logo, encontrar um compromissoentre todas essas questões e o tamanho da rede é fundamental.

5.2 Camada totalmente conectadaA camada totalmente conectada é a mais simples que existe e consiste em um

conjunto de neurônios que possuem pesos diferentes para cada entrada da camada e paracada par de entrada e peso é feita a multiplicação seguida de uma função de ativação. Nocaso, será utilizada a função Relu.

Figura 13 – Arquitetura da camada totalmente conectada

5.2.1 Neurônio

A entidade principal da camada totalmente conectada é o neurônio. Suas entradasprincipais são o peso, a entrada, o sinal de início e o número de neurônios de sua camada.Além disso, há também um controlador do neurônio para selecionar as entradas e pesoscorrespondente. Quando se começa a calcular os valores do primeiro neurônio, o controladorcalcula as posições de memória e envia os dados para o neurônio.

Page 36: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Capítulo 5. Implementação 35

Figura 14 – Entradas e saídas da entidade neurônio

5.2.2 Entidade multiplicadora do neurônio

A entidade de multiplicação do neurônio é responsável pela realização do produtodo valor da entrada com o peso. A descrição da entidade foi feita de forma comportamental,ou seja, com a multiplicação de dois valores signed em VHDL. A vantagem desse descriçãoé que o Quartus utiliza os DSP da FPGA para fazer o cálculo, o que evita a utilização deelementos lógicos. É importante observar na figura 15 que a saída do multiplicador tem odobro da precisão dos valores de entrada.

Figura 15 – Entradas e saídas da entidade de multiplicação

5.2.3 Controlador do neurônio

O controlador do neurônio é responsável por enviar os sinais de controle para oneurônio para indicar o início do cálculo.

Page 37: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Capítulo 5. Implementação 36

Figura 16 – Entradas e saídas dado controlador do neurônio

5.2.4 Controlador da memória ROM

A memória ROM é a entidade que armazena os pesos da rede neural. O controladorda memória ROM é responsável por fazer o cálculo do endereço do peso de acordo comíndice do neurônio e da entrada. O endereço do peso depende do endereço do primeiropeso da camada, do índice do neurônio , do índice da entrada e do tamanho da entrada.

address = indexNeuron× sizeInput + indexInput + initialWeightPositionRom (5.1)

Caso o valor de sizeInput seja potência de 2, a multiplicação pode ser simplificadapara um deslocamento de bit.

Figura 17 – Entradas e saídas da entidade do controlador da ROM

5.2.5 Controlador da memória RAM

O controlador da memória RAM é responsável por calcular os endereços da entradapara a leitura e os endereços da saída para a escrita. O cálculo realizado por essa entidadeé dado por:

address =

initialInputPosition + indexInput, se writeRam = 0.

initialInputPosition + indexInput + sizeInput, se writeRam = 1.

(5.2)

Page 38: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Capítulo 5. Implementação 37

Figura 18 – Entradas e saídas da entidade do controlador da RAM

5.2.6 Relu

A entidade Relu é responsável pela aplicação da função de ativação. Neste módulo,além da função relu, o número é truncado de 40 bits para 20 bits, sendo que os bitsselecionados dependem da notação em ponto-fixo. Por exemplo, para o caso de 20 bitscom quatro bits para a parte inteira, a multiplicação de dois valores tem 8 bits para aparte inteira. Logo, a entidade Relu descartaria os 4 primeiros bits e os 16 últimos bits daentrada.

Figura 19 – Entradas e saídas da entidade ReLU

5.2.7 Entidade da camada totalmente conectada

Todas as entidades da camada totalmente conectada estão dentro do componenteque representa a camada. O controlador principal do sistema envia os dados do tamanhoda entrada, o número de neurônios, a posição inicial dos pesos e a posição inicial dasentradas. Em seguida ela inicia o cálculo com o sinal start. O controlador do neurôniorecebe esse sinal e envia os índices para os controladores da RAM e ROM para calcularemo endereço da entrada e peso, respectivamente. O endereços são enviados para as memóriase elas enviam os valores para o neurônio. Quando os dados estão prontos, o controlador doneurônio envia o sinal de start para o neurônio.

Os resultados intermediários são armazenados no neurônio e, após fazer o cálculocom todas as entrada, gera a saída para a entidade Relu. Esta entidade reduz o númerode bits e envia o resultado para a saída da camada. O sinal de writeRAM é colocadoem nível alto para fazer a escrita com o endereço correspondente. Ao final da escrita, o

Page 39: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Capítulo 5. Implementação 38

controlador do neurônio gera um reset para o neurônio e passa para o próximo índice.Quando todas entradas forem calculadas, o controlador da camada envia o sinal de términodo processamento da camada.

Assim, o controlador principal pode reiniciar o cálculo para a próxima camadaajustando a quantidade de entradas e saídas e posição inicial dos pesos e entradas.

Figura 20 – Entradas e saídas da entidade da camada totalmente conectada

5.3 Camada convolucionalA camada convolucional é baseada na convolução de duas matrizes e tem como

resultado uma outra matriz. Como o número de multiplicações para um pixel da entrada ésempre igual ao número de elementos no kernel, é possível projetar uma arquitetura ondecada pixel da entrada é lido uma única vez e as somas são organizadas em FIFOS paraque ocorram conforme previsto.

Figura 21 – Algoritmo da convolução

A implementação da rede neural foi baseada na arquitetura proposta por (FARA-

Page 40: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Capítulo 5. Implementação 39

BET et al., 2009) e indicada na figura 21: cada pixel da imagem é enviado para a entradadesse sistema e todos os pesos do kernel de convolução multiplicam essa entrada ao mesmotempo. Os resultados intermediários são armazenados em registradores e acumuladoresconforme são deslocados. No final de cada linha, uma FIFO é utilizada para armazenaros resultados parciais e são deslocados ao final do processamento de cada entrada. EssasFIFOs têm a finalidade de atrasar os valores intermediários de forma que as operaçõesrealizadas coincidam com a operações da convolução. Essa implementação da rede neuralé extremamente eficiente, pois os resultados intermediários são calculados em pipeline e assaídas dos valores individualmente permite fazer as escritas na memória de modo simples.

Existe, contudo, ainda algumas considerações relevantes que foram utilizadas parafacilitar o desenvolvimento do hardware. Primeiramente, não foi considerada a reduçãoou aumento do tamanho da imagem ao passar por uma camada convolucional. Isso énecessário para permitir a redução apenas nas camadas de pooling. Contudo, se o kernelde convolução fosse feito com a imagem original sem modificação e com a janela dentro damatriz, a imagem obrigatoriamente diminuiria, pois a janela de convolução não conseguiriavarrer os pixels mais externos com todos os pesos. Assim, existe uma outra abordagemque é completar a borda da imagem com uma camada de zeros igual a (n− 1)/2, onden é o tamanho da janela e deve ser ímpar. Ademais, o uso de kernel de convolução comtamanho de largura ou altura par não é adequado, pois não é possível que a imagem desaída seja do mesmo tamanho da entrada. A implementação considerou um kernel comtamanho fixo.

Além disso, existe uma outra restrição que foi colocada para facilitar as operaçõesmatemáticas: o tamanho da imagem é preferencialmente uma potência de 2. Como énecessário fazer multiplicações com o tamanho da imagem para obter o endereço da saída,essa condição facilita nos cálculos dos endereços. Por fim, a função de ativação continuasendo a ReLU, pois é mais simples de ser implementada em hardware e é uma maisutilizadas em redes profundas.

Figura 22 – Valores dos pesos e entradas na memória ao fazer a convolução

Page 41: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Capítulo 5. Implementação 40

5.3.1 Entidade da convolução

O componente que realiza o algoritmo descrito acima é a entidade chamada con-volução. A implementação se restringiu ao kernel 3x3. Logo, as entradas do módulo sãotodos os pesos da janela de convolução e os registradores do início de cada linha. As saídassão os finais de cada linha que serão conectadas nas FIFOs. Os sinais de start e resetpermitem iniciar o cálculo e voltar ao estado padrão, respectivamente. O sinal nextStepindica quando os valores dos registradores devem ser deslocados.

Figura 23 – Entradas e saídas da entidade da convolução

5.3.2 Entidade dos pesos do kernel

Como os valores dos pesos do kernel de convolução estão na ROM e o algoritmoexige que todos os pesos sejam multiplicados simultaneamente, é necessário armazenaros valores em registrados após lê-los individualmente. A entidade dos pesos do kernel é oprimeiro componente que á utilizado na camada convolucional. Os endereços dos pesossão enviados do controlador da convolução e são armazenados nesse componente. Quandotodos os valores forem lidos, a convolução pode prosseguir.

Page 42: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Capítulo 5. Implementação 41

Figura 24 – Entidade que armazena os pesos do kernel de convolução

5.3.3 Controlador convolução

O controlador da convolução é responsável por enviar os sinais de controle paraa entidade de convolução. Ele deve coordenar quais são os índices da entrada para fazera leitura e os índice da saída para fazer a escrita na memória. Logo, esse controladortambém faz os cálculos dos endereços da memória de acordo com o tamanho da entrada eo tamanho da janela de convolução.

Figura 25 – Entradas e saídas da entidade do controlador da camada convolucional

Page 43: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Capítulo 5. Implementação 42

5.3.4 FIFO da convolução

As FIFOs que conectam as linhas da entidade de convolução apresentam a diferençade ter uma profundidade de valores variáveis com o tamanho da entrada: se a imagem égrande, é necessário mais registradores na FIFO para fazer as operações da convoluçãocoincidirem. Logo, esse valor precisa ser variável, pois as camadas convolucionais de umarede neural podem receber entradas com tamanhos diferentes. Logo, além dos sinaispadrões de uma FIFO, a entidade FIFO da convolução recebe também um índice paraescolher qual é o último registrador da FIFO.

Figura 26 – Entradas e saídas da FIFO da convolução

5.3.5 Camada de convolução

A entidade da camada de convolução interage com o controlador principal dosistema. Para iniciar a operação de convolução, o controlador envia o tamanho das imagensde entrada e os dados das posições iniciais dos pesos e das entradas na memória.

Figura 27 – Entradas e saídas da entidade da camada convolucional

Page 44: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Capítulo 5. Implementação 43

5.4 Camada max-poolingComo as entradas da camada convolucional são matrizes de tamanho elevado, o

número de cálculos também é elevado e nem sempre são necessários todos os dados damatriz para extrair as informações essenciais. Assim, camadas de pooling são inseridasapós cada camada convolucional com o objetivo de reduzir a quantidade de entradas dapróxima camada. Dois tipos comuns de pooling são o max pooling e o average pooling. Doponto de vista de implementação, ela será semelhante à camada convolucional, mas comas estruturas correspondentes ao pooling.

Figura 28 – Entradas e saída da camada max-pooling

A camada max pooling é um tipo de camada pooling onde se seleciona o maiorvalor dentro de uma janela da imagem de entrada e o retorna para formar a saída. Para onosso projeto, está sendo utilizado pooling com janela 2x2 para sempre reduzir a imagempela metade. Esse é um dos motivos pela qual utilizamos entradas com tamanho potênciade 2.

Figura 29 – Valores dos pesos e entradas na memória ao fazer o max-pooling

Page 45: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Capítulo 5. Implementação 44

5.5 Camada de SeleçãoA camada de seleção serve para escolher a classe detectada. Normalmente, se usa

softmax para obter as probabilidades de cada classe. Contudo, o projeto considerarásomente a classe mais provável, ou seja, com maior valor, pois o cálculo é mais simples enão precisa de exponenciais ou divisão.

Figura 30 – Entradas e saídas da entidade SelectMax

O funcionamento da camada e similar a camada totalmente conectada. Contudo,em vez de multiplicar e somar as entradas, a entidade select max analisa apenas a entradae armazena o maior valor assim como a classe correspondente.

5.6 Controlador da SDRAMComo a implementação do controlador da SDRAM é algo complexo, será utilizada

uma IP da Altera: o SDRAM controller core. Esse módulo permite integrar um sistemacom uma SDRAM com comportamento padrão conforme descrito acima. Ela suporta umnúmero diversificado de tamanho de dados, endereços e bancos e possui recursos paratransferências em pipeline. Para gerar o sinal de clock da SDRAM seria utilizado a IPPLL da Altera. Ela permite criar diversos sinais de clocks a partir de um clock de entradacom valores diferentes de fase e frequência de acordo com o número de PLL da FPGA.Contudo, diversos outros controladores como o da Terasic e um próprio foram testados,mas não apresentaram o desempenho esperado.

5.7 Dual-ported RAMPara aumentar a velocidade de leitura dos pesos da rede neural, o grupo optou por

utilizar a memória embarcada da FPGA, pois ela é mais rápida e o número de pesos não étão elevado. A escolha foi uma dual-ported ram: ela tem duas conexões Avalon que podemfazer escritas ou leituras. Uma das interfaces será conectada ao Avalon Switch Fabric para

Page 46: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Capítulo 5. Implementação 45

que os processadores tenham acesso a essa memória. A outra interface será exportadapara ser utilizada pelos componentes da FPGA. A duas frequências serão 50 Mhz e estásendo utilizada uma memória com 512 valores de 32 bits, ou seja, 16,384 kb, sendo que amemória embarcada total da FPGA da placa DE1-SoC é 4884 kb.

Page 47: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

46

6 Testes e avaliação

Para realizar os testes de cada componente e da estrutura geral da rede neural, ogrupo propôs os seguintes testes em etapas distintas:

1. Testes dos componentes individuais com o ModelSim com uma memória simples emVHDL para os pesos e entradas.

2. Testes da memória SDRAM com componentes de leitura e escrita com a FPGA e oQuartus.

3. Testes dos componentes individuais com o ModelSim com a descrição de uma memóriacom comportamento similar ao da SDRAM.

4. Testes dos componentes individuais com o controlador de memória da SDRAM naFPGA e do sistema completo.

Entretanto, a etapa de teste do projeto ficou um pouco comprometida porque aimplementação do projeto exigiu muito mais tempo que o previsto e, por causa disso,nem todos os testes previstos puderam ser realizados. Em especial, o teste do sistemacompleto na placa não foi finalizado. Em virtude disso, este capítulo irá focar em doistestes: a simulação da a camada totalmente conectada no ModelSim e os testes da camadatotalmente conectada na FPGA enfatizando os acessos à memória SDRAM.

6.1 Tesbench da camada totalmente conectadaPara fazer o testbench da rede totalmente conectada, foi feita a simulação da

seguinte rede.

Figura 31 – Rede neural totalmente conectada para teste

Page 48: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Capítulo 6. Testes e avaliação 47

A simulação foi feita sem considerar restrições de tempo e considerando a memóriasimplificada que gera a saída em um ciclo de clock. Além disso, o componente ReLU foialterado para fazer os cálculos com valores inteiros, pois isso facilita a verificação dosresultados. No ModelSim, é possível observar os valores iniciais da memória. As entradas2 e 3 estão nas posições iniciais da memória.

Figura 32 – Valores na memória no início da simulação

Após 53 ciclos de clocks, a saída da primeira camada foi obtida. É possível observarque os resultados armazenados na memória são idênticos aos resultados esperados.

Figura 33 – Valores na memória após o cálculo da primeira camada

Ao continuar a simulação por mais 55 clocks, há o término dos cálculos da terceiracamada e os resultados estão disponíveis na memória.

Figura 34 – Valores na memória após o cálculo da segunda camada

No waveform do Modelsim, é possível confirmar que o sinal de término está emnível alto, conforme esperado.

Page 49: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Capítulo 6. Testes e avaliação 48

Figura 35 – Waveform após o cálculo da segunda camada

6.2 Testes da rede totalmente conectada com a memória SDRAMna FPGAO mesmo teste anterior foi repetido na FPGA. Neste teste, o objetivo era se certificar

que os componentes Avalon e a memória SDRAM estavam funcionando corretamente coma rede neural. Esta etapa foi uma das mais complicadas do projeto, pois o grupo tevedificuldade de integrar o componente da rede neural com a interface Avalon. A versão finaldo controlador de memória utiliza os componentes de write burst e read burst descritos noapêndice.

Os testes para leitura e escrita foram feitos com os switches, leds e botões da placa.Os valores da SDRAM eram visualizados pelos Eclipse com o NIOS no modo de depuração.

Os primeiros testes mostraram resultados muito inconsistentes, apesar das primeirasescritas e leituras estarem corretas, os valores após algumas operações que eram salvosnão correspondiam aos valores dos switches. Em alguns momentos, a máquina de estadoperdia sincronismo com o controlador da memória e ficava preso em algum estado. Ogrupo também percebeu que isso só acontecia com frequências altas no clock, pois caso elefosse diminuído para 1 Hz, o problema aparentemente nunca ocorria. Com frequência de25Mhz o problema demorava mais para acontecer.

Para resolver isso, foi necessário fazer uma depuração com o SignalTap para analisartodos os sinais de entrada e saída desses componentes para determinar a causa do problema.Ao verificar as curvas, foi possível observar que a quantidade de dados nas FIFOs doscomponentes de escritas e leitura não estava consistente com o previsto: cada operaçãodeveria ler ou escrever apenas um único valor na FIFO. Essa etapa exigiu vários testes atéperceber que o problema era nos botões da placa: como eles não estavam sincronizadoscom o clock da FIFO, havia momentos em que eram inseridos mais valores na FIFO e elaficava cheia após algum tempo. A sincronização com dois flip-flops em cada botão resolveu

Page 50: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Capítulo 6. Testes e avaliação 49

o problema das leituras e escritas.

Figura 36 – Waveforms do Signal-Tap no momento em que ocorreu uma leitura

Ao analisar o waveform no SignalTap, foi possível determinar que, em média, aleitura dos dados da SDRAM precisam de 10 a 11 ciclos de clock e a escrita precisa de 9a 10 ciclos. Esse caso é o ideal, ou seja, sem interferência dos acessos do controlador daVGA.

Figura 37 – Waveforms do Signal-Tap no momento em que ocorreu uma escrita

Page 51: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

50

7 Considerações finais

7.1 Modificações no projetoDiante da dificuldade que o grupo se deparou com a implementação na FPGA,

foi possível identificar alguns pontos chaves que poderia ser alterado para conseguir umsistema melhor ou mais eficiente.

1. Fazer um estudo mais aprofundado do funcionamento da memória da placa é muitoimportante. No início, o grupo não fez as considerações adequada para a SDRAM.Em particular, não foi previsto os sinais de controle de leitura e escrita adequadosem todos os componentes da rede neural, pois os primeiros testes eram feitos sempreatravés de simulação. Logo, quando o grupo passou para os testes na FPGA, algunscomponentes precisaram ter a descrição alterada e passar por novos testes. Issoconsumiu um tempo considerável e poderia ser evitado se tivesse sido consideradodesde o início;

2. A arquitetura da camada totalmente conectada não foi adequada. Apesar do sistemafuncionar corretamente com o módulo projetado, ele não está escalável de forma fácil,pois a inclusão de novos neurônios exigiriam modificações significativas no projeto.Ao analisar as possibilidades para resolver esse problema, a integração dos neurônioscom a interface Avalon seria uma opção mais interessante, pois isso permitiria queos processadores enviasse os dados para cada neurônio e o sistema ficaria mais fácilde ser programado.

7.2 Sugestões de melhoriasDiante dos resultados obtidos, o grupo propõe algumas melhorias para o projeto

que poderiam aumentar as funcionalidades do sistema

1. Em todas as camadas, a única função de ativação considerada foi a Relu. Apesarde ser a função mais utilizada atualmente e redes profundas, as funções de ativaçãosigmoid, tanh e softmax também são utilizadas. A escolha da ReLU foi devido à faci-lidade de implementação em hardware, pois não exige nenhuma operação matemáticacomplexa. A sugestão para implementar essas funções mais complexas é a aproxima-ção polinomial com coeficientes sendo potências de 2. Essa técnica foi encontradaem algumas referências e poderia trazes resultados igualmente interessantes.

Page 52: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Capítulo 7. Considerações finais 51

2. Um outro tipo de rede neural que é bastante utilizada no processamento de linguagemnatural é a rede neural recorrente. A principal diferença desta rede é que ela não épuramente combinatória, mas a entradas anteriores influenciam na saída do sistema.O neurônio mais utilizado nessa rede é o LSTM (Long Short Term Memory networks)e a sua diferença em relação ao neurônio convencional é a possibilidade de armazenarinformação ao longo do tempo. A arquitetura do projeto poderia ser modificadapara incluir um novo tipo de camada onde os parâmetros dos neurônios poderia seralterados em registradores ou na memória.

3. A integração com uma câmera USB conforme proposto no início não foi possíveldevido ao atraso no cronograma. Segundo algumas pesquisas, a forma mais eficientede integrar a câmera seria com a criação de uma distribuição Linux para o HPS comos drivers de câmera USB incluídos e o OpenCV para o processamento da imagem.Essa etapa, contudo, é mais avançadas, pois exige conhecimentos da compilação dokernel do Linux.

Page 53: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

52

8 Conclusão

O objetivo da pesquisa era desenvolver um hardware capaz de fazer o processamentoda rede neural convolucional de forma veloz e eficiente. Esse objetivo não foi completamenteatingido, pois o grupo enfrentou diversas dificuldades não previstas e isso comprometeu ocronograma do projeto. Até o momento, somente a rede totalmente conectada foi concluídacompletamente incluindo os testes na FPGA. As outras camadas foram validadas somenteno simulador, mas exigem um refinamento maior para que funcionem na placa. Portanto,os testes ainda não terminaram e os ajustes necessários ainda estão sendo feitos.

Apesar dos problemas enfrentados durante os testes do sistema que dificultarama simulação completa da rede neural na FPGA, o projeto abrangeu diversos aspectosimportantes da arquitetura de uma rede neural que precisam ser levados em consideraçãona sua implementação em hardware. Em especial, a notação para representação dos valores,o algoritmo para a camada convolucional e a forma de armazenar os dados na memória.

Outro ponto relevante no projeto foi aprendizado obtido com o estudo de tecnologiasda FPGA. Em especial, foi possível obter muito conhecimento sobre a integração de IPsno Platform Designer com módulos escritos em VHDL, sobre o uso do NIOS II e do HPScom a FPGA e sobre o funcionamento da SDRAM.

Por fim, a contribuição deste projeto foi no desenvolvimento de uma arquiteturaque pode ser estendida para incluir no futuro outros tipos de camadas da rede neural. Emespecial, redes neurais recorrentes, pois elas também tem diversas aplicações.

Page 54: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

53

Referências

ARM. Cortex-A9. 2018. [Online; accessed November 18, 2018]. Disponível em:<https://developer.arm.com/products/processors/cortex-a/cortex-a9>. Citado napágina 23.

FARABET, C. et al. Cnp - an fpga-based processor for convolutional networks. 2009.Citado 3 vezes nas páginas 18, 30 e 39.

GAISLER, J. Introduction to VHDL. 2018. [Online; accessed November 11, 2018].Disponível em: <https://www.gaisler.com/doc/vhdltut.pdf>. Citado na página 23.

HAYKIN, S. Neural Network and Learning Machines. [S.l.]: Person, 2009. Citado napágina 16.

INTEL. Architecture Brief: What is an SoC FPGA? 2018. [Online; accessed November 18,2018]. Disponível em: <https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/ab/ab1_soc_fpga.pdf>. Citado na página 20.

INTEL. Avalon R© Interface Specifications. 2018. [Online; accessed November 18, 2018].Disponível em: <https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/manual/mnl_avalon_spec.pdf>. Citado na página 23.

INTEL. Cyclone V Device Overview. 2018. [Online; accessed November 24, 2018].Disponível em: <https://www.intel.com/content/www/us/en/programmable/documentation/sam1403480548153.html>. Citado 2 vezes nas páginas 19 e 20.

INTEL. Nios R© II Software Developer’s Handbook. 2018. [Online; accessed November 18,2018]. Disponível em: <https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/hb/nios2/n2sw_nii5v2gen2.pdf>. Citado na página 23.

INTEL. Signal-Tap: User guide. 2018. [Online; accessed December 1, 2018]. Disponível em:<https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/ug/signal.pdf>. Citado na página 26.

KAO, J. Convolutional neural networks. Citado na página 18.

LI, X.; MEDHAT, M.; AREIBI, S. Arithmetic formats for implementing artificial neuralnetworks on fpgas. 2006. Citado na página 30.

NG, A.; KATANFOROOSH, K. CS229 Lecture Notes - Deep Learning. [Online; accessedNovember 24, 2018]. Disponível em: <http://cs229.stanford.edu/notes/cs229-notes-deep_learning.pdf>. Citado na página 18.

TERASIC. Terasic De1-SoC. 2018. [Online; accessed November 24, 2018]. Disponívelem: <https://www.terasic.com.tw/attachment/archive/870/image/DE1-SoC_top45_01.jpg>. Citado 2 vezes nas páginas 8 e 21.

WALKER, R. A. VHDL Introduction, Part I. 2018. [Online; accessed November 11, 2018].Disponível em: <http://www.cs.kent.edu/~walker/classes/vlsi.s06/lectures/L18.pdf>.Citado na página 24.

Page 55: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Referências 54

XU, B. et al. Empirical evaluation of rectified activations in convolution network. 2015.Citado na página 17.

YATES, R. Fixed-point arithmetic: An introduction. 2013. Citado na página 22.

ÅKESSON, B. An introduction to SDRAM and memory controllers. 2018. [Online;accessed November 11, 2018]. Disponível em: <http://www.es.ele.tue.nl/premadona/files/akesson01.pdf>. Citado na página 28.

Page 56: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Apêndices

Page 57: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

56

APÊNDICE A – Configuração do sistema noPlaftorm Designer

Ao invés de fazer o design de todos os componentes do Platform Designer, o grupooptou por adicionar os componentes a partir do projeto base da placa DE1-SoC da Terasic.Logo, todas as conexões do HPS com a memória assim como alguns componentes básicosjá estavam conectados com garantia de funcionamento.

A.1 NIOS IIComo o uso do NIOS II foi apenas para auxiliar na depuração do sistema, foi

utilizado a versão mais simples dele. Além disso, uma pequena parte da memória embarcadada FPGA foi reservada para os NIOS II para executar os programas sem interferir na zonade memória da SDRAM. Essa memória é a niosMemory com 16 kb. O vetor de reset evetor de interrupção foram configurados para usar o início dessa memória.

Figura 38 – Configurações do NIOS II

A.2 Altera Phase-Locked Loop (PLL)Para que todos os componentes utilizem o clock com a frequência correta, foi

necessário adicionar dois PLLs para gerar os diversos sinais. A entrada do componente é oclock da FPGA de 50 Mhz. As saídas são:

1. Clock de 100 Mhz para o controlador da SDRAM;

2. Clock de 100 Mhz com fase de - 55 graus para a SDRAM. O valor da fase foibaseado em exemplos disponíveis em outros projetos para a mesma placa e os testesmostraram que esse valor funciona de modo estável;

3. Clock de 25 Mhz para o controlador da VGA;

Page 58: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

APÊNDICE A. Configuração do sistema no Plaftorm Designer 57

4. Clock de 300 Mhz para depuração com o Signal-Tap.

5. Clock de 50 Mhz para todos os outros componentes;

A.3 Controlador da SDRAMO controlador da SDRAM foi utilizado com as constantes usadas em um exemplo

desenvolvido pela Terasic para a placa.

A.4 Avalon burst read master e avalon burst write masterA conexão entre os componentes em VHDL e a interface Avalon foi feita através dos

componentes burstReadMaster e burstWriteMaster. Os dois componentes foram descritospela Altera e disponibilizados como um template para ser integrado com o PlatformDesigner.

O burstReadMaster é responsável por fazer leituras com burst e armazenar osdados em uma FIFO com single clock (SCFIFO). O burstReadMaster é responsável porler os dados de uma FIFO e fazer a escrita na posição de memória correspondente.

Figura 39 – Componente writeBurstMaster

Figura 40 – Componente readBurstMaster

Page 59: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

APÊNDICE A. Configuração do sistema no Plaftorm Designer 58

No documento da Altera, não havia um waveform para explicar a utilização dossinais. Contudo, a partir dos testes e estudando o código do componente, foi possíveldeduzir o comportamento deles. Embora esses waveforms não descrevam perfeitamente ofuncionamento, eles foram suficientes para elaborar os componentes que os utilizam.

Figura 41 – Waveforms dos componentes readBurstMaster e writeBurstMaster

A partir dos sinais acima, é possível perceber a ordem dos sinais da FIFO para queo componente funcione corretamente. Além disso, é essencial que todos os sinais da entradaestejam sincronizados com o clock da FIFO. Para o caso da escrita, deve-se primeiramentecolocar o valor na fifo com o sinal userWriteBuffer e, em seguinda, iniciar a escrita com ocontrolWriteGo. Após alguns clocks, o sinal controlDone é alterado para nível alto, o queindica o término da operação. É importante observar que userFull não foi alterado parao nível lógico 1 porque a FIFO utilizada tem comprimento de 4 elementos. Essa é umarestrição que existe no componente da Altera, e, ao ler o manual da IP da SCFIFO, essarestrição também existe na FIFO.

Para o caso de leitura, primeiramente se inicia o procedimento com controlReadGo.Após alguns ciclos de clock, o signal userAvailable é alterado para nível alto com o dado jádisponível na FIFO. Em seguida, o signal userDone é alterado para nível 1. No projeto,o grupo optou por usar os dois sinais em nível alto como condição para o fim da leitura,pois é uma condição mais confiável, embora o sinal available seja suficiente para indicara presença de dados na FIFO. Acionar o comando userReadBuffer permite remover oprimeiro elemento da fila para ler o valor seguinte. Como estamos fazendo a leitura deapenas um elemento, o sinal available volta para o nível zero após remover o primeiroelemento.

A configuração do componente writeBurst no Platform Designer optou por desa-bilitar o modo burst, para fazer a leitura individual das palavras. Evidentemente, umaversão com cache para armazenar diversos valores retirados da FIFO após o burst seriao ideal, pois isso permitiria fazer a leitura dos dados com um número menor de ciclos.Contudo, uma versão mais simples se mostrou mais adequada para o projeto.

Para o caso do burstReadMaster, foi possível notar algo importante. Após realizardiversos testes, foi possível perceber que a versão com burst desabilitado não estavafuncionando corretamente. Assim, ao invés disso, o burst foi ativado com valor máximo igual

Page 60: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

APÊNDICE A. Configuração do sistema no Plaftorm Designer 59

a 1. Na prática, não há diferença, pois os dois casos funcionam de forma idêntica. Contudo,ao analisar o código da Altera, foi possível notar que a descrição para o burst desabilitadonão é a mesma para o burst habilitado, pois a primeira tem algumas otimizações, que,aparentemente, apresenta algum erro.

Para os dois componentes, a FIFO foi sintetizada com a memória embarcada daFPGA, pois é uma área reservada especificamente para elementos de armazenamentos. Aoutra opção seria sintetizar com elementos lógicos da FPGA, mas isso diminuiria o númerode elementos disponíveis para a rede neural.

A.5 SCFIFOPara deduzir os waveforms dos componentes de escrita e leitura, foi imprescindível

consultar o manual da SCFIFO. No documento, foi possível encontrar não somentewaveforms com o funcionamento da fila, mas também quais eram os outros sinais disponíveisno componente que poderia ajudar na depuração do código. Dentre os sinais disponíveis, omais útil foi o usedw. Este sinal contém o número de elementos na FIFO. Foi somente apósa modificação da descrição dos componentes de leitura e escrita da Altera para exportaresse sinal que foi possível perceber na depuração que o problema de sincronismo de clockestava adicionando mais de um elemento na FIFO e isso gerava resultados inexplicáveis deFIFO cheia.

Page 61: Implementação de rede neural convolucional em FPGA para ...€¦ · Autorizo a reprodução e divulgação total ou parcial deste trabalho, por qualquer meio convencional ou eletrônico,

Use Connections Name Description Export Clock Base End IRQ Tags Opcode Name

clk_0 Clock Source

clk_in Clock Input clk exported

clk_in_reset Reset Input reset

clk Clock Output Double-click to export clk_0

clk_reset Reset Output Double-click to export

hps_0 Arria V/Cyclone V Hard Processor System

f2h_cold_reset_req Reset Input hps_0_f2h_cold_reset_req

f2h_debug_reset_req Reset Input hps_0_f2h_debug_reset_req

f2h_warm_reset_req Reset Input hps_0_f2h_warm_reset_req

f2h_stm_hw_events Conduit hps_0_f2h_stm_hw_events

memory Conduit memory

hps_io Conduit hps_0_hps_io

h2f_reset Reset Output hps_0_h2f_reset

h2f_axi_clock Clock Input Double-click to export clk_0

h2f_axi_master AXI Master Double-click to export [h2f_axi_clo...

f2h_axi_clock Clock Input Double-click to export clk_0

f2h_axi_slave AXI Slave Double-click to export [f2h_axi_clo... 0x0000_0000 0xffff_ffff

h2f_lw_axi_clock Clock Input Double-click to export clk_0

h2f_lw_axi_master AXI Master Double-click to export [h2f_lw_axi...

f2h_irq0 Interrupt Receiver Double-click to export IRQ 0 IRQ 31

f2h_irq1 Interrupt Receiver Double-click to export IRQ 0 IRQ 31

hps_only_master JTAG to Avalon Master Bridge

clk Clock Input Double-click to export clk_0

clk_reset Reset Input Double-click to export

master Avalon Memory Mapped Master Double-click to export [clk]

master_reset Reset Output Double-click to export

sysid_qsys System ID Peripheral Intel FPGA IP

clk Clock Input Double-click to export clk_0

reset Reset Input Double-click to export [clk]

control_slave Avalon Memory Mapped Slave Double-click to export [clk] 0x0001_0000 0x0001_0007

hps_memory On-Chip Memory (RAM or ROM) Intel ...

clk1 Clock Input Double-click to export clk_0

s1 Avalon Memory Mapped Slave Double-click to export [clk1] 0x0000_0000 0x0000_ffff

reset1 Reset Input Double-click to export [clk1]

jtag_uart JTAG UART Intel FPGA IP

clk Clock Input Double-click to export clk_0

reset Reset Input Double-click to export [clk]

avalon_jtag_slave Avalon Memory Mapped Slave Double-click to export [clk] 0x0002_0000 0x0002_0007

irq Interrupt Sender Double-click to export [clk]

fpga_only_master JTAG to Avalon Master Bridge

clk Clock Input Double-click to export clk_0

clk_reset Reset Input Double-click to export

master Avalon Memory Mapped Master Double-click to export [clk]

master_reset Reset Output Double-click to export

intr_capturer_0 Interrupt Capture Module

clock Clock Input Double-click to export clk_0

reset_sink Reset Input Double-click to export [clock]

avalon_slave_0 Avalon Memory Mapped Slave Double-click to export [clock] 0x0003_0000 0x0003_0007

interrupt_receiver Interrupt Receiver Double-click to export [clock] IRQ 0 IRQ 31

pll_0 PLL Intel FPGA IP

refclk Clock Input Double-click to export clk_0

reset Reset Input Double-click to export

outclk0 Clock Output Double-click to export pll_0_outclk0

outclk1 Clock Output Double-click to export pll_0_outclk1

outclk2 Clock Output sdram_clock pll_0_outclk2

outclk3 Clock Output nios_clock pll_0_outclk3

locked Conduit Double-click to export

sdram SDRAM Controller Intel FPGA IP

clk Clock Input Double-click to export pll_0_outcl...

reset Reset Input Double-click to export [clk]

s1 Avalon Memory Mapped Slave Double-click to export [clk] 0x0800_0000 0x0bff_ffff

wire Conduit sdram_wire

nios2_gen2_0 Nios II Processor

clk Clock Input Double-click to export clk_0

reset Reset Input Double-click to export [clk]

data_master Avalon Memory Mapped Master Double-click to export [clk]

instruction_master Avalon Memory Mapped Master Double-click to export [clk]

irq Interrupt Receiver Double-click to export [clk] IRQ 0 IRQ 31

debug_reset_request Reset Output Double-click to export [clk]

debug_mem_slave Avalon Memory Mapped Slave Double-click to export [clk] 0x0001_2800 0x0001_2fff

custom_instruction_master Custom Instruction Master Double-click to export

nios_memory On-Chip Memory (RAM or ROM) Intel ...

clk1 Clock Input Double-click to export clk_0

s1 Avalon Memory Mapped Slave Double-click to export [clk1] 0x0400_0000 0x0400_3fff

reset1 Reset Input Double-click to export [clk1]

burst_read_master master_template

clock_reset Clock Input Double-click to export clk_0

clock_reset_reset Reset Input Double-click to export [clock_reset]

avalon_master Avalon Memory Mapped Master Double-click to export [clock_reset]

control Conduit burst_read_master_0_conduit_end_control [clock_reset]

user Conduit burst_read_master_0_conduit_end_user [clock_reset]

burst_write_master master_template

clock_reset Clock Input Double-click to export clk_0

clock_reset_reset Reset Input Double-click to export [clock_reset]

avalon_master Avalon Memory Mapped Master Double-click to export [clock_reset]

control Conduit burst_write_master_0_conduit_end_control [clock_reset]

user Conduit burst_write_master_0_conduit_end_user [clock_reset]

video_pixel_buffer_dma_0 Pixel Buffer DMA Controller

clk Clock Input Double-click to export clk_0

reset Reset Input Double-click to export [clk]

avalon_pixel_dma_master Avalon Memory Mapped Master Double-click to export [clk]

avalon_control_slave Avalon Memory Mapped Slave Double-click to export [clk] 0x0001_3000 0x0001_300f

avalon_pixel_source Avalon Streaming Source Double-click to export [clk]

video_scaler_0 Scaler

clk Clock Input Double-click to export clk_0

reset Reset Input Double-click to export [clk]

avalon_scaler_sink Avalon Streaming Sink Double-click to export [clk]

avalon_scaler_source Avalon Streaming Source Double-click to export [clk]

video_rgb_resampler_0 RGB Resampler

clk Clock Input Double-click to export clk_0

reset Reset Input Double-click to export [clk]

avalon_rgb_sink Avalon Streaming Sink Double-click to export [clk]

avalon_rgb_slave Avalon Memory Mapped Slave Double-click to export [clk] 0x0001_3018 0x0001_301b

avalon_rgb_source Avalon Streaming Source Double-click to export [clk]

video_character_buffer_with_... Character Buffer for VGA Display

clk Clock Input Double-click to export clk_0

reset Reset Input Double-click to export [clk]

avalon_char_control_slave Avalon Memory Mapped Slave Double-click to export [clk] 0x0001_3010 0x0001_3017

avalon_char_buffer_slave Avalon Memory Mapped Slave Double-click to export [clk] 0x0001_0000 0x0001_1fff

avalon_char_source Avalon Streaming Source Double-click to export [clk]

video_alpha_blender_0 Alpha Blender

clk Clock Input Double-click to export clk_0

reset Reset Input Double-click to export [clk]

avalon_foreground_sink Avalon Streaming Sink Double-click to export [clk]

avalon_background_sink Avalon Streaming Sink Double-click to export [clk]

avalon_blended_source Avalon Streaming Source Double-click to export [clk]

video_dual_clock_buffer_0 Dual-Clock FIFO

clock_stream_in Clock Input Double-click to export clk_0

reset_stream_in Reset Input Double-click to export [clock_strea...

clock_stream_out Clock Input Double-click to export pll_vga_ou...

reset_stream_out Reset Input Double-click to export [clock_strea...

avalon_dc_buffer_sink Avalon Streaming Sink Double-click to export [clock_strea...

avalon_dc_buffer_source Avalon Streaming Source Double-click to export [clock_strea...

video_vga_controller_0 VGA Controller

clk Clock Input Double-click to export pll_vga_ou...

reset Reset Input Double-click to export [clk]

avalon_vga_sink Avalon Streaming Sink Double-click to export [clk]

external_interface Conduit video_vga_controller_0_external_interface

pll_vga PLL Intel FPGA IP

refclk Clock Input Double-click to export clk_0

reset Reset Input Double-click to export

outclk0 Clock Output Double-click to export pll_vga_out...

locked Conduit Double-click to export

weights On-Chip Memory (RAM or ROM) Intel ...

clk1 Clock Input Double-click to export clk_0

s1 Avalon Memory Mapped Slave Double-click to export [clk1] 0x1800_0000 0x1800_0fff

reset1 Reset Input Double-click to export [clk1]

s2 Avalon Memory Mapped Slave weights_s2 [clk2]

clk2 Clock Input weights_clk2 exported

reset2 Reset Input weights_reset2 [clk2]