Einstieg in die HDL / Verilog programmierung mit I2s

OP #7568842
Lesenswert?

Altera /Intel Quartus mit DE0-nano board

Hallo,

ich habe nach dem obligatorischen einstiegsprojekt counter mit Led-Ausgabe, vor einen I2s receiver (pcm5102) anzusteuern und stecke dabei etwas fest, ich habe für den schnellen einstig folgenden code mit chatgpt generiert, und bin nicht komplett sicher ob der Fehler dort steckt oder auf der Hardwareseite... Ich habe sckl, lrck und sdata an die generellen GPIO pins vom DE0-nano angeschlossen aber nichts passiert nach der Programmierung...

Der Code für den I2s-transmitter selbst ist folgendermaßen:

1
module I2S_tx (
2
  input wire mclk,            // Master Clock
3
  input wire nReset,          // Reset input
4
  input wire [23:0] audio_input, // 24-bit Audio Input
5
  output wire sclk,           // System Clock
6
  output wire lrclk,          // Left/Right Clock
7
  output wire sdata           // Audio Data
8
);
9

10
  reg [23:0] audio_data;       // 24-bit Audio Data Register
11
  reg [5:0] lrclk_divider;     // Left/Right Clock Divider (6 bits for 64 states)
12

13
  always @(posedge mclk or posedge nReset) begin
14
    if (nReset) begin
15
      audio_data <= 0;
16
      lrclk_divider <= 0;
17
    end else begin
18
      // Shift in new audio data on rising edge of master clock
19
      audio_data <= audio_input;
20

21
      // Increment Left/Right Clock Divider on rising edge of master clock
