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?
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
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 (?)
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
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
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(62downto39));
2
out_r<=signed(in_shift(30downto7));
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.
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.
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.
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.
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 :(
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.
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.