Präsentationsquelle herunterladen

Werbung
FPGA Praktikum
WS2000/2001
3.Woche:
FPGA Architektur
Simulationsskripte
Aufgaben
Architektur der Spartan-II Familie
Die Spartan-II Familie
 Ein Baustein der Spartan-II Familie wird auf der im
Praktikum verwendeten Experimentierplatine verwendet.
 Die Architektur ist in vielen Punkten sehr typisch für
heutige FPGAs.
 (fast) identisch:
Xilinx Virtex, Virtex-E
 ähnlich:
Actel ProASIC
Altera
Atmel 40K
Quicklogic Eclipse
Xilinx XC4000, Spartan, Virtex-II
Elemente eines FPGAs
 Ein FPGA hat vier Hauptkomponenten:
Verdrahtung
Logik
I/O
Konfigurationsspeicher
 Hinzu kommen manchmal dedizierte Blöcke mit
Spezialschaltungen:
RAM
Multiplizierer
Prozessoren
PCI Interface
 Der Konfigurationsspeicher ist für uns unsichtbar.
Struktur eines Spartan-II
 Matrix von sogenannten Slices
 umrandet von I/O Blöcken (IOBs)
Logik: Lookup Table (LUT)
 Das Grundelement eines Logikblockes ist
eine Lookuptable (LUT, Wertetabelle).
 Ein LUT ist ein Speicher in dem für jede
Eingangskombination der Ausgabewert
steht.
 Für n Eingänge sind 2n Einträge
erforderlich.
 Eine Zahl vor der Abkürzung LUT
bezeichnet in der Regel die Zahl der
Eingänge.
Z.B. 4-LUT, n-LUT
x
3
0
0
0
0
0
0
0
1
f(x)
LUT
Größe der LUTs
 LUTs sollten mindestens drei Eingänge haben, um
Addierer bauen zu können:
Carry_in
a
b
LUT
Sum
LUT
Carry_out
 Auch der häufig benötigte 2-zu-1 Multiplexer benötigt
drei Eingänge
Größe der LUTs
 Allerdings belegt die Logik nur einen kleinen Teil der
Fläche des FPGAs (<1%)
 Deshalb ist es Sinnvoll, die LUTs etwas größer zu
machen, um die Schaltungstiefe kombinatorischer
Schaltungen zu reduzieren.
 Aber auch nicht zu groß, da die Fläche der LUTs
exponentiell wächst.
5-LUTs verwendet ausschließlich Lucent
4-LUTs dominieren den Markt
3-LUTs bei einigen Herstellern
LUTs bei Spartan-II
 Ein Spartan-II Slice enthält zwei 4-LUTs und einen
Multiplexer (Mux)
 Mit dem Mux lassen sich die 4-LUTs z.B. zu einem 5-LUT
zusammen schließen.
LUT
MUX
LUT
Flip-Flops
 Flip-Flops sind sehr wichtige Schaltungselemente
 Flip-Flops sind langsam, groß und unzuverlässig, wenn
man sie in LUTs realisiert.
 Ein Spartan-II Slice enthält deshalb zwei D-Flip-Flops
DFF
LUT
MUX
LUT
DFF
Addierer
 Addierer sind sehr häufige Schaltungen.
 In der gezeigten CLB Architektur benötigt jedes Bit zwei
4-LUTs
 Elegante Lösung:
4-LUTs die sich in zwei 3-LUTs aufteilen lassen.
 Schnellere Lösung: Spezialhardware für die Carry Chain
Carry Chain
 Spartan-II enthält eine solche
carry chain hinter den LUTs.
 Sie ist mit 50ps pro Bit
erheblich schneller als die
anderen Funktionen des FPGAs
 Der 2-zu-1 Multiplexer ist in die
Carry Logik integriert
Speicher
 Ein 4-LUT ist ein 16x1 ROM.
 Bei vielen FPGAs kann er auch als RAM konfiguriert
werden.
 Spartan-II Slice:
ein Speicher 32x1 Bit
zwei Speicher 16x1 Bit
ein RAM 16x1 mit gleichzeitigem Lesen und Schrieben von
getrennten Addressen (Dual Port RAM)
Distributed RAM
So sieht ein Slice im Datenblatt aus
Verdrahtung
 Die Verdrahtung macht 90% des FPGAs aus.
 In den meisten synthetisierten Schaltungen macht die
Verdrahtung deutlich mehr als die Hälfte des delay aus.
 FPGAs werden oft daran gemessen, wie gut sich die
Logik ausnutzen läßt.
 Wichtiger wäre es, zu wissen, wie gut sich die
Verdrahtung ausnutzen läßt. Das ist jedoch so gut wie
nicht beschreibbar.
Die Daten des
XC2S200-PQ208
 Slices:
 4-LUTs:
 Verteiltes RAM:
 BlockRAMs:
 Logik:
 Flip-Flops:
 I/O:
2352
4704
max 9408 Bytes
14 à 4096 Bits = 7kBytes
ca. 100.000 Gatteräquivalente
5292
145
Simulationsskripte
Simulationsskripte
 Die Einzige Dokumentation zur Simulationsskriptsprache