22
      if (lrclk_divider == 6'b111111) begin
23
        lrclk_divider <= 0;
24
      end else begin
25
        lrclk_divider <= lrclk_divider + 1;
26
      end
27
    end
28
  end
29

30
  // Generate System Clock (sclk)
31
  assign sclk = mclk;
32

33
  // Generate Left/Right Clock (lrclk)
34
  assign lrclk = lrclk_divider[5]; // LRCLK switches state every 32 clock cycles (64 states)
35

36
  // Output Audio Data (sdata) directly
37
  assign sdata = audio_data;
38
endmodule

Der Rest ist eigentlich nur glue-code. Und das ganze ist mit 1,4112 Mhz getaktet, also dem 32 fachen der audiofrequenz 44.1 khz die ich am Ende heraushaben möchte. Kann mir jemand helfen, den Fehler zu finden. Und mir vielleicht ein paar Tipps wie ich die Testbench zu schreiben habe. und wie ich am besten die Hardware debugge...?

[/vhdl]

Angehängte Dateien:
Persönliche Seite #7569553
Lesenswert?

Da stimmt so einiges nicht:

  1. Ich sehe da nicht, dass da geshifted wird, und das richtige Bit rauskommt.

  2. Der LRCLK scheint um 1 CC verfrüht, zu spät - je nachdem welches Schema man fährt. Sieh dir mal die I2S-Spec genauer an, wie der LR CLOCK liegen muss.

  3. Der SCLK ist nicht notwendigerweise identisch mit dem MLCK. Das hängt an dessen Definition und wie das devices da haben will: Manche fahren mit 128x, mache mit 256x - mache brauchen gar keinen MCLOCK. In jedem Fall solltest du mal posten, was da hinten dran hängt.

und ja es kann auch die HW sein. Ich verwende fertige Module aus CN und in der Tat hatte ich von 4 Stück einer Lieferung schon mal 2 kaputte: Eins hat geplärrt, eins wollte gar nicht - jeweils an einem I2S-chip betrieben, der ein perfektes timing machte. Eine andere Charge war komplett ok.

Als weitere Problemquelle kommt hinzu, dass manche Empfänger immer 32 Bit haben wollen und verarbeiten, einige auch dann, wenn sie sie nicht verarbeiten.

Und es kann sein, dass dein Takt nicht exakt passt: 64x48 und 64x96 klappten super, 64x44,1 war nicht zum Laufen zu bekommen. War ein Wolfson ...

Gast #7569891
Lesenswert?

Jürgen S. schrieb:

Da stimmt so einiges nicht:

Und prinzipiell/workflow liegt einiges mehr daneben. Das da ne LED blinkt; bedeudet nicht das:

  • bekannt ist, wie Error/Warnings/Logik-Allokation bei Synthese, PAR, bitstream-gen angezeigt wird
  • eine Simulation gemacht wurde um die gröbsten Fehler zu finden
  • ein brauchbares Sys-Reset-Netzwerk exestiert

Aber wenigstens der Takt scheint ja zu tun.

So wie ich das Top-Blockbild verstehe ist keinerlei Reset angeschlossen und der Namensgebung nach erwartet die eine Komponente eine Reset auf '0', ein anderes auf '1'. Und das Ganze scheint ein Altera/intel-FPGA zu sein, bei dem man im Unterschied zu Xilinx/AMD nicht mit synthetisierbaren default auf signals arbeiten kann.

Also tut man IMHO gut daran, erstmal eine Testbench für die Simu des LED-Blinkers aufzusetzen und den Blinker um einen Reset-Eingang für einen Button zu erweitern. Bei der Simu hilft man sich u.U. viel, wenn man nur für die Simu die Bllinkperiode klein hält, um nicht ewig auf den simulierten Ablauf einer Echtzeit-Sekunde zu warten.

Dann erweitert man das Blinker-Design stückweise um die Komponenten fürs I2S. Wenn man dergestalt das Blinkerdesign mitschleppt, erkennt man sofort, wenn man etwas prinzipielles zerkloppt hat und kann dann stückweise zurück gehen.

OP #7570043
Lesenswert?

Vielen Dank für die Antworten - leider bin ich zur Zeit gerade unterwegs und kann erst im neuen Jahr wieder hineinschauen... Ursprünglich wollte ich auch eigentlich ein entsprechendes Project von OpenCore verwenden, habe da aber den login verloren, irgendwie schicken sie keine Email raus (?), und die angegebene email adresse ist auch falsch bzw. nicht vorhanden.

Gast #7571505
Lesenswert?

Sven W. schrieb:

Habe mir ausserdem den Nachfolger des Boards den DE10-nano besorgt https://www.mouser.de/ProductDetail/993-P0496, das macht die Sache hardwareseitig hoffentlich etwas einfacher.

Wie bereits hingewiesen liegen Deine Probleme nicht in der Hardware sondern im KnowHow bezüglich dem Bereich FPGA-Entwicklung und insbesonders im Aufsetzen/Benutzen einer vollständigen Tool-Chain. Allerdings kann es schon sein, das man durch den Ersatz des D10-Nano (Cyclone V -SoC) mittels eines "reinem" (ohne ARM-SoC) FPGA-Board das Lern-Problem deutlich verringert. Allerdings ist dein "neues" Board (Terassic P0496 mit CycV) ebenfalls ein (IMHO für einen Einsteiger) unnötig komplexes Board.

Sinnvoll, weil ergänzende Neuanschaffungen wären an dieser Stelle im Lernprozess gescheite Bücher zum Thema und Debugtools (Aufsetzen SignalTap, Logicanalyzer an Test-Pins, ...).


Ist aber im Grunde schon egal, weil die VHDL-Einarbeitung die gleiche wäre.

Der TO metzelt seinen Code allerdings in Verilog statt in VHDL. Und der Verilog-code sieht aus wie von einem C-Programmierer geschrieben dem jegliche Erfahrung mit Digitalen - Grundstrukturen (FF-Beschaltung, ROM als LUT) abgehen.

Es gibt auch keinen FPGA der so alt sein kann, daß man damit kein I2S hinbekäme.

Ja, I2S vor über 25 Jahren mit einem Spartan/Spartan-XL

Im Audio-Bereich macht man es sich IMHO mit den in "jüngeren" FPGA's vorhandenen Hardware-Multiplizieren "leichter", wenn man umfängliche Frequenzfilter bspw. würde für Sample-Rate-Conversion realisiert. Aber das ist immer noch weit weg von einem ARM-Dual-Core SoC- Boliden wie dem CycV.

OP #7580704
Lesenswert?

Da das DE10-nano board es mir bietet, werde ich erstmal die Audioschnittstelle über linux realisieren, bevor ich überhaupt an hardware code / schnittstellen denke. Das flacht die Lernkurve immens ab. Und ein embedded zum (rum)spielen ist eine lohnende Investition.

Später dann, wenn ich die Grundlagen drauf habe, kann ich mich an die Hardware setzen. Einziges Problem was ich noch sehe ist, dass ich kein günstige breadboard Variante von dem FPGA/ARM-SOC sehe, sollte ich später tatsächlich mal dazu kommen ein eigenes Produkt machen zu wollen...

#7580746
Lesenswert?

Sven W. schrieb:

Da das DE10-nano board es mir bietet, werde ich erstmal die Audioschnittstelle über linux realisieren, bevor ich überhaupt an hardware code / schnittstellen denke. Das flacht die Lernkurve immens ab. Und ein embedded zum (rum)spielen ist eine lohnende Investition.

Später dann, wenn ich die Grundlagen drauf habe, kann ich mich an die Hardware setzen. Einziges Problem was ich noch sehe ist, dass ich kein günstige breadboard Variante von dem FPGA/ARM-SOC sehe, sollte ich später tatsächlich mal dazu kommen ein eigenes Produkt machen zu wollen...

Wann soll denn das spaeter sein? Bei einer flachen Lernkurve in etwa 50 Jahren? Schwimmen lernt man nur im Wasser. Wenn dir I2S zu kompliziert ist, nimm einfach erstmal einen PT8211. "Algorithmen" auf dem FPGA, und dazu benutzt man den ja eigentlich, sind dann aber auch nicht weit weg.

Ja, I2S vor über 25 Jahren mit einem Spartan/Spartan-XL

Au ja. Sparten XCS40XL :) Und Leonardo und ISE8.4.

Edith:

Im Audio-Bereich macht man es sich IMHO mit den in "jüngeren" FPGA's vorhandenen Hardware-Multiplizieren "leichter", wenn man umfängliche Frequenzfilter bspw. würde für Sample-Rate-Conversion realisiert. Aber das ist immer noch weit weg von einem ARM-Dual-Core SoC- Boliden wie dem CycV.

Auch ein aus LEs aufgebauter Multiplizierer in einem CycI ist sehr schnell. Und den kann man ja fuer Audioanwendungen bequem "multiplexen".

OP #7580788
Lesenswert?

Motopick schrieb:

Wann soll denn das spaeter sein? Bei einer flachen Lernkurve in etwa 50 Jahren? Schwimmen lernt man nur im Wasser.

Nein,keine 50 Jahre aber ein paar Monate - momentan jongliere ich noch andere Projekte nebenbei, genauer gesagt ein paar analoge module für einen eurorack synthesizer.

Wenn dir I2S zu kompliziert ist, nimm einfach erstmal einen PT8211. "Algorithmen" auf dem FPGA, und dazu benutzt man den ja eigentlich, sind dann aber auch nicht weit weg.

Inwiefern ist der PT8211 einfacher? Was ich gerade suche ist eigentlich nur die pinbelegung für I2S auf z.B. dem DE10-nano board.

#7580815
Lesenswert?

Sven W. schrieb:

Inwiefern ist der PT8211 einfacher?

Den muss man nicht initialisieren. :)

Was ich gerade suche ist eigentlich nur die pinbelegung für I2S auf z.B. dem DE10-nano board.

Sehr verwunderlich. Gibt es da vom Hersteller keine Dokumentation? Ansonsten: Ist dir das Altera University Programm ein Begriff? Da wird viel "Audio" mit dem Cyc5/Soc gemacht.

OP #7580817
Lesenswert?

Motopick schrieb:

Was ich gerade suche ist eigentlich nur die pinbelegung für I2S auf z.B. dem DE10-nano board.

Sehr verwunderlich. Gibt es da vom Hersteller keine Dokumentation?

Da bin ich gerade dran, für den Raspberry Pi scheint es eine GPIO-Tabelle zu geben,was entsprechendes finde ich aber nicht im datenblatt bzw. user manual (hier ist das Datenblatt und Handbuch in einem PDF zusammen)...

Ansonsten: Ist dir das Altera University Programm ein Begriff? Da wird viel "Audio" mit dem Cyc5/Soc gemacht.

Nein, darum vielmals danke für den Hinweis! Allerdings finde ich auf der Seite nur die Board beschreibungen und software toos anklickbar und login mit MyAltera funktioniert auch nicht :/

#7580838
Lesenswert?

Allerdings finde ich auf der Seite nur die Board beschreibungen und software toos anklickbar und login mit MyAltera funktioniert auch nicht :/

Protipp: Das heisst "University Program" weil es an den Universitaeten genutzt wird. Man muss also schon ein paar Links folgen... Und ob die Inhalte "suchmaschinenverwurstet" sind, weiss ich nicht. Inhalte des Lehrprogramms aendern sich dort™ oft. Ein Link von gestern kann heute schon nichts mehr Wert sein.

Und suchen musst du schon selber.

Edith: Meinen Altera Account hab ich fuer meine Fundstellen gar nicht gebraucht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren