Forum: FPGA, VHDL & Co. Spartan - LVDS Takt ausgeben


von Andreas (Gast)


Lesenswert?

Hallo,

ich bin auf der Suche nach etwas Hilfe bei meinem aktuellen Projekt. Es 
ist für ein Praktikum hier im Studium und es ist recht neu für mich, 
leider war die Themenwahl nicht frei :(

Es geht darum, dass ich in einem Teilprjekt (mein Partner macht den 
anderen Teil) LVDS Daten abspeichern muss. Dazu sollen wir ein Board, 
bestückt mit einem Spartan3A-DSP XC3SD1800A, verwenden.

Die LVDS Signale werden an die Samtec Steckverbinder geführt und müssen 
nun verarbeitet werden.

Da ich mich mit FPGAs bisher nur rudimentär beschäftigt habe, habe ich 
recht großen Bammel/Respekt vor dieser Aufgabe und wollte nun erst 
einmal anfangen, einen LVDS Takt auszugeben. Einfach um zu schauen, wie 
händle ich die Bitsignale und wandle diese in LVDS um... das denke ich 
erleichert mir dann den Weg rückwärts, also die LVDS Signale in 
verwertbare Signale zu wandeln.

Ich habe auf dem Board zwei Oszillatoren, 25,xxMHz und 125MHz. Ich 
wollte den 125MHz Takt nun einfach mal an zwei Pins als LVDS ausgeben. 
Dazu sind laut Datenblatt ja nur die Bänke 0 und 2 geeignet, 1 und 3 
können wohl nur LVDS entgegennehmen.

Wie gehe ich nun am besten vor. Ich habe bisher nur den Takt halbiert 
und habe damit eine LED blinken lassen:
1
entity Takt_LED is
2
    Port ( CLOCK : in  STD_LOGIC;
3
           LED : out  STD_LOGIC);
4
end Takt_LED;
5
6
architecture Behavioral of Takt_LED is
7
signal clk_halbe : STD_LOGIC;
8
9
begin
10
process (BLINK) 
11
begin
12
  
13
  if rising_edge(CLOCK) then
14
     clk_halbe <= not clk_halbe;
15
  end if;
16
end process;
17
18
COUNT_OUT <= clk_halb;
19
 
20
end Behavioral;

Nun habe ich leider keine Ahnung, wie ich die Bausteine IBUFDS und 
OBUFDS richtig einsetze. Wobei ich für die Ausgabe ja nur den OBUFDS 
benötige. Wie verschalte ich die Variable clk_halbe z.B. mit dem Eingang 
des OBUFDS und welche Maßnahmen muss ich noch treffen, dass es 
funktioniert.

Welche I/O Spannung (das Board kann 2,5V oder 3,3V per Jumper) muss ich 
einstellen? Laut Datenblatt sollen wohl beide gehen, zumindest lese ich 
das so heraus, aber ganz sicher bin ich mir leider nicht.

Ich wäre für Hilfe Sehr sehr dankbar!

Andreas

von Christian R. (supachris)


Lesenswert?

LVDS läuft üblicherweise mit 2,5V VCCIO. Das ist ja durch die externe 
BEschaltung vorgegeben bzw. muss geklärt werden mit der "Gegenstelle". 
Die Ausgabe ist denkbar einfach, du instanziierst einfach den OBUFDS und 
verschaltest den Eingang an deinen Takt intern, die Ausgänge N und P 
müssen direkt an die entsprechenden Pins des FPGA. Die sind ja auch so 
gekennzeichnet (also N und P, die zusammengehörigen). Dann klappt das 
schon. Ansonsten ist das genauso einfach wie bei Single ended Signalen, 
das meiste, was man beachten muss, spielt sich auf der Platine an sich 
ab.
Achja, den CLK so zu teilen geht zwar auch, ist aber unschön und bremst 
eventuell das Timing aus. Mach das mal lieber mit dem DCM, dazu sind die 
schließlich da. Und die Takt-Ausgabe empfilet Xilinx mit ODDR FlipFlop 
zu machen.

von Christian R. (supachris)


Lesenswert?

Übrigens bekommst du in der ISE über Edit -> Language Templates schon 
den passenden COde vorgeschlagen:
1
--   OBUFDS     : In order to incorporate this function into the design,
2
--    VHDL      : the following instance declaration needs to be placed
3
--  instance    : in the architecture body of the design code.  The
4
-- declaration  : instance name (OBUFDS_inst) and/or the port declarations
5
--    code      : after the "=>" assignment maybe changed to properly
6
--              : connect this function to the design. All inputs must be
7
--              : connected.
8
9
--   Library    : In addition to adding the instance declaration, a use
10
-- declaration  : statement for the UNISIM.vcomponents library needs to be
11
--     for      : added before the entity declaration.  This library
12
--   Xilinx     : contains the component declarations for all Xilinx
13
--  primitives  : primitives and points to the models that will be used
14
--              : for simulation.
15
16
--  Copy the following two statements and paste them before the
17
--  Entity declaration, unless they already exist.
18
19
Library UNISIM;
20
use UNISIM.vcomponents.all;
21
22
--  <-----Cut code below this line and paste into the architecture body---->
23
24
   -- OBUFDS: Differential Output Buffer
25
   --         Spartan-3A DSP
26
   -- Xilinx HDL Language Template, version 11.3
27
   
28
   OBUFDS_inst : OBUFDS
29
   generic map (
30
      IOSTANDARD => "DEFAULT")
31
   port map (
32
      O => O,     -- Diff_p output (connect directly to top-level port)
33
      OB => OB,   -- Diff_n output (connect directly to top-level port)
34
      I => I      -- Buffer input 
35
   );
36
  
37
   -- End of OBUFDS_inst instantiation

von Andreas (Gast)


Lesenswert?

Vielen Dank,
ergibt folgender Code Sinn?
Ich setze jetzt also die Ausgänge des OBUFDS mit den Ausgängen meines 
entities Test2 gleich, geht das so einfach?
Auch wenn die Takterzeugung erstmal unsauber ist, würde ich dennoch 
gerne dabei bleiben, denn da weiß ich, dass sie funktioniert :)
1
entity Test2 is
2
    Port ( CLOCK : in  STD_LOGIC;
3
           LVDSTakt_OB : out  STD_LOGIC;
4
           LVDSTakt_O : out  STD_LOGIC);