die ich finden konnte ist in der Onlinehilfe des
Simulators:
 Eine Liste der Befehle ist im
Scripteditor unter:
„Simulation Makros Help“
 Im folgenden erläutere
ich die wichtigsten Makros
Skript: Initial Settings
 Die folgenden Zeilen werden für den Anfang der meisten
Simulationsskripte sinnvoll sein:
 delete_signals
restart
stepsize 10 ns
 Dadurch werden alle Signale aus der Ansicht gelöscht,
die Simulation auf den Zeitpunkt 0 gesetzt, alle
Signalzuweisungen gelöscht und eine Sinnvolle
Schrittweite für die Beschreibung von Wellenformen
gesetzt.
Skript: Vector definitions
 Dem Simulator muß mitgeteilt werden, daß er Vektoren
nicht als einzelne Signale darstellt, sondern zu einem
mehrbittigen Wert zusammenfaßt. Dies geht mit dem „v“
Makro:
 v result result[15:0]
Skript: Watch List
 Signale und Vektoren, die im Waveformviewer angezeigt
werden sollen, werden mit „watch“ ausgewählt
 watch clk h_out zeichen
 Kommentarzeilen beginnen mit „|“
 | Start der Testvektoren
 Wertzuweisungen erfolgen mit „assign“
 assign reset 1
Skript: Stimulus
 Periodische Signale werden mit „clock“ definiert
 clock clk 0 1
 Dabei wechseln die aufgelisteten Zustände in dem durch
„stepsize“ definierten Zeitintervall
 Beispiel mit zwei um 90° verschobenen Taktsignalen:
 clock clk1 0 1 1 0
clock clk2 0 0 1 1
Skript: Stimulus (Fortsetzung)
 Beliebige, nicht periodische Wellenformen lassen sich
mit „wfm“ beschreiben. Dabei wird jeweils einem
Zeitpunkt ein Zustandswechsel zugeordnet:
 wfm load @0ns=0 @20ns=1 @40ns=0
 Die Zeitpunkte können auch relativ angegeben werden:
 wfm load @0ns=0 20ns=1 20ns=0
 Das ist nützlich für Wiederhohlungen:
 wfm test @0ns=0 @77ns=1 (10ns=0 10ns=1)*5
 Außer ns sind auch ps, us, ms und s möglich.
Skript: Vektorwerte
 Vektoren können Werte in verschiedenen Zahlenbasen
zugewiesen werden.
Binär (\B), Octal (\O), Decimal (\D) and Hexadecimal (\H)
Beliebige Basis: \2 \3 \16
Standard ist Binärdarstellung
 Beispiele:
wfm
wfm
wfm
wfm
char_in
char_in
char_in
char_in
@0ns=1111
@0ns=1111\B
@0ns=F\H
@0ns=15\D
Skript: Simulation
 Um die Simulation schließlich zu starten verwendet man das
„sim“ Kommando
 sim 500ns
 Oder „cycle“ um für eine bestimmte Anzahl von Taktzyklen
zu simulieren. Dabei wird der längste zuvor mit „clock“
definierte Taktzyklus verwendet.
 cycle 1
 „sim“ und „cycle“ sind auch eine alternative zu „wfm“
 assign operand 101
cycle
assign operand 000
cycle
Aufgaben 3. Woche
Aufgabe 3.1
 Für einen Prozessor wird eine 16-Bit ALU benötigt.
 Diese soll in Abhängigkeit vom Eingang „operation“ eine von fünf
Operationen ausführen:
 Addition
 Subtraktion
 And Not (Löschen von Bits)
 Or
(Setzen von Bits)
 Arithmetischer Rechtsschift (Teilung durch zwei, mit Vorzeichen)
 Startet ein neues Projekt und schreibt eine ALU die zu der Deklaration
auf der nächsten Folie kompatibel ist.
 Für die undefinierten Werte von operation solltet Ihr dem Resultat den
Wert „----------------“ zuweisen (Don‘t care). Dann kann die Synthese am
besten optimieren.
 „use ieee.std_logic_unsigned.all“ ist für die ALU erforderlich.
Aufgabe 3.1
 -- A simple arithmetic, logic unit
-- operation / result
--- 000 /
in_a + in_b
--- 001 /
in_a - in_b
--- 010 /
in_a &~ in_b
--- 011 /
in_a | in_b
--- 100 /
in_a / 2
component ALU16
port (
in_a:
in STD_LOGIC_VECTOR(15
in_b:
in STD_LOGIC_VECTOR(15
operation: in STD_LOGIC_VECTOR(2
result:
out STD_LOGIC_VECTOR(15
end component;
downto
downto
downto
downto
0);
0);
0);
0));
Aufgabe 3.2
 Der Prozessor braucht außerdem einen Programzähler mit
Verzweigungsmöglichkeit.
 Der Programmzähler zählt normalerweise in jedem Takt eins weiter.
 Wenn der Eingang „stop“ gleich ‘1‘ ist, zählt er nicht weiter
 Wenn der Eingang „jump“ gleich ‘1‘ ist, wird der Programzähler auf den
