Forum: FPGA, VHDL & Co. Semaphore in VHDL


von Robert M. (andro86)


Lesenswert?

Guten Abend zusammen,

für ein aktuelles Projekt von mir versuche ich einen exklusiven Zugriff 
auf zwei RAM-Blöcken aufzubauen.
Zu den technischen Hintergundinfos. Ich benutze einen Cyclone IV FPGA. 
In diesem habe ich zwei RAM-Blöcke mit jeweils 1024 Speicherzellen 
aufgebaut. In diesen Speicherzellen lade ich Stromwerte, die ich nach 
einem festen Zeitabstand Zelle für Zelle wieder auslese. Nun will ich 
aber, dass im laufenden Betrieb neue Daten in den RAM-Block geschrieben 
werden, der gerade nicht ausgelesen wird. Zum besseren Verständnis: Die 
RAM-Blöcke sind mit RAM1 und RAM2 benannt. RAM1 wird mit den Daten voll 
geschrieben. Ist  Beschreibung abgeschlossen, beginnt das Auslesen von 
RAM1. Nun wird von außen ein neuer Datensatz gegeben. Jetzt soll 
automatisch erkannt werden, dass aus RAM1 ausgelesen wird, woraufhin die 
Daten in RAM2 geschrieben werden. Nach dem Beschreiben von RAM2 (und 
nachdem RAM1 vollständig ausgelesen wurde) soll das Auslesen zu RAM2 
switchen.
Wenn wieder ein neuer Datensatz vorliegt, soll erneut erkannt werden, 
dass aus RAM2 aktuell ausgelesen wird und das Einschreiben in RAM1 
erfolgen soll. Und so soll sich das ganze Spiel immer und immer wieder 
abwickeln.

Ich habe mir überlegt sowohl das Beschreiben, also auch das Auslesen als 
zwei Prozesse zu gestalten. Die Zugriffe auf die beiden RAM-Blöcke soll 
dabei über Semaphore geregelt werden (bzw. Sperrvariable/signale nach 
dem Semaphor-Prinzip). Für jeden Block soll es jeweils zwei Semaphore 
geben, eine zu Anzeige, ob auf dem RAM gerade zugegriffen wird und die 
Andere um den Zugriff zu bestätigen. Nachfolgend ein kleiner 
Beispielcode wie ich mir vom Prinzip her die Verwendung der Semaphore 
gedacht habe.
Bei dem Beispielcode habe ich aber das Problem, dass ein Signal von zwei 
Treiber getrieben wird und die ganze Geschichte verkompliziert.

Nun weiß ich aber nicht, wie ich mein Problem sonst lösen soll und 
hoffe, dass ihr mir hier weiter helfen könnt. Wie kriege ich den 
abwechselnden, exklusiven Zugriff aufgebaut?

Schon einmal ein Danke im Vorraus.
1
LIBRARY ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;
4
5
------------------------------------------------------------------------------------------------------------------
6
entity ram_control is
7
------------------------------------------------------------------------------------------------------------------
8
  port(  clock_100MHz, reset_n  :   in  std_logic;
9
      RAM_wren            :  in   std_logic;                -- RAM write enable
10
      RAM_rden            :  in   std_logic;                -- RAM read enable
11
      RAM_Data            :  in   std_logic_vector(12 downto 0);
12
      adrCounter_wrop      :  in   std_logic_vector(09 downto 0);  -- Address counter write operation
13
      adrCounter_rdop      :  in   std_logic_vector(09 downto 0);  -- Address counter read operation
14
15
16
      wren_RAM1          :  out std_logic;                -- Write enable RAM-Block 1
17
      rden_RAM1          :  out std_logic;                --  Read enable RAM-Block 1
18
      wren_RAM2          :  out std_logic;                -- Write enable RAM-Block 2
19
      rden_RAM2          :  out std_logic;                --  Read enable RAM-Block 2
20
      regSwitch          :  out std_logic;                -- Register switch
21
      data_RAM1          :  out std_logic_vector(12 downto 0);
22
      data_RAM2          :  out std_logic_vector(12 downto 0);
23
      RAM0_address        :  out std_logic_vector(09 downto 0);
24
      RAM1_address        :  out std_logic_vector(09 downto 0)
25
     );
26
end ram_control;
27
28
------------------------------------------------------------------------------------------------------------------
29
architecture behav of ram_control is
30
------------------------------------------------------------------------------------------------------------------
31
  
32
    --  Semaphore für RAM-Block 1.
33
  signal lock_RAM1    :  std_logic  :=  '0';  --  0 ...  Zugriff auf RAM-Block 1 möglich.
34
                                              --  1 ...  Zugriff auf RAM-Block 1 gesperrt.
35
                                
36
    --  Semaphore für RAM-Block 1.
