An das Modul habe ich nun ein paar selbstgepowerte Boxen angeschlossen
(irgendwelche billig Boxen...Ultron mini cubes 2.0). Allerdings kommt
kein Sound aus den Boxen...nur irgendwelches rauschen, welches aber
unabhängig von den Daten ist die ich zum Chip sende.
Wo kann der Fehler stecken?
Danke für die Hilfe!
Daniel K. schrieb:> rauschen, welches aber unabhängig von den Daten ist die ich zum Chip> sende.
Wie sendest du denn Daten zum Chip?
Daniel K. schrieb:> Dazu habe ich mir einen I²S-Transmitter geschrieben, der mit 8,192 MHz> getaktet wird
Wie generierst du diesen Takt?
Daniel K. schrieb:> Wo kann der Fehler stecken?
Hast du ein Oszilloskop?
BTW: warum schon wieder ein neuer Thread?
Das ist doch noch das alte Thema wie im
Beitrag "I2S Schieberegister", oder nicht?
Hallo Lothar,
Lothar M. schrieb:> Daniel K. schrieb:>> rauschen, welches aber unabhängig von den Daten ist die ich zum Chip>> sende.> Wie sendest du denn Daten zum Chip?>
mein Top-Design schaut so aus:
1
libraryIEEE;
2
useIEEE.STD_LOGIC_1164.ALL;
3
4
entityTopis
5
port(
6
Clock_In:inSTD_LOGIC;
7
MCLK:outSTD_LOGIC;
8
LRCLK:outSTD_LOGIC;
9
DEM:outSTD_LOGIC;
10
DOUT:outSTD_LOGIC
11
);
12
endTop;
13
14
architectureTop_ArchofTopis
15
16
signalClock_Out:std_logic:='0';
17
signalEmpty:std_logic;
18
19
componentClockis
20
port(
21
Clock_In:inSTD_LOGIC;
22
Clock_Out:outSTD_LOGIC
23
);
24
endcomponent;
25
26
componentI2S_Transmitteris
27
port(
28
Clock:inSTD_LOGIC;
29
Data_In:inSTD_LOGIC_VECTOR(31downto0);
30
Reset:inSTD_LOGIC;
31
LRCLK:outSTD_LOGIC;
32
DOUT:outSTD_LOGIC;
33
MCLK:outSTD_LOGIC;
34
Empty:outSTD_LOGIC
35
);
36
endcomponent;
37
38
begin
39
40
Clocking_Wizard:componentClockportmap(
41
Clock_In=>Clock_In,
42
Clock_Out=>Clock_Out
43
);
44
45
I2S:componentI2S_Transmitterportmap(
46
Clock=>Clock_Out,
47
MCLK=>MCLK,
48
LRCLK=>LRCLK,
49
DOUT=>DOUT,
50
Data_In=>x"77777777",
51
Reset=>'0',
52
Empty=>Empty
53
);
54
55
DEM<='0';
56
57
endTop_Arch;
Ich sende im Prinzip erst einmal nur die selben Daten...da muss dann ja
ein konstanter Ton bei raus kommen.
> Daniel K. schrieb:>> Dazu habe ich mir einen I²S-Transmitter geschrieben, der mit 8,192 MHz>> getaktet wird> Wie generierst du diesen Takt?>
Der Takt wird mittels Clocking Wizzard generiert.
> Daniel K. schrieb:>> Wo kann der Fehler stecken?> Hast du ein Oszilloskop?>
Ja, ich muss es wohl mal wieder aus dem Schrank kramen...gleich mal
morgen machen :)
> BTW: warum schon wieder ein neuer Thread?> Das ist doch noch das alte Thema wie im> Beitrag "I2S Schieberegister", oder nicht?
Im Prinzip gehört es dazu. Nur ich weiß nicht wie das hier gehandhabt
wird. In anderen Foren (Xilinx, Microsoft, etc.) ist es üblich ein neues
Problem in einen neuen Thread zu packen und in einem Thread nur ein
explizites Problem zu diskutieren, auch wenn beide Probleme zum selben
Thema gehören. Daher habe ich einen neuen Thread auf gemacht...
Da ist das Timing völlig daneben. MCLK und SCLK sind bei sowas
eigentlich nie identisch. Bei dir wäre der Sampletakt offensichtlich
8.192MHz/32=256kHz, was ja wohl ziemlicher Quatsch ist. Schau ins
Datenblatt vom CS4344, da stehen Vorschriften zu den definierten (aka
benötigten) Verhältnissen von MCLK zu Sampleclock und ebenso WS/LRCK zu
SCLK.
Edit:
> Ich sende im Prinzip erst einmal nur die selben Daten...da muss dann ja> ein konstanter Ton bei raus kommen.
Was soll da rauskommen ausser Gleichspannung, die der Wandler
wegrechnet?
Bei der Waveform stimmt absolut garnichts und das Datenblatt haste wohl
auch nicht gelesen.
Das ist kein I2S sondern irgendwas anderes.
Ersteinmal bekommste mit 8,192MHz keine Standardsamplerate hin, also man
nehme 12,288MHz für 48kHz Samplerate.
Mit 8,192MHz geht nur: 128kHz, 64kHz, 32kHz
Mit MCLK = SCLK = 8,192MHz geht nur eine Samplerate von 128kHz.
Zudem sind es zu wenig Bits zwischen 2 Flanken von WS (LRCK).
I2S überträgt 2x32 Bits pro LRCK Periode, auch dann wenn du nur 16 Bit
des 24Bit DACs brauchst.
Guck dir zudem an ab wann das erste Bit des Samples nach der LRCK Flanke
übertragen werden darf. Als kleiner Tipp: nicht sofort.
Wie oben schon angesagt, imemr dieselben Daten senden ergibt kein Ton...
Nen Sägezahn (Counter) senden reicht als erster Test.
Mw E. schrieb:> nehme 12,288MHz für 48kHz Samplerate.
Das sind auch die Frequenzen, die ich kenne. Soweit ich mich erinnere,
liefert die auch der Wandler. Das müsste also irgendwie im Modell der
Testbench auftauchen.
> Zudem sind es zu wenig Bits zwischen 2 Flanken von WS (LRCK).> I2S überträgt 2x32 Bits pro LRCK Periode, auch dann wenn du nur 16 Bit> des 24Bit DACs brauchst.
Kann bis zu 64Bit je Frame übertragen, muß aber nicht. Die
Philips-Original-Spezifikation nennt an keiner einzigen Stelle eine Zahl
für die Wortlänge.
Carl D. schrieb:> Kann bis zu 64Bit je Frame übertragen, muß aber nicht. Die> Philips-Original-Spezifikation nennt an keiner einzigen Stelle eine Zahl> für die Wortlänge.
Aber so ziemlich alle DAC Datenblätter wollen da 32Bit sehen bei der
Config des TE.
Sonst würden die Verhältnisse MCLK/SCLK/LRCK nicht mehr stimmen.
Mw E. schrieb:> Aber so ziemlich alle DAC Datenblätter wollen da 32Bit sehen bei der> Config des TE.> Sonst würden die Verhältnisse MCLK/SCLK/LRCK nicht mehr stimmen.
Dafür sind die Takte aber sicher da, daß man das individuell steuern
kann, oder?
Was den DAC angeht, müsste man das eigentlich belibnig tunen können,
zumindest bei Aufrechterhalt der Verhältnisse und umtakten.
Vom MCLK leitet sich alles ab. Und mal abgesehen von den analogen
Filtern am Ausgang (deren Einfluss man kaum hört, paar dB SNR hin oder
her) ist es dem DAC ziemlich egal, was die tatsächliche Samplerate ist.
Im CS4344-Datenblatt stehen auch nur untere und obere Grenzen. Wenn nur
8.192kHz da sind, werden es halt 32kHz. Gab's ja bei DAT-Longplay auch,
ist also nicht so ungewöhnlich.
Hallo zusammen,
danke für den ganzen Input. Anscheinend habe ich da was gewaltig
missverstanden...
Nun gut, ich habe mir mal die ganzen Hinweise durchgelesen und einen
weiteren Versuch gestartet :)
MCLK nehme ich nun einen Takt von 12,288 MHz. Wegen dem konstanten Pegel
an DEM/SCLK wechselt der Chip in den internal serial Clock Modus und bei
2x32 Bit Daten entspricht das dann einer Samplerate von 128 kHz(?).
Das Design habe ich zudem auch angepasst:
Anbei habe ich mal den Screenshot von der Simulation angehängt.
SCLK wird bei mir auf einen konstanten Pegel (Low) gezogen (ist in der
Simulation und im I2S-Sender nicht enthalten, sondern im Top-Design).
> SCLK wird bei mir auf einen konstanten Pegel (Low) gezogen
Und das hilft was? Dass der Chip intern ein SCK generiert, dass du nicht
sehen kannst und daher nicht weisst, ob deine Annahmen MCLK/LRCK bzw.
MCLK/SCLK_int und damit das Timing der Datenausgabe stimmen? So kann man
sich das Leben auch schwer machen, obwohl man es sich extra leicht
machen will...
Die Deemphasis brauchst du vermutlich eh nicht...
Erzeuge ALLE Signale selbst, dann ist es viel einfacher, das Timing zu
checken. SCLK brauchst du intern ja auch, sonst bekommst du deine Daten
nicht raus, spart also nicht mal was...
Das sieht jetzt schon mehr nach nem I2S aus, das sollte der DAC
verstehen.
SCK sollteste auch wieder ausgeben und nich den DAC irgendwas
interpretieren lassen.
Und wie schon öfter gesagt: nur gleiche Daten senden ergibt kein Ton.
Daniel K. schrieb:> Anbei habe ich mal den Screenshot von der Simulation angehängt.> SCLK wird bei mir auf einen konstanten Pegel (Low) gezogen (ist in der> Simulation und im I2S-Sender nicht enthalten, sondern im Top-Design).
Hallo Daniel,
ich hab den CS4344 / Pmod-I2S mit mehreren, einstellbaren SRates in
Betrieb. Ein paar grundsätzliche Bemerkungen:
* Leistunganpassung Codec <--> Boxen? Laut Datenblatt beträgt die
minimale Ausgangsimpedanz 100 Ohm - evtl. erstmal nur Kopfhörer
einstöpseln?
* Verhältnis MCLK/LRCK - wie bereits gesagt - Datenblattstudium ist
angesagt. Ein Verhältnis 64:1 ist nur für SR >= 100 kHz spezifiziert
(Seite 9). Für ein paar Beispiele s.u.
* Roll your own Testsignal - z.B. 100 16bit Sinus-Werte in einem ROM
ablegen - gibt bei 200kHz SR einen 2kHz Ton . Siehe Code-Beispiel unten.
* Ohne Logic-Analyzer (oder wenigstens Oszi) wirst Du bei der
Fehlersuche nicht weit kommen. Lege MCLK/SCLK/LRCK als Debug-Signale auf
einen freien PMOD-Port. Evtl. noch das MSB des Datenwortes, dann siehst
Du noch gleich den Wechsel vom positiven zum negativen Wertebereich.
Gruß,
Burkhard
1
-- Expected Inputs:
2
-- clk : MCLK precursor := 2x MCLKmax
3
-- l_data/r_data : PCM 16 bit 2'complement audio data
Burkhard K. schrieb:> Daniel K. schrieb:>> Hallo Daniel,>> ich hab den CS4344 / Pmod-I2S mit mehreren, einstellbaren SRates in> Betrieb. Ein paar grundsätzliche Bemerkungen:>> * Leistunganpassung Codec <--> Boxen? Laut Datenblatt beträgt die> minimale Ausgangsimpedanz 100 Ohm - evtl. erstmal nur Kopfhörer> einstöpseln?>> * Verhältnis MCLK/LRCK - wie bereits gesagt - Datenblattstudium ist> angesagt. Ein Verhältnis 64:1 ist nur für SR >= 100 kHz spezifiziert> (Seite 9). Für ein paar Beispiele s.u.>> * Roll your own Testsignal - z.B. 100 16bit Sinus-Werte in einem ROM> ablegen - gibt bei 200kHz SR einen 2kHz Ton . Siehe Code-Beispiel unten.>> * Ohne Logic-Analyzer (oder wenigstens Oszi) wirst Du bei der> Fehlersuche nicht weit kommen. Lege MCLK/SCLK/LRCK als Debug-Signale auf> einen freien PMOD-Port. Evtl. noch das MSB des Datenwortes, dann siehst> Du noch gleich den Wechsel vom positiven zum negativen Wertebereich.>> Gruß,> Burkhard
Hallo Burkhard,
danke für den Hinweis. Ich habe mich gestern noch einmal dran gesetzt
und den kompletten Code überarbeitet. Dabei habe ich jetzt auch MCLK und
SCLK vom FPGA erzeugt und mir die einzelnen Takte etwas genauer
angeschaut.
Ich bekomme jetzt auch einen Ton raus etc., sprich der Transmitter und
die Ansteuerung funktionieren :)
Hallo zusammen,
um den Thread hier mal abzuschließen poste ich mal meine Lösung (falls
jemand was ähnliches benötigt etc. ).
Ich habe mir zusätzlich noch ein kleines Programm in C# geschrieben um
eine Wave-Datei auszulesen und die Daten in ein .coe-File für den Xilinx
Block Memory Generator zu schreiben (siehe Anhang).
Als Testfile habe ich mir ein Wave-File mit 16-Bit Auflösung, 1 Kanal
und 48 KHz Samplerate heruntergeladen:
(http://download.wavetlan.com/SVV/Media/HTTP/http-wav.htm)
Die VHDL-Sourcen hänge ich ebenfalls mal an. Alles was dann noch
benötigt wird ist ein Blockdesign mit einem ROM und eine Taktquelle die
12,288 MHz erzeugt.
Noch mal an alle ein Dankeschön für die Hilfe :)
Daniel K. schrieb:> Die VHDL-Sourcen hänge ich ebenfalls mal an. Alles was dann noch> benötigt wird ist ein Blockdesign mit einem ROM und eine Taktquelle die> 12,288 MHz erzeugt.
Warning: (vsim-3473) Component instance "Sinewave_ROM : Audio_ROM" is
not bound.
Wupps schrieb:> Daniel K. schrieb:>> Die VHDL-Sourcen hänge ich ebenfalls mal an. Alles was dann noch>> benötigt wird ist ein Blockdesign mit einem ROM und eine Taktquelle die>> 12,288 MHz erzeugt.>>> Warning: (vsim-3473) Component instance "Sinewave_ROM : Audio_ROM" is> not bound.
Hallo Wupps,
bei dem Audio_ROM handelt es sich um ein Blockdesign, welches mit dem
.coe-File initialisiert wird (siehe Anhang).