Dualport Speicher

Singalport
Traditionall wird auf einem Speicher entweder geschrieben oder gelesen werden. Dies geschieht nicht gleichzeitig.Es handelt sich um einen Singel Port Speicher.

SingelPort

 

 

 

 

Dualport (z.B. in FPGAs)
Auf denselben Speicher wird über zwei Schnittstellen zugegriffen. Dadurch kann zeitgleich auf denselben Speicher gelesen wie geschrieben werden.
Bei der Dualport-Konfiguration sagt man, welche Aktion Priorität hat, falls lesen und schreiben auf die selbe Adresse getätigt werden soll.

RealDualPort

Vorteile des Dualport
– lesen und schreiben können einen anderen Takt haben
– lesen und schreiben können andere Datenbreiten haben

Implementation
Dualport ist nur durch 2 unabhängige Bussysteme möglich. Beide Ports werden an einen Bus manuell angebunden. Ebenso wird beim FPGA in der Konfiguration der Ports in den IP-Einstellungen minutiös eingestellt.

DMA: Direct Memory Access

Normalerweise kooridiniert die CPU den Verkehr auf dem Bus. Angeschlossenen Periphierie-Geräte senden ihren Inhalt in ein CPU-Register und diese sendet diese an das RAM.

DMA: Periphierie-Geräte schreiben direkt in RAM
Die Zwischenspeicherung in das CPU-Regsiter entfällt. Es braucht für die Koordination eine DMA-Leitung zur CPU. Sind mehrere Geräte DMA-fähig, werden sie durch ihren Index voneinander unterschieden.

DMA: Entlastet Bus und CPU
..

JTAG als generelle Schnittstelle

JTAG wurde für Built in Tests auf Chips entwickelt. Da durch JTAG direkt auf den Chip zugegriffen werden kann, erweiterten Hersteller die Schnittstelle für diverse Chip-Bedürfnisse:

JTAG-Schnittstelle als Programmer
JTAG kann gebraucht werden zum Laden eines Programms oder von Konfigurationen (FPFA) über einen Speicher (Flash).
Code kann heruntergeladen und ausgeführt werden.

Einblick in CPU und Peripherals
Hersteller bieten JTAG-Schnittstellen an über die auf die Speichersteine, den Bus, die CPU und weitere Blocks zum Debuggen zugegriffen werden kann. Werte können gesetzt wie auch nur analysiert werden.

Schnittstelle für Logic-Analyser
Die JTAG-Schnittstelle kann für den Zugang von Logic-Analyser-Programen gebraucht werden. Im FPGA ist dies Singaltap.

 

JTAG: Built in Testing

Von der Prüfspitze zu Testpins
Früher wurde ausschliesslich mit der „Nadelmethode“ Testnadeln an ausgewählte Stellen (Knoten) angelötet, um den Signalverlauf zu testen.
Da die Bauteile immer kleiner werden ist dies physisch fast nicht mehr möglich. An den Teststellen (Knoten) werden Leitungen an die Oberfläche fix geführt. Ist dies in einem Chip (Built in) so enstehen Pins am Chip-Ausgang, die Zugang zu den Knoten bieten.

JTAG-Standard
Der IEEE 1149.1 Standard ist von der Gruppe JTAG verfasst und definiert eine Schnittstelle für Boundary Scan Test in Chips. Detailierter Artikel JTAG

Über die JTAG-Schnittstelle, auch TAP = Test Access Port genannt kann auf die SCAN CHAIN (siehe Boundary Scan) auf die Ein-und Ausgänge des Chips zugegriffen werden.

scanChain

TAP Schnisstelle
JTAG definiert 4 Signale:
– TCK: Der Clock
– TMS: Der Testmode
– TDI: Die Datenleitung für Input (Simulation)
– TDO: Die Ausgabe des aktuellen Zustands an den Ein-und Ausgängen.

 

..

Cmake introduction

Automatisches Generieren von Makefiles

$ mkdir build
$ cd build
$ cmake ..   // führt die CMakeList.txt aus = generiert Makefiles
             // cmakeList.txt liegt ein Verzeichnis weiter unten