37
  signal access_RAM1  :  std_logic  :=  '0';  --  0 ...  Zugriff auf RAM-Block 1 beendet.
38
                                              --  1 ...  Zugriff auf RAM-Block 1 getättigt.
39
                                  
40
    --  Semaphore für RAM-Block 2.
41
  signal lock_RAM2    :  std_logic  :=  '0';  --  0 ...  Zugriff auf RAM-Block 2 möglich.
42
                                              --  1 ...  Zugriff auf RAM-Block 2 gesperrt.
43
                                
44
    --  Semaphore für RAM-Block 2.
45
  signal access_RAM2  :  std_logic  :=  '0';  --  0 ...  Zugriff auf RAM-Block 2 beendet.
46
                                              --  1 ...  Zugriff auf RAM-Block 2 getättigtt.
47
  
48
  begin
49
  
50
51
  write: process(clock_100MHz, reset_n, RAM_wren)
52
  
53
    begin
54
    
55
    if(neue Schreibanforderung eingtroffen) then
56
    
57
      if(lock_RAM1 = 0 or access_RAM1 = 1)  then  --  Steht RAM1 für einen Zugriff zur Verfügung?
58
        
59
        access_RAM1  <= '1';  -- Bestättige Zugriff auf RAM1
60
        lock_RAM1  <= '1';  -- Sperre den Zugriff auf RAM1
61
        Schreibe in RAM1;
62
        
63
        if(Beschreibung von RAM1 abgeschlossen)  then
64
        
65
          acces_RAM1  <=  '0';  -- Beende den Zugriff auf RAM1
66
          lock_RAM1  <= '0';  -- Gib den Zugriff auf RAM1 wieder frei
67
          
68
        end if;
69
      
70
      elsif(lock_RAM2 = 0 or access_RAM2 = 2)  then  --  Steht RAM2 für einen Zugriff zur Verfügung?
71
72
        access_RAM2  <= '1';  -- Bestättige Zugriff auf RAM2
73
        lock_RAM2  <= '1';  -- Sperre den Zugriff auf RAM2
74
        Schreibe in RAM2;
75
        
76
        if(Beschreibung von RAM2 abgeschlossen)  then
77
        
78
          acces_RAM2  <=  '0';  -- Beende den Zugriff auf RAM2
79
          lock_RAM2  <= '0';  -- Gib den Zugriff auf RAM2 wieder frei
80
          
81
        end if;      
82
    
83
    end if;      
84
        
85
  end process;
86
87
88
  read: process(clock_100MHz, reset_n, RAM_rden)
89
  
90
    begin
91
    
92
    if(neue Leseanforderung eingtroffen) then
93
    
94
      if(lock_RAM1 = 0 or access_RAM1 = 1)  then  --  Steht RAM1 für einen Zugriff zur Verfügung?
95
        
96
        access_RAM1  <= '1';  -- Bestättige Zugriff auf RAM1
97
        lock_RAM1  <= '1';  -- Sperre den Zugriff auf RAM1
98
        lese aus RAM1;
99
        
100
        if(Auslesen von RAM1 abgeschlossen)  then
101
        
102
          acces_RAM1  <=  '0';  -- Beende den Zugriff auf RAM1
103
          lock_RAM1  <= '0';  -- Gib den Zugriff auf RAM1 wieder frei
104
          
105
        end if;
106
      
107
      elsif(lock_RAM2 = 0 or access_RAM2 = 2)  then  --  Steht RAM2 für einen Zugriff zur Verfügung?
108
109
        access_RAM2  <= '1';  -- Bestättige Zugriff auf RAM2
110
        lock_RAM2  <= '1';  -- Sperre den Zugriff auf RAM2
111
        Lese aus RAM2;
112
        
113
        if(Auslesen von RAM2 abgeschlossen)  then
114
        
115
          acces_RAM2  <=  '0';  -- Beende den Zugriff auf RAM2
116
          lock_RAM2  <= '0';  -- Gib den Zugriff auf RAM2 wieder frei
117
          
118
        end if;      
119
    
120
    end if;
121
        
122
  end process;  
123
  
124
  
125
end architecture behav;

: Verschoben durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Robert M. schrieb:
> Zum besseren Verständnis:...
Wenn ich mir die Beschreibung so durchlese komme ich zum Schluss, dass 
du eigentlich einen simplen Fifo brauchst. Warum hampelst du da mit 2 
RAMs herum?

: Bearbeitet durch Moderator
von Georg A. (georga)


Lesenswert?

Da denkt einer wohl noch viel zuviel in SW...

a) Der Process hat einen Takt in der Sensitivitylist, der wird intern 
aber nie benutzt.