Wert des Eingangs „jump_target“ gesetzt.
 Baut eine PCU Entity die mit der Deklaration auf der folgenden Folie
kompatibel ist.
 Die Entity soll Teil des selben Projektes sein. Sie kann in der selben Datei
stehen, oder aber in einer separaten Datei.
 „use ieee.std_logic_unsigned.all“ ist auch hier erforderlich.
Aufgabe 3.2
 -- The program counter unit
-- usually the PC output is incremented by one on
-- every rising edge of clk.
-- if stop='1' the PC is not incremented
-- if jump='1' the PC is set to the value of the
-- jump_target input.
component PCU
port (
jump_target: in STD_LOGIC_VECTOR(15 downto 0);
jump:
in STD_LOGIC;
stop:
in STD_LOGIC;
clk:
in STD_LOGIC;
pc:
out STD_LOGIC_VECTOR(15 downto 0));
end component;
Aufgabe 3.3
 Aufgabe 3.2: Implementierung der PCU
Ihr habt eine Schaltung entworfen, synthetisiert und simuliert.
Jetzt soll sie auf die Zieltechnologie abgebildet werden.
Wählt im Project Manager sicherheitshalber den Menüpunkt
„Project->Clear Implementation Data“ und bestätigt. Dies löscht
die bisherigen Syntheseergebnisse.
Aufgabe 3.3
 Wählt PCU als oberstes
Hierarchielement für
euren Chip (Top Level)
 Im Beispiel befinden sich
beide Entities in der
selben VHDL Datei
Aufgabe 3.3
 Wählt den richtigen FPGA
 Family: Spartan2
 Device: 2S200PQ208
 Speed: -5
 Klickt auf „Run“
 Der Schaltung wird jetzt
synthetisiert. Es sollten nur
Warnungen, keine Fehler
erscheinen
Aufgabe 3.3
 Drückt auf den Knopf
„Implementation“
 Drückt auf „Run“
 Fertig.
Aufgabe 3.4
 Der Map Report
Der zweite Schritt des automatisch ausgeführten
Implementierungs Toolflows ist die Technologieabbildung. (Map)
Sie bildet die von der Synthese generierte Netzliste auf die
Bauteile des FPGAs ab. Die Ergebnissen stehen im Map Report.
Zum öffnen des Reports geht klickt Ihr auf den „Reports“ Reiter
und öffnet den Ordner „Implementation Report Files“.
Doppelklick auf den „Map Report“ öffnet diesen.
Aufgabe 3.4
 Der Map Report ist sehr nützlich um:
Die Qualität des Ergebnisses zu beurteilen
Mögliche Fehler früh zu erkennen
Schaut euch das Design Summary an:
Gibt es Flip-Flops?
Wieviele 4-LUTs wurden verwendet?
Wieviele IO Blöcke?
Stimme diese Ergebnisse mit euren Erwartungen überein?
Was ist der „equivalent gate count“?
Gibt es Fehler in Abschnitt 1?
Sind die Warnungen in Abschnitt 2 vertretbar?
Wurde in Abschnitt 5 unerwartet Logik entfernt?
Schreibt die Antworten an [email protected]
Aufgabe 3.5
 Timing Analyse
Die Xilinx Software analysiert die maximale
Taktfrequenz des Designs. Wie hoch ist diese? (Steht
im „Post Layout Timing Report“ und im
„Implementation Log File“
Die Software hat außerdem detaillierte
informationen über das Timing der Einzelteile der
Schaltung generiert. Dadurch läßt sich jetzt eine
Timingsimulation durchführen.
Startet den Timingsimulator (Linke Hälfte des
„Verification“ Knopfes)
Simuliert ein paar Takte. Die Signale ändern sich
jetzt teilweise erst 10ns nach der steigenden
Taktflanke.
Aufgabe 3.6
 FPGA Editor
Um einen Eindruck davon zu gewinnen, was die Foundation
Software mit euren Design angestellt hat, startet den FPGA Editor.
(Im Menu Tools->Implementation->FPGA Editor)
Ihr seht ein Layout des Chips, in dem Ihr herumscrollen und
Zoomen könnt.
Mit diesen Knöpfen könnt Ihr verschiedene Teile des Layouts einund ausblenden:
Benutzte Slices und IOBs könnt Ihr euch per Doppelklick genauer
anschauen.
Aufgabe 3.7
 In den Tipps und Tricks zu dieser Woche findet Ihr die
restlichen Dateien, die für den Prozessor benötigt werden.
 Kopiert sie in das Projektverzeichnis.
 Synthetisiert mit „maincpu“ als Top Level.
 Wie hoch ist die maximale Taktfrequenz?
 Wieviele 4-Luts, Flip-Flops und BlockRAMs werden
verwendet?
 Das RAM des Prozessors enthält bereits ein kleines
Programm. Simuliert 40 Takte. Was ist der höchste Wert,
den der Programmzähler annimmt?
Herunterladen