www.mikrocontroller.net

Forum: FPGA, VHDL & Co. BRAMs per EDK instanziieren


Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen!
Ich habe bzgl der BRAMs ein kleines Verständnisproblem. Ich habe eine 
Komponenten per EDK, die am PLB-Bus hängt, erzeugt und möchte jetzt von 
dort Daten in ein BRAM schreiben.

Meine Fragen:
1. sind die BRAMs auch über das Bussystem angeschlossen? Sitzen die also 
auch irgendwo am PLB-Bus gibt es eine direkte Verbindung zu meiner 
Komponente?
Hintergrund: der Bus soll möglichst wenig belastet werden.

2. wie kann ich BRAMs aus dem EDK instanziieren?

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also beim MicroBlaze werden die Block Rams nicht an den PLB oder OPB, 
sondern an den LMB (Local Memory Bus) angeschlossen. Dadurch wird der 
OPB nicht belastet, und außerdem ist die höchstmöglcihe 
zugriffsgeschwindigkeit auf den speicher gewährt. Um das zu 
instantiieren muss man einen LMB Speichercontroller ins System einfügen, 
bzw mehrere.
Ich glaub aber neben LMB gibts auch ne Komponente um BlockRam über OPB 
anzusteueren.

Wies beim PowerPC ist wieß ich leider nicht. Wenns über OPB geht, sollte 
es natürlich auch beim PowerPC gehen, ist aber langsam.

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, ganz vergessen. Ich benutze den PPC, aber schonmal danke für die 
Hilfe!

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die BlockRAMs müssen natürlich nicht über den Prozessor-Bus an deine 
Komponente angeschlossen sein.
BlockRAM ist ein Speicher-Element des FPGAs und kann mittels VHDL direkt 
instantiiert werden.
Das EDK verwendet BlockRAM um bestimmte Speicher/Caches des Prozessors 
zu bauen, aber die nicht verwendeten BRAMs stehen frei zur Verfügung.
Wenn deine Komponente eigenes BRAM benötigt um für sich Daten abzulegen, 
dann brauchst Du nur BRAM Elemente instantiieren, und die Schnittstelle 
(Adressen  und Daten) musst Du selber schreiben.

Klaus

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry... hatte erst jetzt deine Antwort gelesen Klaus. Trotzdem danke 
für die   Antwort.
Für alle die es interessiert, hier ein Beispiel, mit dem ich erfolgreich 
getestet habe:
...
architecture IMP of user_logic is


    component RAMB4_S8    
    generic (INIT_00,INIT_01,INIT_02,INIT_03,INIT_04,INIT_05,INIT_06,INIT_07,
      INIT_08,INIT_09,INIT_0a,INIT_0b,INIT_0c,INIT_0d,INIT_0e,INIT_0f:
      bit_vector(255 downto 0):=
      X"0000000000000000000000000000000000000000000000000000000012345678"
     );
  
    port (DO : out STD_LOGIC_VECTOR (7 downto 0);
          ADDR : in STD_LOGIC_VECTOR (8 downto 0);
          CLK : in STD_ULOGIC;
          DI : in STD_LOGIC_VECTOR (7 downto 0);
          EN : in STD_ULOGIC;
          RST : in STD_ULOGIC;
          WE : in STD_ULOGIC);
    end component; 
...

begin
      RAMB4_S8_TEST : RAMB4_S8
      generic map (
        INIT_00=>X"0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"
      )
      port map (DO => bramDataOut,
             ADDR => bramAddr,
             CLK => Bus2IP_Clk,
             DI => bramDataIn,
             EN => bramEN,
             RST => bramRST,
             WE => bramWE); 


Diese "Templates" nennen sich primitive und es gibt in den 
entsprechenden Datenblättern der FPGAs Kapitel über die unterstützten 
RAM/ROM-Strukturen.
Ich bin mir nur noch nicht ganz sicher was das mit den Initialisierungen 
auf sich hat (INIT_00,...).

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich bin mir nur noch nicht ganz sicher was das mit den Initialisierungen
>auf sich hat (INIT_00,...).

Das sind die Werte, die beim Programmieren des FPGA in die BRAMs geladen 
werden.

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Jan!
Soweit ist mir das auch klar, aber was sollen die Werte bei component 
und dann nochmal die bei der eigentlichen Instanziierung?
Bei mir sind immer die Werte der Instanziierung in dem BRAM.

Autor: Jan M. (mueschel)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Die Werte bei der component kannst du prinzipiell weglassen - Alle 
generics müssen genauso wie die Ports in der Component angegeben sein 
und können hier schon mit default-Werten belegt werden. Die eigentliche 
Wert- bzw. Signalzuweisung findet dann bei der Instanziierung statt.
Würdest du zwei BRAMs mit den selben Daten haben wollen, bräuchtest du 
diese Daten beispielsweise nur in der component angeben und lässt sie 
bei der Instanziierung dann weg, das spart Schreibarbeit.

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super! Danke Jan, das war verständlich und einleuchtend ;)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.