5
end Test2;
6
7
architecture Behavioral of Test2 is
8
9
    -- Component Declaration for OBUFDS should be placed
10
    -- after architecture statement but before begin keyword
11
    component OBUFDS
12
      port (O : out STD_ULOGIC;
13
          OB : out STD_ULOGIC;
14
          I : in STD_ULOGIC);
15
    end component;
16
17
    signal clk_halb : STD_LOGIC;
18
19
    begin
20
21
    process (CLOCK) 
22
    begin
23
      
24
        if rising_edge(CLOCK) then
25
          clk_halb <= not clk_halb;
26
        end if;
27
28
        -- Component Instantiation for OBUFDS should be placed
29
        -- in architecture after the begin keyword
30
        LVDS_Takt_out : OBUFDS
31
            port map (O => LVDSTakt_O,
32
                   OB => LVDSTakt_OB,
33
                   I => clk_halb); 
34
35
    end process;
36
37
end Behavioral;

Ich kann ihn leider nicht gleich testen, weil ich nicht an der FH bin, 
erst morgen wieder...

von Andreas (Gast)


Lesenswert?

Ich schau mir mal das Template an, hatte eigentlich genau dort schon 
danach gesucht, aber leider nichts gefunden. Ich hoffe ich schaffe es am 
Wochenende weiter zu kommen.

Vielen Dank :)

von Christian R. (supachris)


Lesenswert?

Ja, das geht so, wenn du die beiden Ausgänge über das Top-Level Design 
direkt mit den Ausgängen des Chips verbindest.

von Andreas (Gast)


Lesenswert?

Super, hatte zwar noch einen Fehler drin, dass ich OBUFDS im process 
aufgerufen hatte und das nicht geht, aber nun habe ich vorerst ein 
125MHz LVDS Takt.

Nun versuche ich mal, mit Hilfe des DCM den Takt zu teilen und von mir 
aus auch noch weiter in die Höhe zu treiben, mal schauen ob es mir 
gelingt.

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.