Forum: FPGA, VHDL & Co. Anfänger braucht mal einen Denkanstoß (DE0-nano, SDRAM, NIOS, VGA)


von Christian G (Gast)


Lesenswert?

Hi,

ich bin vor kurzem erst ein wenig in die FPGA Welt eingestiegen und die 
ersten Gehversuche mit VHDL, Quartus prime, Qsys, NIOSII und dem 
DE0-nano (Cyclone IV) sind schon ganz gut geglückt, aber jetzt steht ich 
doch ein wenig auf dem Schlauch...

Das board besitzt 32 MB SDRAM,die sollen sowohl als Speicher für einen 
NIOSII (economy da ich keine Lizenz für z.B. die "fast" Version besitze) 
als auch als double frame buffer für einen VGA controller herhalten.
Jetzt habe ich gesehen das es schon einen Pixelbuffer DMA controller bei 
den University IPs gibt den ich als VGA controller bzw. als Teil eines 
VGA controllers nutzen könnte.
Dort kann ich Adressen für den buffer und den backbufer einstellen sowie 
Farbtiefe, Auflösung etc und der kümmert sich dann um das streamen der 
Pixeldaten.
Ich denke mal den SDRAM als pixel buffer zu gebrauchen wird einfach nur 
eine Frage der richtigen Adresse bei den Buffereinstellungen des 
Pixelbuffer DMA controller sein.
ABER was mir viel mehr Kopfzerbrechen bereitet, wie stelle ich nun 
sicher das der NIOS und der VGA controller nie auch nur ansatzweise 
"gleichzeitig" versuchen auf den Speicher zuzugreifen?
Genauso darf der NIOS ja nie in den aktuellen buffer (welcher gerade 
angezeigt wird) schreiben sondern nur in den aktuellen backbuffer.
Gibt es sowas wie einen Speicher -manager / -arbiter der dafür sorgt das 
soetwas nicht passieren kann?
Also quasi sodass der pixelbuffer dma eine höhere Priorität beim Zugriff 
auf das SDRAM als der NIOS hat damit das VGA timing nicht beinflusst 
wird.
Wie läuft das eigentlich beim refresh des SDRAM ab? Der könnte ja auch 
genauso gut mit dem VGA timing kollidieren.
Wie regelt man soetwas ? Weitere DMA controller mit mehr Kanälen und 
buffern?

Es soll auch noch eine SD Karte hinzukommen, also quasi soll nachdem 
Reset der NIOS eine kleine "firmware" aus dem eeprom starten, diese 
prüft dann auf eine vorhandene SD Karte und "User binary" welche dann
geladen und gestartet werden soll.
Kann ich eigentlich gefahrlos den NIOS mit einer PLL takten ? Mit der 
standart 50 MHz clock ist die economy Version ja nicht wirklich 
performant. Wie hoch kann ich da gehen?
Hatte ein Beispiel gesehen mit 260 MHZ PLL, aber macht das das board und 
der ganze Rest auch mit?
Hatte irgendwo etwas von eine Art Diagnosefunktion in der Quartus 
software gelesen mit der man solche Dinge testen kann, leider war das 
ein Beispiel einer älteren Version der Software und ich habs in der 
prime nicht mehr wieder gefunden.
Den SDRAMM soll man wohl ohne Probleme mit ner 100 MHz PLL takten 
können.

Ok das waren jetzt doch ein paar mehr Fragen auf einmal aber im Grunde 
is das Verständniss mit dem SDRAM, NIOS und dem VGA controller das 
primäre Problem, evtl. weis da ja jemand Rat bzw. kann mich in die 
richtige Richtung lenken?

Danke!

von Roger S. (edge)


Lesenswert?

Hi Christian,

Der Avalon hat einen impliziten arbiter.
Per default ist der als round-robin ausgelegt und alle Master haben eine 
gleiche Gewichtung.
Mittels Show Arbitration Shares im context-menu des Avalon Slave 
Interface kannst du diese ändern. In Deinem Fall bietet sich auch an das 
auf fixed-priority umzuschalten, indem Du im Tab 'View->Interconnect 
Requirements' ein neues Requirement des SDRAM Avalon slaves hinzufügst 
und das auf Slave arbitration scheme und fixed-priority setzt.

Das Nios System läuft problemlos mit 100MHz, ein wenig mehr sollte auch 
drin liegen. Natürlich getaktet über eine PLL. Die PLL generiert den 
Systemtakt plus einen Zusätzlichen fürs SDRAM, letzteren 270 Grad 
phasenverschoben.

Ich kenne den Pixelbuffer DMA nicht, ich habe in meinen Video Controller 
üblicherweise einen FIFO drin um SDRAM refreshs und Bus Arbitrationen 
abzufedern.

Der alte SDRAM controller ist zwar robust und funktioniert gut, aber er 
ist keine Performance Kanone. Mit einem VGA Framebuffer wird der schon 
so gut ausgelastet das da ein Nios /s ohne caches nicht wirklich gut 
performt.

Was noch wichtig ist: Du musst dein System constrainen, zumindest ein 
minimal SDC file mit dem Eingangstakt plus der Direktive die PLL Takte 
abzuleiten:

1
create_clock -name {CLOCK_50} -period 20.000 [get_ports {CLOCK_50}]
2
derive_pll_clocks

Cheers, Roger

von Christian G (Gast)


Lesenswert?

Danke dir Roger, das hilft mir doch sehr weiter!!!

Habe den NIOS/e jetzt mit 100 MHZ PLL und das SDRAM auch mit 100 MHZ -54 
deg (hatte das in einem der zahlreichen tutorials dazu gefunden - von 
emb4fun war es wohl) angebunden was auch zu funktionieren scheint. Das 
SDC file habe ich auch erstellt.
Bevor ich mich aber jetzt an die VGA Sache begebe wird es wohl 
unabdingbar sein dem NIOS economy zu etwas mehr umpf zu verhelfen also 
irgendwie einen instruction und data cache zu implmentieren und auch die 
vorhandenen hardware multiplier des cyclone iv zu nutzen evtl. eine 
minimale fpu zu erstellen. Das dürfte wohl erst einmal genug Zeit in 
Anspruch nehmen das alles heraus zu bekommen wie das klappen könnte und 
dann einzubauen.

von Roger S. (edge)


Lesenswert?

No problemo.

Ich wurde es eher umgekehrt angehen.
Mit einem Nios II /f anfangen und aufs Wesentliche konzentrieren.
Ohne Lizenz läuft der zwar nur tethered mit Quartus OpenCore Plus, aber 
für einen proof-of-concept sollte das ja egal sein.
Zumal Software Debugging und SignalTap nach wie vor funktionieren.

Cheers, Roger

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.