b) Wenn beide Prozesse denselben Takt haben, kann es auch einer werden. 
Das löst zwar praktischerweise das multiple driver Problem, aber 
trotzdem noch nicht den ganzen Sempahor/Exklusiv/Lock-Mist-Knoten in 
deinem Kopf ;)

Du hast/brauchst ein Signal, das entscheidet, aus welchem RAM gelesen 
werden soll. Damit ist auch klar, in welches geschrieben werden soll 
(nämlich das andere). Wobei mir aber überhaupt nicht klar ist, woher man 
bei deinem aktuellen Konzept wissen soll, in welchem RAM die Daten 
eigentlich gelandet sind. Das wird ja offenbar intern ausgewürfelt, 
wobei das Wissen aber eigentlich nur aussen vorhanden ist ("RAMx voll"). 
Dann soll das gefälligst auch von aussen rein und wählt intern nur aus, 
wohin die Adressen und rd/wr-en Signale geroutet werden. Da braucht es 
kein Semaphor.

Generell hast du noch das Problem, dass am Ausgang des RAMs keiner 
weiss, wann da was sinnvolles anliegt. Da liegen ja ein paar Takte von 
rden bis data-valid. D.h. die Weiterverarbeitung müsste man dann passend 
verzögert starten. Handshake-Signale sind da praktisch, da braucht es 
aber etwas mehr Wissen, wie der Datenfluss sein soll.

von Martin O. (ossi-2)


Lesenswert?

Kann man das ganze nicht auch so machen: Du legst die beiden Ramblöcke
zu einem doppelt so langen zusammen. Der Schreiber schreibt immer 
umlaufend.
Wenn der Schreiber in der ersten Hälfte ist (ist am obersten Adressbit 
erkennbar), darf der Leser in der zweiten Hälfte lesen und umgekehrt.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Martin O. schrieb:
> Kann man das ganze nicht auch so machen:...
Genau das ist ein Fifo.

von Strubi (Gast)


Lesenswert?

Wenn der Zugriff wahlfrei sein muss/soll (wenn man mal wie bei 
Videocoding Daten umsortiert): Stichwort Pingpong-Buffer mit zwei 
identischen RAM-Blöcken und etwas Muxerei. Der "Filler" schreibt immer 
gerade den Block voll, den der "Drainer" gerade nicht ausliest. Bloss 
nicht so kompliziert machen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Strubi schrieb:
> Der "Filler" schreibt immer gerade den Block voll, den der "Drainer"
> gerade nicht ausliest.
Die "Semaphore"  besteht dann aus einem einzigen Bit, das in geeigneter 
Weise eigentlich nur das höchstwertige Adressbit darstellt. Und dann 
braucht es nur noch einen, der dieses Bit zum geeigneten Zeitpunkt 
umschaltet.

von J. S. (engineer) Benutzerseite


Lesenswert?

Robert M. schrieb:

> Ich habe mir überlegt sowohl das Beschreiben, also auch das Auslesen
> als zwei Prozesse zu gestalten.
Wozu?

> Die Zugriffe auf die beiden RAM-Blöcke soll dabei über Semaphore(n)
> geregelt werden
Wozu?

Du weißt, wozu Semaphoren verwendet werden? Nämlich, um Prozesse, die 
nicht hart synchron sind, weil sie in einer virtuellen Umgebung mit 
unbekanntem timing ablaufen, zu synchronisieren und sicherzustellen, 
dass eindeutig beobachtbare Zustände hinsichtlich der Gleichzeitigkeit 
erzielt werden?

Also etwas, was in einem hart am Takt hängenden FPGA schon voll 
automatisch realisiert ist?

> Bei dem Beispielcode habe ich aber das Problem, dass ein Signal von zwei
> Treiber getrieben wird und die ganze Geschichte verkompliziert.

Da braucht es wohl ein Semaphor! :D

Im Ernst, Du solltest mal das Konzept checken. Normalerweise muss man 
nicht mehrere Prozesse nehmen, um ein RAM zu timen und niemals sollte 
ein Signal aus zwei Prozessen heraus getrieben werden.

Die Lösung wäre eine einzige FSM. Wenn mehrere Module mit dynamischem 
Ablauf vorkommen, reicht ein einfaches flag mit Prio eines Prozesses, 
damit im nächsten Takt kein nichtinterpretierbarer Zustand vorkommen 
kann.

Du setzt einfach mit dem P1 das Sem auf "P1" und mit dem anderen auf 
"P2" ansonsten ist es "Null". Dann müssen im nächsten Takt beide FSM 
schauen, ob sie arbeiten dürfen.

Aber wie gesagt: Im FPGA sollte man schauen, dass man einen 
kontinuierlichen flow hinbekommt und Zugriffe mit einer FSM steuert, die 
entscheidet, welcher Datenpfad aufs RAM geht und welcher nicht.

