kramann.info
© Guido Kramann

Login: Passwort:










kramann.info
© Guido Kramann

Login: Passwort:




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/01_Einfuehrung
69_FPGA/05_Beispiele/03_Mustervergleich

2 -- Donnerstag 21.03.2019

Vorlesung, Kapitel:

69_FPGA/03_DLP_FPGA
69_FPGA/05_Beispiele/01_Blinkende_LED
69_FPGA/21_XSE14
69_FPGA/02_Einrichtung/02_BitLoadApp

2 -- Dienstag 26.03.2019

Übung:

69_FPGA/06_Uebung
3

3 -- Donnerstag 28.03.2019 (V)

Wiederholung und Vertiefung:

69_FPGA/05_Beispiele/01_Blinkende_LED
69_FPGA/05_Beispiele/02_Binaerzaehler
69_FPGA/05_Beispiele/03_Mustervergleich

Besprechung der Übung (ggf. studentische Lösung)

69_FPGA/06_Uebung

Arbeiten mit Bitwörtern (Vektoren von Binärsignalen)

69_FPGA/11_VHDL
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:

  • Jede Person sucht sich einen PC, auf dem ISE und Arduino laufen und nimmt immer diesen PC bis zum Ende des Semesters.
  • Jede Person prüft ein FPGA-Board mit Mikrocontroller (Blinken muß aufgebaut werden und muß funktionieren).
  • Das Board wird, wenn alles funktioniert, dem Dozenten übergeben. Der bringt seitlich die Matrikelnummer des Studierenden an.
  • Es soll weiterhin in Zweiergruppen gearbeitet werden. Aber jede Person setzt alle Übungen am eingenen PC mit dem eigenen Board um.
  • Alle helfen mit, die genügende Anzahl an Boards bereitzustellen. Funktionierende Boards werden beim Dozenten abgegeben und "umverteilt".
  • Immer zwei Boards werden in eine eigene Box gepackt (also pro Gruppe eine Box und zwei Boards), die ebenfalls mit den Matrikelnummern versehen wird.
  • Erst wenn jede Person ein funktionierendes Board mit Box und einen PC, auf dem ISE und Arduino laufen hat, kann mit folgender Übung begonnen werden:
Ü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:

69_FPGA/05_Beispiele/03_Mustervergleich

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

  • Wählen Sie selber geeignete Pins auf dem Board für die Ein- und Ausgänge.
  • Bauen Sie die Schaltung auf.
  • Entwickeln und testen Sie das VHDL-Programm.
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:

  1. ... mit einzelnen Standard-Logic-Signalen und einem Integer-Zähler,
  2. ... mit vektoriellen Standard-Logic-Signalen und einem Integer-Zähler,
  3. ... mit vektoriellen Standard-Logic-Signalen und Bit-Verkettungen.

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/02_Binaerzaehler (STD_LOGIC_VECTOR verwenden)
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:

  1. rot
  2. rot und gelb
  3. grün
  4. gelb

Diese vier Zustände lassen sich durch zwei Bit repräsentieren.

Erstellen Sie zwei Varianten dieser Ampel mit Hilfe des FPGA-Boards:

  1. Die vier Zustände werden über zwei äußere Taster eingestellt und durch drei LEDs angezeigt.
  2. Die vier Zustände wechseln zyklisch im Sekundentakt.

HINWEISE:

  • Erstellen Sie zunächst eine Logiktabelle mit allen Eingängen und Ausgängen und deren Möglichkeiten.
  • Setzen Sie das Ganze dann ein einen Logikschaltplan oder als logische Verknüpfungen um.
  • Nutzen Sie die neu erlernten Möglichkeiten aus der letzten Vorlesung, indem Sie statt zwei einzelne logische Signale einen 2-Bit-Vektor benutzen, um den Input zu repräsentieren.
  • Setzen Sie die erste Aufgabe als reine Architektur um.
  • Überlegen Sie dazu sinnvolle Pins, die als Ein- bzw. Ausgänge dienen sollen und verwenden diese.
  • Beim zweiten Teil muß ein Prozeß hinzu genommen werden, der die Zeitsteuerung übernimmt.
5

