Forum: FPGA, VHDL & Co. Zynq OSERDES2 Hilfe


von Horst K. (Gast)


Lesenswert?

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
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
library UNISIM;
4
use UNISIM.VCOMPONENTS.ALL;
5
entity design_1_wrapper is
6
    port (  CLK     : in STD_LOGIC;
7
            CLKDIV  : in STD_LOGIC;
8
            CH1_OUT : out STD_LOGIC := '0'          
9
    );   
10
11
end design_1_wrapper;
12
13
architecture STRUCTURE of design_1_wrapper is
14
  
15
  signal OQ_INT : STD_LOGIC := '0';
16
  signal RST_INT : STD_LOGIC := '1';
17
  signal COUNTER : INTEGER := 0;
18
  
19
begin
20
 
21
OSERDESE2_inst : OSERDESE2
22
    generic map (
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)
31
        TBYTE_CTL => "FALSE",    -- Enable tristate byte operation (FALSE, TRUE)
32
        TBYTE_SRC => "FALSE",    -- Tristate byte source (FALSE, TRUE)
33
        TRISTATE_WIDTH => 4      -- 3-state converter width (1,4)
34
    )
35
    port map (
36
        OFB => OQ_INT,             -- 1-bit output: Feedback path for data
37
        OQ => OQ_INT,               -- 1-bit output: Data path output
38
        -- SHIFTOUT1 / SHIFTOUT2: 1-bit (each) output: Data output expansion (1-bit each)
39
        SHIFTOUT1 => open,
40
        SHIFTOUT2 => open,
41
        TBYTEOUT => open,   -- 1-bit output: Byte group tristate
42
        TFB => open,             -- 1-bit output: 3-state control
43
        TQ => open,               -- 1-bit output: 3-state control
44
        CLK => CLK,             -- 1-bit input: High speed clock
45
        CLKDIV => CLKDIV,       -- 1-bit input: Divided clock
46
        -- D1 - D8: 1-bit (each) input: Parallel data inputs (1-bit each)
47
        D1 => '1',
48
        D2 => '1',
49
        D3 => '0',
50
        D4 => '0',
51
        D5 => '0',
52
        D6 => '1',
53
        D7 => '0',
54
        D8 => '0',
55
        OCE => '1',             -- 1-bit input: Output data clock enable
56
        RST => RST_INT,             -- 1-bit input: Reset
57
        -- SHIFTIN1 / SHIFTIN2: 1-bit (each) input: Data input expansion (1-bit each)
58
        SHIFTIN1 => '0',
59
        SHIFTIN2 => '0',
60
        -- T1 - T4: 1-bit (each) input: Parallel 3-state inputs
61
        T1 => '0',
62
        T2 => '0',
63
        T3 => '0',
64
        T4 => '0',
65
        TBYTEIN => '0',     -- 1-bit input: Byte group tristate
66
        TCE => '0'              -- 1-bit input: 3-state clock enable
67
    );
68
  
69
  CH1_OUT <= OQ_INT;
70
  
71
  process(CLKDIV)
72
  begin
73
    if rising_edge(CLKDIV) then
74
        if COUNTER < 100 then
75
            COUNTER <= COUNTER + 1;
76
            RST_INT <= '1';
77
        else
78
            RST_INT <= '0';
79
        end if;
80
    end if;
81
  end process;
82
  
83
  
84
end STRUCTURE;

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.

von Duke Scarring (Gast)


Lesenswert?

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

von Klakx (Gast)


Lesenswert?

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.

von Horst K. (Gast)


Lesenswert?

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!

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.