FPGA-Programmierung, wo anfangen

Ich bin Softwareentwickler (C, C++, Objective-C, Java ...) und interessiere mich dafür, das Programmieren von FPGAs zu lernen. Nun, die Frage mag Ihnen einfach erscheinen, aber bitte nehmen Sie sich die Zeit, mir bei dieser Frage zu helfen, da ich gerade irgendwie feststecke. Mein Unternehmen hat mich gebeten, mich mit der Technologie vertraut zu machen und an einem Gitterprodukt zu arbeiten. Meine Frage ist, wo soll ich anfangen? Nach einiger Recherche stellte ich fest, dass ich zwischen VHDL und Verilog wählen konnte, ich habe noch nie eines davon verwendet. Gibt es einen Spezialisten, der mir empfehlen könnte, wo ich anfangen soll? Eine Sprache lernen, sich über die Hardwarekomponenten informieren und dann das Gitterprodukt? Oder direkt mit dem Lattice-Produkt beginnen (wie ich gelesen habe, dass die Programmiermethoden zwischen den FPGA-Anbietern sehr unterschiedlich sind)?

Wenn Sie mit der C/C++-Programmierung vertraut sind, sollten Sie Verilog anstelle von VHDL wählen. Die Syntax von Verilog ähnelt der von C.
@m.Alin Ich fange gerade erst an und habe herausgefunden, dass es keine Rolle spielt, ob es wie C aussieht, weil ich festgestellt habe, dass der schwierigste Teil nicht die Syntax war, sondern der Unterschied in den Konzepten. Die Semantik ist nicht einmal annähernd die von C.
Die größte Änderung, die ich von C/C++/Java/etc. besteht darin, dass Module, die Sie schreiben (äquivalent zu Übersetzungseinheiten), rein ereignisgesteuert sind. In C, auf ein Grundprinzip vereinfacht, führt ein kompiliertes Programm Zeile 1 Ihres Codes aus, dann Zeile 2, dann 3, dann 4 usw. So etwas gibt es in Verilog/VHDL nicht, es ist ein bisschen wie das Zeichnen eines Bildes : Dieser Eingangspin ist mit module1_input verbunden, module1_output schaltet den Zustand jedes Mal um, wenn module1_input hoch geht. Anstelle if(condition)dessen ist when(condition). Die meisten FPGA-IDEs haben sogar einen Grafikdesign-Input, als ob Sie es auf Papier zeichnen würden.

Antworten (3)

Digitales Design hat nicht viel mit Softwareentwicklung gemeinsam (vielleicht abgesehen davon, dass die Verilog-Syntax ein bisschen wie C-Sprache aussieht, aber es sieht einfach so aus). Daher ist es sehr schwierig, diese Art von Frage angemessen zu beantworten. Aber als jemand, der einen Weg von der Softwareentwicklung zum Hardwaredesign gegangen ist, werde ich es versuchen. Wenn ich auf mich selbst zurückblicke, so hätte ich mir damals geraten, wenn ich gewusst hätte, was ich heute weiß:

Von vorne anfangen

Vergessen Sie alles über Softwareentwicklung. Vor allem Programmiersprachen. Diese Prinzipien gelten nicht für digitales Design. Es wäre wahrscheinlich einfach für jemanden, der eine CPU entwickelt hat, sie in Assembler oder sogar C zu programmieren, aber ein Assembler-Programmierer wird nicht in der Lage sein, eine CPU zu entwerfen.

Neigen Sie auf Ihrem Lernpfad nicht dazu, ein scheinbar einfaches Problem mit Ihrem vorhandenen Softwarewissen zu lösen. Eines der klassischen Beispiele ist eine "for-Schleife". Auch wenn Sie eine for-Schleife beispielsweise in verilog schreiben können, dient sie anderen Zwecken. Es wird hauptsächlich zur Codegenerierung verwendet. Es kann auch eine For-Schleife sein, wie Softwareentwickler es sehen, aber es wird für nichts anderes als Simulation gut sein (dh Sie werden nicht in der Lage sein, FPGA so zu programmieren).

