Beagle Bone (mit WLAN-CAP)

Beagle Bones sind von Texas Instruments. Sie sind die professionellere Variante der Arduinos und eine Alternative zu den Raspberry Pi.

Implementation des WLAN-Chips WL183x
Zum Testen dieses Chips, ist das Beagle Bone eine gute Idee.

beaglebone_Kommunikation

Die Prozessoren sind von ARM, dieses Modell hat HDMI ist ist bezüglich Kommunikation sehr vielseitig. Gleichzeitg ist das Board energiesparend konzipiert.

BEAGLEBONE_WL1835MOD_Cape
Das WLAN- und Bluetooth-Cap ist für durchsatz-starkes WLAN ( 802.11 n) gedacht und hat leistungsstarke Komponenten. Das Cap hat 2 Antennen (MIMO) und kann 40 MHz-Bandbreiten (802.11n) verarbeiten.

Bei Bluetooth ist BLE implementiert und die Coexistenz von BLE und WLAN ist möglich. Ein eigener, freier Datenstack ist vorhanden

WLAN Standards IEEE 802.11

IEEE 802.11
Der Standard definiert das Frequenzband [F0], die Anzahl Kanäle, deren Kanalbreiten [B], die Modulationsarten, die Kommuncationsart (unicast, multicast) und die Anzahl Antennen (SISO <-> MIMO).

Überblick Spezifikationen
IEEE 802.11a, b, c, g:  1 Antenne,
.                                          B = 20 MHz,
.                                          F0 = 2.4 GHz,
.                                          Anzahl Kanäle =  14 (! überlappen sich. Nur 1, 6, 11 nutzbar)
.                                          R_max = 54 Mbps

