Forum: FPGA, VHDL & Co. FPGA vs. CPU Beispiel


von Florian (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen,

ich werde demnächst ein Referat zum Thema FPGA halten und möchte dabei 
einen Vergleich zu einer CPU machen.
Konkret würde ich gerne ein Beispiel zeigen wie ein FPGA eine bestimmte 
Aufgabe löst, und wie der Prozessor diese Aufgabe lösen würde.
Ich habe hierfür ein Beispiel(siehe Anhang) im Internet gefunden.

Frage 1:
Ist das so in etwa richtig? Kann man sagen das ein Compiler für z.b. 
eine RISC CPU diese 12 Befehle generiert und diese dann von der CPU 
abgearbeitet werden.

Frage 2:
Bei der FPGA Schaltung steht dabei das es 2 Schritte für diese Operation 
braucht. Was soll den hier genau 2 Schritte bedeuten? Eine 
Addieroperation allein braucht ja schon mehrere Schritte. Da sind ja 
auch viele Gatter vorhanden.

Frage 3:
kann man das ganze vielleicht grob in Zahlen ausdrücken? Ich würde gerne 
aufzeigen wie schnell das in etwa eine CPU mit 1GHz lösen würde. und Wie 
schnell ein FPGA mit z.b. 100Mhz.
Kann ich hergehen und sagen das eine CPU mit Piplining für jeden Befehl 
genau einen Taktzyklus braucht? D.h. 12*1ns = 12 ns
Bei dem FPGA könnte ich mir ja die Schaltung in einem Entwicklungstool 
aufbauen und mir die Laufzeit durchrechnen lassen. Oder geht das auch am 
grob am Papier?

Danke sehr

Gruß

Florian

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


Lesenswert?

Florian schrieb:
> Kann man sagen das ein Compiler für z.b. eine RISC CPU diese 12 Befehle
> generiert und diese dann von der CPU abgearbeitet werden.
Für diese spezielle RISC-CPU in deinem Beispiel ist das so.

> Bei der FPGA Schaltung steht dabei das es 2 Schritte für diese Operation
> braucht. Was soll den hier genau 2 Schritte bedeuten?
Da sind 2 grundlegende Logikelemente in dem Schaltplan.
Tatsächlich wird dies Logik in einem FPGA aber natürlich in 1 LUT mit 4 
Eingängen und 1 Ausgang gepackt und damit ist das real nur 1 Schritt.

> Bei dem FPGA könnte ich mir ja die Schaltung in einem Entwicklungstool
> aufbauen und mir die Laufzeit durchrechnen lassen. Oder geht das auch am
> grob am Papier?
In der Realität nicht mehr.

> Frage 3: kann man das ganze vielleicht grob in Zahlen ausdrücken? Ich
> würde gerne aufzeigen wie schnell das in etwa eine CPU mit 1GHz lösen
> würde.
Keine CPU macht was mit 1GHz. Sondern bestenfalls der innerste 
Rechnerkern der CPU läuft damit. Aber weil du erst noch die Befehle und 
die Daten aus dem Speicher holen musst, dauert das alles viel länger.

> Kann ich hergehen und sagen das eine CPU mit Piplining für jeden Befehl
> genau einen Taktzyklus braucht? D.h. 12*1ns = 12 ns
Die Zahlen sind beliebig. Du musst etwas vergleichen, was gleich teuer 
und gleich groß ist: ein FPGA für 3€ und einen µC für 3€. Dann kannst du 
die Performance ansatzweise vergleichen. Wenn du aber ein FPGA für 5€ 
(=100MHz) mit einem Prozessor samt Pipapo für 50€ vergleichst, dann 
kannst du auch das Wetter in Absurdistan mit der Farbe von Grünkohl 
vergleichen.

> und Wie schnell ein FPGA mit z.b. 100Mhz.
Das braucht weniger als 10ns für die Aufgabe. Sonst könnt es die 
Setup-Zeit für das nächste Flipflop nicht einhalten. Real sind die 
Durchlaufzeiten durch LUTs im huntert-ps Bereich. Dazu kommt das Routing 
usw...

: Bearbeitet durch Moderator
von Dergute W. (derguteweka)


Lesenswert?

Moin,

Der Unterschied zwischen FPGA und CPU wird wohl deutlicher, wenn du das 
Beispiel nicht mit einzelnen Variablen machst, sondern jeweils mit 
Arrays von z.b. jeweils 16 Eintraegen.
Die CPU muss dann halt 16mal hintereinander mit den verschiedenen 
Arrayeintraegen rechnen, waehrend im FPGA "einfach" 16 Instanzen der 
fuer die Berechnung benoetigten LUTs nebeneinander rumliegen und 
gleichzeitig rechnen koennen.
Die CPU braucht also grob 16x laenger fuer's Array, im FPGA kann man's 
"in die Flaeche komponieren", wenns pressiert und es bleibt dann genauso 
schnell - solange das parallele Design noch ins FPGA passt.

Gruss
WK

von Florian (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Danke für die Antworten.

ich hab das mal in Xilinx Vivado für den Zybo (xc7z010clg400-1) 
nachgebaut.
Allerdings mit einem Multiplizierer statt einem Subtrahierer.
1
entity test is
2
  Port (
3
   a : in  unsigned(15 downto 0);
4
   b : in  unsigned(15 downto 0);
5
   c : in  unsigned(15 downto 0);
6
   d : in  unsigned(15 downto 0);
7
   z : out unsigned(33 downto 0);
8
   clk : in std_logic
9
  );
10
end test;
11
12
architecture Behavioral of test is
13
14
 signal a_s : unsigned(15 downto 0);
15
 signal b_s : unsigned(15 downto 0);
16
 signal c_s : unsigned(15 downto 0);
17
 signal d_s : unsigned(15 downto 0);
18
 signal z_s : unsigned(33 downto 0);
19
 signal x_s : unsigned(16 downto 0);
20
 signal y_s : unsigned(16 downto 0);
21
22
begin
23
  
24
   x_s <= ('0' & a_s) + ('0' & b_s);
25
   y_s <= ('0' & c_s) + ('0' & d_s);
26
   z_s <= x_s * y_s;
27
  
28
   regs : process(clk)
29
   begin 
30
      if rising_edge(clk) then 
31
     a_s <= a;
32
     b_s <= b;
33
     c_s <= c;
34
     d_s <= d;    
35
     z <= z_s;
36
      end if; 
37
   end process;
38
39
end Behavioral;


Das was rausgekommen ist, sieht man im Anhang. Es wurde dafür ein DSP 
Slice verwendet. Zu sehen ist der kritische Pfad. Als total Delay wurde 
hier 3,2 ns angegeben.
Diesen Wert würde ich gern gegenüber einem Mikrocontroller der z.b. mit 
1Ghz läuft stellen? Wie mache ich das am besten? Es muss nicht ganz 
genau sein. Grob würde mir schon reichen :)

Danke sehr

von Vancouver (Gast)


Lesenswert?

Ein fairer Vergleich zwischen FPGA und CPU ist auf diese Weise kaum 
möglich. z.B. verwendet dein CPU-Programm LOAD-Operationen zum Laden der 
Operanden aus dem Speicher. Aber woher bekommt der FPGA seine Daten? 
Fairerweise musst du voraussetzen, dass bei beiden die Operanden bereits 
in Registern liegen und die Ergebnisse nur in Registern gespeichert 
werden.
Für halbwegs brauchbare Performancevergleiche wirst du dich zumindest 
auf einen speziellen CPU- Typ festlegen müssen, alleine schon wegen der 
Speicheranbindung (Stichwort Harvard-Architektur). Da würde sich z.B. 
die RISC-V CPU anbieten, die vollständig offengelegt ist. Wenn du für 
dein Problem ein RISC-V Maschinenprogramm schreibst und gleichzeitig 
zeigst, wie das FPGA-Design aussieht, kannst du sehr schön 
demonstrieren, wo die Vorteile/Nachteile liegen.

FPGA haben immer die Nase vorn, wenn es um feingranulare Parallelität 
geht, z.B. bei einer Skalarmultiplikation (fairerweise mit 
Integer-Vektoren,die vollständig in die 32 RISC-V-Register passen). Geht 
es dagegen um Steuerungsaufgaben mit vielen if/else-Entscheidungen und 
Variablen, würde man eher eine CPU nehmen. Ebenso bei 
nicht-parallelisierbaren Algorithmen mit vielen 
Floating-Point-Operationen.

Dein Beispiel-Design oben lässt sich wohl auf den meisten aktuellen FPGA 
in einem einzigen Takt berechnen, und wenn nicht, dann in einer 
zweistufigen Pipeline. Wenn du von 100MHz ausgehst, bekommst Du 100Mio 
Ergbnisse pro Sekunde, vorausgesetzt, du kannst den FPGA pro Sekunde mit 
400Mio Operanden füttern. Jetzt kannst du mal überlegen, welche 
Perfromance ein RISC-V mit 4-stufiger Pipeline bei 100MHz bringen würde, 
und wie hoch man ihn takten müsste, damit er genau so schnell ist wie 
der FPGA. Für einen aktuellen AMD-RYZEN Prozessor verglichen mit einem 
Xilinx-Virtex-Ultrascale-II-Monstrum dürften sich dann ähnliche 
Vergleichswerte ergeben.

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


Angehängte Dateien:

Lesenswert?

Dergute W. schrieb:
> Die CPU braucht also grob 16x laenger fuer's Array
Wobei diese Zahl 16 ein für dieses Beispiel beliebig gewählter Wert ist 
und nichts direkt mit den 16 Werten im Array zu tun hat. In der Praxis 
kann die CPU auch 160 mal länger brauchen, wenn grad ein Cache Miss war 
und erst noch das komplette Array in den CPU-Speicher geladen werden 
muss...  ;-)