Eigentlich ist das deutlich einfacher, als es in Software zu machen. Die 
Verrenkungen mit Semaphoren, priorisierten Lese- und Schreibeprozessen, 
Lösung von Philosophenproblemen gibt es ja nur wegen der 
Multi-Thread-Thematik und dem Umstand, dass in einem richtigen 
Multitaskingsystem keine Annahmen über die Zeiten gemacht werden (dürfen 
und können).

von Robert M. (andro86)


Lesenswert?

Lothar M. schrieb:
> Wenn ich mir die Beschreibung so durchlese komme ich zum Schluss, dass
> du eigentlich einen simplen Fifo brauchst. Warum hampelst du da mit 2
> RAMs herum?

Martin O. schrieb:
> Kann man das ganze nicht auch so machen: Du legst die beiden
> Ramblöcke
> zu einem doppelt so langen zusammen. Der Schreiber schreibt immer
> umlaufend.
> Wenn der Schreiber in der ersten Hälfte ist (ist am obersten Adressbit
> erkennbar), darf der Leser in der zweiten Hälfte lesen und umgekehrt.

In meinem Projekt geht es darum eine Prozessstromquelle zu bauen. Diese 
soll in der Lage sein, ihr vorgegebene Stromverläufe (bspw. 
Dreiecksverlauf, Sinusverlauf etc.) nachzubilden. Die Stromverläufe 
werden in einem MatLab-Modell erzeugt und besitzen dabei 1024 
Stützpunkte. Diese Stützpunkte werden im RAM abgespeichert und nach 
einem festen Zeitabstand werden dann Zelle für Zelle ausgegeben. Eine 
Nachgestellte Regelung samt Leistungselektronik setzt den Verlauf dann 
um. Für diese Betriebsweise reicht mir ein RAM-Block vollkommend, nur 
jedes mal wenn ich einen neuen Stromverlauf draufgeben will, muss ich 
mein System erst wieder reseten.
Was ich aber will ist einen neuen Stromverlauf laden zu können ohne das 
der Betrieb der Prozessstromquelle deswegen unterbrochen werden muss. 
Dazu wollte ich den zweiten RAM als Hilfs-RAM nutzen. Während aus dem 
Ersten noch gelesen wird, kann das Zweite beschrieben werden. Ist das 
Zweite beschrieben und das Erste komplett ausgelesen, dann soll aus dem 
Zweiten gelesen werden, solange bis eine neue Vorgabe eintrifft.

Was ich will ist, dass der Leser ununterbrochen ausliest. In wie weit 
ist es mit dem FIFO gewährleistet? So wie ich es von Martin verstanden 
habe muss der Leser solange pausieren bis der Schreiber fertig ist. 
Schreiber und Leser wechseln sich also ab, bei mir sollen sie aber 
parallel arbeiten.


Georg A. schrieb:
> Da denkt einer wohl noch viel zuviel in SW...


Jürgen S. schrieb:

> Im Ernst, Du solltest mal das Konzept checken. Normalerweise muss man
> nicht mehrere Prozesse nehmen, um ein RAM zu timen und niemals sollte
> ein Signal aus zwei Prozessen heraus getrieben werden.
>
> Die Lösung wäre eine einzige FSM. Wenn mehrere Module mit dynamischem
> Ablauf vorkommen, reicht ein einfaches flag mit Prio eines Prozesses,
> damit im nächsten Takt kein nichtinterpretierbarer Zustand vorkommen
> kann.

> kontinuierlichen flow hinbekommt und Zugriffe mit einer FSM steuert, die
> entscheidet, welcher Datenpfad aufs RAM geht und welcher nicht.


Mein Problem liegt wirklich darin, dass ich noch zu starkt in SW 
denke.^^
Den Ansatz über eine FSM werde ich mal weiter verfolgen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Robert M. schrieb:
> Was ich will ist, dass der Leser ununterbrochen ausliest. In wie weit
> ist es mit dem FIFO gewährleistet? So wie ich es von Martin verstanden
> habe muss der Leser solange pausieren bis der Schreiber fertig ist.
> Schreiber und Leser wechseln sich also ab, bei mir sollen sie aber
> parallel arbeiten.
Diese "Schreiber" und Leser" Ansicht ist viel zu abstrakt.
Du musst in (DP)RAMs mit Steuer-, Adress- und Datenleitungen denken.

Robert M. schrieb:
> Die Stromverläufe werden in einem MatLab-Modell erzeugt und besitzen
> dabei 1024 Stützpunkte. Diese Stützpunkte werden im RAM abgespeichert
> und nach einem festen Zeitabstand werden dann Zelle für Zelle
> ausgegeben.
Zyklisch, bis auf das andere RAM umgeschaltet wird?

