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
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.
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
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.)
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.