Speicher Timing Zeitverlauf

Das Timing (einhalten der Setup- und Hold-Zeit) ist eine Fehlerquelle für ungültige Daten.

Bsp. eines Schreibe-Zyklus
Ein neuer Zylkus beginnt bei der fallenden Flanke
   Da Daten leicht verzögert ankommen, beginnt der neue Zyklus
nach der fallenden Flanke. Die Verzögerung darf nicht so gross sein,
dass die setup Zeit verletzt wird.
(t_setup = Zeit, in der Daten vor CLK anliegen müssen)
Ausführen des Befehls bei steigender Flanke
Hier ist es ein Schreibbefehl. Auch der Lesebefehl wird bei steigender Flanke
ausgeführt.
Der Befehl wird leicht verzögert ausgeführt.
Um den Befehl recht auszuführen, darf die Hold Zeit nicht verletzt werden.
(t_hold = Zeit, in der die Daten nach dem CLK noch anliegen müssen)

Bereits kurz nach der ausführenden Flanke sind die Daten wieder Weg und der neue Zyklus beginnt.

Timing_Speicher

FPGA
Speicher haben intern einen Takt. Dadurch entfällt das Timingproblem.

Speicherzeilen und Speichertiefe

Speicherbreite
Die Speicherbreit ist oft identisch mit der Busbreite.
Ist sie dies nicht, muss mit Byte-enable das Ansprechen geregelt werden.
Word
= Breite einer Bit-Zeile (32-Bit, 16-Bit, ..)
= Speicherbreite
.               1 Word hat m Bits.
Bit      = Einzelne Speicherzelle.

Speichertiefe
Die Tiefe hängt von der Anzahl Adressleitungen ab.
Führen zum Speicher n Adressleitunge,  so ist der Speicher
2^n  (Word-)Zeilen tief.
Bsp.         2 Adressleitungen = 4 Speicherzeilen (Words) auslesbar

Speichergrösse
Word-Grösse x Anzahl Zeilen = m x 2^n
Bsp. Word = 32 Bit,  16 Adressleitungen
Speichergrösse:  4 x 2^16 =
4 x 2^3 x 2^3 x 2^10 = 4 x 8 x 8 x 1’000 =
32 x 8’000 = 256 kBytes

Organisation_Speicherzelle

 

 

 

 

Memory an Prozesssor anbinden

Takt anpassen
Die Geschwindigkeit des Prozessors ist oft langsamer als der Speicher.
Hier braucht es eine Synchronisation durch einen Takt-Generator.
Das Timing (einhalten der Setup und Holdzeit) war traditionell die grösste Fehlerquelle für ungültige Daten.

Word Grösse
Bei 32-Bit Prozessoren ist ein Word 32 Bit breit. Der Bus hat dieselbe Breite. Am einfachsten ist es, wennd der Speicher ebenfalls 32 breit ist. Dann entspricht ein Word einer Speicher-Zeile. Ansonsten braucht es Anpassungen (siehe Byte-enable).

Schreib- und Leserichtung
Traditionell hat der Prozessor nur ein Bus, der in beide Richtungen kommuniziert.
Bei FPGAs hat es immer zwei Busse, einer fürs Lesen und einer fürs Schreiben.

Zugriffe auf Speicher (Port)
Normalerweise gibt es einen Port. Über diesen gehen die Lese- wie auch die Schreibzyklen.
Im FPGA hat es zwei Ports. Beide können für beides gebraucht werden und können unterschiedliche Busbreiten haben.

 

Disk-Image auf Speichermedium

Unterschied Image <-> Datei
Ein image (speicherabbild) wird nicht, wie eine Datei, kopiert, sondern bitweise in das Medium geschrieben. Das Image liest auch die Rohdaten (wie Startadresse) und Filesystem und nicht nur Dateiinhalte.
Beim Kopieren findet man denselben Dateiname am Zielort. Beim Einschreiben kommt die Image-Datei nicht mehr vor, sondern sie ist nun physich vorhanden

Programme zum Einschreiben von Image
– dd
– bmaptool

Soft Core OS

Nachdem ein Soft-Core-Prozessor in ein FPGA geladen wurde, folgt das Aufsetzen des OS. Bei Altera ist dies Nios2, bei Xilinx MicroBlaze.

Remote Zugriff auf OS
Per SSH (bzw. Nios Shell) wird auf den Softcore zugegriffen.

Ordner und Programme
Baut man einen Softprozessor ein, bildet dieser im Synthese Ordner ein Unterordner Software

synthese/software/

In diesen Ordner kann man notwendige Scripts und Settings ablegen.

Board Support Packet erzeugen
Das Script create bildet die Support Packete (und Ordner dazu)

./create

Kompilieren

./compile

Programm auf FPGA laufen lassen

./run

Logikblocks einbauen und ändern

QSys (früher SOPC):
– Ist ein System Integration Tool
– QSys ermöglicht den Import von Logik-Blöcken.
– Die Logikblöcke werden nachher als Files in das Projekt gealden

Qsys: Designen von eigenen Blöcken
quartus: Tools/qsys         eigenes Fenster geht auf
– Als erstes muss neue qsys-Datei erstellt werden (*.qsys)
– Dies Datei liegt in synthese/outputfiles/<name>
– Über Library holt man mit add einen Block
– Block benennen (wird zu Titel im Blockschema)
– Unter Export sagen, Blockvariable setzen
– Speicherplatz dem Block zuweisen
– add: man fügt neue Elemente hinzu
– neues Element verdrahten
generate: beendet das Design
– die Datei (*.qip) liegt in outputfiles/<name>/synthese
– das Blockbild in outputfiles/<name> (*.bsf)

Quartus: Blöcke einbauen
– Neues, leeres *.bdf öffnen
– Über Block-Import den Block holen (*.bsf)
– Pin zuweisen
– Verdrahtungen benennen gemäss Export
– Kompilieren