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


von FlorianB (Gast)


Angehängte Dateien:

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

von Duke Scarring (Gast)


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

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
Noch kein Account? Hier anmelden.