[FPGA] MAXimator, konfigurowanie NIOS II
[FPGA] MAXimator, konfigurowanie NIOS II
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
On-Chip Memory (RAM or ROM), odznaczamy opcję Initialize memory content i Finish
JTAG UART, nic nie zmieniamy, Finish
PIO (Parallel I/O), zmieniamy opcję Width (1-32 bits) na 4, Finish
Kolejny raz dodajemy PIO (Parallel I/O), zmieniamy opcję Width (1-32 bits) na 2 oraz Direction na Input, Finish
Mamy coś takiego, teraz trzeba wszystko ładnie po podłączać i skonfogurować:
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
Gotowe, tak wygląda skonfogurowany procesor:
klikamy finish, nadajemy nazwę (np. processor), generujemy.
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
On-Chip Memory (RAM or ROM), odznaczamy opcję Initialize memory content i Finish
JTAG UART, nic nie zmieniamy, Finish
PIO (Parallel I/O), zmieniamy opcję Width (1-32 bits) na 4, Finish
Kolejny raz dodajemy PIO (Parallel I/O), zmieniamy opcję Width (1-32 bits) na 2 oraz Direction na Input, Finish
Mamy coś takiego, teraz trzeba wszystko ładnie po podłączać i skonfogurować:
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
Gotowe, tak wygląda skonfogurowany procesor:
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.
Re: [FPGA] MAXimator, konfigurowanie NIOS II
Pozamiatane Będzie część o tym jak go programować?
Nowy blog o tematyce embedded -> https://www.embedownik.pl/
Re: [FPGA] MAXimator, konfigurowanie NIOS II
Będzie ciąg dalszy.
Gott weiß ich will kein Engel sein.
Re: [FPGA] MAXimator, konfigurowanie NIOS II
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/
Re: [FPGA] MAXimator, konfigurowanie NIOS II
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.
Re: [FPGA] MAXimator, konfigurowanie NIOS II
Lecimy dalej, po wygenerowaniu HDL'a i zamknięciu Qsys'a trzeba nasz processor zaimportować do Quartusa.
W Project Navigator, Hierarchy zmieniamy na Files.
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.
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.
Przeprowadzamy koleją kompilację i mamy sukces.
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.
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.
W Project Navigator, Hierarchy zmieniamy na Files.
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.
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.
Przeprowadzamy koleją kompilację i mamy sukces.
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.
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.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Gott weiß ich will kein Engel sein.
Re: [FPGA] MAXimator, konfigurowanie NIOS II
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.
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:
Następnie wgrywamy program do NIOS-a
Wybieramy w menu Run->Run as..->3 Nios II Hardware
Wybiermy zakładkę Target Connection i w System ID checks zaznaczamy opcje:
Ignore mismatched system ID
Ignore mismatched system timestamp
Po wciśnięciu Run program zostanie wgrany do NIOS-a.
efekt końcowy: https://youtu.be/t9obvcy28zo
Na koniec załączam kompletny projekt
Miłej zabawy!
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.
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;
}
Następnie wgrywamy program do NIOS-a
Wybieramy w menu Run->Run as..->3 Nios II Hardware
Wybiermy zakładkę Target Connection i w System ID checks zaznaczamy opcje:
Ignore mismatched system ID
Ignore mismatched system timestamp
Po wciśnięciu Run program zostanie wgrany do NIOS-a.
efekt końcowy: https://youtu.be/t9obvcy28zo
Na koniec załączam kompletny projekt
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.
Re: [FPGA] MAXimator, konfigurowanie NIOS II
To ja już nie mogę się doczekać jak praca będzie mi tylko zajmowała 8 godzin
Re: [FPGA] MAXimator, konfigurowanie NIOS II
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:
W tej formie diody ładnie "płyną".
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
BeMicro MAX10
BeMicro CV A9
Re: [FPGA] MAXimator, konfigurowanie NIOS II
Cześć,
Prawidłowy kod to:
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:
Ta część kodu przypisuje do przerwania funkcję irr oraz odblokowuje przerwanie:
Procesor sobie czeka w pustej pętli, ewentualnie robi coś innego a diody są sterowane przez przerwanie.
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.
Re: [FPGA] MAXimator, konfigurowanie NIOS II
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.
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
BeMicro MAX10
BeMicro CV A9
Re: [FPGA] MAXimator, konfigurowanie NIOS II
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.
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
BeMicro MAX10
BeMicro CV A9
Re: [FPGA] MAXimator, konfigurowanie NIOS II
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.
Są tylko biblioteki Altery, do których są nie najgorsze dokumentacje na ich stronach.
Re: [FPGA] MAXimator, konfigurowanie NIOS II
Jestem początkujący. Czy standardowe kość w Maximatorze ma wystarczającą ilość bramek, by zaimplementować Nios?
Re: [FPGA] MAXimator, konfigurowanie NIOS II
W kodzie procesora, w linii:
sw = IORD_ALTERA_AVALON_PIO_DATA(SWITCH_BASE) & 0x03;
powinno być BUTTON_BASE - tak zadeklarowano w samym procesorze
Pozdrawiam
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
Tutaj stronka hub z odnośnikami do różnych materiałów o NIOS II:
https://www.altera.com/support/support-resources/intellectual-property/embedded/nios-ii/legacy-support/ips-nios2_support.html
https://www.altera.com/support/support-resources/intellectual-property/embedded/nios-ii/legacy-support/ips-nios2_support.html
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 1 gość