Dann brauchst du am einfachsten 1 DPRAM mit 2048 Speicherzellen. Du 
liest/gibst dann z.B. kontinuierlich die "untere" Hälfte aus. Neue Daten 
werden in die "obere" Hälfte geschrieben.
Wenn dann irgendwann die "obere" Hälfte fertig beschrieben ist, dann 
schaltet (sinnvollerweise zum Nulldurchgang) der Lesepointer auf den 
"oberen" Bereich um und gibt fürderhin diese Daten aus. Und jetzt darf 
der "untere" RAM-Bereich beschrieben werden.

Letztlich muss jetzt nur noch irgendwer festlegen, wann von wo gelesen 
werden soll. Das ist schlussendlich der eigentliche Knackpunkt. Denn das 
DPRAM an sich könnte gleichzeitig gelesen und beschrieben werden...

: Bearbeitet durch Moderator
von Strubi (Gast)


Lesenswert?

Robert M. schrieb:
> Was ich will ist, dass der Leser ununterbrochen ausliest. In wie weit
> ist es mit dem FIFO gewährleistet? So wie ich es von Martin verstanden
> habe muss der Leser solange pausieren bis der Schreiber fertig ist.
> Schreiber und Leser wechseln sich also ab, bei mir sollen sie aber
> parallel arbeiten.

Eben gerade nicht, sie arbeiten synchron. Das "pingpong"-Signal für die 
zwei Buffer ist identisch mit Lothars Adress-MSB. Der Schreiber/Leser 
schaltet das aber jeweils nicht, sondern deine übergeordnete Logik, die 
bestimmt, wann du mit dem Füllen des Puffers fertig bist.
Du musst nur dafür sorgen, dass Schreiber/Leser gleichzeitig loslaufen 
und beachten, das der Leser erst einen Takt später (in Bezug auf das 
Pingpong-Signal) ein gültiges Datum hat.
So wie ich verstehe, brauchst du ein Double-Buffer-Konzept, da du:
- Hilfs-RAM (Shadow) ev. von einer CPU beschreibst
- Arbeits-RAM zyklisch ausliest
- Glitchfrei die Konfiguration umschalten willst

In dem Fall würde dann der Leser signalisieren, wann genau das 
Pingpong-Signal getoggelt werden darf, und der Schreiber setzt 
FILL_DONE, wenn alle Daten ins Shadow geschrieben wurden. Das FILL_DONE 
muss nur bei der Uebernahme (Pingpong-Toggle) wieder gelöscht werden.

von Strubi (Gast)


Lesenswert?

P.S. Ich habe jetzt auch in SW gedacht, was ja nicht immer falsch ist, 
wenn man ev. noch einen Soft-Core im SoC hat..

von weltbester FPGA-Pongo (Gast)


Lesenswert?

Wenn Ich mir das so durchlese, dann verstehe Ich, warum heutige 
FPGA-Entwickler so enorme resourcen benötigen. Ich glaube, Xilinx baut 
auch genau deshalb den nativen Suppoort vieler Cores zurück, um die neue 
FPGA-Entwickler-Riege alle auf Bussysteme und Softwaredenken zu eichen, 
damit sie richtig fette Teile verkaufen können.

von Gustl B. (-gb-)


Lesenswert?

Also das ist aber auch nicht einfach in Hardware zu denken. Wenn man 
schon als Kind TTL Gräber verlötet hat dann mag das einfach sein, kommt 
man aber mit Softwarevorbelastung, dann ist das Leuland. Hat bei mir 
auch lange gedauert.
Da hilft am Ende nur klein anfangen. Lauflicht usw.

von weltbester FPGA-Pongo (Gast)


Lesenswert?

Das Problem ist, dass die Meisten gar keine Vorstellung davon haben, was 
ein FPGA ist und wie digitale Schaltungen funktionieren und wie die 
Software den VHDL-Code verwurstet, um rauszubekommen, wie die 
FPGA-Zellen verschaltet werden müssen. DAMIT muss man anfangen und nicht 
mit VHDL und Prozessen. Wir arbeiten z.B. auch im Bereich Schulung von 
Entwicklern und unterstützen Kunden und Ich sehe da zwei Typen:

1) Der Jüngling, meist aus der Programmiererecke kommend, unter 40 - oft 
noch unter 30 , der nur in Prozessen denkt und überhaupt nicht 
durchblickt, was er da beschreibt und somit auch noch nach Monaten immer 
noch nicht richtig weiß, was er da zusammenbaut. Die Sorte brutzelt 
schnell Lösungen zusammen, die aber im Detail ein Grauß sind und nicht 
selten in einer kompletten Sackgasse münden. Diese Leute brauchen auch 
noch nach Monaten Schulung! Und: Sie kommen immer wieder. Firmen wie 
PLC2 leben prächtig von denen! Oft sind es Anfänger, die im 
Schnellstudium mal was mit VHDL gemacht haben und ihr Wissen von 
Professoren haben, die selber nicht richtig Digital können.

