Forum: FPGA, VHDL & Co. Einstieg in die HDL / Verilog programmierung mit I2s


von Sven W. (wehrend)


Angehängte Dateien:

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]

von Sven W. (wehrend)


Lesenswert?

Looks like i confused MCLK and BCLK, will look into it tomorrow...

von Morty S. (Gast)


Lesenswert?

POR (Power-On-Reset) sucks

von Sven W. (wehrend)


Lesenswert?

Danke für den Tipp (?) D.h. Ich muss nreset auf vcc ziehen?

von J. S. (engineer) Benutzerseite


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 ...

: Bearbeitet durch User
von Morty S. (Gast)


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.

von Sven W. (wehrend)


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.

von Alexander D. (abadu)


Lesenswert?

Die Projekte von OpenCores sind gespiegelt auch hier zu finden: 
http://freecores.github.io/ . Eine Anmeldung ist dafür nicht notwendig.

von Gustl B. (gustl_b)


Lesenswert?

Er hat doch den I2S Empfänger genannt.
https://www.ti.com/lit/gpn/PCM5102
Auf Seite 14 steht wie das ankommen sollte. Wobei ich den Unterschied 
zwischen left justified und I2S nicht verstehe. Ist das wirklich nur ein 
invertiertes LRCK das einen Takt früher da ist?

von Sven W. (wehrend)


Lesenswert?

Ich schätze ich sollte wohl erst einmal dieses Tutorial 
https://www.beyond-circuits.com/wordpress/tutorial/ durcharbeiten,
bevor ich daran denke I2s anzusteuern -leider ist das jedoch auf Xilinx 
zugeschnitten.

von Sven W. (wehrend)


Lesenswert?

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.

von Gustl B. (gustl_b)


Lesenswert?

Leider hat auch das Board einen älteren FPGA drauf. Aber ja klar kann 
man verwenden. Was mit MAX10 oder Spartan7 wäre aktueller.

von J. S. (engineer) Benutzerseite


Lesenswert?

Gustl B. schrieb:
> Was mit MAX10 oder Spartan7 wäre aktueller.

Ist aber im Grunde schon egal, weil die VHDL-Einarbeitung die gleiche 
wäre. Es gibt auch keinen FPGA der so alt sein kann, daß man damit kein 
I2S hinbekäme.

von Morty S. (Gast)


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.

von Sven W. (wehrend)


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...

von Motopick (motopick)


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".

: Bearbeitet durch User
von Sven W. (wehrend)


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.

von Motopick (motopick)


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.

von Sven W. (wehrend)


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 
:/

: Bearbeitet durch User
von Motopick (motopick)


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.

: Bearbeitet durch User
von J. S. (engineer) Benutzerseite


Lesenswert?

Morty S. schrieb:
> 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.

Nun ja zunächst einmal braucht der TE ja nur ein Interface mit I2S und 
das ist gerade mal 60 LUTs groß :-)

von Motopick (motopick)


Lesenswert?

Jürgen S. schrieb:

> Nun ja zunächst einmal braucht der TE ja nur ein Interface mit I2S und
> das ist gerade mal 60 LUTs groß :-)

Der TO hat mittlerweile auf seiner Reise das Fert gewexelt.
Das macht die Strecke zwar auch nicht kuerzer, aber scheinbar
unterhaltsamer.

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.