Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Einsteigerkurs FPGA-Entwicklung
#1
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:


.jpg   EP2C5-Mini-Board-TopView-720px.jpg (Größe: 157,28 KB / Downloads: 355)

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:


.jpg   USBBlaster.jpg (Größe: 8,33 KB / Downloads: 360)

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")
Zitieren
#2
Hallo Bernhard,

Ich wäre bereit...
Viele Grüße
Semir
---------------------------------
"Alle sagten: Das geht nicht. Dann kam einer der wußte das nicht, und hat es gemacht."
(Prof. Hilbert Meyer, Uni Oldenburg)
Zitieren
#3
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: 
.pdf   Lektion1.pdf (Größe: 2,32 MB / Downloads: 31)

Material für Lektion 1: 
.zip   EP2C5-core-board-test.zip (Größe: 273,1 KB / Downloads: 11)

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")
Zitieren
#4
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):

PHP-Code:
module countpro(sys_clk,led);

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

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 

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: 

PHP-Code:
module countpro(sys_clk,up_down,segment);

input sys_clk;
input up_down;

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

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

always @(posedge sys_clk)
 
   begin
        count 
<= count 1 // 50 MHz Systemtaktzaehlung 
 
       ifcount == 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 == )
 
   begin
       segment 
<= 7'b0111111;
    end
  
 if (num == 1 )
    begin
       segment <= 7'
b0001100;
 
end
  
 
if (num == )
 
   begin
       segment 
<= 7'b1011011;
    end
  
 if (num == 3 )
    begin
       segment <= 7'
b1011110;
 
   end

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

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

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

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

 end
endmodule 

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:

PHP-Code:
// 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 


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:


PHP-Code:
module countpro(sys_clk,up,down,segment,overflow);

input sys_clk;
input up;
input down;

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

output [1:0overflow
reg [1:0overflow;
 
reg [25:0count;
reg   [3:0num;


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 == )
 
 begin
 segment 
<= 7'b0111111;
  end
  
if (num == 1 )
  begin
   segment <= 7'
b0001100;
 
 end
  
if (num == )
 
 begin
 segment 
<= 7'b1011011;
  end
  
if (num == 3 )
  begin
 segment <= 7'
b1011110;
 
 end

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

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

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

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

 end
endmodule 

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")
Zitieren
#5
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.


.pdf   Lektion2.pdf (Größe: 4,07 MB / Downloads: 7)

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")
Zitieren


Möglicherweise verwandte Themen...
Thema Verfasser Antworten Ansichten Letzter Beitrag
  FAQ zum FPGA-Einsteigerkurs Bernhard45 10 535 11.08.2020, 17:51
Letzter Beitrag: Semir
  Interessenbekundung FPGA Kurs Bernhard45 24 2.313 12.02.2020, 20:17
Letzter Beitrag: Bernhard45

Gehe zu: