Dual-Port-RAM auf Altera und Xilinx FPGA

Ich habe es immer geschafft, einen 256 x 32 Bit Dual-Port-RAM (kein echter Dual-Port-RAM) in Xilinx ISE mit nur 1 x 18K BRAM zu synthetisieren.

Der Beispielcode von hier wurde verwendet:

-- A parameterized, inferable, true dual-port, dual-clock block RAM in VHDL.

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity bram_tdp is
generic (
    DATA    : integer := 72;
    ADDR    : integer := 10
);
port (
    -- Port A
    a_clk   : in  std_logic;
    a_wr    : in  std_logic;
    a_addr  : in  std_logic_vector(ADDR-1 downto 0);
    a_din   : in  std_logic_vector(DATA-1 downto 0);
    a_dout  : out std_logic_vector(DATA-1 downto 0);

    -- Port B
    b_clk   : in  std_logic;
    b_wr    : in  std_logic;
    b_addr  : in  std_logic_vector(ADDR-1 downto 0);
    b_din   : in  std_logic_vector(DATA-1 downto 0);
    b_dout  : out std_logic_vector(DATA-1 downto 0)
);
end bram_tdp;

architecture rtl of bram_tdp is
    -- Shared memory
    type mem_type is array ( (2**ADDR)-1 downto 0 ) of std_logic_vector(DATA-1 downto 0);
    shared variable mem : mem_type;
begin

-- Port A
process(a_clk)
begin
    if(a_clk'event and a_clk='1') then
        if(a_wr='1') then
            mem(conv_integer(a_addr)) := a_din;
        end if;
        a_dout <= mem(conv_integer(a_addr));
    end if;
end process;

-- Port B
process(b_clk)
begin
    if(b_clk'event and b_clk='1') then
        if(b_wr='1') then
            mem(conv_integer(b_addr)) := b_din;
        end if;
        b_dout <= mem(conv_integer(b_addr));
    end if;
end process;

end rtl;

Ich habe versucht, dasselbe für Altera zu tun, aber das Kompilieren gibt mir Zahlen, die 2 x M20K RAM erfordern.

Sollte es nicht nur 1 x M20K erfordern? Wie kann ich das tun, ohne auf andere Ressourcen wie andere MLAB zurückzugreifen?

Hat es aus einem Paar einzelner Ports einen echten Dual-Port abgeleitet? Ich hatte kürzlich einige Probleme, in Quartus auf einen echten Dual-Port-RAM zu schließen, und ich musste den RAM in ein separates Modul stecken, damit er richtig synthetisiert wird. Die ide ist vielleicht besser als ise, aber der Synthesizer ist Mist.
Ich empfehle die Verwendung des altsyncramMakros von altera_mf. Es ist ein Makro, um den richtigen RAM zu generieren.
Bitte zeigen Sie den Code, den Sie zum Ableiten des RAM verwendet haben.
Ich habe überprüft und 256x32b ist eine unterstützte Konfiguration. 40b ist die maximale Breite für einen M20K.
Ich habe den folgenden VHDL-Code von danstrother.com/2010/09/11/inferring-rams-in-fpgas verwendet. Tut mir leid, ich habe keine Ahnung, wie ich den Code hier einfügen soll, indem ich die Markdown-Sprache verwende und die Wortgrenze nicht überschreite.
Sie sollten Ihrer Frage das spezifische FPGA-Gerät hinzufügen. Es scheint eine Stratix V zu sein, die laut dieser Bedienungsanleitung die einzige M20K in Familienbesitz ist .
Ja, es ist ein Statix ​​V, ich denke, Tom Carpenter hat meine Frage perfekt beantwortet. Danke Tom Carpenter, du warst eine wirklich große Hilfe! Vor allem für die Änderung meiner Frage. Sie haben mir gezeigt, wie ich meinen Code in Zukunft einbetten kann. Ich habe gerade festgestellt, dass es bei mir vorher nicht funktioniert hat, weil ich die Formatierung im Antwortbereich für Kommentare ausprobiert habe.

Antworten (2)

Ich habe jetzt auch gerade versucht, für einen Stratix V mit Quartus 15.0 zu kompilieren, der M20K-Blöcke hat, und Sie haben Recht - es schließt zwei M20Ks, was nicht der Fall sein sollte. Tatsächlich schließt die Verwendung des Verilog-Testcodes, den ich gerade aus meiner Antwort entfernt habe, auch zwei M20Ks.


Warum? Die wahren Dual-Port-Anforderungen

Ein Single-Port-RAM der Größe, an der Sie interessiert sind, sollte in einen einzelnen M20K passen, da er Breiten von bis zu 40 Bit unterstützen kann. Für einfachen Dual-Port-Modus sollte es auch passen - in diesem Modus hat man einen Leseport und einen Schreibport.

Single-Port-Konfiguration

Bildquelle: Stratix V Device Handbook, Abschnitt 2-9

Im True Dual-Port-Modus passt es jedoch nicht. Der Grund dafür ist, dass die M20Ks nur einen 40 Bit breiten Leseweg und einen 40 Bit breiten Schreibweg haben. Beim Betrieb im True Dual-Port-Modus müssen diese Wege zwischen den Ports geteilt werden – mit anderen Worten, jeder Port kann nur 20 Bit breit sein.

Echte Dual-Port-Breite

Bildquelle: Stratix V Device Handbook, Abschnitt 2-9

Aufgrund dieser gemeinsamen Pfade sind zwei M20Ks erforderlich, um den Arbeitsspeicher zu bestücken. Wenn Sie im Single-Port-Modus oder im einfachen Dual-Port-Modus arbeiten, wäre nur 1 erforderlich.

Tut mir leid, ich habe keine Ahnung, wie ich den Code hier einfügen soll, indem ich die Markdown-Sprache verwende und die Wortgrenze nicht überschreite.

Es scheint, dass Sie eine Stratix V verwenden, die laut dem Embedded Memory User Guide von Altera die einzige FPGA-Familie mit M20K-Speicherblöcken ist.

Gemäß Tabelle 2-8 des Stratix V Device Handbook Volume 1 beträgt die maximale Datenbreite eines M20K im echten Dual-Port-Modus 20 Bit. Somit werden für einen 32-Bit-Datenbus zwei M20K benötigt.

Nur im einfachen Dual-Port- Modus unterstützt der M20K eine Datenbreite von bis zu 40 Bit, wie in Tabelle 2-7 aufgeführt.