5 -- Donnerstag 11.04.2019 (V)


  • Definition und Verwendung selbst erstellter "Entities" / "Sub-Mudule".
  • Verwendung vordefinierter Entities aus der UNISIM-Lbrary.

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 (Ü)

  1. Analysieren Sie die beiden Projekt-Varianten in module.zip aus der letzten Vorlesung.
  2. Bauen Sie die Schieberegister-Schaltung in passender Weise auf und prüfen, ob beide Varianten funktionieren.
  3. Schauen Sie sich das Beispiel zum UNISIM-Modul LUT4 an.
  4. Benutzen Sie ein LUT3 (vergl. spartan3e_hdl.pdf, Seite 81 ff.) in einem eigenen Projekt, um folgende Logik (Wahr bei ungerader Anzahl an Einsern) zu realisieren (vergl. nachfolgende Logiktabelle).
  5. Legen Sie selber sinnvolle Pins als Eingänge A0, A1, A2 und als Ausgang AUS fest.
  6. Verschalten Sie die Eingänge über Taster mit inverser Logik und AUS mit einer LED (2200 Ohm Vorwiderstand).
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_LUT
69_FPGA/10_Servo

7 -- Dienstag 30.04.2019 (Ü)

  • Bauen und testen Sie die Servoschaltung aus der Vorlesung.
  • Bearbeiten Sie die Übung am Ende des Kapitels:
69_FPGA/10_Servo

Es können nur Miniservos verwendet werden. Die Stromversorgung der Servos erfolgt über den Arduino-Micro.


8

8 -- Donnerstag 02.05.2019 (v)

  • Einführung in Neuronale Netze mit dem Ziel NN durch FPGAs zu realisieren.
//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.)

NN002.zip -- Lösung, um ein UND-Gatter zu realisieren.
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
  • Schreiben Sie ein Optimierungsprogramm, das selber geeignete Gewichte findet, um das UND-Gatter aus der Vorlesung mit einem Neuronalen Netz zu realisieren.

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.

  • Schreiben Sie das Programm aus der Vorlesung so um, dass es mit Integern funktioniert.
  • Dazu ist eine Anpassung des Faktors d der sigmoiden Funktion nötig.
  • Außerdem muß der Zahlenbereich insgesamt vergrößert werden, z.B. auf +/- 10000.
  • Entsprechend könnte logisch 1 bedeuten, dass ein Wert >5000 ist und logisch 0, dass er kleiner 5000 ist.
Kapp.zip -- studentische Beispiellösung für Teil1.
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:

69_FPGA/99_day_by_day_SoSe2018

Versuch, das NN basierte UND-Gatter mit einem FPGA umzusetzen.

9 -- Dienstag 14.05.2019 (Ü)

  • Umsetzung eines Neuronalen Netzes, das ein UND-Gatter realisiert mittels eines FPGA.

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

NN005_Optimierer.zip -- Processing-Sketch NN005_Optimierer.
  1. Realisieren Sie ein UND-Gatter mit Tastern und einer LED mit dem FPGA, damit klat ist, dass die Schaltung funktioniert.
  2. Schreiben Sie mit Processing ein NN auf Integer-Basis, das ein UND-Gatter repräsentiert und testen es (insbesondere benötigter Zahlenbereich). Es soll möglichst nah dran an der FPGA-Umsetzung sein.
  3. Setzen Sie nun das UND-Gatter auf den gleichen Pins wie bei 1. mittels eines NN auf dem FPGA um und testen es.

Orientieren Sie sich an:

69_FPGA/99_day_by_day_SoSe2018
10

10 -- Donnerstag 16.05.2019 (V)

Vorbereitung für die Vorlesung:

NN006_integer.zip -- Suche nach passenden Gewichten für Integer-basiertem NN.

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.
  • Heute kein FPGA, sondern NN: Das Backpropagation-Verfahren, Theorie und Implementierung:
67_Echtzeitsysteme/08_NeuronaleNetze/02_Backpropagation

