Technische Universität Ilmenau Fakultät für Informatik und Automatisierung Institut für Technische Informatik und Ingenieurinformatik Fachgebiet: Integrierte Kommunikationssysteme
Praktikumsanleitung
Integrierte Hard- und Softwaresysteme II Versuch: Reaktionstester Dipl.-Ing. Steffen Ostendorff, B.Sc. Johannes Both
2
Inhaltsverzeichniss
1 Aufgabenstellung ............................................................................................................... 3
1.1 Einführung ................................................................................................................... 3
1.2 Anforderungen ............................................................................................................ 3
1.3 Übersicht ...................................................................................................................... 5
1.4 Modul: IHS2_PRAK_Control......................................................................................... 6
1.5 Modul: IHS2_Prak_Random ........................................................................................ 7
1.6 Modul: IHS2_Prak_10msTimer .................................................................................... 7
1.7 Hardware ..................................................................................................................... 8
2 Anleitung: Modultest mit ModelSim .................................................................................. 9
2.1 Installation ................................................................................................................... 9
2.2 Starten einer Simulation mithilfe von do-Files ............................................................ 9
2.3 Aufbau und Verwendung von TestBenches .............................................................. 10
2.4 Aufbau von Do-Files .................................................................................................. 11
3 Anleitung: Programmierung der Zielhardware ................................................................ 12
4 Anhang: Zusammenfassung VHDL Befehle ...................................................................... 14
4.1 Concurrent Statements ............................................................................................. 14
4.2 Sequential Statements............................................................................................... 15
4.3 Specifications ............................................................................................................. 17
4.4 Library & Use Clause .................................................................................................. 17
4.5 Declarations ............................................................................................................... 17
4.6 Library Units ............................................................................................................... 19
3
1 Aufgabenstellung
1.1 Einführung Auf Basis des im Seminar vorgestellten VGA Moduls soll ein Reaktionstester entwickelt werden. Eine ausführliche Beschreibung ist den Seminarunterlagen (besonders Seminar 1-2) vom WS09/10 zu entnehmen. Dafür werden 4 Grafikmodule als 7-Segmentanzeige verwendet. Hier soll die benötigte Reaktionszeit angezeigt werden. Ein weiteres Grafikmodul wird als farbiges Signal verwendet und dient zur Zustandssignalisierung während des Reaktionstests. Es kann über 3 Steuerleitungen die 3 Grundfarben des RGB-Raums sowie deren Mischfarben darstellen. Weitere Informationen über die verwendeten Grafikmodule sowie das VGA Modul finden Sie in den Seminarunterlagen zum Fach IHS 2. Der Reaktionstester soll nach seiner Aktivierung eine zufällige Zeit in einem Wartemodus bleiben. Danach wird auf der 7-Segmentanzeige ein Timer angezeigt, welcher durch einen Tastendruck angehalten wird. Beim vorzeitigen Drücken einer Taste, wird der Versuch mit einem roten Signal abgebrochen. Die einzelnen Phasen (Idlephase, Wartephase, Reaktionsphase und Anzeigephase) sollen über das farbige Signal gekennzeichnet werden. Für das Praktikum ist eine Bearbeitungszeit von ca. 10 Stunden vorgesehen. Davon entfallen 6,5 Stunden auf die häusliche Vorbereitung und 3,5 Stunden auf die Umsetzung der praktischen Aufgaben im Praktikumsraum. Die Bearbeitung des Praktikums darf nur mit vorbereiteten und vollständigen Unterlagen durchgeführt werden! Das Praktikum ist in Teams von 2 Personen durchzuführen. Alle Module sind in VHDL zu implementieren. Nutzen Sie dazu die Xilinx ISE 11.4. Alle Vorbereitungsaufgaben sind schriftlich zu erfüllen und MÜSSEN zum Praktikumstermin vorgelegt werden. Die restlichen Aufgabenteile (Programmierung in VHDL) müssen zu Beginn des Praktikums fehlerfrei Synthetisierbar sein. Kleinere Verhaltensfehler können noch während der Praktikumszeit ausgebessert werden. Zur Verhaltensvalidation (Teil der Vorbereitung) können die bereits angelegten TestBenches verwendet werden (siehe Kap. 2 Anleitung: Modultest mit ModelSim). Weiterhin besteht die Möglichkeit sich eine Hardware-Plattform auszuleihen. Kontaktieren Sie dazu Herr Ostendorff per Mail.
1.2 Anforderungen Zu entwerfen ist der Reaktionstester mit folgenden Anforderungen:
der Reaktionstester ist zu Beginn in einem neutralen Zustand (alle 7-Segmentanzeigen auf 0, beliebig farbiges Signal)
durch Drücken einer Taste ändert sich das Signal auf gelb (-> Abbildung 1)
das gelbe Signal bleibt für eine zufällige Zeit von 1 bis 10 Sekunden angezeigt
4
wird während dieser Zeit eine weitere Taste gedrückt, so wechselt das Signal auf rot (durch erneutes Drücken einer Taste wechselt das System zurück in den neutralen Zustand)
nach Ablauf der zufälligen Zeit erlischt das gelbe Signal und es wird ein Timer angezeigt
für den Timer stehen die vier 7-Segmentanzeigen zur Verfügung - dabei soll die 4. Stelle die 1/100 s, die 3. Stelle die 1/10s, die 2. Stelle die 1s und die 1. Stelle die 10s anzeigen (-> Abbildung 1 & Abbildung 2)
wird jetzt eine Taste gedrückt, wird der Timer angehalten, die benötigte Zeit wird angezeigt und ein grünes Signal ausgegeben (-> Abbildung 2)
durch erneutes Drücken einer Taste wechselt das System zurück in den neutralen Zustand
Abbildung 1: Wartephase - Signal gelb - Timer auf 0
Abbildung 2: Anzeigephase - Signal grün - Timer steht
1.3 Übersicht
Für den Reaktionstester sind folgende Grundmodule zu entwerfen und in VHDL zu implementieren:
Abbildung 3: Übersicht über die Grundmodule des Reaktionstesters und deren Verschaltung
Die Entitys der einzelnen Module sind bereits vorhanden. Die Signale zur Kommunikation untereinander sind ebenfalls schon angelegt. Alle benötigten VHDL Gerüste sind in dem Projekt "VGA_Projekt_IHS2_PRAK" zu finden.
1.4 Modul: IHS2_PRAK_Control
Das Modul realisiert die interne Verwaltung des Reaktionstesters. Entwerfen Sie eine geeignete Struktur zur Realisierung der Anforderungen.
1.4.1 Ports
CLK: 25.175 MHz Main Clock des Systems (Achtung! - nicht der VGA Clock) RST: globaler Reset des Systems pvButton_IN: beschreibt 3 Tasten auf dem Experimentierboard (Abbildung 5) die Tasten sollen für den internen Ablauf des Systems verwendet werden pvRandomNumber_IN: 12 Bit Random Zahl die vom IHS2_Prak_Random generiert wird pvTimeInDecimals_IN: Input Vektor für den Timer-Output die Zeit muss in BCD-Code dargestellt sein jeweils 4 Bits entsprechen den darzustellenden Digits pfGetRandom_OUT: wenn 1, wird auf pvRandomNumber_IN ein Zufallswert geliefert pfSetXXXColour_OUT: setzt das Signal auf die entsprechende Farbe (es können mehere Farben gleichzeitig gesetzt werden) die Farben sind im RGB Farbformat codiert pfStartTimer_OUT: startet den Timer pfSopTimer_OUT: stoppt den Timer - letzter Wert wird beibehalten pfResetTimer_OUT: setzt den Timer auf 0 - der aktuelle Zustand wird beibehalten pv7SegX_Out: Anzeigewert für die vier 7-Segmentanzeigen der Ausgabewert muss ein BCD Wert enthalten - andere Werte werden nicht dargestellt Vorbereitung:
Informieren sie sich über die Möglichkeiten zur Beschreibung von Automaten in VHDL. Nutzen sie dazu die Materialen aus dem Seminar oder aus dem Language Templates der ISE unter "VHDL->Synthesis Constructs->Coding Examples". Entwerfen Sie einen geeigneten Automat zur Umsetzung von IHS2_PRAK_Control. Die Zustände sowie Zustandsübergänge sind in einer angemessenen Form schriftlich zu entwerfen und grafisch zu dokumentieren.
7
1.5 Modul: IHS2_Prak_Random
Da man in Hardware keine nichtdeterministischen Verfahren implementieren kann, fallen die gängigen Methoden zur Random-Number Generierung aus. Eine mögliche Realisierung eines streng deterministischen Pseudozufallszahlengenerator ist ein linear rückgekoppeltes Schieberegister (engl. Linear Feedback Shift Register, kurz LFSR). Die Güte der Zufallszahlen kann durch eine Kombination von meheren LFSR und durch die Wahl eines günstigen Generatorpolynoms beeinflusst werden. Dieses Modul soll ein solches LFSR mit 12 Bit Ausgabebreite realisieren. Sobald das pfGetRandom_IN Flag auf 1 gesetzt ist, soll an pvRandomNumber_OUT eine neue Zufallszahl anliegen. Wird das Flag wieder auf 0 gesetzt, soll die momentane Random Number am Ausgangsport gehalten werden. Vorbereitung: Informieren Sie sich über die Generierung von Zufallszahlen mittels LFSR. Skizzieren Sie den strukturellen Aufbau eines LFSR. Geben Sie ein geeignetes Generatorpolynom für ein 12 Bit LFSR an.
1.6 Modul: IHS2_Prak_10msTimer
Der Timer soll eine Stoppuhr realisieren. Sobald das pfStartTimer_IN Signal gesetzt ist, wird der Timer aktiviert. Mit pfStopTimer_IN wird der Timer angehalten, die Ausgabe bleibt bestehen. pfResetTimer_IN setzt den Zähler auf 0 zurück, der Timer verbleibt im aktuellen Zustand (zählend, angehalten). Die Auflösung lässt sich über das gCOUNTER_TICK Generic frei wählen. Ausgegeben werden vier BCD-kodierte Digits, wobei die Bits 0 .. 3 die kleinste Stelle und die Bits 12 ... 15 die größte Stelle sind. Wird der interne Wert gCOUNTER_TICK erreicht, so wird das niederwertigste Digit inkrementiert. Es ist darauf zu achten, dass nur gültige BCD Werte ausgegeben werden.
Abbildung 5: Taster zur Steuerung des Reaktionstesters Abbildung 4: Language Templates
8
1.7 Hardware
Spartan-3A DSP 1800 Board 25.175 MHz Main Clock 62,9375 MHz VGA Clock JTAG programming and configuration port
9
2 Anleitung: Modultest mit ModelSim
2.1 Installation
ModelSim ist eine Simulationsumgebung für VHDL und Verilog die für Studenten kostenlos unter
http://model.com/content/modelsim-pe-student-edition-hdl-simulation heruntergeladen werden kann. Zum Download ist eine Registrierung erforderlich. Eine Schritt-für-Schritt-Anleitung ist auf der Seite vorhanden.
2.2 Starten einer Simulation mithilfe von do-Files Starten Sie nun ModelSim.
Abbildung 6: ModelSim
Wechseln Sie über den File->Change Directory Befehl in das Hauptverzeichnis ihres Projekts.
Abbildung 7: ModelSim - change directory
Zum Starten der Simulation können automatische do-Skripte verwendet werden. Für die 3 Hauptmodule des Praktikums sind Standard-do-Files im ./Sim/ModelSim Ordner vorhanden. Diese müssen bei Bedarf noch um user-spezifische Signale erweitert werden (s.u.).
10
Zum Starten eines do-Files geben sie do ./sim/ModelSim/<Name des do-Files>.do in die Konsole ein.
Abbildung 8: ModelSim - console
2.3 Aufbau und Verwendung von TestBenches
Für eine Simulation eines VHDL-Moduls wird ein VHDL TestBench(TB) benötigt. Ein TB ist ebenfalls eine VHDL-Datei welche die zu testenden Datei (UUT - unit under test) instanziiert. Durch das TB werden die Eingangs-Stimuli festgelegt und die Ausgangssignale der UUT entgegen genommen.
Test
Bench UUT
Eingangs-Stimuli
Ausgangs-Signale
Abbildung 9: TestBench & UUT
11
Um eine bestimmte Eingangsbelegung am UUT zu testen muss diese zu einem definierten Zeitpunkt von der TB erzeugt werden. Die TBs für die 3 Hauptmodule des Praktikums sind im ./sim Ordner vorhanden. In jeder TB gibt es einen "stimulus process" der die Eingangsstimuli erzeugt. Dabei ist zu beachten, dass die Signale die dort gesetzt werden zeitlich aufeinander abgestimmt sind. z.B.: pvButton_IN <= "100"; wait for CLK_period*2; pvButton_IN <= "000"; wait for 200 ns; pvButton_IN <= "100"; wait for CLK_period*1; pvButton_IN <= "000"; wait for 200 ns; Hier wird der pvButton_IN Port für 2 CLK-Perioden auf "100" gesetzt. Danach sofort wieder auf "000". Danach passiert 200 ns (5 Takte - bei 40ns CLK-Periode ) nichts am Eingang der UUT. Danach wird der pvButton_IN Port erneut auf "100" gesetzt, diesmal jedoch nur ein 1 CLK-Periode gehalten. Daraufhin gibt es eine weitere 200 ns Pause. Mithilfe der TB können nur Signale am Eingang der UUT geändert werden. Instanziierte Komponenten im Inneren der UUT oder interne Signale sind nicht direkt erreichbar.
2.4 Aufbau von do-Files In do-Files sind alle nötigen Simulationseinstellungen beschrieben. Die wichtigsten Konstrukte sind hier kurz dargestellt.
vcom ./src/IHS2_PRAK_Random.vhd
Der "vcom" Befehl kompiliert die benötigten VHDL Files, so dass sie von ModelSim verarbeitet werden können. Alle in der Simulation verwendeten VHDL-Files müssen kompiliert werden. add wave -noupdate -format Literal -radix hexadecimal -label "CLK" /IHS2_PRAK_Random_TB/clk
Mit "add wave" können zu beobachtende Signale hinzugefügt werden. Die "format" Option gibt an ob das Signal als logischer Pegel (Logic) oder als Literal (Literal) angezeigt wird. Im Literal Modus kann über die "radix" Option die Darstellungsform gewählt werden. Typische Formate sind: Binary, Octal, Decimal, Hexadecimal, ASCII. Die "Label" Option gibt eine Alias für das Signal an um lange Namen zu vermeiden. Am Ende des Befehls wird das zu beobachtende Signal geschrieben. run 200 us
Gibt die Länge der Simulation an. WaveRestoreZoom {0 us} {2 us}
Zoomt nach Ende der Simulation in den angegeben Bereich.
12
3 Anleitung: Programmierung der Zielhardware
Erstellen Sie als erstes ein bit-File zur Programmierung des FPGAs. Nutzen Sie dazu die
"Generate Programming File" Option aus der ISE.
Abbildung 10: Generate Programming File
Starten Sie nun iMPACT.
Abbildung 11: iMPACT
Doppelklicken Sie auf "Boundary Scan" und initialisieren danach Sie die JTAG Kette über den "Initialize Chain" Button.
13
Abbildung 12: iMPACT - Boundary Scan & Initialize Chain
Wählen Sie im erschienenen Dialog, das von der ISE generierte Bit-File aus. Dies befindet sich standardmäßig in dem Projektordner des aktiven Projekts. Sie können auch nachträglich ein anderes bit-File über die "Assign New Configuration File" Option des Xilinx-Symbols zuweisen. Diese Option ist im Kontextmenü des Symbols zu finden und wird über ein Rechtsklick angezeigt.
Abbildung 13: iMPACT- Assign New Configuration File
Nun werden sie gefragt, ob Sie ein SPI File anhängen möchten. Lehnen Sie das über die No Option ab und bestätigen Sie die darauf folgenden "Programming Options" mit OK. Nun können sie den FPGA Programmieren indem Sie ein Rechtsklick auf das Xilinx-Symbol machen, und dort die "Program" Option auswählen.
Abbildung 14: iMPACT - Program
14
4 Anhang: Zusammenfassung VHDL Befehle1
4.1 Concurrent Statements
4.1.1 block_statement
label: block [(guard_expression)]
[generic]
[ports]
[declarations]
begin
concurrent_statements
end block [label];
4.1.2 component_instantiation_statement
label : name [ generic map (map) ] [ port map (signals) ];
4.1.3 concurrent_assertion_statement
assert condition
[ report string_expression ]
[ severity {NOTE | WARNING | ERROR | FAILURE} ];
4.1.4 concurrent_procedure_call
[ label : ] procedure_name [ (parameters) ];
4.1.5 concurrent_signal_assignment_statement
[ label : ] [ {conditional_assignment | assignment |
selected_assignment} ];
1 University of Cambridge - Department of Engineering,
http://www2.eng.cam.ac.uk/~dmh/ptiiavlsi/VHDLcmd.htm (17.04.2011)
15
4.1.6 generate_statement
label : [{ for specification | if condition }] generate
concurrent_statements
end generate [label];
4.1.7 process_statement
[label : ] process [ (sensitivity_list) ]
[ variable_declaration ]
[ type_declaration ]
[subprogram_declaration ]
[ declarations ]
begin
sequential_statements -- Cannot contain a wait
statement if sensitivity_list is used
end process [ label ];
4.2 Sequential Statements
4.2.1 assertion_statement
assert condition -- When condition is false [strng_expression] is
printed
[ report string_expression ]
[severity { NOTE | WARNING | ERROR | FAILURE } ];
4.2.2 case_statement
case expression is -- Avoid the use of parenthesis, if possible
when choices_1 => sequential_statements
.
.
when choices_n => sequential_statements
end case;
4.2.3 exit_statement
exit [ label ] [ when condition ];
16
4.2.4 if_statement
if condition then
sequential_statements
{ elsif condition then sequential_statements }
[ else sequential_statements ]
end if;
4.2.5 loop_statement
[ label : ] [ while condition | for loop_specification ] loop
sequential_statements
end loop [ label ] ;
4.2.6 next_statement
next [ label ] [ when condition ];
4.2.7 null_statement
null;
4.2.8 procedure_call_statement
procedure_name [ (parameters) ] ;
4.2.9 return_statement
return expression; --For use in a Function
return; --For use in a Procedure
4.2.10 signal_assignment_statement
target <= expression [ after time_expression ]
.
.
{ , expression [ after time_expression ];
4.2.11 variable_assignment_statement
target := expression ;
17
4.2.12 wait_statement
wait --A Function may not contain a wait_statement
[ on signal_name {, signal_name} ]
[ until conditional_expression ]
[ for time_expression ] ;
4.3 Specifications
4.3.1 attribute_specification
attribute attribute_name
of entity_name is expression ;
4.3.2 configuration_specifications
for component_name
use [ generic_map_part ]
[port_map_part] ;
4.4 Library & Use Clause
4.4.1 library_clause
LIBRARY names ;
4.4.2 use_clause
USE selected_names ;
4.5 Declarations
4.5.1 alias_declaration
alias name1 : type [ (indexes) ] is name2 [ (indexes) ] ;
4.5.2 attribute_declaration
attribute name : type ;
4.5.3 component_declaration
component identifier :
[ generic (generic_list) ; ]
[ port (port_list) ; ]
end component ;
18
4.5.4 constant_declaration
constant name : type := expression ;
constant name : array_type [ (indexes) ] := expression ;
4.5.5 file_declaration
file name : type is [ mode ] logical_name ;
4.5.6 signal_declaration
signal names : type [ constraint ] [ := expression ] ;
4.5.7 port_declaration
port ( names : direction type [ := expression ] [ ; more_signals ] );
4.5.8 subprogram_declaration
{ procedure name [ (parameters) ] | function name [ (parameters) ]
return type; }
4.5.9 sub_program_body
is
declarations
begin
sequential_declarations
end [name] ;
4.5.10 subtype_declaration
subtype name is [ resolution_function] type [constraint] ;
4.5.11 type_declaration
type name is definition;
4.5.12 variable_declaration
variable names : type [ constraint ] [ := expression ] ;
19
4.6 Library Units
4.6.1 architecture_body
architecture name of
entity_name is
[types]
[constants]
[signals]
[subprograms]
[other declarations]
begin
concurrent_statements
end [name];
4.6.2 configuration_declaration
configuration name of
entity_name is
declarative_part
block_configuration
end [name];
4.6.3 entity_declaration
entity name is
[generics] [ports]
[declarations]
[begin statements] --typically, an entity does not have
statements. If it does, the statemnts cannot operate on signals
end name;