IEEE 802.11n:              4 Antennen:
.                                         Durchsatz R multipliziert sich mit Anzahl Antenen
.                                          B = 20 MHz, 40 MHz
.                                          F0 = 2.4 GHz, 5 GHz
.                                          Anzahl Kanäle = ? (überlappen sich bei 2. FO nicht)
.                                          R_max 1 Antenne = 150 Mbps (64-QAM, B = 40, guard = 0.4 u
.                                          R_max 4 Antennen = 600 Mbps (siehe 1 Antenne)

IEEE 802.11ac:             8 Antennen,
.                                          B = 160 MHz,
.                                          F0 =5 GHz,
.                                          Anzahl Kanäle = 8
.                                          R_max 1 Antenne = 866.7 Mbps
.                                          R_max 8 Antennen = 6.77 Gbps

Datendurchsatz R per LAN messen [Bitpersecond]

Iperf
Ist ein freie Software, um den Datendurchsatz auf TCP/IP-Netzen zu messen. Das Programm generiert UDP oder TCP Datenströme und funktioniert nach dem Server-Client-Prinzip.

# Client
iperf3 -c <ip-server>
# Client mit Paketgrösse und Meesszeit 1 min
iperf3 -c <ipserver> -l 1400 -t 60 
-f k 
--get-server-output
# Server 
iperf3 -s

Befehle
– l     :  Packetgrösse
– t    :   Wie lange (in s). Standard: 10 s.
– i    :   Intervall der Pakete (in s). Standard: 1 s.
— get-server-output : Die Messwerte des Serverers
.          erscheinen auch unter den Messwerten des
.          Clients. So in 1 Datei beide Werte.
– f    :   Ausgabeformat der Messung.
.          -f k   bedeutet, dass alle angaben in k sind
-B   :   welche IP (bei mehreren Netzen, z.B. LAN und WLAN)
– u    :  UDP.  Standard: TCP.

Eingabe Parameter über Konsole (Windows)

# Messinterval und Messzeit eingeben
echo %1 %2
iperf3 -c -i %1 -t %2

Eingabe Paramter über Konsole (Linux)

echo "Messintervall: " $1
echo "Messdauer: "     $2
iperf -c -i $1 -t $2

 

Theoretische Durchsatzraten WLAN

 

 

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.

Speicher Timing Zeitverlauf

Das Timing (einhalten der Setup- und Hold-Zeit) ist eine Fehlerquelle für ungültige Daten.

Bsp. eines Schreibe-Zyklus
Ein neuer Zylkus beginnt bei der fallenden Flanke
   Da Daten leicht verzögert ankommen, beginnt der neue Zyklus
nach der fallenden Flanke. Die Verzögerung darf nicht so gross sein,
dass die setup Zeit verletzt wird.
(t_setup = Zeit, in der Daten vor CLK anliegen müssen)
Ausführen des Befehls bei steigender Flanke
Hier ist es ein Schreibbefehl. Auch der Lesebefehl wird bei steigender Flanke
ausgeführt.
Der Befehl wird leicht verzögert ausgeführt.
Um den Befehl recht auszuführen, darf die Hold Zeit nicht verletzt werden.
(t_hold = Zeit, in der die Daten nach dem CLK noch anliegen müssen)

Bereits kurz nach der ausführenden Flanke sind die Daten wieder Weg und der neue Zyklus beginnt.

Timing_Speicher

FPGA
Speicher haben intern einen Takt. Dadurch entfällt das Timingproblem.

Speicherzeilen und Speichertiefe

Speicherbreite
Die Speicherbreit ist oft identisch mit der Busbreite.
Ist sie dies nicht, muss mit Byte-enable das Ansprechen geregelt werden.
Word
= Breite einer Bit-Zeile (32-Bit, 16-Bit, ..)
= Speicherbreite
.               1 Word hat m Bits.
Bit      = Einzelne Speicherzelle.

Speichertiefe
Die Tiefe hängt von der Anzahl Adressleitungen ab.
Führen zum Speicher n Adressleitunge,  so ist der Speicher
2^n  (Word-)Zeilen tief.
Bsp.         2 Adressleitungen = 4 Speicherzeilen (Words) auslesbar

Speichergrösse
Word-Grösse x Anzahl Zeilen = m x 2^n
Bsp. Word = 32 Bit,  16 Adressleitungen
Speichergrösse:  4 x 2^16 =
4 x 2^3 x 2^3 x 2^10 = 4 x 8 x 8 x 1’000 =
32 x 8’000 = 256 kBytes

Organisation_Speicherzelle

 

 

 

 

Byte enable

Grund
Entspricht die Speicherbreite nicht der Breite des Buses, so müssen die Bytes des Busses über enable aufgeteilt werden können.
Mit enable sagt man, ob man den ersten oder zweiten Teil der Busbreite will.

Bsp
32-Bit-System für einen Baustein nur 16 Bit (z.B. für ein IO-Port oder ein Speicherbaustein).
ByteEnable

Byte_enable_0:
Bezieht sich auf die höheren Bits des Datan-Signals im Bus:   Data[16] – Data[31]
Byte_enable_1:
Bezieht sich auf die tieferen Bits der aktuellen Busdaten:     Data[0] – Data[15].

Setzt man Byte_enable_0, so werden nur die 15 oberen Bits des akutellen Bussiganals geschrieben oder gelesen.

Aktuelle Busdaten und Speichervorgang
Hier liegen in einem Speicher bereits Daten an den Adressen a0, a1 und a2.
Auf dem Bus liegt ein aktuelles Datenpaket (data) von 32 Bit.
Teile (oder auch das ganze) Datenpaket sollen auf die belegten Speicheradressen geschrieben werden.

Byte_Enable_timing

Da auch der Befehl Lesen aktiviert ist, wird „zeitgleich“ von der bestehenden Adresse auch der Wert an den Datenausgang (q) gelegt.

Aubau einer Speicherzelle

Logik

Logik_FF

Ein FF besteht aus logischer Sicht aus zwei Invertern. Durch die zwei Inverter, erscheint der Eingangswert wieder am Ausgang. Der Wert wurde gespeichert. Tiefer betrachtet, ist die Basis eines FF ein Latch. Das Latch ist der Baustein, der durch Set-Reset am Ausgang ein Wert behält. Das Latch ist aber asynchron und deshal kein FF im engen Sinn. Das FF hat zusätzlich einen Clock. Dadurch werden erst (bei steigender Flanke) die Ausgänge gesetzt.

Hardware (mit Transistoren)

Hardware_FF

Pro Speicherzelle (FF) hat es zwei Bit-Lines. Eine ist die Inversion der anderen.
Auf der Bit-Line wird das aktuelle Bit gesetzt (siehe erstes Bild für Logik).
Die Word-Linien, ist die Verbindung einer Reihe von Speicherzellen.
Unterschied Transistoren <-> Kondensatoren als Speicherelement
FF können mit Transistoren (z.B. in SRAM, s = static = stabil) oder mit Kondensatoren (z.B. DRAM, d = dynamisch = instabil) aufgebaut sein. Die Transistoren behalten ihren Wert (Zustand ‚1‘ oder ‚0‘), sind sie einmal geschalten, was bei den Kondensatoren nicht gilt. Die Kondensatoren entladen sich (‚1‘ – > ‚0.7‘ -> ‚0.5‘), weshalb ihr Wert immer wieder neu gesetzt (refresh) werden muss.
Das Refrehen wird zeilenweise gemacht.
Bsp. Bei einem 16-Bit-Memory, wird in einem Refresh-Zyklus 16 FF neu gesetzt.

Gute Website zu detaillierteren Informatioenen zum digitalen Speichern („How RAM works“).

Memory an Prozesssor anbinden

Takt anpassen
Die Geschwindigkeit des Prozessors ist oft langsamer als der Speicher.
Hier braucht es eine Synchronisation durch einen Takt-Generator.
Das Timing (einhalten der Setup und Holdzeit) war traditionell die grösste Fehlerquelle für ungültige Daten.

Word Grösse
Bei 32-Bit Prozessoren ist ein Word 32 Bit breit. Der Bus hat dieselbe Breite. Am einfachsten ist es, wennd der Speicher ebenfalls 32 breit ist. Dann entspricht ein Word einer Speicher-Zeile. Ansonsten braucht es Anpassungen (siehe Byte-enable).

Schreib- und Leserichtung
Traditionell hat der Prozessor nur ein Bus, der in beide Richtungen kommuniziert.
Bei FPGAs hat es immer zwei Busse, einer fürs Lesen und einer fürs Schreiben.

Zugriffe auf Speicher (Port)
Normalerweise gibt es einen Port. Über diesen gehen die Lese- wie auch die Schreibzyklen.
Im FPGA hat es zwei Ports. Beide können für beides gebraucht werden und können unterschiedliche Busbreiten haben.

 

VHDL IO Debuggen

Signalüberprüfung
Zum Debuggen können den Top-Level-Ports spezifische Wert zugewiesen werden:

GPIO_0 <= '0';
GPIO_0 <= '1';

Am KO kann dann der Wert überprüft werden oder man kann die Pins ausläuten, um zu sehen, ob sie funktionieren. Problem: Pins können auch sonst auf ‚0‘ oder ‚1‘ per default sein.

Besser: Clock-Zuweisung. (Problem auch hier: ClK könnte per default herauskommen.) Am sichersten: CLK auf eigene Frequenz einstellen, so ist man sicher, dass es der gewünschte Pin ist.

GPIO_0 <= CLK_50;


Instanzen anpassen

Im Top-Level könnendie IO der Instanzen mit open auf inaktiv gesetzt werden.

inst_counter: counter
    PORT MAP( clk          => CLOCK_50,
              verification => open,   -- GPIO_0   
              zero_out      => open   -- GPIO_1                
        );