Florian schrieb:
> ich werde demnächst ein Referat zum Thema FPGA halten und möchte dabei
> einen Vergleich zu einer CPU machen.
Weil ein allgemeiner Vergleich einer CPU mit einem FPGA immer hinkt, 
solltest du da eher eine diskret aufgebaute Schaltung mit einer ins FPGA 
gepackte Logik vergleichen. Denn die Logik, die aus einer Rechnung wie 
der obigen wirklich gemacht wird, sieht für 8-Bit signed Werte real so 
aus wie im Screenshot. Da ist wie in deinem Beispiel nichts mit "2 
Schritten" zu erkennen, sondern da sind zwischen Ein- und Ausgang einige 
LUT und Multiplexer beteiligt.

Florian schrieb:
> Diesen Wert würde ich gern gegenüber einem Mikrocontroller der z.b. mit
> 1Ghz läuft stellen? Wie mache ich das am besten?
Es geht in dieser Liga nicht, ohne dass du irgendwelche Randbedingungen 
annimmst. Denn GHz Prozessoren erreichen das GHz eben nur in den 
internen Pipelines. Für einen Vergleich musst du also alles vergleichen 
von Quelle bis Ziel, also von dem Zeitpunkt, wo die Eingangsdaten im 
Speicher stehen bis zu dem Augenblick, wo das Ergebnis im Speicher 
steht. Aber auch das ist Sand in die Augen gestreut, denn währen der 
Buscontroller die Daten in den Speicher legt, macht die CPU ja schon 
lange wieder was anderes. Und es läuft eben auch dort vieles parallel.

