Você está na página 1de 11

UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE

CENTRO DE TECNOLOGIA/DEPARTAMENTO DE ENGENHARIA ELTRICA


PROGRAMA DE PS GRADUA EM ENERGIA ELTRICA

Tutorial
SoPC com Qsys e Nios II

Discente: Leonardo Duarte de Albuquerque


(Mat. 2015100202)
Docente: Dr. Jose Alberto Nicolau De Oliveira

NATAL, RN, Maro de 2016.

Trabalho avaliativo da disciplina de Metodologias


de Projeto de Sistemas Embarcados MPEE0010.

Descrio Geral
QSYS a nova ferramenta Altera SOPC Builder. Ento, se voc estiver usando o Quartus 13.0.x,
voc deve t-la. Neste tutorial vamos criar um sistema on Chip Programvel (SOPC) ou System on
Chip (SoC) com QSYS.

Explicao
Este tutorial desenvolver um sistema que acende dois LEDs atravs de dois botes utilizando a
placa DE2 e o Quartus II .
Ser escolhido o hardware, realizado o projeto e criada uma biblioteca de software a partir deste
projeto. Aps isso ser escrito um programa em C, que ser carregado na placa DE2, com
hardware desenvolvido no QSYS, gerando o arquivo "de2_blinker.sopcinfo".
Com este arquivo que ser criado o BSP (Board Support Package), compilado com a aplicao do
usurio em linguagem C (desenvolvida no SBT - Software Build Tools, plataforma baseada no
Eclipse), para depois ser descarregado na placa e testado.

Criando um projeto no Quartus

Temos antes de tudo para criar um novo projeto Quartus.


De Quartus > File > New Project Wizard > Next..

Project directory: C:\dev\fpga\altera\sys-on-prog-chip


Project name: chip1
Project top-level entity: chip1

Next>

Family: Cyclone II
Package: FBGA
Pin count: 672
Speed grade: 6
Available devices: EP2C35F672C6

Next> Next> Finish

Criando uma interao entre componentes com QSYS

De Quartus > Tools > QSYS


Com o Qsys aberto, clique em File > Save > A janela de salvar deve abrir diretamente do diretrio
sys-on-prog-chip >, em seguida, digite o nome de2_blinker > Save.
Em seu diretrio de projeto agora voc pode ver um novo arquivo: de2_blinker.qsys.
Voltando para o QSYS, a direita voc pode ver o clock clk_0 na guia System Contents.
Clique com o boto direito em cima dele, e vamos renomear para clock_main.
Voc pode verificar todas as guias para ver o que eles contm. Tudo est por padro correto, por
isso no vamos modificar nada.

Adicionando um processador

Em Component Library ( esquerda), selecione: Library > Embedded Processors > Nios II
Processor.
Clique no boto +Add.., e a janela do mdulo do processador Nios II vai abrir.
Na guia Core Nios II > Selecione Nios II Core > Nios II/e > Finish
O ncleo Nios II adicionado sobre o contedo do sistema com o nome nios2_qsys_0, vamos
renome-lo para nios2_proc.
Voc pode ver que o data_master e instruction_master j esto ligados a jtag_debug_module

com uma linha preta.


Na parte inferior, na aba Messages, existem 4 erros que iremos corrigi-los mais a frente.

Adicionando uma memria

Vamos continuar adicionando um novo mdulo: a memria.


Clique em Library > Memories and Memory Controllers > On-Chip > On-Chip Memory
(RAM or ROM) > +Add
A janela do chip de memria (RAM ou ROM) aparecer, e em Size > Total memory size est
4096 bytes. Como esse valor pequeno para nosso exemplo, modifique para 16384.
Clique em Finish.
O onchip_memory2_0 foi adicionado aos componentes do sistema. Renomeie para
onchip_memory.
Existem agora 6 erros na parte inferior e um aviso.

Adicionando o primeiro PIO (para as chaves)

