Forum: FPGA, VHDL & Co. Digital-Multiplexer-2zu4 timed nicht richtig


von Paul B. (Gast)


Angehängte Dateien:

Lesenswert?

Ich verwende einen 2:16 Multiplexer mit 4 Xilinx FPGAs um digitale Daten 
aus zwei Quellen auf 16 Verbraucher zu lenken. Die Busbreite sind 16 Bit 
und die Datenrate 100 MHz SDR. (ursprünglich 100 MHz DDR auf 8 Bit). 
Theoretisch kann jeder Verbraucher jede der beiden Quellen nutzen. Die 
Auswahl geschieht über eine Logik, die die Quellen analysiert und die 
jeweils richtige weiterschaltet. So sehen die ersten 1-4 Verbraucher 
z.B. die Quelle 1 und die anderen die 2 oder auch umgekehrt.

Die Takte der Quellen müssen aber erhalten bleiben und mit auf den 
Ausgang, damit die exakte Frequenz mitgeliefert wird. Retiming geht 
nicht, weil mit dem Originaltakt ein ADC getrieben wird.

Dazu synchronisiere ich jede Quelle mit ihrem Takt ein, (PLL ist erlaubt 
und vorteilhaft, wegen der clock skew Thematik) und geben sie an einen 
MUX weiter. Jeder der jeweils 4 MUX bekommt ein Steuersignal, welche 
Daten er weitergeben soll. Parallel dazu wird ein CLock-MUX benutzt, der 
genau so funktioniert.

Die Steuerlogik läuft mit der System Clock des FPGAs und synched die 
Quellen ein, um sie stabil analysieren zu können.

Die Schaltung funktioniert eigentlich, allerdings bekomme ich neuerdings 
physikalische timing Probleme. Diese liegen ausschließlich im 
Vorwärtspfad. Das Analysieren der Daten klappt und das statische 
Umschalten funktioniert und ist stabil. (die dabei entstehenden 
Aussetzer sind unbedeutend).

Das Timing, soweit spezifiziert, wird 100% getroffen.

Ich gehe davon aus, dass das Design noch nicht komplett constrained ist. 
Ich habe eine Weile damit herumexperimentiert und gefunden, dass sich 
XST wohl teilweise mit den Signalen zu vertun scheint. Daher habe ich 
jedes einzelne Signal einzeln benannt. Im Umfeld der PLL war das ohnehin 
nötig, weil 14.7 aus irgendeinem Grund keine vernüftige PLL-Instanz 
hinbekam.


Bislang mache ich dies:

1) Periode auf den Eingang ganz vorne, also so, wie das Signal am PAD 
heisst und auch im Editor angeboten wird?

NET "CLK_X_IN" TNM_NET = "CLK_X_IN";
TIMESPEC TS_CLK_X_IN = PERIOD "CLK_X_IN" 10 ns HIGH 50 % INPUT_JITTER 50 
ps;


2) dasselbe für den Y-Pfad:

NET "CLK_Y_IN" TNM_NET = "CLK_Y_IN";
TIMESPEC TS_CLK_Y_IN = PERIOD "CLK_Y_IN" 10 ns HIGH 50 % INPUT_JITTER 50 
ps;


3) und die Systemdomain:


4) Dazu Ignores zwischen den Domainen, damit die Synthese entspannt wird 
und er nicht probiert, da was zu timen:

TIMESPEC "TS_IGNORE_X_TO_Y" = FROM CLK_X_IN TO CLK_Y_IN TIG;
TIMESPEC "TS_IGNORE_Y_TO_X" = FROM CLK_Y_IN TO CLK_X_IN TIG;

TIMESPEC "TS_IGNORE_X_TO_S" = FROM CLK_X_IN TO SYS_CLK_IN TIG;
TIMESPEC "TS_IGNORE_S_TO_X" = FROM SYS_CLK_IN TO CLK_X_IN TIG;

TIMESPEC "TS_IGNORE_S_TO_Y" = FROM SYS_CLK_IN TO CLK_Y_IN TIG;
TIMESPEC "TS_IGNORE_Y_TO_S" = FROM CLK_Y_IN TO SYS_CLK_IN TIG;



Tatbestand:

Etliche der TIGs werden ignoriert, was auch plausibel ist, weil es je 
nach Designausführung solche Pfade nicht gibt. Was mich aber irriert ist 
das Folgende:

WARNING:ConstraintSystem - TNM : CLK_Y_IN was distributed to a DCM but 
new
   TNM constraints were not derived. The requirement for derived TNM 
constraints
   is that the distributed TNM is referenced by no more than a single 
PERIOD
   constraint. Non-PERIOD referencers are also not allowed. This TNM is 
used in
   the following user groups or specifications:
   <TIMESPEC TS_CLK_Y_IN = PERIOD "CLK_Y_IN" 5 ns HIGH 50 %
   INPUT_JITTER 50 ps;> [C:/Matrix Control 
Unit/FPGA/xst/matcon.ucf(168)]
   <TIMESPEC "TS_IGNORE_S_TO_Y" = FROM SYS_CLK_IN TO CLK_Y_IN TIG;>
   [C:/Matrix Control Unit/FPGA/xst/matcon.ucf(172)]
   <TIMESPEC "TS_IGNORE_Y_TO_S" = FROM CLK_Y_IN TO SYS_CLK_IN TIG;>


Heisst das, dass das Constrained weggefallen ist wegen Doppelrefrenz?

Wie liesse sich das prüfen oder umgehen?


Weitere Frage, was brauche ich noch?

Global Offset constraints?

