[FPGA] MAXimator, konfigurowanie NIOS II

MAXimatora – jak zacząć, sprzęt, oprogramowanie, pierwszy projekt, następne zaawansowane projekty, kursy itp.
Awatar użytkownika
PROTON
Expert
Expert
Posty: 527
Rejestracja: czwartek 08 paź 2015, 18:35
Lokalizacja: Warszawa

[FPGA] MAXimator, konfigurowanie NIOS II

Postautor: PROTON » wtorek 19 kwie 2016, 22:44

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.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Gott weiß ich will kein Engel sein.

Awatar użytkownika
dambo
Expert
Expert
Posty: 645
Rejestracja: czwartek 17 mar 2016, 17:12

Re: [FPGA] MAXimator, konfigurowanie NIOS II

Postautor: dambo » środa 20 kwie 2016, 09:28

Pozamiatane :) Będzie część o tym jak go programować?
Nowy blog o tematyce embedded -> https://www.embedownik.pl/

Awatar użytkownika
PROTON
Expert
Expert
Posty: 527
Rejestracja: czwartek 08 paź 2015, 18:35
Lokalizacja: Warszawa

Re: [FPGA] MAXimator, konfigurowanie NIOS II

Postautor: PROTON » środa 20 kwie 2016, 10:17

Będzie ciąg dalszy.
Gott weiß ich will kein Engel sein.

Awatar użytkownika
dambo
Expert
Expert
Posty: 645
Rejestracja: czwartek 17 mar 2016, 17:12

Re: [FPGA] MAXimator, konfigurowanie NIOS II

Postautor: dambo » środa 20 kwie 2016, 12:35

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?
Nowy blog o tematyce embedded -> https://www.embedownik.pl/

Awatar użytkownika
PROTON
Expert
Expert
Posty: 527
Rejestracja: czwartek 08 paź 2015, 18:35
Lokalizacja: Warszawa

Re: [FPGA] MAXimator, konfigurowanie NIOS II

Postautor: PROTON » środa 20 kwie 2016, 12:56

Tak, można tworzyć własne peryferia w VHDLu/Verilogu i je obsługiwać, będzie w II części.
Gott weiß ich will kein Engel sein.

Awatar użytkownika
PROTON
Expert
Expert
Posty: 527
Rejestracja: czwartek 08 paź 2015, 18:35
Lokalizacja: Warszawa

Re: [FPGA] MAXimator, konfigurowanie NIOS II

Postautor: PROTON » środa 20 kwie 2016, 18:01

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
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Gott weiß ich will kein Engel sein.

Awatar użytkownika
PROTON
Expert
Expert
Posty: 527
Rejestracja: czwartek 08 paź 2015, 18:35
Lokalizacja: Warszawa

Re: [FPGA] MAXimator, konfigurowanie NIOS II

Postautor: PROTON » środa 20 kwie 2016, 19:35

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!
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Ostatnio zmieniony środa 20 kwie 2016, 20:07 przez PROTON, łącznie zmieniany 1 raz.
Gott weiß ich will kein Engel sein.

SuperGość
Uber Geek
Uber Geek
Posty: 2346
Rejestracja: piątek 04 wrz 2015, 09:03

Re: [FPGA] MAXimator, konfigurowanie NIOS II

Postautor: SuperGość » środa 20 kwie 2016, 20:07

To ja już nie mogę się doczekać jak praca będzie mi tylko zajmowała 8 godzin :)

Shuman
Posty: 3
Rejestracja: środa 28 gru 2016, 19:44

Re: [FPGA] MAXimator, konfigurowanie NIOS II

Postautor: Shuman » czwartek 29 gru 2016, 08:23

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ą".
MAXimator
BeMicro MAX10
BeMicro CV A9

Awatar użytkownika
PROTON
Expert
Expert
Posty: 527
Rejestracja: czwartek 08 paź 2015, 18:35
Lokalizacja: Warszawa

Re: [FPGA] MAXimator, konfigurowanie NIOS II

Postautor: PROTON » czwartek 29 gru 2016, 09:38

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.
Gott weiß ich will kein Engel sein.

Shuman
Posty: 3
Rejestracja: środa 28 gru 2016, 19:44

Re: [FPGA] MAXimator, konfigurowanie NIOS II

Postautor: Shuman » czwartek 29 gru 2016, 12:00

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.
MAXimator
BeMicro MAX10
BeMicro CV A9

Shuman
Posty: 3
Rejestracja: środa 28 gru 2016, 19:44

Re: [FPGA] MAXimator, konfigurowanie NIOS II

Postautor: Shuman » niedziela 08 sty 2017, 10:06

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.
MAXimator
BeMicro MAX10
BeMicro CV A9

piotrva
Posty: 14
Rejestracja: poniedziałek 24 paź 2016, 23:39

Re: [FPGA] MAXimator, konfigurowanie NIOS II

Postautor: piotrva » niedziela 30 kwie 2017, 16:54

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.

AndrzejB
Posty: 1
Rejestracja: czwartek 03 sie 2017, 00:40

Re: [FPGA] MAXimator, konfigurowanie NIOS II

Postautor: AndrzejB » czwartek 03 sie 2017, 00:44

Jestem początkujący. Czy standardowe kość w Maximatorze ma wystarczającą ilość bramek, by zaimplementować Nios?

piotrva
Posty: 14
Rejestracja: poniedziałek 24 paź 2016, 23:39

Re: [FPGA] MAXimator, konfigurowanie NIOS II

Postautor: piotrva » sobota 16 wrz 2017, 21:44

tak

adi
Posty: 20
Rejestracja: sobota 02 kwie 2016, 17:47

Re: [FPGA] MAXimator, konfigurowanie NIOS II

Postautor: adi » piątek 29 gru 2017, 15:47

W kodzie procesora, w linii:

sw = IORD_ALTERA_AVALON_PIO_DATA(SWITCH_BASE) & 0x03;

powinno być BUTTON_BASE - tak zadeklarowano w samym procesorze

Pozdrawiam

adi
Posty: 20
Rejestracja: sobota 02 kwie 2016, 17:47

Re: [FPGA] MAXimator, konfigurowanie NIOS II

Postautor: adi » niedziela 31 gru 2017, 07:44



Wróć do „FPGA - MAXimator”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 0 gości