ich möchte in meinem Design ein Dual Port Ram als Block Ram verwenden.
Jetzt habe ich aber das Verhalten, dass das Block Ram durch Register ersetzt wird, sobald ich den zweiten Port schreibend hinzunehme.
Sobald ich den Teil unter "if(PortB_we = '1') then" auskommentiere ist nach der Synthese das FPGA komplett voll und er macht das nicht mehr als Block Ram.
Wenn ich es weglasse, dann macht die Synthese was sie soll.
Muss ich das noch als irgendeine Option mitgeben, dass ich ein Block Ram möchte?
Um Blockrams zuverlässig zu inferieren, musst du dich mit deinem Coding-Style ziemlich akribisch an die Vorgaben des FPGA-Herstellers halten. Bei Xilinx stehen die z.B. Synthese-Guide UG901, im Kapitel "RAM HDL Coding Guidelines".
schreibt undefiniert, wenn beide Ports auf dieselbe Adresse schreiben
Dein Code:
aktualisiert den Leseausgang nur bei we=0
schreibt die Daten von Port B, wenn beide auf dieselbe Adresse schreiben
Ersteres ist evtl. noch kein Problem für die Synthese, zweiteres zwingt die Synthese Register zu nehmen (wenn sie nicht so schlau ist, da noch zusätzliche address collision-Logik einzubauen).
Daher (mindestens) drei Möglichkeiten am Beispiel Xilinx:
UG901 hat ein bisschen Licht ins Dunkel gebracht.
Da muss man deutlich mehr machen, damit das funktioniert. Da muss man mit Funktionen arbeiten und so weiter.
Das was ich brauche steht 1:1 drin. Hab ich übernommen und jetzt meckert er, dass da das Ausgangssignal mehrere Treiber hat.
Da könnte man sicher den Fehler suchen, aber das artet gleich wieder aus.
Ich gehe zurück auf den IP Generator, damit funktioniert es tadellos.
Du findest sonst unzaehlige portable TDP-RAM-HDL-Implementierungen im Netz, die mit dem VHDL93-Standard zumindest mit A, L, X und inzwischen auch yosys-unterstuetzten Architekturen korrekt uebersetzen. Bei VHDL08 wirds lustig, da gab es Diskrepanzen bei den Tools, bis zu im Detail inkorrekten Simulationen. Aeussert sich allerdings dann bei Kollisionen und Transparenz-Glitches, aber das wirst du wohl fuer den Anfang nicht brauchen. Wenn du nur mit einem Clock arbeitest und nicht auf beiden Ports schreibst, tut es auch eine einfache Simple-Dualport-Implementierung.
ich schreibe schon auf beiden Ports, aber nicht gleichzeitig.
Über das Ram übergebe ich Daten zwischen µC und FGPA in beide Richtungen.
Die AD-Werte füttert der µC rein und das FPGA rechnet damit den Rest. Das Ergebnis, gibt es dann auch wieder über das Ram zurück.
ich schreibe schon auf beiden Ports, aber nicht gleichzeitig.
Schreiben auf beiden Ports (True-Dual-Port-RAM) bieten die wenigsten FPGA-Hersteller.
Wenn das Schreiben sowieso nicht gleichzeitig stattfindet, bietet es sich an eine passende State-Machine/Multiplexer/Arbiter vor den Schreibport zu setzen.
Was mich daran stört ist die Bezeichung dual port, wo es aber nur einen Takt hat. Nach meiner Erinnerung (ich habe länger nichts mehr mit Altera gemacht) war es aber so, dass das ein true dual port RAM mit zwei unterschiedlichen Takten klarkommt und das oben dargestellte ein "normales" dual port ram ist.
Bei einem synchronen statischem TDP-RAM (mit zwei unterschiedlichen Clks) lassen sich zwei 'gleichzeitige' (TBD) Writes auf dieselbe Adresse ganz unten in der harten BRAM-Logik abfangen, gibt auch in manchen Architekturen die Option das zu aktivieren. Geht nur auf die Performance. Ansonsten ist der Inhalt der Speicherzelle beliebig korrumpiert, je nachdem wie nahe die Writes zeitlich beeinander sind. Ist allerdings gar nicht so einfach, in der HW etwas deterministisches wie in der Simulation mit exakt verstimmten Clocks zu provozieren.
Ansonsten kann man bei einem TDP-RAM natuerlich gleichzeitig auf verschiedene Adressen schreiben. Entweder stellt man mit Gray-Logik sicher, dass die Adressen nie gleich sein koennen, oder nimmt grundsaetzlich eine Pingpong-Buffer-Logik her, wenn die Daten in synchronen Paketen kommen/gehen.
Was passiert bei einem true dual port ram, wenn beide Seiten schreiben?
Naja eine Seite gewinnt. Welche verrät das Handbuch.
Im Handbuch steht "unknown", was letzlich bedeudet, das der FPGA-Designer dafür zu sorgen hat, das dergleichen nicht auftritt, wenn er an einem deterministischen Verhalten interessiert ist.
So wie der Ampel-Programmierer Sorge trägt, das nicht alle an einer Kreuzung "Grün" bekommen.