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


von Christoph (Gast)


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?

von Matthias (Gast)


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.

von Christoph (Gast)


Lesenswert?

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

von Klaus F. (kfalser)


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

von Christoph (Gast)


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:
1
...
2
architecture IMP of user_logic is
3
4
5
    component RAMB4_S8    
6
    generic (INIT_00,INIT_01,INIT_02,INIT_03,INIT_04,INIT_05,INIT_06,INIT_07,
7
      INIT_08,INIT_09,INIT_0a,INIT_0b,INIT_0c,INIT_0d,INIT_0e,INIT_0f:
8
      bit_vector(255 downto 0):=
9
      X"0000000000000000000000000000000000000000000000000000000012345678"
10
     );
11
  
12
    port (DO : out STD_LOGIC_VECTOR (7 downto 0);
13
          ADDR : in STD_LOGIC_VECTOR (8 downto 0);
14
          CLK : in STD_ULOGIC;
15
          DI : in STD_LOGIC_VECTOR (7 downto 0);
16
          EN : in STD_ULOGIC;
17
          RST : in STD_ULOGIC;
18
          WE : in STD_ULOGIC);
19
    end component; 
20
...
21
22
begin
23
      RAMB4_S8_TEST : RAMB4_S8
24
      generic map (
25
        INIT_00=>X"0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"
26
      )
27
      port map (DO => bramDataOut,
28
             ADDR => bramAddr,
29
             CLK => Bus2IP_Clk,
30
             DI => bramDataIn,
31
             EN => bramEN,
32
             RST => bramRST,
33
             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,...).

von Jan M. (mueschel)


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.

von Christoph (Gast)


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.

von Jan M. (mueschel)


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.

von Christoph (Gast)


Lesenswert?

Super! Danke Jan, das war verständlich und einleuchtend ;)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.