#fpga

Photo of the Board

Das EP2C5T144 Development Board ist für unter 20€ unter anderem bei eBay und Amazon erhältlich. Leider ist der Einstieg in die Programmierung dieses Boards mit VHDL nicht ganz einfach. Diese Seite listet Ressourcen auf, die mir beim Einstieg geholfen haben.

Schaltplan und Pins

Eigentlich ist der Schaltplan recht selbsterklärend. Fast alle Pins sind auf die vier langen Pinheader rausgeführt. Allerdings gibt es folgende Besonderheiten:

Besondere Pins

  • PIN144 ist über den Taster mit GND verbunden (falls der Taster benutzt werden soll, muss ein Pull-Up-Widerstand einprogrammiert werden).
  • PIN17 ist mit dem 50MHz-Oszillator verbunden.
  • PIN3, PIN7, PIN9 sind jeweils über eine LED mit VCC3.3 verbunden.

Nicht nutzbare Pins

  • PIN26 ist über R1 (0Ω) fest mit VCC1.2 verbunden.
  • PIN27 ist über R2 (0Ω) fest mit GND verbunden.
  • PIN80 ist über R9 (0Ω) fest mit GND verbunden.
  • PIN81 ist über R10 (0Ω) fest mit VCC1.2 verbunden.
  • PIN73 ist über R13 (10kΩ) mit VCC3.3 und über C14 (10µF) mit GND verbunden.

Diese Pins können daher nicht als I/O Pins benutzt werden. Man kann die 0Ω-Widerstände mit etwas Geschick aber entfernen. Laut land-boards.com sind diese Pins so komisch angeschlossen, um auch mit einem anderen FPGA, dem EPC28, kompatibel zu sein.

Programmierung

Die Programmierung erfolgt mit der kostenlosen Quartus II Software. Allerdings unterstützten aktuelle Versionen den genutzten FPGA nicht mehr. Die letzte Version, die den FPGA unterstützut, ist Quartus 13.0SP1. Die Software kann hier heruntergeladen werden: https://fpgasoftware.intel.com/13.0sp1/?edition=subscription&platform=windows

Setup

  1. Klick auf “Create a New Project”
  2. Klick auf “Next”
  3. Namen und Speicherort für das Projekt vergeben, danach Klick auf “Next”
  4. Klick auf “Next”
  5. FPGA auswählen, danach Klick auf “Next”
  6. Klick auf “Next”
  7. Klick auf “Next”
  8. Das erstellte Projekt wird geöffnet.

Als nächstes sollte noch eine wichtige Option geändert werden. Standardmäßig werden alle nicht benutzten Pins nämlich mit GND verbunden. Das führt aber zu einem Kurzschluss, da wie oben beschrieben einige Pins ja mit VCC verbunden sind. Daher sollte man in den “Device”-Einstellungen einstellen, dass alle unbenutzten Pins als “input tri-stated” programmiert werden:

  1. Rechtsklick auf das Projekt, dann auf “Device…”
  2. Klick auf “Device and Pin Options…”
  3. Klick auf “Unused Pins” und dann Auswahl von “As input tri-stated”

Desweiteren kann man in den Einstellungen noch den VHDL-Standard auf “VHDL 2008” stellen, um modernere VHDL-Features nutzen zu können:

  1. Rechtsklick auf das Projekt, dann auf “Properties…”
  2. Auswahl von “VHDL 2008”

Top-Level Entity Erstellung und Pin Planner

  1. Wir erstellen nun eine Top-Level Entity, die den gleichen Namen wie das Projekt hat:
  2. Zum Testen lassen wir die LEDs mittels eines Möbiuszählers blinken. Während der Knopf gedrückt wird, invertieren wir die Signale.
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
     
    entity VHDLTest is
    port(
      clk		: in 	std_logic;
      btn_n		: in	std_logic; -- Per Konvention fügen wir an alle Signale mit negativer Logik ein _n suffix an.
      leds_n	: out	std_logic_vector(3 downto 1)
    );
    end VHDLTest;
     
    architecture arch of VHDLTest is
      signal led_state : std_logic_vector(3 downto 1) := "000";
    begin
      leds_n <= led_state when btn_n = '1' else not led_state;
     
      process(clk, led_state)
        variable counter : integer range 1 to 50000000 	:= 1;
      begin
        if rising_edge(clk) then
          counter := counter + 1;
          if counter = 50000000 then
            led_state <= led_state(2 downto 1) & not led_state(3);
          end if;
        end if;
      end process;
    end arch;
    
  3. Wir speichern die neue Datei mit dem gleichen Namen wie das Projekt.
  4. Nun können wir das Design testweise kompilieren:
  5. Das sollte klappen und mit folgender Meldung bestätigt werden:
  6. Bevor wir das Design auf das Board übertragen können, müssen wir noch alle Ein- und Ausgangssignale der Top-Level Entity den entsprechenden Pins zu weisen. Dazu öffnen wir den Pin Planner:
  7. Für uns sind nur die beiden Spalten “Location” und “Weak Pull-Up Resistor” relevant. Hier werden den Signalen die physischen Pins zugeordnet. Wir wählen die Pins natürlich so, wie sie auf unserem Board belegt sind. Danach schließen wir den Pin Planner wieder:
  8. Nun können wir nochmal kompilieren und sollten eine Warnung weniger erhalten. Die verbleibenden Warnungen können wir getrost ignorieren:

Programmieren über JTAG

Die Programmierung über JTAG ist nicht persistent, d.h. nach dem nächsten aus- und anschalten des Board läuft wieder das im EEPROM auf dem Board gespeicherte Programm.

  1. Um das Design auf das Board zu übertragen, schließen wir den USB-Blaster an den Computer an und verbinden ihn mit dem rechten “JTAG” Sockel auf dem Board. Danach öffnen wir den Programmer. Dort stellen wir sicher, dass “JTAG” ausgewählt ist und klicken danach auf “Hardware Setup”:
  2. Hier sollte der USB-Blaster auftauchen, den wir unter “Currently selected hardware” auswählen:
  3. Nun können wir das Design per Klick auf “Start” auf das Board übertragen:

Programmieren des EEPROM

Um ein Design dauerhaft auf dem FPGA zu speichern, müssen wir den EEPROM auf dem Board programmieren.

  1. Zuerst stellen wir den “Mode” von “JTAG” auf “Active Serial Programming”. Die ggf. erscheinende Warnung können wir ignorieren:
  2. Nun müssen wir über “Add File” die “VHDLTest.pof“-Datei auswählen:
  3. Schließlich wählen wir sowohl “Program/Configure” als auch “Verify” aus und klicken abschließend auf “Start”:

Achtung: Das Design wird erst gestartet, wenn man den USB-Blaster wieder in den JTAG-Port steckt oder ausstöpselt.

Downloads und weitere Dateien

Alle Dateien befinden sich in meinem GitHub Repository im Ordner EP2C5T144.

Enthaltene Dateien: