www.mikrocontroller.net

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


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

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

Autor: Andi Z. (duderino65)
Datum:

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

Autor: Andi Z. (duderino65)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oh,

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

mfg

Autor: Raptor23 (Gast)
Datum:

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

Autor: Raptor23 (Gast)
Datum:

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

Autor: Andi Z. (duderino65)
Datum:

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

Autor: Raptor23 (Gast)
Datum:

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

Autor: Raptor23 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Andi,

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

Gruss

Autor: Andi Z. (duderino65)
Datum:
Angehängte Dateien:

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

Autor: Raptor23 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

achso, Du hattest keine Feste Bit CLK.

jetzt wirds klarer.

Danke Gruss

Autor: Andi Z. (duderino65)
Datum:

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

Autor: Andi Z. (duderino65)
Datum:

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

Autor: Raptor23 (Gast)
Datum:

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

Autor: Andi Z. (duderino65)
Datum:

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

mfg

Autor: Raptor23 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sind wir hier alleine hier im Forum??

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

Freitags Mittags, das ist der Grund

gruss

Autor: SeriousSam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zumindest bei dem da 
http://www.wolfsonmicro.com/uploads/documents/en/W... 
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.

Autor: Raptor23 (Gast)
Datum:

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

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.