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
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.
@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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.