Forum: FPGA, VHDL & Co. Passt das so AUDIO CODEC


von Raptor23 (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,


Auf meinem Entwicklungsboard  ist ein Audio CODEC von Ti verbaut.
Dieser soll über den LINE  IN erstmal Daten einlesen können.

Da er bei mir im slave Mode arbeitet , muss vom FPGA das LRCOUT und der 
BCLK kommen.
Das LRCOUT = 1/fs bestimmt den Takt mit dem der AD Wandler arbeiten 
soll.

LRCOUT  = (1/fs) = (1/ 97,656 KHz )= 10,24µs.
Der bit clk(bclk) ist 12.5MHz. Also werden 128 Bits pro Periode gesendet 
bzw. empfangen. Davon sind 16 Informationsbits für den Linken und 16 für 
den rechten.
Der restlichen sind zum füllen.

Das serielle Daten einlesen habe ich mir so gedacht :
 Wenn ich mich für den Right- justifiert Mode entscheide (Bild), dann 
kann ich 64 bit pro Kanal,  in ein 16 Bit Register schieben. Die 
Füllbits „fallen vorne wieder raus“ und im Register bleiben die 16 
Nutzbits. Von Dort greife ich die Bits parallel ab, während der andere 
Kanal gelesen wird.

Das mir nicht so klar?

Im Moment erzeuge ich das LRCOUT Signal selbst.
 Außerhalb des Protokolls gibt es das Enable Signal mit den Takt von 
97.6KHz. (LRCOUT).
Welches die Daten parallel weitertakten soll.

Nehme ich gleich das Externe signal als LRCOUT, oder wie ich es gemacht 
habe .Ein internes über den Zähler generiert.und am Ausgang auf das 
externe syncronisiert.

Ich habe keine Ahnung in welchem Format seriell gesendet wird.?
Im Datenblat finde ich nichts?

Schaut bitte mal den von mir geschriebenen Code an .


Vielen Dank

von Andi Z. (duderino65)


Lesenswert?

hey,

also ich hab mir das datenblatt zwar nur mal kurz angeschaut, aber steht 
da nicht dass der dir die daten schon seriel rausgibt (bei FEATURES)? 
dann müsstest du ja nix mehr serialisieren.

bei deinem code in zeile 44 sollte 63 stehen und nicht 64. sonst hättest 
du ja 65 bit...
wie bist du auf die 64 bit gekommen? pro word gibts doch max 32 bit denk 
ich.

wenn du ein mux bastelst dann ist es glaub ich nicht sehr gut es in 
einem getakteten process zu machen. lieber ausserhalb durch ein "with 
'signal' select <= sig1 when '0', sig2 when '1'; " oder so ähnlich.

wäre auch gut wenn du über jedem process vllt ne beschreibung machst. 
dann weiss man was der prozess im allgemeinen macht.

ausserdem versteh ich deine problematik nicht so ganz ;)

ich bastel gerade auch mit dem protokoll rum...

mfg

Andi

von Andi Z. (duderino65)


Lesenswert?

oh,

was hast du den für ein entwicklungsboard und was hats gekostet? :-)
würde mich vllt auch interessieren.

mfg

von Raptor23 (Gast)


Lesenswert?

Hallo  Andi Z.

Das Board habe ich gebrauch für 300 Euro gekauft.

>wie bist du auf die 64 bit gekommen? pro word gibts doch max 32 bit denk
>ich.


 Für ein fs von 97.656 Khz und einen BCLK con 12.5 MHz gibt doch der 
codec durchgehend  48 Füllbits + 16 Datenbits pro Kanal aus. ODER?
Meine Wordtbreite ist 16 Bit .

Gruß

DANK

von Raptor23 (Gast)


Lesenswert?

Sorry für meine unvollständige Antwort,

es handelt sich um ein Stratix II EP2S60 von Altera.

 Der Codec leifert mit doch einen Serielllen Datenstrom über DOUT
(Pin I2S format serial data output from the sigma-delta stereo ADC).

Diesen möchte ich paralell abgreifen können.

mfg

von Andi Z. (duderino65)


Lesenswert?

ok,

sowas in der art mach ich auch gerade. bei mir ist es allerdings so dass 
ein word aus 32bit besteht. also eine left-right-priode = 64 datenbits.
im datenblatt steht doch aber das man max. 32 bit pro word. (bei 1.1 )
die LR-clock und die bitclock bekomme ich auch. dann lese ich den 
datenstrom ein und puffere es in einem ram.

