Forum: FPGA, VHDL & Co. Fragen zum Block-Ram auslesen


von Sebastian (Gast)


Lesenswert?

Hallo

Ich möchte die Daten aus dem RAM laden und in einen std_logic_vector 
zwischenspeichern. Jetzt zu meinem Problem: Ich lade den Wert aus dem 
Speicher (Block RAM). Dies geschieht zu einem Zeitpunkt X. Anschließend 
verarbeite ich den Wert. Ein wenig später muss ich noch mal auf dem RAM 
zugreifen und erneut einen Wert laden. Da ich nicht tausend 
Zwischenvariablen haben möchte, muss ich den alten Wert durch den Neune 
ersetzen. Dies geschieht aber in einem anderen Prozess. Da nur 1 Prozess 
gleichzeitig auf den std_logic_vector zugreifen kann habe ich das ganze 
durch eine Enable-Leitung gesichert. Mein Quellcode sieht wie folgt aus:

-- A-Scan aus dem Block-Ram laden
process (USB_CLK)

begin
    if(USB_CLK'event and USB_CLK = '0')then
       if(CLR = '1')then
          S_DOUT_RAM_B1 <= (others => 'Z');
       elsif(EN = "01")then
          S_DOUT_RAM_B1 <= DOUT_RAM_B1;
       else
          S_DOUT_RAM_B1 <= (others => 'Z');
       end if;
    end if;
end process;



-- A-Scan aus dem Block-Ram laden
process (USB_CLK)

begin
    if(USB_CLK'event and USB_CLK = '0')then
       if(CLR = '1')then
          S_DOUT_RAM_B1 <= (others => 'Z');
       elsif(EN = "10")then
          S_DOUT_RAM_B1 <= DOUT_RAM_B1;
       else
          S_DOUT_RAM_B1 <= (others => 'Z');
       end if;
    end if;
end process;


Mein Problem ist das ich nicht weiß was passiert, nachdem der Wert in 
den std_logic_vector geschrieben wurde, da der std_logic_vector 
anschließend in den Tristate geschaltet wird. Bleibt der Wert solange im 
std_logic_vector vorhanden, bis der zweite Prozess, der später auftritt 
den Wert überschreibt?

Grüsse

Sebastian

von Christian P. (kron)


Lesenswert?

Beide Prozesse laufen gleichzeitig, und dadurch dürfte S_DOUT_RAM_B1
in jedem Fall auf Z landen, bzw. auf X, weil du trotzdem 2 Quellen hast.
Du müsstest (wenn ich das richtig verstehe) gewährleisten, dass z.B. der 
zweite Prozess S_DOUT_RAM_B1 nur dann Z setzt (der else-Zweig), wenn EN 
NICHT 01 ist.
Ansonsten einfach mal simulieren das Ganze, dann siehst du doch, was 
passiert.

von Falk (Gast)


Lesenswert?

@Sebastian

>Ich möchte die Daten aus dem RAM laden und in einen std_logic_vector
>zwischenspeichern. Jetzt zu meinem Problem: Ich lade den Wert aus dem

Im FPGA verwendet man intern keine Tristates. Ne einfache MUX ist das 
Mittel der Wahl (deine Tristates werden sowieso in ne MUX umgewandelt).

>anschließend in den Tristate geschaltet wird. Bleibt der Wert solange im
>std_logic_vector vorhanden, bis der zweite Prozess, der später auftritt
>den Wert überschreibt?

Auf eine Variable kann nur von EINEM Prozess schreibend zugegriffen 
werden.
Also muss jeder der zwei Prozesse, welche auf den BRAM zugreifen 
möchten, eine Variable mit seiner Adresse beschreiben. Ein dritter 
Prozess beschreibt dann das Address Select Bit, welche zwischen den 
beiden Adressen auswählt.

MFG
Falk

von Sebastian (Gast)


Lesenswert?

Danke Falk

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.