Assignment Chef icon Assignment Chef
All German tutorials

Programming lesson

Einführung in FPGA-Speicherblöcke mit M10K: Ein Tutorial zu Ee371 Lab 2

Lerne, wie du mit M10K-Speicherblöcken auf dem DE1-SoC-Board RAM-Module in SystemVerilog implementierst. Dieses Tutorial führt dich durch die wichtigsten Konzepte und Aufgaben aus Lab 2 – ideal für Studierende der Digitaltechnik.

FPGA Speicherblöcke M10K Block 32x3 RAM SystemVerilog Speicher Quartus IP Catalog altsyncram DE1-SoC Tutorial Ee371 Lab 2 Lösung Speicheraspektverhältnis synchrones RAM Design Testbench ModelSim Memory Initialization File getrennte Lese Schreibports FPGA Laborübung digitale Schaltungstechnik Embedded System Design

FPGA-Speicherblöcke verstehen: M10K und die 32×3-RAM-Architektur

In modernen FPGAs wie dem Cyclone V auf dem DE1-SoC-Board sind dedizierte Speicherressourcen integriert. Die M10K-Blöcke bieten jeweils 10240 Bit und können flexibel als RAM oder ROM konfiguriert werden. In diesem Tutorial lernst du, wie du mit diesen Blöcken einen 32×3-Speicher (32 Wörter à 3 Bit) aufbaust – eine typische Aufgabe aus dem Ee371 Lab 2. Das Verständnis von FPGA-Speicherblöcken ist essenziell für die Hardwarebeschreibung mit SystemVerilog und die Quartus-IP-Integration.

Warum M10K-Blöcke? Ein Blick auf die Hardware

Stell dir vor, du entwickelst eine KI-gestützte Anwendung auf einem FPGA: Jeder M10K-Block kann als schneller Pufferspeicher für neuronale Netze dienen. Die 32×3-RAM-Architektur ist perfekt, um Konzepte wie Speicheraspektverhältnis und Register-Synchronisation zu üben. Die M10K-Blöcke besitzen integrierte Register für alle Ein- und Ausgänge sowie getrennte Lese- und Schreibports – ideal für synchrones RAM-Design.

Aufgabe 1: Speicher aus der IP-Bibliothek

Der schnellste Weg zu einem funktionierenden RAM ist die Nutzung des Quartus IP Catalog. Folge diesen Schritten:

  1. Erstelle ein neues Quartus-Projekt.
  2. Öffne den IP Catalog und wähle altsyncram aus.
  3. Konfiguriere den Speicher mit 3 Bit Breite und 32 Wörtern.
  4. Deaktiviere die Register für die Datenausgabe – so erhältst du die Struktur aus Abbildung 1b.
  5. Generiere das IP-Modul ram32x3.

Erstelle dann ein SystemVerilog-Top-Level-Modul, das dieses IP instanziiert. Vergiss nicht, die Testbench für die Simulation in ModelSim zu schreiben. Ein häufiger Fehler: Die Meldung „Instantiation of 'altsyncram' failed“ – dann fehlt die Altera-Bibliothek in ModelSim. Füge sie unter Simulate → Start Simulation → Libraries hinzu.

Aufgabe 2: Speicher in reinem SystemVerilog

Statt vorgefertigter IP kannst du den Speicher auch direkt als multidimensionales Array beschreiben:

logic [2:0] memory_array [31:0];

Dieses Array wird bei synchronem Lesen automatisch auf M10K-Blöcke abgebildet. Schreibe ein Modul mit den gleichen Ports wie in Aufgabe 1 und verwende die DE1-SoC-Schnittstelle: Schalter SW[4:0] für die Adresse, SW[7:5] für die Dateneingabe, KEY[0] als Write-Enable und KEY[1] als Takt. Zeige die Ausgabe auf den 7-Segment-Anzeigen HEX0 und HEX1 an. Ein 7-Segment-Decoder ist bereits vorgegeben – passe ihn bei Bedarf an.

Teste dein Design auf dem DE1-SoC über LabsLand. Wähle die Standard-Oberfläche (nicht Breadboard).

Aufgabe 3: Getrennte Lese- und Schreibports

In vielen Anwendungen – etwa einem Grafikspeicher für ein Retro-Spiel – benötigt man unabhängige Adressports für Lesen und Schreiben. Nutze dazu das IP altsyncram erneut, aber aktiviere die Option „Separate read/write addresses“. Konfiguriere die gleiche Größe (32×3) und deaktiviere die Ausgangsregister. Zusätzlich lernst du, wie du eine Memory Initialization File (MIF) erstellst, um den Speicher vorzubelegen. Beispiel für eine MIF:

DEPTH = 32;
WIDTH = 3;
ADDRESS_RADIX = HEX;
DATA_RADIX = BIN;
CONTENT
BEGIN
0 : 101;
1 : 010;
...
END;

Lade die MIF in das IP und simuliere das Verhalten. Beachte: Bei „read-during-write“ gibt es verschiedene Modi – wähle „old data“ oder „new data“ je nach Anforderung.

Fehlerbehebung und Tipps für die Praxis

  • ModellSim-Bibliotheksfehler: Füge altera_mf_ver und altera_lnsim_ver hinzu.
  • Synthese-Warnungen: Ignoriere Warnungen zu „timeunit/timeprecision“ – sie sind harmlos.
  • Timing-Probleme: Stelle sicher, dass der Takt (clock) korrekt angeschlossen ist.

Mit diesen Aufgaben beherrschst du die Grundlagen der FPGA-Speicherimplementierung – eine Schlüsselkompetenz für Embedded-System-Design und digitale Schaltungstechnik. Viel Erfolg im Labor!