wenn du die parallel abgreifen willst kannst du ein bit speichern und es 
dann beim nächsten bit erst auslesen und auf den nächst höheren 
dateneingang schieben. also den ausgang wieder auf den eingang zurück 
führen. und immer an die selbe  adresse speichern. wenn die LR-clock 
einen anderen zustand annimmt dann wechselst du auf die nächste adresse. 
so liegen deine daten dann parallel im ram und du musst nurnoch die 
adresse ansprechen und der wert kommt dann komplet raus.

mfg

Andi

von Raptor23 (Gast)


Lesenswert?

Hallo Andi Z.,

ich glaub ich steh auf dem Schlauch?
Wie du die Daten paralell abgreifen würdest, hab ich noch nicht ganz 
verstanden.?





> das man max. 32 bit pro word. (bei 1.1 )


Ich benutze nur 16 pro wort.

Ich verstehe das Bild right-justified  so, dass 12.5 MHz / 97.656KHz 
=128

Dass in einer Periode von 97.656KHz 128 Perioden von BCLK passen.

DANKE

GRUSS

von Raptor23 (Gast)


Lesenswert?

Hallo Andi,

Kannst Du bitte noch einmal einen Versuch starten mir das irgenwie zu 
erklären?

Gruss

von Andi Z. (duderino65)


Angehängte Dateien:

Lesenswert?

hey,


mh ja stimmt. du hast ja eine feste bitclock. also das mit dem 
parallelisieren musst du dir schon selber überlegen wie du es 
letztendlich machst.
was ich gerade mach ist, die samples zu parallelisieren. nicht fragen 
warum! :)

ich hab am anfang glaub ich einen fifo verwendet weiss aber grad auch 
nicht mehr genau wie und was.

das mit dem parallelisieren meinte ich so wie im bild. sieht auf dem 
bild halt scheisse aus :-D

von Raptor23 (Gast)


Lesenswert?

Hi,

achso, Du hattest keine Feste Bit CLK.

jetzt wirds klarer.

Danke Gruss

von Andi Z. (duderino65)


Lesenswert?

also wenn ein bit ankommt dann schreibst du es an eine adresse. dann 
liest du diese adresse so aus, dass der wert an den nächsten eingang 
gelegt wird wenn das 2. bit kommt. dann schreibst du wieder an die 
gleiche adresse. usw. bis alle datenbits parallel an einer adresse 
liegen. das kannst du dann so machen, dass du das rechte und das linke 
sample einliest und dann über einen adressaufruf rausliest.

ich hoffe ich habs jetzt nicht so kompliziert geschrieben. ich denke 
sowas geht auch irgendwie anderst. mir fällt grad aber nix ein :)

mfg

Andi

von Andi Z. (duderino65)


Lesenswert?

ich hab zwar auch ne feste bitclock aber die ist nicht so hoch. die hat 
nur 1,5 mhz oder so.

also abtastfrequenz ist 48khz. -> wordclock = 48kz.
mal 32 bit pro word = 1.5.. mhz

wenn ich mich nicht verrechnet hab

von Raptor23 (Gast)


Lesenswert?

ich hab geschrieben:
>Ich habe keine Ahnung in welchem Format seriell gesendet wird.?


Ich weiss nicht ob die Daten  im 2 er , bzw 1er komplement gesendet 
werden.

mfg

von Andi Z. (duderino65)


Lesenswert?

achso ok da kann ich dann aber auch nicht wirklich weiterhelfen :)

mfg

von Raptor23 (Gast)


Lesenswert?

Sind wir hier alleine hier im Forum??

Oder ist mein Thema so schlecht,schlicht so sch..?  :)

Freitags Mittags, das ist der Grund

gruss

von SeriousSam (Gast)


Lesenswert?

Zumindest bei dem da 
http://www.wolfsonmicro.com/uploads/documents/en/WM8731_Rev4.4.pdf 
werden die Daten im 2er-Komplement gesendet. Scheint in etwa identisch 
zu sein und so wie es aussieht ein Standardchip und Interface für Audio.

von Raptor23 (Gast)


Lesenswert?

Hallo ,

durch einsatz eines Logic Analysators hab ich herausgefunden wo meine 
Bits beim paralellisieren landen(nicht da wo ich sie vermutet habe)und 
das der Codec seine Daten im 2er-Komplement liefert. Glaube ich?

Was ich blos nicht verstehe.

Wenn ich nur das MSB drehe bekomme ich das Eingangssignal nur 
invertiert.
also  not(not INPUT(15) & INPUT (14 downto 0)).
Dann bekomme ich das richtige signal (SINUS).

 Gruß

Raptor23

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.