System-on-chip Car Übungsblatt 1 Bearbeitung bis spätestens 9. Mai 2008, Demonstration im Labor Bearbeitungszeit: 3 Wochen Die folgenden Quellen sind für die Bearbeitung der Aufgaben hilfreich. Gunther Lehmann, Bernhard Wunder, Manfred Selz - Schaltungsdesign mit VHDL http://mikro.ee.tu-berlin.de/~kds/text_all.pdf R. Walker, D. Thomas - A Model of Design Representation and Synthesis http://portal.acm.org/citation.cfm?id=317825.317928 Peter Asheden - The VHDL Cookbook http://tams-www.informatik.uni-hamburg.de/vhdl/doc/cookbook/ VHDL Online Tutorial http://www.vhdl-online.de ISE Tutorial http://www.xilinx.com/support/techsup/tutorials/ Spartan-3E Starter-Kit User Guide http://www.xilinx.com/support/documentation/boards_and_kits/ug230.pdf Arbeiten Sie sich in die Hardwarebeschreibungssprache VHDL und in das Entwicklungswerkzeug ISE (Integrated Software Environment) von Xilinx ein (siehe Quellen). Im Modelbaubereich werden kleine Elektromotoren (Servos) für Steuerung von Flugzeugen, Autos oder Booten eingesetzt. Die Ansteuerung eines Servos erfolgt durch periodische Impulse (siehe Abbildung 1). Die Frequenz beträgt dabei 50 Hz und die Länge des Impulses (Pulsweitenmodulation) koreliert linear mit der Stellung des Servos: 1 ms = Linksanschlag, 1.5 ms = Mittelstellung und 2 ms = Rechtsanschlag. Aufgabe 1. Ansteuerung eines Modellbau-Servos a) Beschreiben Sie ein Hardwaremodul pulse_generator zur Ansteuerung eines Servos in VHDL mit dem Eingang control_value, dem vorzeichenbehaftete Stellwert, und dem Ausgang pulse für das PWM-Signal: ENTITY p u l s e g e n e r a t o r IS GENERIC( CLOCK TICKS FOR 250KHZ : p o s i t i v e ) ; c o n t r o l v a l u e : IN signed (0 to 7) ; p ulse : OUT s t d l o g i c ) ; END p u l s e g e n e r a t o r ; Übungskoordination: Dipl.-Inf. Felix Mühlbauer, Dipl.-Ing. Philipp Mahr 1
Abbildung 1: Pulsweitenmodulation control_value = 0 soll der Mittelstellung des Servos entsprechen, negative Werte einer Drehung nach links bzw. positive Werte nach rechts. Verwenden Sie für die Implementierung einen 250 khz Zähler. Für diesen soll CLOCK_ TICKS_FOR_250KHZ die Anzahl der Zyklen vom Systemtakt (hier: 50 MHz) clk angeben. Hinweis: Der Wertebereich von control_value wird auf diese Weise nicht vollständig ausgenutzt! Warum? b) Schreiben sie eine Testbench in VHDL und überprüfen Sie die Funktionalität Ihrer pulse_generator Komponente durch Simulation des Verhaltens vor der Synthese UND nach der Platzierung und Verdrahtung. Erst wenn die Funktionalität in beiden Simulationen identisch ist, ist Ihre Implementierung auch auf einem FPGA lauffähig. c) Beschreiben Sie eine Top-Komponente mit VHDL, die als Eingabe die Stellung der Schalter (slide switches) des Spartan3E-Boards bekommt und als Ausgabe das Signal pulse erzeugt. Instanziieren Sie dazu Ihre pulse_generator Komponete und schließen Sie für einen einfachen Test die vier Schalter an control_value an (z. B. an Bit 6-3). Benutzen Sie folgende Schnittstelle: ENTITY t o p s e r vo IS s w i t c h e s : IN s t d l o g i c v e c t o r (0 to 3) ; p ulse : OUT s t d l o g i c ) ; END t o p s e r vo ; d) Schreiben Sie analog zu Aufgabenteil b) eine Testbench und überprüfen Sie die Funktionalität Ihrer Implementierung. e) Praktische Übung zum Anschließen eines Servos an das FPGA-Board. Mehr Details später... f) Überprüfen Sie nun Ihre Schaltung mit einem Oszilloskop und einem Servo. Dazu müssen Sie die Ein- und Ausgangspins des Spartan3E-Board mit den Ein-und Ausgängen Ihrere Komponeten verknüpfen (siehe UCF-Datei). Übungskoordination: Dipl.-Inf. Felix Mühlbauer, Dipl.-Ing. Philipp Mahr 2
Aufgabe 2. Abtasten eines Servo-Steuersignals a) Beschreiben Sie eine Komponete pulse_analyser, die das inverse Verhalten zur Komponente pulse_generator besitzt. ENTITY p u l s e a n a l y s e r IS GENERIC( CLOCK TICKS FOR 250KHZ : p o s i t i v e ) ; p ulse : IN s t d l o g i c ; s e r v o v a l u e : OUT signed (0 to 7) ) ; END p u l s e a n a l y s e r ; b) Schreiben Sie eine Testbench und überprüfen Sie die Funktionalität der Pulsanalyse analog zur Aufgabe 1b. c) Schreiben Sie eine neue Top-Komponete top_analyser_test, die als Eingabe die Werte der Schalter bekommt (äquivalent zu Aufgabe 1c) und als Ausgabe den abgetasteten Wert an die LEDs des Spartan3E Starter-Kits übergibt. Verbinden Sie dazu die pulse_generator Komponente mit der pulse_analyser Komponente. ENTITY t o p a n a l y s e r t e s t IS s w i t c h e s : IN s t d l o g i c v e c t o r (0 to 3) ; l e d : OUT s t d l o g i c v e c t o r (0 to 7) ) ; END t o p a n a l y s e r t e s t ; d) Schreiben Sie eine Testbench und überprüfen Sie die Funktionalität der Top-Komponete. e) Test Sie Ihre Implementierung auf dem Spartan3E-Board. Übungskoordination: Dipl.-Inf. Felix Mühlbauer, Dipl.-Ing. Philipp Mahr 3
Aufgabe 3. Abstandsmessung mit Ultraschallsensoren Zur Erfassung seiner Umgebung ist das SoCar mit fünf Distanzmessern (Ultraschallsensoren) ausgestattet (siehe Abbildung 2). Abbildung 2: SoCar mit Ultraschallsensoren (symbolische Abb.) Ein Ultraschallsensor sendet Schallimpulse aus und misst die Zeit bis zum Empfang eines Echos (Reflektion des Schalls an einem Objekt). Die Zeit ist proportional zum Abstand zwischen dem Sensor und einem Objekt. Wegen dieser Funktionsweise können mehrere Sensoren nicht simultan betrieben werden. Beim SoCar sind sie deshalb in einer Kette (daisy chain) verschaltet und zur Vereinfachung die Ausgänge der Sensoren zu einem einzigen Signal zusammengefasst (siehe Abbildung 3). Nachdem ein Startimpuls an den ersten Sensor geschickt wurde, werden die Sensoren der Reihe nach automatisch aktiviert. Erst wenn der letzte Sensor seine Messung abgeschlossen hat, kann erneut ein Messzyklus angestoßen werden. Abbildung 3: Daisy Chain der Ultrschallsensoren a) Studieren Sie das Datenblatt des MaxSonar-EZ3 Ultraschallsensors (siehe SoCar- Internetseite). b) Für die Komponente ultrasonic_sensors soll folgende Schnittstelle verwendet werden: Übungskoordination: Dipl.-Inf. Felix Mühlbauer, Dipl.-Ing. Philipp Mahr 4
ENTITY u l t r a s o n i c s e n s o r s IS GENERIC( NUM SENSORS : p o s i t i v e must be g r e a t e r than 1 CLOCK TICKS FOR xxxhz : p o s i t i v e ) ; enable : IN s t d l o g i c ; d i s t a n c e ( per sensor ) in cm d i s t a n c e v e c t o r : OUT s t d l o g i c v e c t o r (0 to (NUM SENSORS 10 1) ) ; impulse i f a new v a l u e ( per sensor ) i s a v a i l a b l e new value : OUT s t d l o g i c v e c t o r (0 to (NUM SENSORS 1) ) ; s t a r t u l t r a s o n i c d i s t a n c e measurement u s s t a r t : OUT s t d l o g i c ; sensor output u s p u l s e : IN s t d l o g i c ) ; END u l t r a s o n i c s e n s o r s ; Ein Messzyklus sieht wie folgt aus: 1. Aktivierung von Signal enable abwarten. 2. Startimpuls an Sensoren senden (siehe Datenblatt). 3. Für jeden Sensor: us_pulse abtasten und Zeit messen; Ausgangsregister distance_vector aktualisieren und einen Impuls (1 clk) über den Ausgang new_ value[current_sensor] senden. Beschreiben Sie die Komponente ultrasonic_sensor. Die gemessenen Abstände (in cm; Genauigkeit: 10 Bit) aller Sensoren sind in dem Vektor distance_vector zusammengefasst. Bestimmen Sie eine geeignete Taktfrequenz für Ihre Komponente und passen Sie CLOCK_TICKS_FOR_xxxHZ entsprechend an. Hinweis: Es ist hilfreich für die Beschreibung der Komponete einen Zustandsautomat zu verwenden. c) Schreiben sie eine Testbench und überprüfen Sie die Funktionalität der ultrasonic_ sensors Komponente. d) Testen Sie Ihre Komponente mit dem FPGA-Board. Beschreiben Sie hierzu eine Top- Komponete top_ultrasonic_sensors_test und instantiieren Sie Ihre ultrasonic_sensors Komponente mit zwei Ultraschallsensoren (NUM_SENSORS = 2). Geben Sie einen gemessenen Distanzwert über die LEDs aus, wobei mit Hilfe von Schalter SW0 zwischen den beiden Sensoren umgeschaltet werden soll. Verbinden Sie zum Starten von Messvorgängen das enable Signal mit einer Oder-Verknüpfung von Schalter SW3 und Taster BTN WEST. Benutzen Sie den Taster BTN SOUTH für das Reset-Signal. Der Testaufbau von zwei kaskadierten Ultraschallsensoren steht zur Verfügung und muss an Pfostenleiste J4 angeschloßen werden (auf Polung achten!). Hinweis: Der Wertebereich von distance_vector wird auf diese Weise nicht vollständig ausgenutzt. Kommentieren Sie Ihren Code! Übungskoordination: Dipl.-Inf. Felix Mühlbauer, Dipl.-Ing. Philipp Mahr 5