2) Elektronikdesigner, die nicht oder nur wenig Software können und sich 
jetzt mit FPGAs befassen wollen oder müssen. Meistens sind das Typen um 
die 45-50 aufwärts, die immer nur Platinen gemacht haben und 
Logiggattergräber erzeugt haben. Die bringen sich auch selber mal 
schnell die Mikrocontrollerprogrammierung bei, wenn es sein muss und 
sind bei den FPGAs gut aufgehoben!


Dem Typ 1 kannst Du nämlich erklären, was Du willst, es bleibt an der 
Oberfläche. Er stöpselt zwar recht rasch SOC-Systeme zusammen, scheitert 
aber immer wieder an einfachen eigentlich klaren Dingen. Er findet 
umständliche bis unmögliche Lösungen und hat immer die Tendenz, einen 
kleinen Computer zu bauen, der so funktioniert, wie eine CPU. Von der 
Sorte werden dann mehrere reingeworfen, die sich dann wie eine 
Multi-Core-System verhalten und er ist stolz, dass er es nach Wochen der 
Firckelei geschafft hat, dass sie sich unterhalten. AXI, Wishbone, 
Atlantic und Avalon leisten da Vorschub. MATHWORKS erledigt den Rest. 
Die zeichen diese Wege vor, so als gäbe es nichts anderes.

Dem Typ 2 hingegen musst Du nur klarmachen, was er durch das VHDL 
jeweils kriegt und ihm ein paar Beispiele hinschreiben. Diese Leute 
haben nur das Problem, was zu formulieren. Was sie jedoch brauchen, das 
wissen sie ganz genau! Schaltungen, die ihnen die Funktion liefern, 
schütteln die aus dem Ärmel.  Irgendwann, meistens nach 10-20h kommt 
dann plötzlich ein Punkt, wo es Bing macht und er alles von alleine 
kann. Ab dann baut der die kompliziertesten Sachen zurecht, kriegt sie 
auch zum Laufen und das einzig zu Bemängelnde besteht darin, dass er 
viele Dinge in VHDL nicht nutzt und es zu umständlich formuliert. Aber 
er ist jederzeit in der Lage, eine Schaltung zu bauen, die er braucht 
und sehr sehr schnell kommt dann auch der Punkt, wo der Typ Dir wegläuft 
und er Dich nicht mehr braucht, sondern im Gegenteil Dir die neuesten 
schlaue Schaltung erklärt, die er gebaut hat. Da knallt es dann Tag für 
Tag und er hat ein "Aha-Erlebnis" nach dem anderen.

Diese Leute sind einfach geerdet und haben von klein auf Digitales 
gemacht und brauchen nur jemanden, der sie richtig aufs Pferd setzt.

Typ 1, kann weder reiten noch kennt er Pferde, sondern bewegt sich nur 
virtuell an der Playstation. Der reale Sachbezug zur Hardware wurde bei 
ihm übersprungen und das alles müsste er sich nun anhand der vielen 
virtuellen Konstruktionen und Prozesse zusammenreimen und was da 
rauskommt, ist bei jedem eine andere Welt. Diese Leute können eigentlich 
nur sinnvoll eingesetzt werden, wenn sie einen Typ 2 um sich haben, die 
ihnen was bauen, was sie dann programmieren können. Sonst ist grosser 
Mist angesagt!

>Semaphore in VHDL
Die Fragestellung exisitiert bei einem Hardwareentwickler im Grunde 
überhaupt nicht. Denn wenn er wirklich softwareähnliche Prozesse hätte, 
die wirklich später im FPGA auch als Prozesse laufen, dann wären diese 
auch so zu gestalten, wie man sie in Software realisiert. VHDL braucht 
da nichts Spezielles. Sondern es wäre einfach irgendwo eine 
Speicherzelle wie eben in Software auch. Vermutlich wissen  aber viele 
Softwareheinis nicht einmal, wie ein Semaphor durch das OS gemanaged 
wird, dass es eins sein kann und durch die SW benutzt werden kann.

