Forum: FPGA, VHDL & Co. I2S-Transceiver mit 32 Bit


von Mark B. (Gast)


Lesenswert?

Ich habe in der LogiCoreLib von Xilinx einen I2S entdeckt, den ich gerne 
nutzen möchte. Den scheint es kostenlos zu geben. Allerdings unterstützt 
er offiziell nur 16/24 Bit Daten. Wie könnte ich den aufbohren, um auch 
32 Bit zu übertragen? Leider ist der Core wie andere verkrüppelt und 
kann nicht ohne weiteres selber bearbeitet werden. Kann das irgendwie 
multiplexed werden?

: Verschoben durch Admin
von Dergute W. (derguteweka)


Lesenswert?

Moin,

Da wirds doch weniger Arbeit sein, den gschwind' selber zu schreiben, 
wuerd' ich mal vermuten. I2S ist doch wirklich kein Hexenwerk.
Vielleicht gibts ja auch was auf opencores.

Gruss
WK

von i2s (Gast)


Lesenswert?


von Mark B. (Gast)


Lesenswert?

Dergute W. schrieb:
> Da wirds doch weniger Arbeit sein, den gschwind' selber zu schreiben,
vermutlich, nur ist mir noch nicht klar, wie ich die 32 Bit ins Spiel 
bringe. Das Verhältnis der Abtastsrate (L/R clock) lässt nur 64 bit zu 
und laut Spezifikation werden maximal 24 Bit übertragen. Bei 16 Bit wird 
aufgefüllt, aber was passiert bei 32 Bits? Wir das gefiltert?

Ich meine, es muss ja einen Grund geben, warum Xilinx in seinem 
offiziellen Core das nicht anbietet.

i2s schrieb:
> 
https://github.com/YetAnotherElectronicsChannel/FPGA-Class-D-Amplifier/blob/master/i2s_rxtx.vhd

auch dort entdecke ich keine 32 Bit (?)

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Hm, ja also aeh - was hast du denn vor? Ich denk mal, du hast 
irgendeinen IC, aus dem dein 32bit I2S raus/reinkommt und das willst du 
mit deinem FPGA verbinden, oder? Wenn dem so ist, dann sollte doch im 
Datenblatt des IC beschrieben sein, wie er's gerne haette.

Gruss
WK

von i2s (Gast)


Lesenswert?

24 Bit audio heißt, dass du im Regelfall automatisch 32-Bit samples 
überträgst.

Beispiel 48 khz sample-rate -> macht 2*32*48000 clocks -> 3.072 MHz 
bitclock

Die 24 Bit sind left-alligned in dem 32-Bit Frame drinnen. Die letzten 8 
Bits sind einfach 0.

So gut wie jeder 24 Bit ADC/DAC unterstützt diese 32-Bit form der 
Kommunikation und im DSP kann man direkt als 32-Bit integer dann damit 
rechnen.

Das VHDL Modul oben arbeitet genau mit den 32-Bit frames

von Mark B. (Gast)


Lesenswert?

Dergute W. schrieb:
> Hm, ja also aeh - was hast du denn vor? Ich denk mal, du hast
> irgendeinen IC, aus dem dein 32bit I2S raus/reinkommt
Was der Chip so kann, ist mir natürlich bewusst. Es ging mir darum, zu 
verstehen, warum der Core das nicht kann.

i2s schrieb:
> So gut wie jeder 24 Bit ADC/DAC unterstützt diese 32-Bit form der
> Kommunikation und im DSP kann man direkt als 32-Bit integer dann damit
> rechnen.
Ja, denke ich auch. Ich habe einen 5102-DAC und 9023, die das beide 
können (sollen).

i2s schrieb:
> Das VHDL Modul oben arbeitet genau mit den 32-Bit frames
Ich sehe da nur:
1
out_l <= signed(in_shift(62 downto 39));
2
out_r <= signed(in_shift(30 downto 7));
der cropped das also weg. Warum wird das gemacht? Gibt es ein SPEC mit 
48 Bits pro sample? Meines Erachtens sind es bei I2S immmer 32 Bits, 
die übertragen werden. Man überträgt also Nullen, wenn man weniger 
Eingang hat.

Nun habe ich aber einen 32 Bit Eingang und frage mich, warum die 
Xilinx-IP das nicht kann? Es wäre doch ein Leichtes, diese am Eingang 
des Cores anliegenden Bits mitzuübertragen, oder denke ich da falsch?

Klar kann ich mir I2S selber stricken, nur gibt es ja verschiedene 
Formate und es wäre ja elegant, wenn ich einen validierten und 
varifizierten CORE aus der LIB nehmen könnte, den man nur parametriert, 
statt selber was zu tippen.

von J. S. (engineer) Benutzerseite


Lesenswert?

Mark B. schrieb:
> Warum wird das gemacht? Gibt es ein SPEC mit
> 48 Bits pro sample?
Du kannst mit dem Word-Takt festlegen, wann eine Bitfolge anfängt und 
wann sie aufhört. Damit wird Stereo, 8-Kanal und TDM unterschieden, je 
nach Wandler. Man kann also ohne weiteres auch nur 24 Bit übertragen und 
dann direkt wechseln und das eben auch auf anderen Freuenzen.

Allerdings kann nicht jeder Empfänger alle Formate.

Mark B. schrieb:
> Ja, denke ich auch. Ich habe einen 5102-DAC und 9023, die das beide
> können (sollen).
Dabei spielt auch eine Rolle, ob der Wandler das überhaupt verarbeiten 
kann. Dass er 32 Bit annimmt, heisst nicht, dass die Qualität besser 
ist. Letzt kommt das ja alles in einen Interpolations / 
Dezimationsfilter / Vorverzerrer, der von der DAC-Arcitektur abhängt.

von i2s (Gast)


Lesenswert?

Die meisten 08-15 ADCs / DACs oder I2S-Class-D Verstärker erreichen 
einen SNR von um die 120 dB wenn sie gut sind. Das wären dann +/- 20 
bits Auflösung.

Ich denke, dass sogar 100 dB SNR als allgemeine Richtlinie für 
"high-quality" Audio akzeptiert ist -> wären dann bisschen mehr als 16 
bits.

Ein Wandler der wirklich 24 bit kann, müsste dann 146 dB SNR erreichen.


Das Problem bzw. das Kritische bei den DACs ist die Überführung vom 
"digitalen" ins "analoge". Aber auf eine andere Art als du jetzt denkst.

Im Regelfall kommt nach dem Eingang ein Upsampling-Filter der die 
sample-rate intern ziemlich weit hochpusht - je nachdem wie viel 
oversampling der Chip macht, kann das irgendwas zwischen 64 - 256* die 
input-sample rate sein und danach kommt ein digitaler sigma-delta 
Wandler entweder mit single-bit output (also PDM out) oder als multi-bit 
output (irgendwas zwischen 3-6 bit output) und das ganze wird dann auf 
ein Widerstands-array geführt.

Bei mir in der Firma hat man so etwas mal mit einem FPGA entwickelt, 
also i2s input auf PDM out. Wenn man den PDM Ausgang digital gesampled 
hat und dann in den spectrum-anaylzer geht kommt man da durchaus auf 
140dB SNR und mehr.
Leider scheitert es dann eher an den digitalen I/Os an die das analoge 
Ausgangsinterface angebunden wird -> da reichen leichteste Assymetrien 
in den output-buffern aus und man landet schnell mal 20-30 dB unter dem, 
was der sigma-delta Modulator wirklich kann.

von J. S. (engineer) Benutzerseite


Lesenswert?

i2s schrieb:
> Bei mir in der Firma hat man so etwas mal mit einem FPGA entwickelt
dito

> also i2s input auf PDM out. Wenn man den PDM Ausgang digital gesampled
> hat und dann in den spectrum-anaylzer geht kommt man da durchaus auf
> 140dB SNR und mehr.
bei 1kHz Sinus oder Rauschen? Delta-Sigma ist ja stark frequenzabhängig.

