swift introduction

Implizite Typzuweisung
Der Datentyp muss nicht angegeben werden. Vor dem Variablenname definiert man nur, ob es sich um eine Konstante let  oder eine Variable var  handelt.

let length_box = 5                 // wird zu int
let hight_box = 3.5                // wird zu float
let projectname = "ImageRecover"   // wird zu string 
var number = 2
var isPressed = true               // bool

Konstanten sind Variablen vorzuziehen. let area = Squar(length:5)

Explizite Typzuweisung
Nach dem Variablenname kann über : den Datentyp definiert werden.

var number: Int16 = 2        // Integer definieren                  
let matrix:[Int16]


Nullpointer

var device: MTLDevice!;        //Typ ist MTLDevice mit Nullpointer


Ausführen nur bei Objekten mit Inhalt
Sind Variablen, Funktionen oder Klassen mit ?  definiert, wird der Code nur ausgeführt (bzw. ein Wert zugewiesen), wenn das Objekt einen Wert enthält.

var answer: String?         // answer erhält Wert nur, wenn String Inhalt hat
var error: NSError? 
var age: Int?               // variable hat initalwert.
if answer {                //answer ! nil
.    // do
}

if age {                  // nur wenn age einen Wert hat
.   // do
}

 

swift Vererbung über Delegierte

Zwei Dateien
Proj_Bauteil_Funktion.swift
Proj_Bauteil_FunktionDelegate.swift

Inhalt DateiDelegate.swift

import Bibliothek

protocol Proj_Bauteil_FunktionDelegate {
.    func name(<var>:<Type>!)
}

Ähnlich zum Header gibt sie das an, was importiert wird.

Bezug auf Vererbung in der Hauptdatei

class xy {
.          // Deklarationen
.         var delegate: Proj_Bauteil_FunktionDelegate?
.
.        // Funktionen
.       func tcpSocket( <argument>) {
.                // Code
.                delegate?.receiveAck(data)
}   

Die vererbte Variable wird mit einem definiert und immer mit einem ?  aufgerufen.
Was bedeutet das !  ?
Vermutung: Die Eltern erhalten dieses Zeichen.

 

Steuerung Audio Codec

Überblick der Funkionen
Der Audio Codec gibt die Audiodaten aus. Zudem verwaltet er alle Audio-Pfäde auf dem Board. Er definiert, ob der Analoge Input aktiv oder der Digitale Input übergangen wird. Alle Einstellungen stehen in seinen Registern.

audio_Codec_v1

Bidirektionale Konfiguration des Audio Codec IO-Bauteilen
Die Einstellungen des Audio Codecs erfolgen über Register. Damit die Register gesetzt werden können, wird mit I2C auf die Codecregister zugegriffen.Insgesamt bestehen 11 Register mit je 16 Bits.

Einerseits werden über den Codec Kontroller die Konfigurationen gesetzt, anderseits setzt der Audio Codec die Pfade aktiv oder nicht. Die Kommunikation ist bidirektional: in beide Richtungen.

Audio Codec mit Audio-Daten speisen
Die konkrete Musikdatei wird über I2S dem Codec übermittelt und dann an den entsprechenden Ausgang geleitet.

Makefile

 

 # the compiler: gcc for C program, define as g++ for C++
  CC = gcc

  # compiler flags:
  #  -g    adds debugging information to the executable file
  #  -Wall turns on most, but not all, compiler warnings
  CFLAGS  = -g -Wall

  # the build target executable:
  TARGET = myprog

  all: $(TARGET)

  $(TARGET): $(TARGET).c
     $(CC) $(CFLAGS) -o $(TARGET) $(TARGET).c

  clean:
          $(RM) $(TARGET)

Makefiles kann man mit Cmake automatisch generieren lassen.

self in Klassen [aus: swift]

Die Variable self wird nur gebraucht, wenn das Argument einer Funktion denselben Namen hat wie eine Klassenvariable.

Mit self.variable wird die Klassenvariable bezeichnet bzw. unterschieden von dem Argument.

class TipCalculator {
   let total: Double
   let taxPct: Double
   let subtotal: Double

   init(total: Double; taxPct: Double) {
       self.total = total      // Argumente erhalten
       self.taxPct = taxPct
       subtotal = total /(taxPct+1)   // keine Argumente
                                 // nur Klassenvariable
   }


}

aus: Swift 2 Tutorial

PLL Phase Locked Loop

In den FPGAs sind PLLS ein Standard für zwei Gründe:
– Um Pfadverzögerungen zu Kompensieren (Bsp. 2)
– Um andere Taktfrequenzen zu erhalten (Bsp. 1)

Neuer Takt
Viele Protokole besitzen ihre eigene Takt-Frequenz. Daher braucht es einige Takte innerhalb eines FPGAs

f_out = (f_in * m) / n         // m wird multipliziert,  n und g dividiert

pll_schema_Takt_Generator


Kompensation Verzögerung

Werte im Feedback Pfad v1= 3 ns  schieben CLK_IN nach vorne,
Werte beim Ausgang v2 = 8 ns  verzögern CLK_IN.
pll_schema_delay

Bsp Kompensation
Ausgangslage: Durch Flip-Flop-Verzögerung oder Pfadverzögerung und IO-Verzögerung kommt data 5ns später als CLK_50 beim SRAM an.
1.)  Entweder führt man ein PLL in den data-Pfad ein,
dann muss der PLL den CLK_50 vorverlegen v1 = 5 ns
um die Verspätung zu kompensieren,
oder   (siehe Bild)
2.) man verzögert den CLK_50 zum SRAM mit genau der Verzögerung,
die der data-Pfad hat v2 = 5 ns . Dann kommt CLK RAM „gleich verzögert “
wie data beim SRAM an.
PLL_SDRAM

 

PLL Rechenbeispiel mit Takterzeugung und Verzögerung

a_pll

..

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
..

DebugNavitator XCode

Fensterübersicht
Das fünfte Fenster im Navigator dient dem Debuggen.
Das Fenster links (1) heisst Stack View. Es zeigt alle Aufrufe (Ablagen auf dem Stack) bis zum aktuellen Programmpunkt. Zu unterst im Stack ist das main(), dann folgen alle aufrufe. Theoretisch kann man die Grösse der Stack-Details durch die Bedienung zu unterst am Fenster einstellen (nur Aufrufe, auch Variablen, …). Bei der hier abgebildeten Funktion war dies nicht möglich.
Das Fenster unten links (2) nennt sich Variable View. Durch Klicken auf das Dreieck vor der Variable, erhält man mehr Details. Man kann über das Menü ganz unten festlegen, ob man nur die lokalen Variabeln (aktuelle Einstellung) oder alle oder AUTO sehen will.
Das Fenster (3) ist die Konsole.

Fenster_DebuggNavigator

Debugg-KnöpfeDebuggKnoepfe_DebuggNavigator

  • CONTINUE: Verlässt die aktuelle Debugging-Stelle. Das Programm läuft weiter bis zum nächsten Breakpoint.
  • STEP OVER: Aktuelle Zeile wird ausgeführt. Cursor geht zur nächsten Zeile.
  • STEP INTO: Sprung von der aktuellen Stelle in die Funktion. Man sieht wohin das Programm geht und wie die Variablen gesetzt werden
  • STEP OUT: Verlassen der aufgerufenen Funktion. Man kehrt an die Debugging-Stelle zurück.

Variablen währende dem Debuggen temporär setzen
Im zweiten Fenster (Variable View) können während dem das Debuggen läuft, also der Code ausgeführt wird, Variablen-Werte manuell gesetzt werden. Man sieht dann, wie sich das auf den Code auswirkt.

 

 

 

 

 

ASCII-File to Binary-File

edid.txt
Eine Binärdatei, die in hex eingelesen wurde:

00 FF FF FF FF FF FF 00 4D D9 01 08 01 01 01 01 
01 11 01 03 80 A0 5A 78 0A 0D C9 A0 57 47 98 27 
12 48 4C 21 08 00 01 01 01 01 01 01 01 01 01 01

Konvertieren zu edid.bin

cat edid.txt | xxd -r -p > edid.bin

xxd ist ein Programm. Das andere ist hexdump