Das Schlimmste, was es in dem Zusammenhang gibt, sind Mathematiker und 
Physiker, die sich Programmieren selber beigebracht haben und die 
Grundlagen der Interprozesskommunkation nicht kennen sich jetzt noch 
Elektronik selber beibringen und dann FPGAs machen wollen. Das diese 
Leute an obskuren Ideen und Methoden erdenken und was sie an Lösungen 
skizieren, spottet jeder Beschreibung. Da werden Analogeffekte von FPGAs 
genutzt und kompensiert, die es bei richtiger elektrischer Beschaltung 
und funktioneller Nutzung (entkopplung der jitternden Schaltung) gar 
nicht gäbe, es werden Prozesse und pipelines aufgesetzt, Daten dynamisch 
und pulsierend durchgeschaltet, weil vollkommen asynchrone Module in 
FPGAs erzeugt werden, wo es unnötig war und dort, wo es wiederum 
sinnvoll und einfach gewesen wäre, aufwändig verhindert wird. Da wird 
einsychronisiert und überabgetastet, was das Zeug hält, wo eine einfache 
Flankenbetrachtung gereicht hätte und es werden FSMs  und Filter mit 
Taktfrequenzen gefahren, die extreme Auflösungen und Speicherzellen 
erfordern, wo es ein trickreiches enable getan hätte.

von Strubi (Gast)


Lesenswert?

Und täglich grüsst das Murmeltier...
War wohl spät, und es ist immer schön, wenn man seinen in Ueberlänge 
kundgetanen Weltschmerz hinter der Anonymität verstecken kann, ne.
Nur der Diskussion vermutlich nicht zielführend (TL;DR). Für mich sind 
die Zeiten, wo noch in HW/SW 'gedacht' wird, längstens vorbei.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Strubi schrieb:
> Für mich sind die Zeiten, wo noch in HW/SW 'gedacht' wird, längstens
> vorbei.
Solange alles "läuft" und "schnell genug" ist, passt diese Aussage.

Interessant wird es aber bei Problemen, die man nicht mit Google lösen 
kann. Dann muss man wissen, worauf letztlich ein Code "läuft". Nur so 
kann man einschätzen, woher die Probleme kommen, die er macht. Mir sind 
schon Softies untergekommen, die nicht mal ihre Toolchain kannten. Die 
nicht wussten, dass man aus dem C-File Assembler machen und darin 
nachsehen kann, was und wie lange der Prozessor letztlich an einer 
einzigen Zeile Code zu arbeiten hat. In deren Vorstellung hat jede Zeile 
ihres Codes 1/fcpu (mit fcpu=1..5GHz) lang gedauert...

> wenn man seinen in Ueberlänge kundgetanen Weltschmerz hinter der
> Anonymität verstecken kann, ne.
Falsch ist das dort dargestellte nicht. Bestenfalls in akzeptablen 
Rahmen satirisch überzogen...
Und offenbar hat Robert Malle diesen täglichen Gruß des Murmeltiers noch 
nicht gehört.

: Bearbeitet durch Moderator
von Strubi (Gast)


Lesenswert?

Hi Lothar,

Lothar M. schrieb:
> Strubi schrieb:
>> Für mich sind die Zeiten, wo noch in HW/SW 'gedacht' wird, längstens
>> vorbei.
> Solange alles "läuft" und "schnel genug" ist, passt diese Aussage.
>

Naja, robust muss es auch sein. Jeder darf ja seinen Anspruch haben.
Wenn ich Roberts Ansatz richtig verstanden habe, steckt da durchaus ein 
pragmatischer Gedanke dahinter, nur wurde er für die 
Hardliner-HDL-Fraktion nicht günstig formuliert. Und ok, zu umständlich 
angesetzt, aber trivial ist das Problem auch nicht.

> Interessant wir es aber bei Problemen, die man nicht mit Google lösen
> kann.
> Dann muss man wissen, worauf letztlich ein Code "läuft". Nur so kann
> man einschätzen, woher die Probleme kommen, die er macht.
> Mir sind schon Softies untergekommen, die nicht mal ihre Toolchain
> kannten. Die nicht wussten, dass man aus dem C-File Assembler machen und
> darin nachsehen kann, was und wie lange der Prozessor letztlich an einer
> einzigen Zeile Code zu arbeiten hat. In deren Vorstellung hat jede Zeile
> ihres Codes 1/fcpu (mit fcpu=1..5GHz) lang gedauert...
>

Die kommen mir heutzutage mindestens so oft unter wie die 
HDL-Einserkandidaten, die nicht wissen, was eine Clamping-Diode ist.
Ueber die Bildungslandschaft können wir uns aber auch anderswo 
unterhalten, dass da generell der Wurm drin ist, bestreite ich ja nicht.

>> wenn man seinen in Ueberlänge kundgetanen Weltschmerz hinter der
>> Anonymität verstecken kann, ne.
> Falsch ist das dort dargestellte nicht. Bestenfalls in akzeptablen
> Rahmen satirisch überzogen...
> Und offenbar hat Robert Malle diesen täglichen Gruß des Murmeltiers noch
> nicht gehört.

Kann sein, vielleicht auch nicht. Ist mir eigentlich egal, nur muss der 
Murmeltiergruss nicht immer in der redundanten Form eines obsoleten 
Grabenkampfs ausgetragen werden. Als Satire war's nicht erkennbar.