> Leider scheitert es dann eher an den digitalen I/Os an die das analoge
> Ausgangsinterface angebunden wird
Inwiefern?

 -> da reichen leichteste Assymetrien
> in den output-buffern aus
Die müssen natürlich elektrisch entkoppelt werden, z.B. mit einem 
Gate-Transistor und 'ner PLL.

Ein Kunde von mir benutzt meinen PDM-Core mit 24 Bit Eingang und hat 
hinter den FPGAs nur einen Analog-Switch mit komplementären 
GaAs-Schaltern, danach kommt die Power-Elektronik mit Filter. Da sind 
eher Einstreuungen von EMI und Netzteil sowie kleine Nichtlinearitäten 
die aus dem PCB-Design kommen relevant und die werden durch 
Vorverzerrung im Core kompensiert.

von i2s (Gast)


Lesenswert?

Klingt sehr interessant mit der Vorverzerrung.
Gibt es da ne AppNote oder eine Arbeit dazu im Netz? Bzw. nach welchen 
Stichworten müsste ich dafür sinnvoll googeln?

Leider erfolglos bisher :(

von J. S. (engineer) Benutzerseite


Lesenswert?

i2s schrieb:
> Klingt sehr interessant mit der Vorverzerrung.
> Gibt es da ne AppNote oder eine Arbeit dazu im Netz? Bzw. nach welchen
> Stichworten müsste ich dafür sinnvoll googeln?
>
> Leider erfolglos bisher :(

Nee, dass darf mal seber machen, weil jedes System seine eigene 
Übertragungsfunktion hat. Ultraschallsender tuten anders, als 
Lautsprecher. Für letztere ist das aber ein weit verbreitetes Thema. Die 
meisten Autohersteller fahren ihre Lautsprecher mit entsprechend 
präparierten Datenströmen und deren Macken zu reduzieren. Dabei geht es 
vor allem um Resonanzen. Das Thema Resonnzkompensation widerum ist im 
Tontechnikbereich auch bekannt und in mehreren Ansätzen behandelt. Es 
gibt Aktiv-Resonanzabsorber zu kaufen, darunter auch welche, die 
patentiert sind und andere die die Patente umgehen (oder sie 
ignorieren!). Ein System, das im Conumerbereich weit verbreitet ist, ist 
DIRAC.

von J. S. (engineer) Benutzerseite


Lesenswert?

Mark B. schrieb:
> Nun habe ich aber einen 32 Bit Eingang und frage mich, warum die
> Xilinx-IP das nicht kann? Es wäre doch ein Leichtes, diese am Eingang
> des Cores anliegenden Bits mitzuübertragen, oder denke ich da falsch?

Ich habe mir die fertig integrierte XI-IP mal angesehen. Der Core 
arbeitet (mal wieder) mit AXI, Taktübergängen und einem asynchronen 
FIFO, um für die Nutzung in einem SOC ready zu sein. Damit werden ein 
wertvolle BRAM verbraten und obendrein 1700 FFs beansprucht.

Das hier ist der minimale Verbrauch in einem Artix 100 FPGA:

LUT  577  63400  0.9100947
FF  1706  126800  1.3454258
BRAM  0.5  135  0.37037036
IO  150  210  71.42857
BUFG  3  32  9.375

Und das ist nur der Transmitter. Der Receiver kommt nochmal auf ein 
weiteres halbes BRAM und insgesamt 3000 FFs.

Man kann den Core noch etwas verschlanken, wenn man auf das Standard 
AXI-IF verzichtet und es nur als streaming betreibt. Aber selbst bei 
idealen Taktkonstellationen (AXI und AXI Audio als Vielfach des 
Bittaktes) will er unbedingt ein BRAM verschwenden.

Das ist ein Haufen overhead, der Chipfläche verbrät ohne Ende und dies 
für eine Funktion, welche im Wesentlichen aus einem Schieberegister 
besteht, wenn man klug designed und mit massiven Takten arbeitet.

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.