$ make       // führt die Makefiles aus

Mit cmake werden Makefiles generiert. Alle Makefiles liegen im Ordner build. Alle Dateien, die die Programme zur Ausführung brauchen, müssen im build liegen.

Mehrere Executables

CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(HuffmanDecoder)

ADD_DEFINITIONS("-std=c++11 -g")

ADD_EXECUTABLE(decoder
    main.cpp
    FileStreamReader.cpp
    HuffmanDecoder.cpp
    BinaryTree.cpp
    EndoscopeImage.cpp
)

ADD_EXECUTABLE(decoder_fullversion
    decoder.cpp
    FileStreamReader.cpp
    HuffmanDecoder.cpp
    BinaryTree.cpp
    EndoscopeImage.cpp
)

ADD_EXECUTABLE(encoder
    encoder.cpp
    FileStreamReader.cpp
    HuffmanDecoder.cpp
    BinaryTree.cpp
    EndoscopeImage.cpp
)

ADD_EXECUTABLE(testTree
    testTree.cpp
    BinaryTree.cpp
)

Will man nur ein bestimmtes Projekt kompilieren, schreibt man:

$ make testTree && ./testTree

Durch && ./executalbe wird das Programm direkt ausgeführt.

 

Referenzen im Netz

Link1: Anleitung für Programmiererinnen

Link2: Einfache Einführung

Make bedeutet kompilieren (und linken). Will man mehrere Dateien kompilieren und dann auch linken, genügt ein einfacher Shell-Befehl gcc -o main.c test  nicht mehr. Man macht dann ein Makefile, in dem durch Pfad-Variablen und Variablen der Datein, das Kompilieren, Linken vereinfacht wird.

Die Aufgabe von Cmake ist es, Makefiles automatisiert zu erstellen. Der Aufruf cmake funktioniert nur, wenn im Zielordner auch die Datei CMakeLists.txt liegt. In jedem Unterordner liegt eine CMakeLists.txt

cmake pfad/zu/dateien

Alle wichtigen Ergebnisse des Kompilieren, Linkens legt das Programm selbständig in diese Datei ab.

………………………………………………………………………………….

Projektstruktur
project /  CMakeList.txt                          // das main CMake
.                 / source /  CMakeList.txt      // jeder Unterordner braucht sein CMake
.                                     main.cpp
.                                      classb.cpp
.                  /build/                                        // nur hier kein CMakeList.txt
.

Erhält man ein Programm aus einer Plattform, wird das Programm oft so gebildet:

$ mkdir build
$ cd build
$ cmake ..   // führt die CMakeList.txt aus = generiert Makefiles
$ make       // führt die Makefiles aus

 

……………………………………………………………………………………….

CMake legt auch eine CMakeCache.txt Datei selbständig an. Darin sind alle Konfigurationen gespeichert. Diese Datei sollte nicht manuell geändert werden.

Das Programm wird oft nicht im Ordner der Quelldateien abgelegt. Man kann einen Ordner build angeben oder /user/bin nehmen.


Hauptdatei: CMakeLists.txt

add_executable(hallowelt main.c)

Hat man mehrere Files, so werden diese in einer Varibale zusammengefasst

SET( SOURCE main.c calculator.c)   Mit set werden Variablen gesetzt

Braucht man später die Variable, so geschieht dies mit ${SOURCE}  .

add_executable(calculator ${SOURCE})

PROJECT( name )
INCLUDE_DIRECTORY( /usr/bin )
TARGET_LINK_LIBRARIES()
ADD_DEFINITIONS()

INSTALL( TARGETS <programm> RUNTIME DESTINATION bin)

 

Variable zu bereits bestehenden Variablen hinzufügen

SET( EXTRALIBS ${EXTRALIBS} /usr/local/bla)
Fett stehen hier alle alten Pfade zu Bibliotheken, danach kommt der neue Pfad.
Ein typisches Beispiel ist die Umgebungsvariable PATH. Dort wird auch zu ${PATH} <neuer Pfad> dazugeführt.

..

yocto: Konzept und Literatur