Ich verstehe nur nicht, wie manche hier den Hausaufgabenmachern unter 
die Arme greifen, bei einer "divide et impera"-Problemstellung aber 
immer die alte "Nicht in SW-denken"-Leier abspulen. Hilft nicht...
Bei den meisten pragmatischen Lösungen geht es nun mal schlicht darum, 
SW mit HW optimal interagieren zu lassen. Dass es da nicht gleich einen 
AXI-Bus und HAL braucht, sehen auch SW-Leute ein.
Da würde ich etwas kreative Querdenkerei bevorzugen, von mir aus auch 
von überm[uü]tigen Physikern, die alles können, aber nix richtig :-)

von ui (Gast)


Lesenswert?

weltbester FPGA-Pongo schrieb im Beitrag #4918182:
> ...und pulsierend durchgeschaltet, weil vollkommen asynchrone Module in
> FPGAs erzeugt werden, wo es unnötig war und dort, wo es wiederum
> sinnvoll und einfach gewesen wäre, aufwändig verhindert wird. Da wird
> einsychronisiert und überabgetastet, was das Zeug hält, wo eine einfache
> Flankenbetrachtung gereicht hätte und es werden FSMs  und Filter mit
> Taktfrequenzen gefahren, die extreme Auflösungen und Speicherzellen
> erfordern, wo es ein trickreiches enable getan hätte.

Laaber, laaber, laaber. Meine Güte. Sag doch einfach das er falsch denkt 
und lass es gut sein. Ewig am rumheulen, ohne nix.

von Weltbester FPGA-Pongo (Gast)


Lesenswert?

ui schrieb:
> Sag doch einfach das er falsch denkt
> und lass es gut sein.

Für eine überzeugende Argumentation reicht es nicht, zu postulieren, 
dass etwas falsch ist, sondern man unterlegt es auch mit Beispielen.

Zu der Frage, ob man Semaphore in VHDL benötigt, genauer: Ob man bei der 
Programmierung von FPGAs Semaphore braucht, habe Ich Beispiele genannt.

Zu der anderen Frage, ob man Physiker oder Mathematiker an die Themen 
ranlassen sollte, habe Ich ebenfalls Beispiele gebracht. Es hat ja 
seinen Grund, warum es ein Elektrotechnik- und Informatikstudium gibt. 
Die Elektroingenieure setzen in erster Linie physikalische Messmethodik 
in Elektronik um, die Informatiker wiederum Mathematik in Software. In 
beiden Fällen gibt es eine Reihe von Dingen, die man eben gelernt haben 
muss, weil es Generationen vom Ingenieuren vor einem optimiert und 
rausgeforscht haben und das gilt inzwischen auch für die 40 Jahre alte 
Informatik und Computertechnik. Wenn da die "me too"-Generation nach der 
Hausmannsart rangeht, nur weil sie in ihrem eigentlichen 
wissenschaftlichen Fachgebiet nicht so richtig haben landen können, ist 
das schon zweckmäßig, es in Frage  zu stellen und mit Beispiel zu 
unterlegen.

Für ihre Profifussballmannschaft stellt sich der FC Bayern ja auch 
gelernte Fussballer ein und nicht etwa Lederproduzenten, Rasenforscher 
oder FLugbahnberechnungsexperten. Die sind am Rande sicher interessant, 
um Bälle, Plätze und Schusstechniken zu verbessern, aber Treten können 
die eben nur hobbymässig.

Unverständlicherweise ist unsere Industrie auf dem Wege, genau das zu 
tun: Man fordert immer spezifischere Ausbildung, stellt dann aber die 
Quereinsteiger ein, weil sie billiges Arbeitsvieh sind.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Weltbester FPGA-Pongo schrieb im Beitrag #4919369:
> Unverständlicherweise ist unsere Industrie auf dem Wege, genau das zu tun
Ähem, wir sind hier nicht in Arbeit&Beruf. Zudem ist dieses Thema 
mindestens genau so alt wie das Thema mit der "frechen und faulen 
Jugend"(*) und "früher war alles besser"...

(*)http://www.gutzitiert.de/zitat_autor_sokrates_thema_jugend_zitat_11962.html

von Weltbester FPGA-Pongo (Gast)


Lesenswert?

Lothar M. schrieb:
> Weltbester FPGA-Pongo schrieb im Beitrag #4919369:
> Ähem, wir sind hier nicht in Arbeit&Beruf.
Gut, da hast Du natürlich recht. Ich hätte die allgemeine Kritik 
abkoppeln und ins Jobforum schieben sollen, wobei Ich doch noch einen 
gewissen Unterschied zwischen meiner konkreten Betrachtung zu den 
Physikern und der doch recht allgemeinen Plattitude mit dem "früher 
alles besser" sehe, die manche gerne benutzen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.