Einsteigerkurs FPGA-Entwicklung

  • Hallo zusammen,

    nun soll es bald losgehen mit unserem Einsteigerkurs in FPGA! Ich denke die erste Lektion werde ich im Laufe der nächsten Woche hier einstellen. Wer noch mitmachen will, der besorge sich bitte noch folgendes FPGA-Miniboard mit einem EP2C5-FPGA drauf:

    Diese Board gibt es für kleines Geld direkt bei Amazon.de unter dem Suchbegriff "FPGA Board".

    Zusätzlich benötigt Ihr einen Altera USB Blaster als Programmiergerät:

    USBBlaster.jpg

    Das Original von ALTERA ist verhältnismäßig teuer, die Nachbauten hingegen kosten kaum 10 Euro und sind ebenfalls unter dem Suchbegriff "usb blaster" bei Amazon.de erhältlich.


    Wie beim Mikrocontrollerkurs bitte ich Fragen in einem separaten FAQ-Thread zu stellen!!! Dieser Thread soll als "Einbahnstraße" lediglich das Kursmaterial verbreiten.


    Vielen Dank und viel Spaß bei der "Chipentwicklung"
    Bernhard

    Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung.
    Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")

  • Hallo und herzlich Willkommen im FPGA-Einsteigerkurs.


    Heute wollen wir mit der 1. Lektion anfangen. Einigen von Euch wird das in dieser Lektion behandelte schon bekannt sein und demzufolge nichts Neues bringen. Aber wir müssen auch alle anderen Teilnehmer berücksichtigen, die zwar schon Bord und Programmer haben, aber bisher keine weiteren Experimente unternommen haben.

    Wie immer gibt es am Ende der Lektion ein paar Aufgaben zu lösen, die von der Schwierigkeit ungefähr dem behandelten Thema entsprechen. Die Lösungen gibt es dann im Folgemonat, kurz vor Veröffentlichung der nächsten Lektion.

    Download Lektion 1: Lektion1.pdf

    Material für Lektion 1: EP2C5-core-board-test.zip

    Viel Spaß allen Teilnehmern beim Entwerfen Ihrer eigenen Chips.

    Eine Bitte noch: Wie beim Microcontrollerkurs diesen Thread nicht kommentieren oder darauf antworten! Er soll einzig und allein zur Ausspielung des Lektionsmaterials und der Musterlösungen dienen! DANKE!

    Gruß
    Bernhard

    Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung.
    Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")

    Edited once, last by Bernhard45 (July 19, 2020 at 3:08 PM).

  • Hallo Teilnehmer,

    wollen wir langsam zum Ende von Lektion 1 kommen und uns anschauen wie die Lösungen der Aufgaben aussehen könnten.

    In Aufgabe 1 hatten wir ja den Democode zur Einrichtung des EP2C5-Boards dahingehend abzuändern, das eine Art Lauflicht entsteht.

    Eine ganz einfache Lösung könnte so aussehen (ich hoffe die Code-Formatierungen bleiben hier im Post erhalten):

    [code=php]module countpro(sys_clk,led);

    input sys_clk;
    output [2:0] led;
    reg [25:0] count;
    reg [1:0] lednum;
    reg [2:0] led;

    always @(posedge sys_clk)
    begin
    count <= count + 1; // 50 MHz Systemtaktzaehlung
    if( count == 6250000 ) // alle 6250000 Clks, schalte
    begin
    // negiere Schaltzustand bei led
    led[lednum] <= ~led[lednum];
    // naechste led
    lednum <= lednum + 1;
    // Zaehler zuruecksetzen fuer nachsten Schaltzustand
    count <= 0;

    // ueberpruefen ob Ueberlauf in lednummerierung
    if (lednum == 2)
    begin
    lednum <= 0;
    end
    end
    else
    led[lednum] <= led[lednum];
    end
    endmodule[/php]

    Wir erhalten ein IC welches ein Lauflicht realisiert, was als Fahrtrichtungsanzeiger in einer Fahrstuhlanlage oder einem PKW mit LED-Blinker dienen kann. Ebenfalls im Code sichtbar, begin-end-Schlüsselworte sind bei Blöcken mit Einzelanweisungen nicht unbedingt notwendig, wenn klar ist, dass ohne diese Blockmarkierung nur eine(!) Befehlszeile nach einer if/if-else oder Schleifen-anweisung ausgeführt wird!

    In Aufgabe 2 sollte ein IC eine 7-Segmentanzeige treiben und einen Zähler bereitstellen. Über zwei Taster sollte ein Hoch- bzw. Runter-zählen eingeleitet werden.
    Schauen wir uns zuerst diesen Teilcode an, der wiederum auf dem Democode zum EP2C5-Board basiert:

    [code=php]
    module countpro(sys_clk,up_down,segment);

    input sys_clk;
    input up_down;

    output [6:0] segment;
    reg [6:0] segment;

    reg [25:0] count;
    reg [3:0] num;

    always @(posedge sys_clk)
    begin
    count <= count + 1; // 50 MHz Systemtaktzaehlung
    if( count == 25000000 )
    begin
    if (up_down)
    begin
    if (num < 9)
    num <= num + 1;
    else
    num <= 0;
    end
    else
    begin
    if (num > 0)
    num <= num - 1;
    else
    num <= 9;
    end

    count <= 0; // Zaehler zuruecksetzen fuer nachsten Schaltzustand
    end

    if (num == 0 )
    begin
    segment <= 7'b0111111;
    end
     
    if (num == 1 )
    begin
    segment <= 7'b0001100;
    end
     
    if (num == 2 )
    begin
    segment <= 7'b1011011;
    end
     
    if (num == 3 )
    begin
    segment <= 7'b1011110;
    end

    if (num == 4 )
    begin
    segment <= 7'b1101100;
    end
     
    if (num == 5 )
    begin
    segment <= 7'b1110110;
    end

    if (num == 6 )
    begin
    segment <= 7'b1110111;
    end
     
    if (num == 7 )
    begin
    segment <= 7'b0011100;
    end

    if (num == 8 )
    begin
    segment <= 7'b1111111;
    end

    if (num == 9 )
    begin
    segment <= 7'b1111110;
    end

    end
    endmodule
    [/php]

    Auch hier wird wieder der Systemtakt runter auf einen internen Modultakt geteilt, danach erfolgt die Überprüfung wie der Eingang up_down aussieht, gefolgt von der Zählaktion. Der C-Software-Programmierer würde jetzt sagen, der Zähler zählt aber doch bei jedem internem Modultakt und nicht auf Tastendruck! Ist up_down auf high wird inkrementiert, auf low dekrementiert. Das ist richtig, dennoch verhält es sich bei FPGAs etwas anders, es gibt nicht nur high und low, sondern auch noch hochohmig/offen! Ist das bei unserem Beispiel der Fall, also wird der Pin weder auf high noch auf low-Pegel gesetzt, bleibt der Zähler einfach auf dem aktuellen Zahlenwert! Somit können wir an einem Pin mit zwei Schaltern also drei Schaltzustände abbilden!

    Für jeden Wert des Zählers (0...9) erfolgt die Zuweisung der Segmente in if-Blöcken! Auch hier könnte man auf begin/end verzichten, da nur eine(!) Anweisung benötigt wird. Ebenso wäre Anstelle der vielen if-Zweige auch die Verwendung des switch/case-Konstrukts wie wir es aus der Programmiersprache C kennen zu überlegen, in Verilog sieht diese ganz ähnlich aus:

    [code=php]// Here 'expression' should match one of the items (item 1,2,3 or 4)
    case (<expression>)
    case_item1 : <single statement>
    case_item2,
    case_item3 : <single statement>
    case_item4 : begin
    <multiple statements>
    end
    default : <statement>
    endcase[/php]


    Kommen wir nun zu einer Variante, wo wir zwei Eingänge für die Zählrichtung verwenden und wo wir den Zählerüberlauf für einen internen Takt auf Meldeausgänge kopieren:


    [code=php]module countpro(sys_clk,up,down,segment,overflow);

    input sys_clk;
    input up;
    input down;

    output [6:0] segment;
    reg [6:0] segment;

    output [1:0] overflow;
    reg [1:0] overflow;

    reg [25:0] count;
    reg [3:0] num;


    always @(posedge sys_clk)
    begin
    count <= count + 1; // 50 MHz Systemtaktzaehlung
    if( count == 25000000 )
    begin
    if (up == 1)
    begin
    if (num < 9)
    begin
    num <= num + 1;
    overflow[0] <= 0;
    end
    else
    begin
    num <= 0;
    overflow[0] <= 1;
    end
    end
     
    if (down == 1)
    begin
    if (num > 0)
    begin
    num <= num - 1;
    overflow[1] <= 0;
    end
    else
    begin
    num <= 9;
    overflow[1] <= 1;
    end
    end

    count <= 0; // Zaehler zuruecksetzen fuer nachsten Schaltzustand
    end

    if (num == 0 )
    begin
    segment <= 7'b0111111;
    end
     
    if (num == 1 )
    begin
    segment <= 7'b0001100;
    end
     
    if (num == 2 )
    begin
    segment <= 7'b1011011;
    end
     
    if (num == 3 )
    begin
    segment <= 7'b1011110;
    end

    if (num == 4 )
    begin
    segment <= 7'b1101100;
    end
     
    if (num == 5 )
    begin
    segment <= 7'b1110110;
    end

    if (num == 6 )
    begin
    segment <= 7'b1110111;
    end
     
    if (num == 7 )
    begin
    segment <= 7'b0011100;
    end

    if (num == 8 )
    begin
    segment <= 7'b1111111;
    end

    if (num == 9 )
    begin
    segment <= 7'b1111110;
    end

    end
    endmodule[/php]

    Für mehrstellige 7-Segmentanzeigen kann dieses Modul nun entsprechend oft im FPGA "vervielfältigt" werden, wobei die Meldeausgänge des Überlaufs auf die Zähleingänge des nachgeschalteten Moduls gelegt werden.

    Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung.
    Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")

    Edited once, last by Bernhard45 (August 25, 2020 at 11:05 AM).

  • In der 2. Lektion des FPGA-Kurses wollen wir einen Blick auf den Simulator in der Quartus Entwicklungsumgebung werfen, wir werden sehen wie wir unseren geschriebenen Verilogcode simulieren können. Ein Ziel dieses FPGA-Kurses ist es mit unserem FPGA einen Sender zu entwickeln, der nahezu beliebige Modulationsarten darstellen kann. Wir schauen uns also, wie bereits im Mikrocontrollerkurs behandelt, Arten der Erzeugung eines Analogsignals an und wollen verschiedene Digital-Analog-Wandler und einen Sägezahngenerator in Verilog implementieren. Sprachlich sind wir dazu bereits seit der Lektion 1 in der Lage!

    Hier das PDF zur Lektion 2.

    Lektion2.pdf

    Habt keinen Zeitdruck, sondern macht den FPGA Kurs wenn Ihr wollt und Zeit dazu habt! Die Arbeit in Verilog und am FPGA soll Spaß machen und keine Hetze sein. In 4 bis 6 Wochen stelle ich dann Musterlösungen zur Lektion 2 ein, danach dann das PDF für Lektion 3.

    Gruß
    Bernhard

    Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung.
    Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")

  • Guten Tag.
    Geht es hier eigentlich noch weiter oder ist der Kurs magels Mitmacher eingeschlafen? Wäre schade. Gibt es auch noch irgendwo den Raspberry 2040 SDR-Kurs zum nachlesen?
    Mit freundlichen Grüßen BS

  • Guten Tag.
    Ich habe die Information bekommen das der Kurs eingeschlafen ist weil die im Gegensatz zum Mikrokontroller-kurs viel geringere Teilnehmerzahl bei Lektion 2 immer wieder um Zeitaufschub gebeten hat und kein Teilnehmer mehr Zeit zur Bearbeitung gefunden hat. Die Restlektionen und Übungen habe ich zugespielt bekommen. Was fehlt ist ein neues FPGA weil das Board oben nicht mehr vertrieben wird und komplett veraltet ist.

  • Wer etwas zeitgemäßeres als das alte EP2C5-Board haben möchte, sucht mal nach Tang Nano.


    https://wiki.sipeed.com/hardware/en/ta…9K/Nano-9K.html

    Das scheint sowas wie der Arduino im FPGA Bereich zu sein.
    Es gibt verschiedenen Größen

    Von ganz klein mit 1152 LUTs bis 20k LUTs groß ,

    Der Nano 9K hat wohl noch eine zusätzliche Cortex M3 MCU mit auf der Platine.

    Es gibt auch einige Addon-Boards.

    Die Hudelei mit der alten Quartus Programmiersoftware von Intel (nur die hatte den Cyclone 2 noch drin) ist dann auch Schnee von gestern. Programmiert wird in VHDL oder Verilog oder System Verilog mit GOWin https://www.gowinsemi.com/en/support/home/

    https://wiki.sipeed.com/hardware/en/ta…ll-the-ide.html

    Der generierte Bitstrom der das Chipdesign enthält wird über USB-C übertragen, ein extra Programmer wie Altera USB Blaster ist nicht mehr nötig.

    Die Preise sind mit Lieferung aus Deutschland bei Amazon für ein FPGA Board sehr interesssant.

    Edited once, last by O***B***r (March 8, 2024 at 11:53 AM).

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!