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.