mikrocontroller.net

Forum: FPGA, VHDL & Co. 2 Block-Rams in einer Entity


Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo @all,

mal eine Frage, und ich hoffe sie ist nicht zu doof gestellt (bzw. das
die Frage so simpel ist das keiner drauf antwortet :-)) :

Ich möchte 2 von den 12 Block-RAMS aus dem Spartan 3 in einer Entity
verwenden.
Sprich : mir reicht der 1k*18 nicht, ich möchte 2k*18 haben.
Also 2 Instanziierungen klappen noch, die beiden IN-ports sind ja auch
kein problem, aber wie sieht das aus mit dem Data-Out Port.
Muß ich den unbedingt multiplexen ? (kost ja laufzeit und logik)

So in etwa hatte ich mir das vorgestellt :

entity ram is
  ...
  addr : in  std_logic_vector (11 downto 0);
  din  : in  std_logic_vector (7 downto 0);
  dout : out std_logic_vector (7 downto 0);
  wen  : in  std_logic;
  ena  : in  std_logic
end entity;

architecture ...
  ...

  BLOCK_RAM_1 : RAMB16_S9_S9 port map (
       addr => addr (11 downto 0),
       din  => din,
       dout => dout,
       wen  => wen,
       ena  => not addr (0) and ena
       ...
      );


  BLOCK_RAM_2 : RAMB16_S9_S9 port map (
       addr => addr (11 downto 0),
       din  => din,
       dout => dout,
       wen  => wen,
       ena  =>     addr (0) and ena
       ...
      );

...

Bräuchte ich extra noch 2 8 bit-vektoren zwischen denen ich dann im
ausgang hin und her schalte und spare mir dann so das enable für das
jeweilge Block-Ram oder kann ich die out-ports doch
"aufeinander"-legen (ähnlich wie beim datenbus)

Habe beim synthetisieren immer das problem des Multi-Source :-((

Gruß
Rene

Autor: FPGA-User (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
für die Datenausgänge wirst Du schon einen MUX brauchen,
die RAMs sind ja von Natur aus nicht mit Tristate-Funktion
ausgestattet.

Also nimm ein Signal (wie Du das schon beim ena gemacht hast)
und schalte damit den Ausgangs-Multiplexer, z.B.:

ram1_selected <= not addr (0) and ena;

ram_out <= ram_out1 when ram1_selected='1' else ram_out2;

18bit Breite sollten kein Problem sein - welche Laufzeiten
bzw. Taktfreq. musst Du schaffen?

Evt. gleich wieder ein Register hinter den MUX setzen, wenn
das von der Funktion her möglich ist, falls das Signal direkt
zu FPGA-Pins führt, dann ein entspr. Timing-Constraint setzen
und schauen, was der Timing-Analyzer nach der Synthese sagt.

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo fpga user

erstmal danke. hatte ich mir schon fast gedacht das es an dem tri-state
scheitern könnte :-((
laufzeit ist erstmal nicht so kritisch.
es geht um ein vga-text-interface. ich brauche 2 (bzw. 3) blockrams um
den text zu speichern. insgesamt brauche ich 4800 byte (ich weiß,
hässliche krumme zahl :-), aber es kommt leider so aus bei 640*480) und
da brauche ich dann 3 blockrams (wenn ich nicht ein paar zeilen
abschneide um mit 2 blockrams auszukommen)

im moment dümpel ich mit schlappen 25 mhz vor mir hin. timing ist da
erstmal nicht das problem.
für spätere anwendungen (z.b. dsp) wird das timing u.u. kritischer.

gruß
rene

Autor: FPGA-User (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, bei 25MHz seh ich auch kein Problem,

die ENA-Signale würde ich aber mit den MSBs der Adresse erzeugen
und die LSBs alle parallel an die RAM-Blöcke legen

(im Beispiel hast Du addr(0) verwendet, was im Prinzip auch
geht, aber wenn Du lineare Adressen hast dann wird ständig
wechselweise auf die RAMs geschrieben bzw. gelesen.)

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Fpga User.

Danke noch für den Hinweis. Allerdings fehlte noch eine Information
meinerseits : Die Block-Rams sind als Dual-Port ausgelegt :-))
Von daher denke ich es es egal. Hauptsache die VGA-Seite hält sich auch
daran, sonst gibts Text-Salat :-))

Aber danke für die prompten Antworten. Find ich echt klasse an diesem
Forum.
Werde wohl auch noch öfter Fragen und wahrscheinlich mal ein kleines
Tutorial für Anfänger fertig machen (von wegen synchron, asynchron
Statemachines, generelle Prinzipien), damit ich auchmal einen
Hilfe-Beitrag leisten kann (sonst schlechtes gewissen hat :-))

Gruß
Rene

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.