Forum: FPGA, VHDL & Co. Problem mit Dual Port BRAM


von Michael (Gast)


Lesenswert?

Hallo,

ich habe hier ein kleines Problem mit Vivado 2015.2.1.

Wenn ich einen dual port BRAM so beschreibe:
1
process(clka)
2
begin
3
    if(clka'event and clka = '1') then
4
        if(ena = '1') then
5
            if(wea = '1') then
6
                ram_name(to_integer(unsigned(addra))) <= dina;
7
            end if;
8
            ram_data_a <= ram_name(to_integer(unsigned(addra)));
9
        end if;
10
    end if;
11
end process;
12
13
process(clka)
14
begin
15
    if(clka'event and clka = '1') then
16
        if(enb = '1') then
17
            if(web = '1') then
18
                ram_name(to_integer(unsigned(addrb))) <= dinb;
19
            end if;
20
        ram_data_b <= ram_name(to_integer(unsigned(addrb)));
21
        end if;
22
    end if;
23
end process;

dann funktioniert das in FPGA hervorragend. Bei der Simulation 
funktioniert aber das schreiben auf den Speicher nicht. Überall wo eine 
'1' geschrieben wird steht nachher im Speicher 'X'.

Schreibe ich beide Schreibzugriffe in einen Prozess funktioniert die 
Simulation aber die Synthese schlägt fehl. Der Block wird nicht mehr als 
BRAM erkannt.

Wie mache ich es richtig ohne auf einen fertigen BRAM Block von Xilinx 
zuzugreifen?

Danke Michael

von VHDL hotline (Gast)


Lesenswert?

Dann ist deine Simulation falsch ;-) .

Ne mal im Ernst, woher sollen wir ohne deine Testbench wissen, was du da 
in der Sim machst? Vermutlich vergisst du wea/web/ena/enb auf '1' zu 
setzen oder du schreibst immer mit beiden Ports an die gleiche Adresse.

von Sebastian U. (sebp20)


Lesenswert?

Hallo,

wie ist der Ram definiert und welchen Simulator verwendest du?

Ich hatte ein ähnliches Problem und habe den RAM als shared variable 
definiert. Hängt aber vom Simulator ab.

Grüße
Sebastian

von Michael (Gast)


Lesenswert?

Hallo,

der Ram wird so definiert:
1
type ram_type is array (C_RAM_DEPTH-1 downto 0) of std_logic_vector(C_RAM_WIDTH-1 downto 0);
2
signal ram_name : ram_type := (others => std_logic_vector(to_signed(0, C_RAM_WIDTH)));
Als Simulator nutze ich den integrierten in Vivado.

Danke

Michael

von Christian R. (supachris)


Lesenswert?

Für Dual Ported RAM muss das aber schon als shared Variable deklariert 
sein. Sonst geht der Simulator davon aus, dass zwei Quellen ein Signal 
treiben und gibt dir völlig korrekt das X aus. Der Sythesizer kann das 
sicherlich erkennen, dass du in Wirklichkeit einen DP RAM beschreibst.

Ich hab das so:
1
--True Dual Ported RAM according to XST User Guide
2
type  ram_type  is  array  (0  to  MEMORY_SIZE - 1)  of  std_logic_vector  (15  downto  0);
3
shared  variable  RAM  :  ram_type;

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.