Echtzeitsysteme auf der Basis von HDL (FPGA) day by day Sommersemester 2019
(EN google-translate)
(PL google-translate)
1 -- Dienstag 19.03.2019
Vorlesung, Kapitel:
69_FPGA/05_Beispiele/03_Mustervergleich
2 -- Donnerstag 21.03.2019
Vorlesung, Kapitel:
69_FPGA/05_Beispiele/01_Blinkende_LED
69_FPGA/21_XSE14
69_FPGA/02_Einrichtung/02_BitLoadApp
2 -- Dienstag 26.03.2019
Übung:
3
3 -- Donnerstag 28.03.2019 (V)
Wiederholung und Vertiefung:
69_FPGA/05_Beispiele/02_Binaerzaehler
69_FPGA/05_Beispiele/03_Mustervergleich
Besprechung der Übung (ggf. studentische Lösung)
Arbeiten mit Bitwörtern (Vektoren von Binärsignalen)
69_FPGA/05_Beispiele/03_Mustervergleich
3 -- Dienstag 02.04.2019 (Ü)
Angesichts der praktischen Probleme, die einige Studierende bei dem Umgang mit der FPGA-Soft- und Hardware haben, soll die Prüfung doch als praktische Realisierung mehrerer kleiner Projekte erfolgen. Als Vorbereitung wird in dieser Übung folgendes gemacht:
|
Übung
Noch einmal soll ein Beispiel durchgespielt werden, bei dem zuerst eine digitale Schaltung als reine Architektur umgesetzt wird und im Anschluß ein automatischer Ablauf dafür umgesetzt wird. Vergleiche auch dieses mal dazu die folgenden beiden Beispiele:
Wahrheitstabelle für die aktuelle Aufgabe:
Input: A0, A1, A2 (zunächst Taster, später LEDs) Output: B0, B1 (LEDs) A2 A1 A0 B1 B0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 1 0 1 1 1 0 1 0 0 0 1 1 0 1 1 0 1 1 0 1 0 1 1 1 0 1
Code 0-1: Wahrheitstabelle für die aktuelle Aufgabe
|
4
4 -- Donnerstag 04.04.2019 (v)
Der praktische Umgang mit Bit-Vektoren und Verkettungen (Bitshifting) soll vertieft werden. Dazu soll als Beispiel ein Lauflicht dienen, das auf dreierlei Weisen implementiert wird:
|
Es wird angeregt, alternative Umsetzungen zu diskutieren und auszuprobieren, um die Möglichkeiten von VHDL weiter auszuloten.
Die im Unterricht entstandenen Projekte werden hier hochgeladen.
Relevante Kapitel im Skript hierzu:
69_FPGA/05_Beispiele/03_Mustervergleich (conv_std_logic_vector verwenden)
69_FPGA/11_VHDL (&-Operator bei std_logic_vector verwenden)
LAUFLICHT.zip LAUFLICHT.zip -- Alle drei Varianten als Xilinx-Projekte aus der Vorlesung.
4 -- Dienstag 09.04.2019 (Ü)
Eine Verkehrsampel kennt die Zustände:
|
Diese vier Zustände lassen sich durch zwei Bit repräsentieren.
Erstellen Sie zwei Varianten dieser Ampel mit Hilfe des FPGA-Boards:
|
HINWEISE:
|
5
5 -- Donnerstag 11.04.2019 (V)
|
69_FPGA/09_Uebung -- Erstellen eines D-FlipFlops direkt und als Untermodul.
69_FPGA/12_UNISIM -- Einführung in die UNISIM-Bibliothek und Verwendung des dort difinierten D-FlipFlops.
module.zip -- Zwei Projekte aus der Vorlesung: Schieberegister mit selbst geschriebenem D-Flip-Flop-Modul und unter Verwendung der UNISIM-Library.
5 -- Dienstag 16.04.2019 (Ü)
|
A2 A1 A0 AUS 0 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 0 0 1 1 0 1 0 1 1 0 0 1 1 1 1
Code 0-2: Logiktabelle.
6
6 -- Donnerstag 18.04.2019 (V)
23.04.2019 keine Übung/Vorlesung (Ostern)
7
7 -- Donnerstag 25.04.2019 (V)
69_FPGA/13_LUT69_FPGA/10_Servo
7 -- Dienstag 30.04.2019 (Ü)
|
Es können nur Miniservos verwendet werden. Die Stromversorgung der Servos erfolgt über den Arduino-Micro.
8
8 -- Donnerstag 02.05.2019 (v)
|
//Beispiel von: //http://www.kramann.info/67_Echtzeitsysteme/08_NeuronaleNetze/01_Neuron/index.php public float sigmoid(float u) { float d = 1.0; return 1.0/(1.0 + exp(-d*u)); } public float neuro(float in0, float in1) { //Gewichte zur ersten Schicht hin: float w00 = 1.0; float w01 = 1.0; float w02 = 1.0; float w03 = 1.0; //Gewichte von der ersten zur zweiten Schicht: float w10 = 1.0; float w11 = 1.0; //Erste Schicht: float q10 = in0*w00 + in1*w03; float n10 = sigmoid(q10); float q11 = in0*w01 + in1*w02; float n11 = sigmoid(q11); //Zweite Schicht: float q20 = n10*w10 + n11*w11; float n20 = sigmoid(q20); return n20; }
Code 0-3: Testsketch (unvollständig, vergl. Vorl.)
import java.util.Random; Random zufall = new Random(System.currentTimeMillis()); public void setup() { for(int i=0;i<10;i++) { int x = zufall.nextInt(100); //Gleichv. Zuf. 0..99 double y = zufall.nextDouble(); //gleichv. Zuf. 0..1 println("x="+x+" y="+y); } }
Code 0-4: Erzeugen von gleichverteilten Zufallsvariablen mit Java/Processing.
8 -- Dienstag 07.05.2019 (Ü)
Teil 1
|
HINWEISE: Starten Sie bei Zufallswerten. Nehmen Sie zufällige Veränderungen an einem zufällig ausgewählten Gewicht aus und behalten die Veränderung, wenn das Verhalten des Netzes besser wird, ansonsten verwerfen Sie die Veränderung. Für die Zufallswerte kann die Klasse Random aus der Library java.util.Random verwendet werden. Zu Beginn der Übung wird ein Beispiel gezeigt werden.
Teil 2
Das mit NN realisierte UND-Gatter soll weiter in Richtung FPGA gebracht werden. Dazu ist es nötig, das System auf Integer basieren zu lassen.
|
9
9 -- Donnerstag 09.05.2019 (V)
Konzeptsuche zur Umsetzung eines Neuronalen Netzes mit Hilfe eines FPGAs
Untersuchen von "Teillösung 2: Lenkregelung erfolgt über FPGA " bei day_bay_day_SoSe2018:
Versuch, das NN basierte UND-Gatter mit einem FPGA umzusetzen.
9 -- Dienstag 14.05.2019 (Ü)
|
Das nachfolgende Processing-Programm liefert folgende Parameter für das NN:
Beste Gewichte: w0=6.0052643 w1=0.02110678 w2=-0.17983842 w3=-0.18512046 w4=0.31746292 w5=-0.92752934 d=100.0 Guete bei besten Gewichten: Guete=0.75 in0=0.0 in1=0.0 out=5.6568696E-14 in0=1.0 in1=0.0 out=7.213868E-23 in0=0.0 in1=1.0 out=0.4999997 in0=1.0 in1=1.0 out=1.0
Code 0-5: Ergebnis von NN005
|
Orientieren Sie sich an:
10
10 -- Donnerstag 16.05.2019 (V)
Vorbereitung für die Vorlesung:
Vorlesung: Umsetzung UND-Gatter auf Basis eines Integer basierten Neuronalen Netzes mit einem FPGA.
Vorbesprechung zum E-Test
10 -- Dienstag 21.05.2019 E-TEST 1
1. E-TEST (IWZ135 8:30-10:00 NEU!!!!)
11
11 -- Donnerstag 23.05.2019 (V)
neuround.zip -- ISE-Projekt mit "Integer-Neuronen" für UND-Gatter.
|
11-- Dienstag 28.05.2019
|
Orientieren Sie sich bei der Umsetzung an Kapitel 9 der Vorlesung:
neuround2.zip -- studentische Lösung (sigmoide Funktion modular, Breitreiter)
neuround_modular.zip -- studentische Lösung (Neuron und sigmoide Funktion modular, Al-Tamimi)
12
12 -- Donnerstag 30.05.2019
Keine Lehrveranstaltung (Feiertag)
12-- Dienstag 04.06.2019
|
13
13 -- Donnerstag 06.06.2019 (V)
|
13-- Dienstag 11.06.2019
Übung: Entwickeln Sie auf der Grundlage der gleichen Schaltung wie bei der (zu schnell gehenden) Uhr eine Stoppuhr.
|
14
14 -- Donnerstag 13.06.2019 (V)
|
Erneut lädt ein Thema zu einer vergleichenden Betrachtung zwischen Mikrocontroller und FPGA ein ;-)
|
library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity seriellemu is Port ( MEINECLOCK : in STD_LOGIC; TXD : out STD_LOGIC); end seriellemu; architecture Behavioral of seriellemu is signal zaehler : integer range 0 to 624 := 0; signal logikpegel : std_logic := '0'; signal wort : std_logic_vector(15 downto 0) := "1110100000101111"; begin process begin wait until rising_edge(MEINECLOCK); if (zaehler<624) then zaehler <= zaehler+1; else zaehler <= 0; logikpegel <= wort(15); wort <= wort(14 downto 0) & wort(15); end if; end process; TXD <= logikpegel; end Behavioral;
Code 0-6: VHDL-Code für simplen Emulator aus seriellemu1.
## GCLK6 ist auf FPGA-Chip Pin 56 NET "MEINECLOCK" LOC = "P56"; ## IO_L05P_0 ist auf FPGA-Chip Pin 125 NET "TXD" LOC = "P125"; NET "MEINECLOCK" IOSTANDARD = LVCMOS25; NET "TXD" IOSTANDARD = LVCMOS33;
Code 0-7: passende ucf-Datei.
int c; void setup() { Serial.begin(9600); Serial1.begin(9600); } void loop() { if(Serial1.available()) { c = Serial1.read(); Serial.write(c); } }
Code 0-8: Arduino-Programm, um die seriellen Daten zu empfangen und im seriellen Monitor zu sehen. RxD vom Arduino muß mit Pin125 beim FPGA verbunden sein und auch die Massen beider Boards.
|
|
library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity seriellemu is Port ( MEINECLOCK : in STD_LOGIC; TXD : out STD_LOGIC); end seriellemu; architecture Behavioral of seriellemu is signal zaehler : integer range 0 to 624 := 0; signal index : integer range 0 to 16 := 0; -- Index für Array signal logikpegel : std_logic := '0'; -- signal wort : std_logic_vector(15 downto 0) := "1110100000101111"; type meinarraytyp is array (0 to 15) of integer range 0 to 1; -- TYP signal meinarray : meinarraytyp := (1,1,1,0,0,1,0,0,0,0,1,0,1,1,1,1); -- INSTANZ (ASCII B=66) begin process begin wait until rising_edge(MEINECLOCK); if (zaehler<624) then zaehler <= zaehler+1; else zaehler <= 0; if (meinarray(index)=1) then logikpegel <= '1'; else logikpegel <= '0'; end if; index <= index+1; if (index=16) then index <= 0; end if; end if; end process; TXD <= logikpegel; end Behavioral;
Code 0-9: Verwendung eines Integer-Arrays in VHDL. Programm entspricht weitestgehend dem vorangehenden.
14-- Dienstag 18.06.2019 (Ü)
In ähnlicher Weise, wie in der vorangegangenen Vorlesung soll ein möglichst einfacher serieller Empfänger mit einem FPGA-Board umgesetzt werden.
Da als Sender der Einfachheit halber (gleiche Spannung 3,3Volt) auch ein FPGA verwendet werden soll, gliedert sich die Aufgabe folgendermaßen:
|
15
15 -- Donnerstag 20.06.2019 (V)
|
15-- Dienstag 25.06.2019 (E-TEST 2)
2. E-TEST (IWZ135 8:30-10:00)