VHDL Latch

In Zustand hängen bleiben
Ein Latch ist ein Verharren in einem Zustand (latch = Zuschnappen, Schliessen). Dies geschieht z.B. wenn bei einer switch-case-Struktur nicht alle Fälle abgefragt werden. Trifft ein nicht definierter Fall ein, so verharrt das System in diesem.

Urachen im Code

// kein else nach if
// .................
begin
        if (cnt = 15) then
            pulse <= '1';
        end if;
 end process;
// kein others in case
// ....................
case state is
            when s0 =>   LEDR_0  <= '1';
            when s1 =>   LEDR_1  <= '1'; GPIO_0_0 <= '1';
            when OTHERS =>  LEDG_7 <= '1';
        
    end case;

 

VHDL State Machine One Hot

One Hot
Ist ein VHDL-Endcoding-BEgriff und bezieht sich auf die Umsetzung der Zustände in Hardware.
Bei One Hot wird für jeden Zustand s ein weiteres Bit gebraucht wird bzw. ein neues FF eingebaut.

s1 = 0001    -> 4 Flip-Flop
s2 = 0010
s3 = 0100
s4 = 1000

Der Vorteil von One Hot ist, dass sich die Input-Logik (das Decodieren der Zustände) vereinfacht. Man muss nur 1 Bit kontrollieren.

Minimal Bit Endocding
Ist der Gegenbegriff. Die Zustände werden mit möglichst wenigen Bits in VHDL umgesetzt.

s1 = 00    -> 2 Flip-Flop
s2 = 01
s3 = 10
s4 = 11

Einstellen in quartus
Menu Settings/ Analyse & Synthese/   Klicken auf Feld: More Settings:
Scrollen  bis zum Betriff  State Machine Processing:
Dort unter diversen Optionen One-Hot oder minimal-Bit auswählen

State Machine VHDL

states bitweise definieren

constant s0         : std_logic_vector(2 downto 0) := "000";
constant s1         : std_logic_vector(2 downto 0) := "100";
constant s2         : std_logic_vector(2 downto 0) := "110";
constant s3         : std_logic_vector(2 downto 0) := "011";
constant s4         : std_logic_vector(2 downto 0) := "001";
constant s5         : std_logic_vector(2 downto 0) := "111";

signal state :        std_logic_vector(2 downto 0);
signal next_state:    std_logic_vector(2 downto 0);

states als type

type actual_state is (s0, s1, s2, s3, s4, s5, s6, s7);
        
signal state:          actual_state  := s0;  
signal next_state:     actual_state  ;


Enumeriter Type

type actual_state is (s0, s1, s2, s3);

attribute enum_encoding : string;
attribute enum_encoding of actual_state: type is "00 01 10 11";  

// nicht sicher:     
signal state:          actual_state  := s0;  
signal next_state:     actual_state  ;


State-Zuweisung

fsm: process (all)
    begin
        if (KEY_1 = '0') then
            state <= s0;
        elsif (rising_edge(CLOCK_27)) then
          state <= next_state;
        end if;
    end process;


Logik Events

fsm_input: process (all)        
begin     
    case state is
       when s0 =>
          if(pulse ='1') then
            next_state <= s1;
          else
            next_state <= s0;
          end if;           
       when s1 =>    
          if(pulse ='1') then
             if SW_17 = '1' the
                next_state <= s2;  
             else
                next_state <= s0;
             end if;
          else
             next_state <= s1;
          end if;
       when s2 =>   next_state <= s3;
       when s3 =>   next_state <= s4;
       when s4 =>   next_state <= s5;
       when s5 =>   next_state <= s6;
       when s6 =>   next_state <= s7
       when s7 =>   next_state <= s7;    
    end case;        
 end process;

Output Action

fsm_output: process (all)
begin   
    case state is
            when s0 =>   out     <= "001"; 
            when s1 =>   out     <= "011"; GPIO_0_0 <= '1';
            when s2 =>   LEDR_2  <= '1';
            when s3 =>   LEDR_3  <= '1';
   
            when OTHERS =>   NULL;
      end case;
end process;

 

 

 

Tristate: Pull Up, Pull Down

Tristate ist die Zustandsbezeichnung von digitalen IOs. Diese können den Zustand ‚0‘, ‚1‘ oder (je nach Verdrahtung) ‚Z‘ oder ‚Z‚ sein. Der Grund dafür ist, dass Ausgänge getrieben werden müssen, was Transistoren bedingt. Diese können in der Luft hängen und dadurch den dritten Zustand erzeugen.

Pull up (‚Z‘)
Im Ruhezustand fehlt die Verbindung zu GND, aber die Verbindung zu VCC ist über den Widerstand gegeben.
Pull_up

Im Ruhezustand erhält der Ausgang aufgrund der Verbindung mit VCC einen definierten Zustand:  logisch HIGH.

Pull down (‚Z‚)
Im Ruhezustand erhält die Leitung durch die Verbindung zu GND einen klaren Zustand: Logisch LOW.

Pull_down

 

Tri-State Transistoren treiben Ausgang / Bus

Transistoren vor IO
In der Digitaltechnik müssen IOs getrieben werden. Das heisst, dass der Input nicht „von selbst“ an den Ausgang übertragen wird, sondern nur, verstärkt den Zustand übergeben kann. Dazu dienen Transistoren.

npnbuffr
IO-Logik hat deshalb nicht nur zwei, sondern drei Leitungen zu verwalten (In, Out und enable).

tristate

Zustand des Ausgangs

Durch das Transistoren-Bild sieht man, dass der Output, beim Nichtleiten, vom Rest abgehängt ist.  Aus diesem Grund gibt es in der Digitaltechnik für die IOs den dritten Zustand ‚Z‚, was so viel wie in der Luft hängen bez. hochomig bedeutet.

Diese gute Visualisierung habe ich von folgender Website.

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.