Strona 1 z 1

[FPGA] MAXimator, konfigurowanie NIOS II

: wtorek 19 kwie 2016, 22:44
autor: PROTON
Jak by ktoś nie wiedział czym jest NIOS II to już wyjaśniam, jest to 32 bitowy mikroprocesor.


Zaczynamy, w Quartusie tworzymy nowy projekt, uruchamiamy narzędzie Qsys i dodajemy po kolei:

Nios II Processor, w pierwszej zakładce zmieniamy w Nios II Core na Nios II/e i Finish
n0.png

On-Chip Memory (RAM or ROM), odznaczamy opcję Initialize memory content i Finish
n1.png

JTAG UART, nic nie zmieniamy, Finish
PIO (Parallel I/O), zmieniamy opcję Width (1-32 bits) na 4, Finish
n2.png

Kolejny raz dodajemy PIO (Parallel I/O), zmieniamy opcję Width (1-32 bits) na 2 oraz Direction na Input, Finish
n3.png

Mamy coś takiego, teraz trzeba wszystko ładnie po podłączać i skonfogurować:
n4.png

pio_0, prawy myszy, rename, wpisujemy LED, pio_1, zmieniamy na BUTTON
Przy LED i BUTTON przyy external_connection w kolumnie Export na napisie Double-click to export klikamy dwukrotnie, i nadajemy nazwę np led i button.

Kolumna Connections
Z clk_0 podpinamy wszedzie clk i clk_reset.
Z nios2_gen2_0 sygnał data_master podpinamy wszedzie, czyli onchip_memory2_0, jtag_uart_0, LED, BUTTON
Z nios2_gen2_0 sygnał instruction_master podpinamy do onchip_memory2_0
Z nios2_gen2_0 sygnał debug_reset_request podpinmy wszedzie.
Z jtag_uart_0 sygnał irq podpinamy do nios2_gen2_0
Teraz bardzo ważny moment, trzema przydzielić adresy bazowe poszczególnym komponentom, z menu System wybieramy Assign Base Addresses
Kolejny krok to konfiguracja procesora, klikamy prawym myszy na nios2_gen2_0, wybieramy Edit.
W zakładce Vectors zmieniamy w:
Reset vector memory z None na onchip_memory2_0.s1
Exception vector memory z None na onchip_memory2_0.s1
n5.png

Gotowe, tak wygląda skonfogurowany procesor:
n6.png

klikamy finish, nadajemy nazwę (np. processor), generujemy.

Re: [FPGA] MAXimator, konfigurowanie NIOS II

: środa 20 kwie 2016, 09:28
autor: dambo
Pozamiatane :) Będzie część o tym jak go programować?

Re: [FPGA] MAXimator, konfigurowanie NIOS II

: środa 20 kwie 2016, 10:17
autor: PROTON
Będzie ciąg dalszy.

Re: [FPGA] MAXimator, konfigurowanie NIOS II

: środa 20 kwie 2016, 12:35
autor: dambo
To takie pytanko dla potwierdzenia i może innym pozwoli to dostrzec - czyli mamy teraz mikroprocesorek i możemy do niego napisać własne peryferia, czyli np sprzętową obsługę HD44780, VGA, karty pamięci itp i dane do nich/od nich zapisywać/odczytywać normalnie w kodzie w C?

Re: [FPGA] MAXimator, konfigurowanie NIOS II

: środa 20 kwie 2016, 12:56
autor: PROTON
Tak, można tworzyć własne peryferia w VHDLu/Verilogu i je obsługiwać, będzie w II części.

Re: [FPGA] MAXimator, konfigurowanie NIOS II

: środa 20 kwie 2016, 18:01
autor: PROTON
Lecimy dalej, po wygenerowaniu HDL'a i zamknięciu Qsys'a trzeba nasz processor zaimportować do Quartusa.
W Project Navigator, Hierarchy zmieniamy na Files.
n10.png

Prawym myszy na Files -> Add/Remove Files in Project..., kilkamy w trzy kropli obok File name, dodajemy plik, processor.qsys klikamy Add i na dole Apply.
n11.png

Możemy przeprowadzić kompilację i zobaczyć co się stanie, w menu wybieramy: Processing->Start Compilation. I mamy błąd:
Error (12007): Top-level design entity "NIOS_LCD" is undefined
Dlatego, że Quartus domyślnie ustawia nazwę komponentu nadrzędnego taką samą jak nazwę projektu. Ja z rozpędu nazwałem projekt NIOS_LCD (Miał być NIOS_LED). Przełączamy Project Navigator na Hierarchy, kilkamy prawym myszy na NIOS_LCD, wybieramy Settings w Category: General w Top-level entry wpisujemy nazwę projektu wpisaną w Qsys, w moim przypadku processor.
n12.png

Przeprowadzamy koleją kompilację i mamy sukces.
n13.png

Teraz trzeba podłączyć wejścia i wyjścia,W menu Assigments wybieramy Pin Planner
W Pin Planerze możemy połączać wyjścia przeciągając Node Name na odpowiednie miejsce na układzie lub wpisując ręcznie w kolumnie Location.
n14.png

Po podpięciu pinów i przeprowadzeniu ponownej kompilacji możemy wgrać procesor do MAXimatora. Podpinamy programator doMAXimatora i do USB w komputerze, podpinamy zasilanie do MAXimatora, wybieramy w menu Tools->Programmer. W okienku Programmer kilkamy Add File..., wchodzimu do katalogu output_files, wybieramy plik z rozszerzeniem sof. Wciskamy Start, po chwili mamy processor NIOS II na MAXimatorze.
n15.png

Re: [FPGA] MAXimator, konfigurowanie NIOS II

: środa 20 kwie 2016, 19:35
autor: PROTON
Teraz trzeba napisać jakiś programik, w Quartusie wybieramy w menu: Tools->Nios II Software Build Tools for Eclipse i czekamy ...

Po uruchomieniu się środowiska Eclipse, wybieramy w menu: File->New->Nios II Application and BSP from Template.
W nowym okienku w polu SOPC Information File name pokazujemy plik processor.sopcinfo który został wygenerowany przez Qsys, w Project name wpisujemy jakąś nazwę, np LED_DEMO w Templates wybieramy Hello World Small, w normalnej wersji (bez Small) wygeneruje nam ponad 70KB wsad który się nam nie zmieści do procesora.
n20.png

Po wygenerowaniu projektu mamy tak jakby dwa projekty, jeden LED_DEMO w którym umieszaczamy nasz kod, drugi LED_DEMO_bsp (processor) który jest generowany na podstawie pliku wygenerowanego przez Qsys, po wprowadzeniu zmian w Qsys zawartość tego projektu będzie się zmieniała.
W pierwszym projekcie szukamy pliku hello_world_small.c i go edytujemy. Includujemy dwa pliki system.h który zawiera definicje stałych wszystkich komponentów z którymi połączony jest processor, oraz plik altera_avalon_pio_regs.h który zawiera makra do obsługi pinów.
Zmodyfikowałem przykładowy program, dodałem obsługę przycisków i LEDów i skompilowałem:

Kod: Zaznacz cały

#include "sys/alt_stdio.h"
#include "system.h"
#include "altera_avalon_pio_regs.h"

int main()
{
  alt_putstr("Hello PROTON!\n");
  int sw;
  while (1){
   sw = IORD_ALTERA_AVALON_PIO_DATA(SWITCH_BASE) & 0x03;
   switch(sw){
   case 0:
      IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE, 4+2+1);
      break;
   case 1:
      IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE, 8+2+1);
      break;
   case 2:
      IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE, 8+4+1);
      break;
   case 3:
      IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE, 8+4+2);
      break;
   }
  }
  return 0;
}


n22.png

Następnie wgrywamy program do NIOS-a
Wybieramy w menu Run->Run as..->3 Nios II Hardware
n21.png

Wybiermy zakładkę Target Connection i w System ID checks zaznaczamy opcje:
Ignore mismatched system ID
Ignore mismatched system timestamp
n23.png

Po wciśnięciu Run program zostanie wgrany do NIOS-a.

efekt końcowy: https://youtu.be/t9obvcy28zo

Na koniec załączam kompletny projekt
NIOS_LCD.7z


Miłej zabawy!

Re: [FPGA] MAXimator, konfigurowanie NIOS II

: środa 20 kwie 2016, 20:07
autor: wojtek
To ja już nie mogę się doczekać jak praca będzie mi tylko zajmowała 8 godzin :)

Re: [FPGA] MAXimator, konfigurowanie NIOS II

: czwartek 29 gru 2016, 08:23
autor: Shuman
Witam serdecznie szanownych forumowiczów!
Jako że jestem nowy, nie wiem czy dobrze trafiłem z tematem, jednak problem dotyczy właśnie NIOS II.

Nie wiem czy ktoś już "bawił" się ostatnim kursem w EP "Pierwsze kroki z FPGA (6)" jak by tak nie było to proszę o zwrócenie uwagi na kod w głównej funkcji main(), z tego co wynika z kodu, "timer" i "IRQ" powinny znaleźć się w pętli, a w treści artykułu pętla jest pusta.

Ja to zrobiłem tak:

Kod: Zaznacz cały

int main()
{
   while (1){
  /* Timer*/
   IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_0_BASE,
         ALTERA_AVALON_TIMER_CONTROL_START_MSK |
         ALTERA_AVALON_TIMER_CONTROL_CONT_MSK |
         ALTERA_AVALON_TIMER_CONTROL_ITO_MSK);

  /* irq */
   alt_ic_isr_register(TIMER_0_IRQ_INTERRUPT_CONTROLLER_ID, TIMER_0_IRQ, irr, NULL, 0);
   alt_ic_irq_enable(0,0);
   
  };


W tej formie diody ładnie "płyną".

Re: [FPGA] MAXimator, konfigurowanie NIOS II

: czwartek 29 gru 2016, 09:38
autor: PROTON
Cześć,
Prawidłowy kod to:

Kod: Zaznacz cały

#include "sys/alt_irq.h"
#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "altera_avalon_timer_regs.h"

volatile int counter = 0;

static void irr(){
   counter++;
   IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, counter );
   IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_0_BASE, 0);
}

int main()
{
   /* TIMER */
   IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_0_BASE,
         ALTERA_AVALON_TIMER_CONTROL_START_MSK |
         ALTERA_AVALON_TIMER_CONTROL_CONT_MSK |
         ALTERA_AVALON_TIMER_CONTROL_ITO_MSK
         );

   /* IRQ */
   alt_ic_isr_register(TIMER_0_IRQ_INTERRUPT_CONTROLLER_ID,TIMER_0_IRQ, irr, NULL, 0);
   alt_ic_irq_enable(0,0);

   /*loop*/
  while (1){}

  return 0;
}


Wyjaśnię jak to działa, w systemie wraz z procesorem NIOS został utworzony timer, który generuje przerwanie co pół sekundy.
To przerwane zostaje wykorzystane do uruchomienia funkcji irr() co pół sekundy.
Funkcja irr():
- zwiększa wartość zmiennej globalnej counter o jeden;
- 4 ostatnie bity przesyła do wyjścia gdzie są podłączone diody;
- kasuje flagę przerwania;

Poniższa część kodu konfiguruje timer:

Kod: Zaznacz cały

   /* TIMER */
   IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_0_BASE,
         ALTERA_AVALON_TIMER_CONTROL_START_MSK |
         ALTERA_AVALON_TIMER_CONTROL_CONT_MSK |
         ALTERA_AVALON_TIMER_CONTROL_ITO_MSK
         );


Ta część kodu przypisuje do przerwania funkcję irr oraz odblokowuje przerwanie:

Kod: Zaznacz cały

   /* IRQ */
   alt_ic_isr_register(TIMER_0_IRQ_INTERRUPT_CONTROLLER_ID,TIMER_0_IRQ, irr, NULL, 0);
   alt_ic_irq_enable(0,0);


Procesor sobie czeka w pustej pętli, ewentualnie robi coś innego a diody są sterowane przez przerwanie.

Re: [FPGA] MAXimator, konfigurowanie NIOS II

: czwartek 29 gru 2016, 12:00
autor: Shuman
A chyba że tak, spróbuję raz jeszcze z przerwaniem.
Za pierwszym razem kod zaświecał cztery diody i tak to zostawało.

Dzięki za wyjaśnienie.
Do tej pory nie zajmowałem się procesorami na FPGA i nie byłem pewny czy jest ok.

Re: [FPGA] MAXimator, konfigurowanie NIOS II

: niedziela 08 sty 2017, 10:06
autor: Shuman
Miałem trochę czasu i uruchomiłem procesor na bemicro cv a9, działa fajnie :)
Czy poza dokumentacją Altery można gdzieś dowiedzieć się czegoś więcej o samym c/c++ dostępnym do tego środowiska bo widzę że standard to nie jest?
Z pierwszego spojrzenia widzę że, dużo tam bibliotek Altery a ja chciałbym uruchomić ethernet dostępny na płytce CV A9 ale nie bardzo widzę by były jakieś przykłady w sieci dla tego układu.

Re: [FPGA] MAXimator, konfigurowanie NIOS II

: niedziela 30 kwie 2017, 16:54
autor: piotrva
C jest dokładnie taki jak na inne układy / komputery.
Są tylko biblioteki Altery, do których są nie najgorsze dokumentacje na ich stronach.

Re: [FPGA] MAXimator, konfigurowanie NIOS II

: czwartek 03 sie 2017, 00:44
autor: AndrzejB
Jestem początkujący. Czy standardowe kość w Maximatorze ma wystarczającą ilość bramek, by zaimplementować Nios?

Re: [FPGA] MAXimator, konfigurowanie NIOS II

: sobota 16 wrz 2017, 21:44
autor: piotrva
tak

Re: [FPGA] MAXimator, konfigurowanie NIOS II

: piątek 29 gru 2017, 15:47
autor: adi
W kodzie procesora, w linii:

sw = IORD_ALTERA_AVALON_PIO_DATA(SWITCH_BASE) & 0x03;

powinno być BUTTON_BASE - tak zadeklarowano w samym procesorze

Pozdrawiam

Re: [FPGA] MAXimator, konfigurowanie NIOS II

: niedziela 31 gru 2017, 07:44
autor: adi