mikrocontroller.net

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


Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
entity Takt_LED is
    Port ( CLOCK : in  STD_LOGIC;
           LED : out  STD_LOGIC);
end Takt_LED;

architecture Behavioral of Takt_LED is
signal clk_halbe : STD_LOGIC;

begin
process (BLINK) 
begin
  
  if rising_edge(CLOCK) then
     clk_halbe <= not clk_halbe;
  end if;
end process;

COUNT_OUT <= clk_halb;
 
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

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Übrigens bekommst du in der ISE über Edit -> Language Templates schon 
den passenden COde vorgeschlagen:


--   OBUFDS     : In order to incorporate this function into the design,
--    VHDL      : the following instance declaration needs to be placed
--  instance    : in the architecture body of the design code.  The
-- declaration  : instance name (OBUFDS_inst) and/or the port declarations
--    code      : after the "=>" assignment maybe changed to properly
--              : connect this function to the design. All inputs must be
--              : connected.

--   Library    : In addition to adding the instance declaration, a use
-- declaration  : statement for the UNISIM.vcomponents library needs to be
--     for      : added before the entity declaration.  This library
--   Xilinx     : contains the component declarations for all Xilinx
--  primitives  : primitives and points to the models that will be used
--              : for simulation.

--  Copy the following two statements and paste them before the
--  Entity declaration, unless they already exist.

Library UNISIM;
use UNISIM.vcomponents.all;

--  <-----Cut code below this line and paste into the architecture body---->

   -- OBUFDS: Differential Output Buffer
   --         Spartan-3A DSP
   -- Xilinx HDL Language Template, version 11.3
   
   OBUFDS_inst : OBUFDS
   generic map (
      IOSTANDARD => "DEFAULT")
   port map (
      O => O,     -- Diff_p output (connect directly to top-level port)
      OB => OB,   -- Diff_n output (connect directly to top-level port)
      I => I      -- Buffer input 
   );
  
   -- End of OBUFDS_inst instantiation

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :)
entity Test2 is
    Port ( CLOCK : in  STD_LOGIC;
           LVDSTakt_OB : out  STD_LOGIC;
           LVDSTakt_O : out  STD_LOGIC);
end Test2;

architecture Behavioral of Test2 is

    -- Component Declaration for OBUFDS should be placed
    -- after architecture statement but before begin keyword
    component OBUFDS
      port (O : out STD_ULOGIC;
          OB : out STD_ULOGIC;
          I : in STD_ULOGIC);
    end component;

    signal clk_halb : STD_LOGIC;

    begin

    process (CLOCK) 
    begin
      
        if rising_edge(CLOCK) then
          clk_halb <= not clk_halb;
        end if;

        -- Component Instantiation for OBUFDS should be placed
        -- in architecture after the begin keyword
        LVDS_Takt_out : OBUFDS
            port map (O => LVDSTakt_O,
                   OB => LVDSTakt_OB,
                   I => clk_halb); 

    end process;

end Behavioral;

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

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Christian R. (supachris)
Datum:

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

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.