Hallo,
ich bin vor kurzem auf die Zynqs gestoßen und bin gerade dabei mich in
die OSERDES einzulesen. Durch die verfügbaren Templates und den
Reference Designs aus XAPP585 habe ich selber mal einen Versuch
unternommen.
Zwar werden meine Inputs korrekt serialisiert, allerdings geschieht dies
nicht Taktsynchron zum CLKDIV. Ist dieses Verhalten normal oder habe ich
da etwas falsch eingestellt?
1
libraryIEEE;
2
useIEEE.STD_LOGIC_1164.ALL;
3
libraryUNISIM;
4
useUNISIM.VCOMPONENTS.ALL;
5
entitydesign_1_wrapperis
6
port(CLK:inSTD_LOGIC;
7
CLKDIV:inSTD_LOGIC;
8
CH1_OUT:outSTD_LOGIC:='0'
9
);
10
11
enddesign_1_wrapper;
12
13
architectureSTRUCTUREofdesign_1_wrapperis
14
15
signalOQ_INT:STD_LOGIC:='0';
16
signalRST_INT:STD_LOGIC:='1';
17
signalCOUNTER:INTEGER:=0;
18
19
begin
20
21
OSERDESE2_inst:OSERDESE2
22
genericmap(
23
DATA_RATE_OQ=>"SDR",-- DDR, SDR
24
DATA_RATE_TQ=>"SDR",-- DDR, BUF, SDR
25
DATA_WIDTH=>7,-- Parallel data width (2-8,10,14)
26
INIT_OQ=>'0',-- Initial value of OQ output (1'b0,1'b1)
27
INIT_TQ=>'0',-- Initial value of TQ output (1'b0,1'b1)
28
SERDES_MODE=>"MASTER",-- MASTER, SLAVE
29
SRVAL_OQ=>'0',-- OQ output value when SR is used (1'b0,1'b1)
30
SRVAL_TQ=>'0',-- TQ output value when SR is used (1'b0,1'b1)
Ich hätte jetzt erwartet, dass die seriellen Daten synchron zur nächsten
Taktflanke von CLKDIV ausgegeben werden. In der Simulation geschieht
dies allerdings erst um ein paar Takte von CLK versetzt.
Den Reset-Process habe ich nur für die Simulation mit eingefügt.
Könnt ihr mir bitte helfen?
Viele Grüße.
Horst K. schrieb:> Zwar werden meine Inputs korrekt serialisiert, allerdings geschieht dies> nicht Taktsynchron zum CLKDIV.
Simulation oder Synthese?
Ah, zu kurz gelsen:
> In der Simulation geschieht> dies allerdings erst um ein paar Takte von CLK versetzt.
Und in der Realität?
Ich vermute mal, das wird schon so sein, allerdings betrifft es ja
andere OSERDES auch, so das es am Ende wieder passt.
Wie groß ist denn die Latenz genau?
Duke
Horst K. schrieb:> Ich hätte jetzt erwartet, dass die seriellen Daten synchron zur nächsten> Taktflanke von CLKDIV ausgegeben werden. In der Simulation geschieht> dies allerdings erst um ein paar Takte von CLK versetzt.
Das selbe Problem kommt dann nochmal besonders hoch, wenn man mit
Clock-Enable auf CLKDIV arbeitet. Das ist nämlich genauso blöd.
Ein Support-Ticket von Xilinx hat das auch nochmal unterstrichen. Man
solle dann auf der 1bit-Takt-Domäne das Enable setzen.
Im Prinzip musst du dich damit arrangieren zusätzliche Logik auf die
1bit Domäne zu setzen oder dich mit dem Vor- und Nachlauf deiner Daten
zu befassen. Z.B. Könntest du die Daten im Datenstrom verschieben, so
dass Datenbits in einem späteren Datenword landen.
Und ich hatte schon die Hoffnung, irgendwas falsch gemacht zu haben. :(
Kann leider erst morgen wieder ein Bild von der Waveform schicken. Aber
es war so, dass nachdem der Reset freigegeben wurde nach zwei CLK + 4
CLKDIV das Senden begann. Bisher habe ich es auch nur in der Simulation
ausprobiert.
Dachte, ich bringe es erstmal hier zum laufen, bevor es auf den Zynq
kommt.
Was mich vor allem verwundert hat, als ich das CLock-Forwarding
aktiviert habe, um CLKDIV mit auszugeben, war der ausgegebene Takt
synchron und die Daten verschoben. Aber das würde ja sogesehen keinen
Sinn machen oder? Das müsste sich der Empfänger dann ja auch wider
irgendwie zusammen suchen.
Deswegen hatte ich auf einen Fehler meinerseits getippt.
Klakx schrieb:> Ein Support-Ticket von Xilinx hat das auch nochmal unterstrichen. Man> solle dann auf der 1bit-Takt-Domäne das Enable setzen.
Hast du einen Link dazu zum Nachlesen? Ich sollte also bei jeder
Taktflanke von CLKDIV, OCE für die dauer einer CLK-Periode auf High
setzen und dann wieder auf Low?
Bzw. andernfalls meine Daten so übergeben, dass ich die benötigte
Bitpositionen erhalte oder ohne Clock-Forwarding arbeiten, wodurch alle
OSERDES ja den selben Versatz hätten und somit zumindest zueinander
synchron sind.
Habe ich das richtig verstanden?
Schon mal vielen Dank für eure Antworten!