www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Richtige Ansteuerung des AC97-Chips?


Autor: FlorianB (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Forum =)!

Ich habe hier ein VHDL-Design für das Xilinx-XUP-Board (Virtex2Pro). Es 
handelt sich um einen Decoder für ein bestimmtes 
Audio-Kompressionsformat. Es funktioniert soweit alles, nur möchte ich 
jetzt die dekomprimierten Audiodaten (PCM, 16 bit, 8kHz, mono) mit dem 
auf dem XUP-Board integrierten AC97-Audio-Codec wiedergeben. Meine 
Audiosamples liegen in einem Ringpuffer, aus dem ich mit beliebiger 
Taktgeschwindigkeit die 16 bit Samples auslesen kann.

Auf der Xilinx-Seite habe ich ein Referenz-Design gefunden, wie man den 
AC97 ansteuert. Leider ist da nur ein völlig undokumentierter 
VHDL-Wrapper, mit dessen Hilfe man PCM-Daten abspielen können sollte. 
Nicht gezeigt ist jedoch dessen Verwendung. Wenn ich diesen einfach so 
"intuitiv" verwende (ihn also mit den AC97 HW-Pins verbinde), erhalte 
ich zwar eine Audio-Ausgabe, allerdings ist sie nicht korrekt: Die 
Tonhöe stimmt, die Wiedergabegeschwindigkeit ist leider fast doppelt so 
schnell. Es klingt fast so, als würde der AC97 immer nur kleine 
Sample-Pakete annehmen, und zwischendrin immer wieder welche verlieren.

Momentan weise ich dem AC97-PCM-Eingang einfach im 8kHz-Takt meine 
Samples zu. Offensichtlich ist das noch nicht ganz korrekt. Der Wrapper 
verfügt auch über ein Playback-Accept-Signal. Evtl muss ich dieses noch 
beachten, aber wie/wann?

Hat jemand Ahnung vom AC97...? wäre toll, wenn mich da jemand erhellen 
könnte. Ich habe mal die Wrapper-Dateien in den Anhang gepackt; diese 
sind aus dem Xilinx-Beispiel.

Meine Ansteuerung des Wrappers sieht wie folgt aus: Ich instantiiere die 
AC97_if entity. ClkIn wird mit dem 66MHz Bustakt meiner IP beschickt, 
PCM_Playback_Left & PCM_Playback_Right erhalten im 8kHz-Takt eine neues 
16bit-Sample zugewiesen (pcm_buffer_data_out ändert im 8KHz-Takt seinen 
Wert). PCM_Playback_Accept beachte ich momentan noch gar nicht, evtl 
liegt hier der Fehler? So sieht das aus:

  AC97_CTRL: process (Bus2IP_Clk)
  begin
    if rising_edge(Bus2IP_Clk) then
      PCM_Playback_Left <= pcm_buffer_data_out;
      PCM_Playback_Right <= pcm_buffer_data_out;
    end if;
  end process AC97_CTRL;

Grüße, Florian

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich plädiere ja immer wieder für gescheite Testbenches. Hast du eine?
Ansonsten schnupper doch mal rein, wie das andere so lösen:

http://www.google.com/codesearch?q=lang%3Avhdl+ac97

Duke

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.