Yocto ist ein Build-System und hilft, ein embedded Linux-System aufzubauen.

 

Konzept

  • Yocto stellt eine Referenz-System (Poky), durch das viele Tools und Projekte leicht einbaubar sind zur Verfügung.
  • Unter den Cores besteht eine offene Struktur (Metadaten). Dadurch besteht Kompatibilität unter diversen Projekten
  •  Einfaches Buildprogramm (Bitbake), dass mit dieser offenen Struktur umgehen kann und Images buildet.

Wegen dieser Offenheit, können viele BSP (Board Support Packets) der Hersteller eingebunden und weiterentickelt werden. Dadurch muss das Build-System nicht neu erfunden werden.
BSP: Altera stellt über Quartus BSP für FPGAs her. Diese können relativ einfach in Yocto integriert werden. (Device Tree generieren, aus Datei.sof -> Datei.rbf und einen Preloader hinzufügen.)

 

Notwendige Grundlagen-Dateien
Auf dem Speichermedium, vom dem aus gebootet wird, liegen neben dem Yocto-Image weitere Dateien. Yocto ergänzt nur diese Dateien (mit seinem zImage), bzw. hilft, die Grundlagen-Dateiene zu einem funktionstüchtigen Gebilde zusammenzufügen.

  • Bootloader (Image)
  • Bootscript  -> nur so ist das System startfähig
  • Kernel mit Devicetree
  • File System (Image)

 

Struktur Yocto Projekt
-> Ordner build/
conf/                                          layers einstellen,
….

-> ordner pocky/
bitbake/
documentation/
meta/
meta-yocto/
meta-yocto-bsp/                               scripts/                                      um neue Projekte beizufügen
(layers)

Image builden

cd build
bitbake virtual/bootloader
bitbake virtual/kernel
bitbake core-image-minimale     // root file System

 

Vorteile

Die Vorteile von Yocto liegen laut der Linux Foundation darin, dass viele Vorlagen für die Unterstützung spezifischer Hardware (Board Support Packages) vorhanden sind und es einfach ist, das System auf neue Hardware zu portieren. Auch in Lizenzfragen ist man mit Yocto auf der sicheren Seite.

Bücher

  • Embedded Linux Projects Using Yocto Project Cookbook, March 2015
    By Alex González

https://www.packtpub.com/application-development/embedded-linux-development-yocto-project

Board Support Package (BSP)

Normalerweise genügt eine Distribution, um ein Linux laufen lassen zu können. Im Embedded Bereich jedoch sind die Komponenten stark optimiert, so dass spezifischen Treiber, zusätzliche Bibliothekten etc. eingebaut werden (Überblick bei Linutronix.)

Eine gute Unterstützung beim Erstellen eines BSP bietet Yocto.

Die modernere Methode dieser Konfiguration ist der Device Tree.

GPU Introduction

GPU ist ein Grafikprozessor. Also ein Prozessor, mit spezifischem Profil. Hersteller sind Intel, AMD und Nvidia.

CPU <-> GPU
Wird von einem Host gesprochen, meint man damit die CPU (inkl. Memory). Ein C-Programm läuft auf dem Host.

Cuda <-> Metal
Cuda ist das Framework und die Sprache von Nvidio. Will man eine GPU für ein iOS konfigurieren, so braucht man metal als Framework und swift als Sprache.

Optimieren Taktfrequenz Bauteil

Bei einem FPGA hängt die höchte Taktfrequenz vom langsten Pfad zwischen zwei FF ab.
f_max = 1 / t_pfad_max

Logikpfad

Je länger der Pfad, desto tiefer die maximale Taktfrequenz.
t_pfad = 5 ns      f_max = 200 MHz               CLK_Bauteil = 200 MHz
t_pfad = 3 ns      f_max = 333 MHz               CLK_Bauteil = 333 MHz

Optimierung
Durch das direkte Anbinden eines FF beim Ausgang eines Speichers, wird der Pfad verkürzt.

Nachteil der Optimierung
Die Datenverarbeitung braucht insgesamt einen Takt-Zyklus mehr.