mikrocontroller.net

Forum: FPGA, VHDL & Co. Altera RAM Parameter in VHDL Code angeben


Autor: Matthias Nix (vbchaos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

ich quael mich schon laenger mit RAMs in Altera herum. Wobei es nicht um 
deren Verwendung an sich geht, das klappt einwandfrei, es geht mehr 
darum, die Modul-Bauweise ordentlich einzupflegen.
Im aktuellen Fall geht es um einen Video Filter, der eine Bildzeile 
Delay erzeugt. Die Zeile muss dadurch natuerlich gebuffert werden, und 
das mach ich mit einem RAM. Funktioniert auch fein, allerdings ist das 
RAM mit dem MegaWizzard generiert und dadurch in allen Parametern 
fixiert. Der Filter soll aber so aufgebaut werden, dass er auch auf 
andere Video Domains gesetzt werden kann (groesserer oder kleinerer 
Frame z.B.), wodurch die laenge und/oder Tiefe des RAMs natuerlich 
verandert werden muss. Das VHDL Modul wird via Generics an die Video 
domain angepasst, sprich Anzahl pixels per Zeile, Anzahl Zeilen per 
Frame, Video bitbreite etc.

Wie ist es jetzt hinzubekommen, dass ich im Modul-Code das RAM 
initialisiere und als Parameter dafuer die Generics benutze?
Die einzige Moeglichkeit, die ich bisher gefunden habe, ist das 
"ramstyle" Attribut. Allerdings wird das RAM dann in Logic Cells 
synthetisiert (was zugegeben etwas umstaendlich ist).
Wenn mich nicht alles taeuscht kriegt der Synthesizer Probleme damit, 
dass ich das RAM auf zwei verschiedenen Adressen lese und gleichzeitig 
schreibe.

Wenn ich normal ein MegaWizzard RAM einbinde (altsyncram als dualport) 
ist das ganze hingegen kein Problem.
    -- Address with offset of 1, reads ahead of write pointer
    s_line_rdaddress  <= to_unsigned (s_pixel_cnt + 1, G_BUFFER_ADRS_WIDTH);
    s_line_wraddress  <= to_unsigned (s_pixel_cnt, G_BUFFER_ADRS_WIDTH);

    
    line_buffer: entity work.dpr_linebuffer(SYN) 
        port map
        (
            clock           =>  i_clk,
            data            =>  std_logic_vector (s_line_data),
            rdaddress       =>  std_logic_vector (s_line_rdaddress),
            wraddress       =>  std_logic_vector (s_line_wraddress),
            wren            =>  '1', 
            unsigned (q)    =>  s_line_q
        );

Hier noch eben mein Versuch mit dem RAMSTYLE Attribut:
type t_line_buffer is array (0 to G_NMBR_HOR) of unsigned (G_VIDEO_WIDTH - 1 downto 0);
signal s_line_buffer    : t_line_buffer := (others => (others => '0'));
    attribute ramstyle                  :   string;
    attribute ramstyle of s_line_buffer :   signal is "M9K";
Die Zugriffe (lesen und schreiben) sind entsprechend dem ersten 
Codeschnipsel (also write und read address)
Das ganze rennt auf einem cyclone 3, wir benutzen Quartus II 9.1

Ich hoffe die Problemstellung ist einigermassen zu verstehen. Ich hab 
das ganze mit Xilinx auch schon mal hinbekommen vor ein paar Jahren, 
aber bei Altera stehe ich gerade irgendwie ziemlich doof da, wobei es 
wahrscheinlich einfach nur am richtigen Attribut scheitert.

Danke im Vorraus schonmal fuer Denkanstoesse

Autor: Stefan R. (stefripp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei vielen Altera IP-Cores gibt es im Manual weit hinten eine 
Beschreibung, wie du das Modul ohne den Megawizzard mit VHDL/Verilog 
konfigurieren kannst.

Autor: Matthias Nix (vbchaos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Scheint darauf hinauszulaufen, dass ich die Generics an die RAM-Instanz 
durchgeben muss.
Ich probier mal, ob das hinhaut.

Mit IP-Core Manuals hab ich kein Glueck gehabt, die MegaWizzard RAMs 
scheinen da nicht drunter zu fallen.
Ich bastel mal ein wenig. Danke schon mal fuer deine Antwort

Autor: Matthias Nix (vbchaos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habs hinbekommen...
Danke fuer den Manual-Tip mit den IP-Cores - bin da via Hoelzchen aufs 
Stoeckchen gekommen und genau bei der richtigen Stelle gelandet.

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.