Denken Sie also bei jeder Aufgabe, die Sie angehen möchten, nicht, dass Sie wissen, wie es geht, sondern recherchieren Sie stattdessen – prüfen Sie Bücher, Beispiele, fragen Sie erfahrenere Personen usw.

Lernen Sie Hardware und HDL-Sprache

Die beliebtesten HDL-Sprachen sind Verilog und VHDL. Es gibt auch herstellerspezifische wie AHDL (Altera HDL). Da diese Sprachen zur Beschreibung von Hardwarekomponenten verwendet werden, werden sie alle so ziemlich verwendet, um dasselbe auf ähnliche Weise, aber mit einer anderen Syntax auszudrücken.

Einige Leute empfehlen, Verilog zu lernen, weil es wie C aussieht. Ja, seine Syntax ist eine Mischung aus C und Ada, aber es macht es einem Softwareentwickler nicht leicht, sich daran zu gewöhnen. Tatsächlich denke ich, dass es es sogar noch schlimmer machen kann, weil es eine Versuchung geben wird, C in Verilog zu schreiben. Das ist ein gutes Rezept für eine sehr schlechte Zeit.

In Anbetracht dessen würde ich empfehlen, von der VHDL aus zu starren. Obwohl Verilog auch in Ordnung ist, solange das oben Genannte berücksichtigt wird.

Eine wichtige Sache, die Sie im Auge behalten sollten, ist, dass Sie verstehen müssen, was Sie mit dieser Sprache ausdrücken. Welche Art von Hardware wird "beschrieben" und wie funktioniert sie?

Aus diesem Grund würde ich Ihnen empfehlen, sich ein Buch über Elektronik im Allgemeinen und ein gutes Buch wie dieses zu besorgen – HDL Chip Design (auch bekannt als Blue Book).

Holen Sie sich einen Simulator

Bevor Sie anfangen, irgendetwas in der Hardware zu tun und herstellerspezifische Funktionen usw. zu verwenden, besorgen Sie sich einen Simulator. Ich begann mit einem Verilog und verwendete Icarus Verilog zusammen mit GTK Wave. Das sind kostenlose Open-Source-Projekte. Führen Sie Beispiele aus, die Sie in Büchern sehen, üben Sie, indem Sie Ihre eigenen Schaltungen entwerfen, um einen Eindruck davon zu bekommen.

Holen Sie sich ein Entwicklungsboard

Wenn Sie Lust haben, voranzukommen, besorgen Sie sich ein Entwicklungsboard. Wenn Sie wissen, dass Ihr Arbeitgeber sich für Lattice entscheiden möchte, dann holen Sie sich Lattice Board.

Die Programmiermethoden sind sehr ähnlich, aber es gibt Unterschiede, die sich unterscheiden. Zum Beispiel unterschiedliche Tools, unterschiedliche Optionen, unterschiedliche Schnittstellen. Wenn Sie Erfahrung mit einem Anbieter haben, ist es normalerweise nicht schwierig, zu wechseln. Aber Sie möchten diese zusätzliche Lernkurve wahrscheinlich vermeiden.

Ich würde auch sicherstellen, dass das Board mit Komponenten geliefert wird, die Sie verwenden möchten, oder erweiterbar ist. Wenn Sie beispielsweise ein Netzwerkgerät wie einen Router entwerfen möchten, stellen Sie sicher, dass das Board über Ethernet-PHY verfügt oder dass es beispielsweise über einen HSMC-Anschluss usw. erweitert werden kann.

Boards werden normalerweise mit einer guten Referenz, einem Benutzerhandbuch und Designbeispielen geliefert. Studiere sie.

Bücher lesen