: Bearbeitet durch Moderator
von HugoPar (Gast)


Lesenswert?

Man könnte meinen dass es im Kern um einen Vergleich zwischen linearen 
und parallelen Prozessen geht.
Und da wird eine Aufgabe die man parallelisieren kann tendenziell auf 
einem FPGA schneller ablaufen.
Wenn der FPGA klein ist, also wenig Fläche für parallele Prozesse hat, 
dann wird eine sehr schnelle CPU mit linearer Berechnung tendenziell 
trotzdem schneller sein.

Um CPU vs. FPGA zu beurteilen muss man die Menge der Aufgabenstellungen 
definieren. Denn es wird keinen deutlichen Sieger für eine beliebige 
Aufgabenstellung geben. Berechnungen die sich nicht (gut) 
parallelisieren lassen, laufen auf einem FPGA auch nicht besonders 
schnell.

Wobei die Eigenschaften linear und parallel auch nicht immer für CPU und 
FPGA gelten.
Eine CPU mit mehreren Kernen parallelisiert auch Aufgaben oder es gibt 
bestimmte Module in der CPU die bestimmte Berechnungen auch parallel 
ausführt, wenn auch nicht in dem Ausmaß wie es ein FPGA theoretisch 
kann.
Umgekehrt können in realen Berechnungen auch in einem FPGA lineare 
Prozesse zwingend sein die das Gesamtergebnis ausbremsen können.

von HugoPar (Gast)


Lesenswert?

Ehm linear? Ich meinte seriell.

von Clemens (Gast)


Lesenswert?

All die Punkte die hier aufgefuehrt werden sind richtig, helfen aber 
nicht wirklich weiter.

Jetzt gehen wir aber mal einen Schritt zurueck und sehen das dort ein 
"Referat" gehalten wird. Was ist also die Zielgruppe? Klingt nach 
Oberstufe/Richtung Abitur. Hat das Publikum etwas Hintergrundwissen oder 
hoeren die zum ersten Mal von FPGAs? Zum ersten mal von Digitallogik? 
Zum ersten mal von Maschinenbefehlen? Doch im Studium?

Ich wuerde sagen du bist auf einem guten Weg und vergleichst die 
richtigen Baustellen. Seriell gegen parallel ist das Argument. Stelle 
das gut verstaendlich dar. Sei dir bewusst das du die Rahmenbedingungen 
nicht 100% vergleichen kannst. Es passiert zuviel in der 
Mikroarchitektur um CPU-Zyklen 1:1 mit der Gaterlauf vergleichen zu 
koennen. Verstecke das nicht, lass dich aber auch nicht von zuvielen 
unnoetigen Details von dem eigentlich Vergleich abhalten.

von Florian (Gast)


Lesenswert?

ok, danke für eure Hilfe.
Dann werde ich speziell diesen Vergleich etwas überdenken. ;)

von W.S. (Gast)


Lesenswert?

Florian schrieb:
> ich werde demnächst ein Referat zum Thema FPGA halten und möchte dabei
> einen Vergleich zu einer CPU machen.
> Konkret würde ich gerne ein Beispiel zeigen wie ein FPGA eine bestimmte
> Aufgabe löst, und wie der Prozessor diese Aufgabe lösen würde.

Dir ist aber hoffentlich bewußt, daß ein derartiger Vergleich extrem 
hinkend ist.

Also eine CPU ist eine Inkarnation der Turing-Maschine, also eines 
Gebildes, was seriell Befehle liest und ausführt - während ein FPGA eine 
Tüte voller Logik-Gatter ist, denen man erst durch eine sinnvolle 
Verschaltung eben dieser Gatter eine gewünschte Funktion gibt.

Das ist ein wesentlicher Unterschied, der eigentlich jeglichen Vergleich 
verbietet. Und: Ein FPGA kann durchaus auch eine CPU sein, denn eine CPU 
ist ebenfalls nur eine Konstruktion aus Logik-Gattern.

Also: Ein FPGA löst keine Aufgabe - sondern derjenige, der die Gatter 
des FPGA in sinnvoller Weise miteinander verschaltet, löst damit 
Aufgaben.

Eine CPU hingegen löst Aufgaben, denn sie nimmt (eben als 
Turing-Maschine) Befehle entgegen und führt sie aus.

Das beinhaltet einen wesentlichen Unterschied: Die Formulierung der 
Aufgabe besteht beim FPGA in der inneren Verschaltung der Gatter - 
während sie bei der CPU von außen herangeführt wird, indem man der CPU 
unterschiedliche Befehle zu lesen gibt. Für unterschiedliche Aufgaben 
muß ein FPGA innerlich umprogrammiert werden. Die CPU hingegen bleibt 
innerlich gleich, die Aufgaben werden ihr seriell von außen zugeführt.

Und noch ein Wort zu Geschwindigkeiten: Eine CPU ist üblicherweise ein 
getaktetes System und damit ist die Befehlsausführung an den angelegten 
Takt gebunden. Die Verschaltung der Gatter im FPGA kann ebenfalls ein 
getaktetes System sein (ist es in den meisten Fällen auch) - aber das 
ist nicht zwingend, denn man kann mit Logik-Gattern auch ungetaktete 
Fnktionalität herstellen. Dann hängt die Geschwindigkeit von den 
Durchlaufszeiten der Gatter ab und da diese je nach Komplexität 
variieren, ergibt das Glitches.

W.S.

von Josef (Gast)


Lesenswert?

Clemens schrieb:
> Was ist also die Zielgruppe?
> Klingt nach Oberstufe/Richtung Abitur.

Eine Primitiv-Erklärung, was ein FPGA ist:
Beitrag "Re: Modernes "Z80 Klein-Computer"-Analogon für Jugendliche/Kinder?"

von J. S. (engineer) Benutzerseite


Lesenswert?

Ich habe das im Seminar immer am Beispiel eines Taschenrechners erklärt, 
wenn es kurz und knapp für Laien sein sollte:

Hardware:

CPU:  Chip fest verdrahteten Funktionen, die vom Hersteller definiert 
wurden
FPGA: Chip mit frei vom Entwickler festlegbaren Funktionen

Daraus ergibt sich zwangsläufig:

Software:

CPU:  Das Programm ist eine Rechenvorschrift, konkret ein Ablauf, damit 
der universelle Rechner genau die richtige Rechnung durchführt (so, wie 
sie eine Person eintippen würde)

FPGA: Das Programm ist eine Bauvorschrift, damit eine Software aus 
universellen Elementen einen abgespeckten Taschenrechner für die 
gewünschte Rechnung zusammensetzen kann (so, wie es eine Person 
zusammenlöten würde)


Alternativ dazu das ebenfalls von mir gebrachte Roboterbeispiel, um 
einmal zu abstrahieren und CPU / FPGA als etwas Produktives aufzufassen:

Eine Vorschrift wie C oder SPS ist expliziter Ablauf, der einen Roboter 
dazu bringt, ein Auto zusammenzusetzen.

Eine Vorschrift wie VHDL ist die Bauanleitung für den Roboter. Die 
Abläufe für das Zusammensetzen des Autos sind implizit gegeben.

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.