Forum: FPGA, VHDL & Co. 32 Bit Block RAM erzeugen - Xilinx


von FPGA-Einsteiger (Gast)


Lesenswert?

Guten Tag,

ich beschäftige mich seit ein paar Tagen mit FPGA's (Xilinx Artix 7 mit 
Vivado, VHDL). Jetzt bin ich grade beim Block RAM angekommen und hab es 
auch schon geschaft ein Block-RAM zum laufen zu bekommen. Dabei hatten 
Adress und Daten-Bus 16 Bit. Nun hab ich versucht den Datenbus auf 32 
Bit auf zu bohren, aber dann erzeugt Vivado kein Block-RAM mehr sondern 
Distributed-RAM. Ich achte natürlich darauf, dass das Array nicht zu 
groß wird. (Max 1800kb (50 x 36kb) BRAM).

1
entity Test is
2
    Generic( AddrWidth: INTEGER := 16;
3
             DataWidth: INTEGER := 32 );
4
    Port ( Clk : in STD_LOGIC;
5
           Write : in STD_LOGIC;
6
           Addr : in STD_LOGIC_VECTOR ((AddrWidth - 1) downto 0);
7
           DataIn : in STD_LOGIC_VECTOR ((DataWidth - 1) downto 0);
8
           DataOut : out STD_LOGIC_VECTOR ((DataWidth - 1) downto 0));
9
end Test;
10
11
architecture Test_Behavioral of Test is
12
    type BRAM is array((((1800 * 1024) / DataWidth) - 1) downto 0) of STD_LOGIC_VECTOR(DataWidth - 1 downto 0);
13
    signal mem: BRAM;
14
begin
15
16
    process(Clk)
17
    begin
18
        if rising_edge(Clk) then
19
            if Write = '1' then
20
                mem(to_integer(UNSIGNED(Addr))) <= DataIn;
21
            end if;
22
            
23
            DataOut <= mem(to_integer(UNSIGNED(Addr)));
24
        end if;
25
        
26
    end process;
27
end Test_Behavioral;

Vielleicht kennt sich hier ja jemand mit dem Block-RAM aus?

von jibi (Gast)


Lesenswert?

>if rising_edge(Clk) then

du brauchst hier einen synchronen Prozess...

Gruß J

von Bit Wurschtler (Gast)


Lesenswert?

jibi schrieb:
>>if rising_edge(Clk) then
>
> du brauchst hier einen synchronen Prozess...
>
> Gruß J

Hat er doch?!

von The Expert (Gast)


Lesenswert?

BlockRAMs werden nicht erzeugt, sondern inferiert, da sie real eh schon 
da sind und nicht geändert werden können.

von Bit Wurschtler (Gast)


Lesenswert?

FPGA-Einsteiger schrieb im Beitrag #4492327:
> dass das Array nicht zu
> groß wird. (Max 1800kb (50 x 36kb) BRAM).

http://www.xilinx.com/support/documentation/user_guides/ug473_7Series_Memory_Resources.pdf


S.27 check mal ob du bei 32bit datenbusbreite 36kb zur Verfügung hast.
und ob 32 bit wirklich so realisierbar ist.

Und auf S. 13 kannst du checken ob dein FPGA überhaupt 50 BRAM's hat. 
Dann wäre noch zu klären ob die auch alle frei sind. Check doch mal den 
Synthese Report. Alternativ kannst du dich ja bei der type -decla
type BRAM is array((((1800 * 1024) / DataWidth) - 1) downto 0) of 
STD_LOGIC_VECTOR(DataWidth - 1 downto 0);

so langsam hochtasten. Versuch erst mal einen  BRAM -Block 32kbit @ 
32bit zu allokieren.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Bit Wurschtler schrieb:
> S.27 check mal ob du bei 32bit datenbusbreite 36kb zur Verfügung hast.
> und ob 32 bit wirklich so realisierbar ist.
Wenn man an die Obergrenze kommt, dann darf man sich nicht wundern, dass 
einem 1/9 des Speichers fehlt: das 9. Bit ist in die Marketingzahlen 
eingepreist (so kommen die 9, 18, 36, 72 Bit Wortbreite zustande), es 
kann aber so einfach nicht auf 32 Breite "umgemappt" werden...

von The Expert (Gast)


Lesenswert?

Richtig, man hat - wenn man es gebrauchen kann - z.B. 9 RAMs mit 32Bit 
statt nur 8, wenn man die Bits orthogonal aufzieht.

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.