mikrocontroller.net

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


Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian Peters (kron)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Falk

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.