von Paul B. (Gast)


Lesenswert?

Probiert habe ich auch das Zusammenfassen der Eingänge und Ausgänge zu 
Gruppen und ein Constrained zu setzen:

Eingangsgruppe z.B.

INST "MAT_X_D<0>" TNM = MATRIX_IN_X;
INST "MAT_X_D<1>" TNM = MATRIX_IN_X;
...
INST "MAT_X_D<15>" TNM = MATRIX_IN_X;

TIMEGRP "MATRIX_IN_X" OFFSET = IN 0 ns VALID 5 ns BEFORE "CLK_X_IN" 
RISING;
TIMEGRP "MATRIX_IN_Y" OFFSET = IN 0 ns VALID 5 ns BEFORE "CLK_Y_IN" 
RISING;


Was ich sehe ist, dass im Constraint Editor diese Eingänge noch als 
unconstrained gelten, wohl aber hinten in der Gruppe gezeigt werden. 
Wieder ein Xilinx Problem - gfs mit Grossschrift und Anführungszeichen?

Die disbezüglichen Ausgangsconstraineds scheinen nicht zu funktionieren 
- er findet alle Signale als nicht im Timing zu treffen.

von Paul B. (Gast)


Lesenswert?

Hat niemand der FPGA-Grössen hier im Forum eine Idee?

von FPGA Pongo (Gast)


Lesenswert?

Soweit mir bekannt, verträgt die Xilinx Sysnthese, also XST kein 
Doppel-Constraint und blockiert. Habe es auf die Schnelle mal 
ausprobiert: Wenn Du die zusätzliche Anweisung mit den multiplen TIG 
weglässt, nimmt er auch die Periodensettings und die daraus folgenden 
Taktreserven werden ermittelt ("derived).

Schau mal in Deinen Systhesis Report und übermittle das mal.

von Klakx (Gast)


Lesenswert?

Mal ein anderer Ansatz:
Ich sehe hier die Timing Probleme durch das Routing und den Clock-Mux.

Wie wäre es, wenn du beide Eingangsdatenströme in je ein kleines 
Asynchrones Fifo schreibst. Der gemuxte Clock ließt dann wieder daraus. 
Damit hast du den Vorteil, dass die Latenz/Phasenversatz vor dem 
Clock-Mux keine Rolle mehr für das Timing danach spielt.
In diesem Fall kannst du alle zwei Pfade asynchron zueinander auf die 
maximale Frequenz stellen bzw. das Contraint am Ausgang vom Clock-Mux 
neu setzen. Das Timing sollte damit entspannt sein.

von FPGA Pongo (Gast)


Lesenswert?

Das wäre dann nötig, wenn es grundsätzliche Timingprobleme gäbe, was 
wohl nicht der Fall ist und ich auch eher nicht glaube, weil die 
ClockMUX nicht langsamer sind, als die BUFGs selber, die allenthalben 
verwendet werden, um die Logik zu treiben und die langen Routingpfade 
viel mehr Delay produzieren. Ich meine, Xilinx gibt für die Buffer 
irgendwas um die x00ps an.

Grundsätzlich ist das aber ein richtiger Einwand.

von Duke Scarring (Gast)


Lesenswert?

FPGA Pongo schrieb im Beitrag #4116139:
> weil die
> ClockMUX nicht langsamer sind, als die BUFGs selber, die allenthalben
> verwendet werden
BUFG, BUFGCE und BUFGMUX ist alles die selbe Hardware, nur mit 
unterschiedlicher Beschaltung.

Duke

von Paul B. (Gast)


Lesenswert?

Ich komme zurück auf dieses design. Das FiFo hatte ich eingebaut - aber 
er hängt sich noch immer an den constraints auf.

Es gibt 2 Dinge:

1) Wenn ich ein Timing ignore von der linken Seite des FiFos zur rechten 
mache, findet er den rechten Takt, also den BUFGMUX-Ausgang nicht.

2) Die Umschaltung des BUFGMUX selber kommt aus eine dritten Domain, die 
mit den Micocontroller läuft. Dessen Takt wird als Systemtakt des FPGa 
verwendet. Ich habe daher ein weiteres TIG zwischen diesem Tatk und den 
eigentlichen Datentakten liegen. Dies führt dann zu folgendem Fehler:
1
ConstraintSystem - TNM : OSC_100 was distributed to a DCM but new TNM constraints were not derived. The requirement for derived TNM constraints is that the distributed TNM is referenced by no more than a single PERIOD constraint. Non-PERIOD referencers are also not allowed. This TNM is used in the following user groups or specifications:
2
<TIMESPEC TS_OSC_100 = PERIOD "OSC_100" 10.000 ns HIGH 50 %;>
3
4
<TIMESPEC "TS_MUC_TO_DATA" = FROM OSC_100 TO DATA_1_CL TIG;>
5
<TIMESPEC "TS_DATA_TO_MUC" = FROM DATA_1_CL TO OSC_100 TIG;>

Offenbar stört er sich an der doppelten Verwendung des Mastertaktnamens. 
Wie muss man das constaint formulieren, um ein TIG zu setzen, dass ihn 
aber nicht bei den Berechungen der entstehenden Takte im DCM stört?

Ist das TIG überhaupt so richtig?

Habe schon den kompletten constraint guide durchgewühlt, komme aber zu 
keinem schlüssigen Ergebnis.

von VHDL-online Hilfe (Gast)


Lesenswert?

Das ist meist auf unkorrekte Schreibweisen zurückzuführen. Ist das 
Taktsignal überhaupt noch da oder gfs namentlich ersetzt?

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.