Sie müssen Bücher lesen. In meinem Fall hatte ich keine Freunde, die sich mit digitalem Design auskannten, und diese Seite war aus einem einfachen Grund auch nicht sehr hilfreich – ich wusste nicht einmal, wie ich meine Frage formulieren sollte. Alles, was mir einfiel, war: "Ähm, Leute, da ist etwas dcfifo und ich habe etwas über Clock-Domain-Crossing-Herausforderungen gehört, was ist das und warum funktioniert mein Design nicht?".

Ich persönlich habe damit angefangen:

FPGA-Anbieter haben viele Kochbücher mit Best Practices. Studieren Sie sie zusammen mit Referenzdesigns. Hier ist zum Beispiel einer von Altera.

Kommen Sie mit spezifischeren Fragen zurück

Während Sie Ihre Bücher durchgehen, ein Design simulieren, einige LEDs auf Ihrer Entwicklungsplatine blinken lassen, haben Sie höchstwahrscheinlich viele Fragen. Stellen Sie sicher, dass Sie keine Antworten auf diese Fragen auf der nächsten Seite des Buches oder online (dh im Lattice-spezifischen Forum) sehen, bevor Sie sie hier stellen.

Vielen Dank für diese ausführliche Antwort, es hat mir wirklich geholfen zu sehen, wie ich vorgehen kann. Leider habe ich auch keine Freunde, die mir helfen könnten. Aber Sie haben mir gerade viel Ärger erspart und noch einmal vielen Dank!!!!
Ausgezeichnete Antwort.
In der Schule haben wir C++ gelernt, bevor wir VHDL gelernt haben. Ich hatte große Probleme, es zu verstehen, aber der Punkt, an dem alles klickte, war, als ich verstand, dass alles in Echtzeit und parallel passiert (parallel, nicht asynchron wie nodejs). Die Softwareentwicklung folgt einem sequentiellen Ablauf, aber in HDL geschieht alles auf einmal (meistens). Wenn Sie etwas wie "x = 1; y = 2; y = x; x = y" in SW haben, ist y am Ende gleich 1, in HDL haben Sie eine Race-Condition, da sowohl x als auch y versuchen werden gleichzeitig ineinander übergehen. Denken Sie einfach daran und das Leben könnte einfacher für Sie sein.
@PGT Sie sollten erwarten, dass der Wert von y etwas anderes als 1 ist, wenn 'y' für mehrere Prozesse zugänglich ist, die entweder auf einem einzelnen Kern oder mehreren Kernen ausgeführt werden, was einem schwächeren Prozess seine Autorität auferlegen kann.

Als Alternative könnten Sie einige High-Level-Synthesetechniken wie Vivado HLS von Xilinx und die OpenCL-Lösung von Altera verwenden. Vielleicht erleichtert dies Ihre Kurve zum Erlernen von Hardwarebeschreibungssprachen, wenn Sie Ihren Softwarehintergrund berücksichtigen.

Lernen Sie zunächst die Grundlagen des digitalen Designs. Mealy/Moore-Maschine, kombinatorische Logik, Wahrheitstabelle, Karnaugh-Karte und so weiter. Beginnen Sie mit der Erstellung eines einfachen Designs in Schaltplänen (7-Segment-Zähler) und lernen Sie dann ein HDL. In Europa wird VHDL verwendet, in den USA Verilog. Schließlich ist das Timing wichtig, beachten Sie, dass Signale Verzögerungen haben, die komponenten- und temperaturabhängig sind, und jedes Signal hat eine andere Verzögerung.

Buch zum Lesen: http://www.amazon.com/Advanced-FPGA-Design-Architecture-Implementation/dp/0470054379

Perfekte Sprachsyntaxkenntnisse sind für später, zunächst digitales Design und die Probleme verstehen.

In Europa wird VHDL verwendet, in den USA Verilog. Überhaupt nicht wahr...
Tatsächlich habe ich Verilog gelernt und komme aus Großbritannien. Es ist auch die Sprache, die in einem der Module gelehrt wird, die ich an der Uni gemacht habe (ebenfalls in Großbritannien).