Der SPDIF-Decoder läuft. Eine ganz simple Statemachine ist es geworden.
Ich habe mir folgendes überlegt:
Die Zeit zwischen zwei Flanken im SPDIF-Signal (= zwischen zwei Symbolen bzw. Halbsymbolen im Falle der "0") wird gezählt.
D.h. mit jeder steigenden Flanke der FPGA-Clock wird ein Zähler erhöht und nach Detektion einer Flanke im Signal ausgewertet.
Da nun nur die drei Fälle 1x; 2x und 3x (halbe Periode des SPDIF-Takts) auftreten können, lege ich 4 Entscheidergrenzen fest.
Diese sollen bei 0,5x; 1,5x; 2,5x; und 3,5x liegen.
Die Grenzen werden bei der Initialisierung der Statemachine auf viel zu hohe Werte gesetzt, damit ein "lock" erst erreicht werden muss.
Beim internen Takt von 200MHz und 48kHz-SPDIF sollte p0_5 = 16 gelten (mit SignalTap ermittelt).
Die Initialisierung macht:
Code:
p0_5 <= 32;
p1_5 <= 96;
p2_5 <= 160;
p3_5 <= 224;
Sobald ich einen gemessenen Wert nicht zuordnen kann, nach 64 Flaken keine Präambel erkannt wurde, oder auf die einmalige Erkennuntg von "1x" nicht eine erneute Erkennung von "1x" folgt, werden die Entscheidergrenzen wie folgt angepasst:
Code:
p0_5 <= p0_5 - 1;
p1_5 <= p1_5 - 3;
p2_5 <= p2_5 - 5;
p3_5 <= p3_5 - 7;
Das geht soweit echt super.
Ein bisschen grafischer Input:
Das .vhd gibt es
hier.
Pffffffffft. "Da entwich das Vakuum" - Heinrich Physik, 1857.