FPGA LED Blink

Der Arduino Anfänger Code ist es die eingebaute LED blinken zu lassen. Hier das selbe auf einem FPGA, genauer einem Spartan 6.

FGPA

Ein "Field Programmable Gate Array" wird wie ein Schaltkreis programmiert, man kann sich damit eigene integrierter Schaltkreise bauen.

Die Programmiersprache ist meist Verilog oder VHDL.  Das ist eine andere Welt im Vergleich zum C++ mit dem man die AVR´s auf einem Arduino programmiert.

Es gibt einige FPGA Entwicklungsboard, ich hab mich für das Mojo V3 entschieden da die Toolchain dafür kostenlos ist und es diverse Tutorials gibt.

Das Mojo V3 Board mit dem Spartan 6 XC6SLX9 FPGA ist durch den Alchitry Au und den Alchitry Cu ersetzt worden. Man bekommt es aber dadurch zu einem guten Preis bei diversen alternativen Anbietern.

Toolchain

Die Arduino IDE installiert den AVR-GCC gleich mit,  für das Mojo Board braucht es etwas mehr. Genauer gesagt fast 18Gb mehr. Ja das braucht ordentlich platz. Und man muss eine kostenfreie Lizenz beziehen.

Von der Xilinx, Website lädt man die ISE runter, und auch eine Lizenz. Dafür muss man sich registrieren.  Eine gute Beschreibung dafür gibt es in diesem Video: Learn FPGA #1: Getting Started

Die Mojo IDE dannach, die gibt es auf der Alchitry Website: https://alchitry.com/pages/mojo-ide

Auf der Website wird auf die neuere Alchitry Labs verwiesen, diese kann man auch nehmen, wie man möchte.

LED Blinken

Der Mojo V3 läuft mit 50MHz, daraus wird zuerst ein 1Hz Clock gemacht.  Ein Zähler läuft bis 25.000.000 und Invertiert dann den Status der LED.

Das ist Verilog, es ist einfacher damit anzufangen als der "Lucid" Sprache, Verilog ist einer der Quasi Standards und sehr weit verbreitet.

reg [24:0] counter; // used to slow the clock down
reg [8:0] led_out;  // used to store the leds

always @(posedge clk or posedge rst) begin
 if (rst == 1'b1) begin
   counter <= 0;
   led_out <= 0'b8;
 end else begin
   counter <= counter + 1;
   if (counter == 25_000_000) begin  // 1Hz Clock
     counter <= 0;
     led_out <= !led_out;
   end
 end
end 

assign led = led_out;

Man muss die Variablen beim Reset (rst) selbst auf 0 initialisieren.

Das eigentliche Blinken passiert in Zeile 12, wo der Zustand der Led invertiert wird.    Diese Variable wurde in Zeile 17 direkt den Led´s zugewiesen.

Hier der Verlgeich wie das beim Arduino aussieht:

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
}

Comments powered by CComment