Vamos continuar adicionando as entradas do mdulo PIO (Parallel I/O):


Clique em Library > Peripherals > Microcontroller Peripherals > PIO (Parallel I/O) > +
Add
A janela do PIO (Parallel I/O) ir aparecer. Em Basic Settings > Width (1-32 bits) > j est
preenchido com o valor 8. Vamos deixar assim, embora precisemos de apenas 2. Ainda na guia
Basic Settings > Direction > selecione Input > Finish.
Renomeie a PIO adicionada de pio_0 para switcher.
Agora h 8 erros e 2 avisos.

Adicionando um segundo PIO (para os LEDs)

Vamos continuar adicionando o segundo PIO (Parallel I/O) as sadas do mdulo:


Clique em Library > Peripherals > Microcontroller Peripherals > PIO (Parallel I/O) > +
Add
A janela do mdulo PIO (Parallel I/O) ir aparecer. Na aba Basic Settings > Width (1-32 bits) >
j est preenchido com 8, desta vez altere para 2.
Ainda na janela Basic Settings > Direction > selecione Output > Finish.
A sada do mdulo PIO (Parallel I/O) foi adicionada ao contedo do sistema, mude seu nome de
pio_0 para led.

Agora existem 10 erros e 5 advertncias.

Adicionando o System ID Peripheral

Este mdulo funciona como um gerenciador de entre hardware e do BSP.


Clique em Library > Peripherals > Debug and Performance > System ID Peripheral > +
Add..
A janela do mdulo do Sistema ID perifrico aparece. Em Parameters > 32 bit System ID >
mude 0x00000000 por 1337 (que ser transformado automaticamente em 0x00001337).
Este nmero arbitrrio e deve ser exclusivo.
Clique em Finish.
O mdulo do Sistema ID Peripheral foi adicionado ao contedo do sistema. Modifique seu nome
de sysid_qsys_0 para sysid_1337.
Agora existem 12 erros e 6 avisos.

Corrigindo erros, parte 1

Para corrigir os erros e avisos, antes de tudo, vamos conectar todos os clocks.
Para isso necessrio clicar na frente de cada clock, e escolher:

nios2_proc > clk


onchip_memory > clk1
switcher > clk
led > clk
sysid_1337 > clk

Os erros so reduzidos para 7 e avisos continuam a ser 6.


A sada clock_main.clk_reset tambm deve ser atribuda a outras entradas mdulos reset_n.
Vamos conect-los todos.
Ligando o clock_main.clk_reset para:

nios2_proc > reset_n


onchip_memory > reset1
switcher > reset
led > reset
sysid_1337 > reset

Os erros diminuram para 2 e os avisos continuam sendo 6.

Corrigindo erros, parte 2

Conecte nios2_proc.data_master a:

nios2_proc > jtag_debug_module


onchip_memory > s1
switcher > s1
led > s1
sysid_1337 > control_slave

Conecte nios2_proc.instruction_master a:

nios2_proc > jtag_debug_module


onchip_memory > s1

Temos agora 11 erros e 2 avisos.


Vamos atribuir endereos base.
De Qsys > System > Assign Base Addresses
Erros: 2.
Warnings: 2.
Vamos reabrir a janela mdulo do nios2_proc clicando duas vezes nele. Em Reset vector > Reset
vector memory > selecione onchip_memory.s1. Em Exception Vector > Exception vector
memory > selecione onchip_memory.s1.
Clique em Finish.
Conecte o clock_main.clk_in_reset a: #Conectei o clock_main.clk_reset

nios2_proc > reset_n

Corrigindo erros, parte 3

Para terminar o sistema, temos de acrescentar conexes para conexes externas.


Neste ponto o switcher.external_connection est em um estado no definido. D um clique
duplo na coluna Export para o switcher > external_connection (Conduit).
A nova Export torna-se switcher_external_connection.
Faa o mesmo para o led> external_connection na coluna Export.
A nova exportao torna-se led_external_connection.
Erros: 0.
Advertncias: 0.

Gerao do cdigo HDL

Vamos gerar o cdigo Verilog HDL.


De QSYS > selecione a guia Generation a direita, clique em Generate na parte inferior.
No final da gerao, se voc verificar no seu diretrio sys-on-prog-chip, voc deve ver uma nova
pasta de2_blinker e 5 novos arquivos, alm de de 2_blinker.sys:

de2_blinker.bsf
de2_blinker.cmp
de2_blinker.html
de2_blinker.sopcinfo
de2_blinker.generation.rpt

Dentro da pasta de2_blinker h uma outra pasta chamada synthetis e dentro dela a pasta
submodules, com vrios arquivos.
Vamos voltar para o Quartus.

Adio de arquivos, compilao e carregamento de Quartus

Adio de arquivos

Em Quartus > Project > Add/Remove Files in Project > aparecer a janela Settings.
Clique no boto "..." direita da entrada de texto File name e selecione o arquivo que voc pode
encontrar em:
C:\dev\fpga\altera\sys-on-prog-chip\de2_blinker\synthesis\de2_blinker.v
Em seguida, clique em Add a direita. O arquivo de2_blinker.v adicionado.
Vamos continuar adicionando todos os outros arquivos.
Clique no boto "..." direita da entrada de texto File name. Selecione todos os 36 arquivos no
seguinte diretrio:
C:\dev\fpga\altera\sys-on-prog-chip\de2_blinker\synthesis\submodules
Eles so adicionados imediatamente (no precisa clicar em Adicionar). Clique em OK.
No Project Navigator, clique na guia Files.
Na lista de arquivos, selecione de2_blinker/synthesis/de2_blinker.v.
Clique com o boto direito > Set as Top-Level Entity.

Compilaes

Vamos comear a primeira compilao.


De Quartus > Processing > Start Compilation.
Normalmente a compilao termina sem erros (apenas advertncias). Esta primeira compilao
mostrou ao Quartus quais os pinos que gostaria de usar.
Vamos agora atribuir pinos corretos com local correto.
De Quartus > Assignments > Pin Planner.
Na parte inferior, na rea All Pins, voc deve ver Node Name, mas com as colunas Location nem
I/O Bank e VREF Group em branco.
Abra o DE2_pin_assignments.csv, observe que esta atribuio apenas para a placa DE2. Para a
outra placa usar o arquivo especfico CSV atribuies de pinos.
Dentro, podemos ver que a localizao do CLOCK_50 PIN_N2.
Temos de acrescentar cada local para cada n., assim, no Pin Planner, clique duas vezes na
Localizao de clk_clk> selecione PIN_N2.
Automaticamente o I/O Bank e VREF Group so adicionados.
Aviso: Do SW2 at SW7 no so utilizados para este tutorial, para que voc no tenha que atribulos se voc no quiser.
Vamos fazer o mesmo para os outros ns:

clk_clk
PIN_N2
led_external_connection_export[1]
PIN_AF23
led_external_connection_export[0]
PIN_AE23
switcher_external_connection_export[7] PIN_C13
switcher_external_connection_export[6] PIN_AC13
switcher_external_connection_export[5] PIN_AD13
switcher_external_connection_export[4] PIN_AF14
switcher_external_connection_export[3] PIN_AE14
switcher_external_connection_export[2] PIN_P25
switcher_external_connection_export[1] PIN_N26
switcher_external_connection_export[0] PIN_N25

Uma vez feito isso, vamos recompilar o projeto., em Quartus > Processing > Start Compilation.

Enviando o design para a placa

Neste ponto, temos que enviar o arquivo chip1.sof, gerada pela segunda compilao, para a placa.
Arquivo encontrado em:
C:\dev\fpga\sys-on-prog-chip\output_files\chip1.sof
De Quartus > Tools > Programmer.
Normalmente, voc s tem que clicar em Start para fazer o upload do programa na placa, mas se
o output_files/chip1.so no estiver visvel direita, clique em Add File e escolha-o.

Criando uma biblioteca BSP e uma aplicao de usurio com as


ferramentas de software Nios II
A biblioteca BSP

Observao: necessrio ter placa conectada e ligada. Caso contrrio, a biblioteca BSP no
vai encontrar o ID correspondente nem o timestamp do programa atual.
Uma vez que o projeto enviado para a placa, podemos criar a nossa BSP library.
De Quartus > Tools > Nios II Software Build Tools For Eclipse.
Escolha um espao de trabalho para o Eclipse, por exemplo:
C:\dev\fpga\eclipse
De Eclipse > File > New > Nios II Application and BSP from Template.
Vai aparecer uma janela do aplicativo Nios II e BSP.
Na SOPC Information File name escolha:
C:\dev\fpga\altera\sys-on-prog-chip\de2_blinker.sopcinfo
Automaticamente voc pode ver que nios2_proc aparece no menu CPU name.
Adicione um nome na parte Project name, por exemplo, blinker-lib.
No Project template, deixe Hello World como template.
Clique em Next, voc ver blinker-lib_bsp no BSP Project name.
Clique em Finish.
A compilao da biblioteca BSP inicia e voc pode encontrar dois novos projetos em:
C:\dev\fpga\altera\sys-on-prog-chip\de2_blinker.sopcinfo
No Project Explorer, h ento dois novos projetos:

blinker-lib

blinker-lib_bsp

Vamos remover blinker-lib (ou fech-lo).

Criando um programa

V para Eclipse > File > New > Nios II Application.


Adicione um nome no nome do projeto, por exemplo app-to-board.
Em seguida em BSP location, clique no boto "..." e escolha blinker-lib_bsp.
Clique em Finish.
Vamos agora criar um arquivo C.
No Project Explorer > clique com o boto direito em app-to-board > New > Source File.
Em Source file, coloque main.c, e em Template, escolha Default C source template.
Clique em Finish.
No novo arquivo criado, escreva o cdigo abaixo:
#include"io.h"
#include"system.h"
voidset_led(unsignedcharled_pattern){
IOWR(LED_BASE,0,led_pattern);
}
voidmain(){
unsignedcharled_pattern=0x00;
while(1){//LoopInfinito
led_pattern=IORD(SWITCHER_BASE,0);//LED
set_led(led_pattern);//SetandooLED
}
}

Em Project Explorer > clique com o boto direito em app-to-board > Run As > 3 Nios II
Hardware.
O programa principal comear a compilar.
A janela Run Configuration ir abrir. Se houver falta de informao, assim como na aba Target
Connection, voc tem que clicar em Refresh Connections a direita.
Se voc clicar em System ID Properties voc deve ver ID base, system e timestamp.
Se houver erros, clique em Ignore mismatched system ID e/ou Ignore mismatched system
timestamp na guia Target Connection na parte inferior.

Em seguida, clique em Apply e Run.


As vezes, se voc reiniciar o Eclipe ele pode funcionar, ou se voc recarregar o arquivo chip1.sof
na placa ou recompilar o projeto novamente.
No final do processo ir aparecer:
Usingcable"USBBlaster[USB0]",device1,instance0x00
Pausingtargetprocessor:notresponding.
Resettingandtryingagain:OK
ReadingSystemIDataddress0x00009020:verified
InitializingCPUcache(ifpresent)
OK
Downloading00004000(0%)
Downloading00004F0C(61%)
Downloaded4KBin0.0s
Verifying00004000(0%)
Verifying00004F0C(61%)
VerifiedOK
Startingprocessorataddress0x00004020

Agora que o programa est na placa, tente apertar as chaves SW0 e SW1 para ver o LEDR0 e o
LEDR1 respectivamente acenderem.