11-- Dienstag 28.05.2019

  • Nehmen Sie als Grundlage das oben zum Download bereit gestellte Projekt neuround.
  • Schreiben Sie das Projekt so um, dass die diskretisierte sigmoide Funktion (Lookup-Table) nicht jedesmal eingefügt werden muß, sondern als Modul bereitgestellt wird.
  • Schreiben Sie eine weitere Variante des gleichen Projektes, das als Grundlage Module benutzt, die aus Neuronen mit zwei Eingängen samt zweier Eingangsgewichte bestehen.

Orientieren Sie sich bei der Umsetzung an Kapitel 9 der Vorlesung:

69_FPGA/09_Uebung -- Erstellen eines D-Flip-Flop-Moduls und dessen Verwendung.
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

  • Analysieren und testen Sie sorgfältig die Aufgabe und auch die Musterlösung in der folgenden Übungsaufgabe:
69_FPGA/22_Uebung -- Herstellen einer Digitaluhr
13

13 -- Donnerstag 06.06.2019 (V)

  • Nachbesprechung: Modularisierung des FPGA-basierten Neuronalen Netzes
  • Nachbesprechung: Herstellen einer Digitaluhr
69_FPGA/22_Uebung -- Herstellen einer Digitaluhr

13-- Dienstag 11.06.2019

Übung: Entwickeln Sie auf der Grundlage der gleichen Schaltung wie bei der (zu schnell gehenden) Uhr eine Stoppuhr.

  • Die 4 Anzeigeelemente sollen 4 Dezimalstellen zur Anzeigen von Millisekunden darstellen, also 0 bis 9999ms.
  • Die Drei Tasten sollen die Funktion START, STOPP, RESET haben. D.h. Die Anzeige bleibt immer sichtbar und kann mit RESET auf 0000 gestellt werden.
Stoppuhr.zip -- Studentische Lösung.
14

14 -- Donnerstag 13.06.2019 (V)

  • Emulation einer seriellen Schnittstelle auf der Basis von VHDL.

Erneut lädt ein Thema zu einer vergleichenden Betrachtung zwischen Mikrocontroller und FPGA ein ;-)

seriellemu1.zip -- Simple Testumsetzung aus Vorlesung, sendet nur AAAAAAAAA....
  • Codierung von A (dezimal 65) in umgekehrter Bitreihenfolge, da mit Least significant Bit begonnen wird.
  • Prefix: 1110 bedeutet: Erst High-Level und dann Startbit
  • Postfix: 1111 bedeutet: Für längere Zeit High-Level, also keine Datenübertragung.
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.

  • Umgang mit Arrays bei VHDL:
  • Arrays können als selbst definierter Datentyp in VHDL vereinbart werden.
  • Das heißt aber: Erst vereinbart man den Datentyp und dann erzeugt man eine Instanz davon.
  • Durch minimale Änderungen an obigem Programm soll dies beispielhaft gezeigt werden:
  • Anstatt ein Bitwort durchzugehen, wird ein Integer-Array mit Einsen und Nullen gebildet und stattdessen verwendet.
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.

seriellemu3.zip -- Variante mit Integer-Array: Simple Testumsetzung aus Vorlesung, sendet nur BBBB....

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:

  1. Entwickeln Sie auf der Grundlage von seriellemu1 (s.o.) einen seriellen Sender, der im Wechsel A und B sendet, jeweils mit einer Sekunde Pause dazwischen.
  2. Testen Sie dieses neue Programm, indem Sie die gesendeten Daten mit einem Arduino empfangen und im seriellen Monitor anzeigen.
  3. Entwickeln Sie danach einen seriellen Empfänger für ein zweites FPGA-Board, der serielle Daten empfangen kann und die ASCII-Codes von A und B erkennt, wenn sie empfangen wurden.
  4. A schaltet bei diesem Board eine LED an und B schaltet die gleiche LED aus (Test um Funktionstüchtigkeit zu prüfen.)
  5. Überprüfen Sie die Funktionstüchtigkeit, indem Sie beide FPGA-Boards (Sender und Empfänger) miteinander verbinden.
15

15 -- Donnerstag 20.06.2019 (V)

  • Fortsetzung Serial-Emulator mit FPGA.

15-- Dienstag 25.06.2019 (E-TEST 2)


2. E-TEST (IWZ135 8:30-10:00)


16

16 -- Donnerstag 27.06.2019 (V)