Hallo,
habe mal eine kleine Frage. Ich will im Rahmen eines Projektes zwei
Kameras über CameraLink an das FPGA (Virtex 5, Custom Board)
anschließen. Die Hardware und Hardwarebeschreibung in VHDL ist schon
fertig und getestet, aber mit nur einer Kamera. Jetzt wollte ich die
beiden Kameras an die selben Ports meiner IP anschließen, da die
Arbeitsweise ja genau gleich ist, zum anderen ich mir eine zweite
Instanziierung meiner IP sparen will und drittens, da die Kameras nie
gleichzeitig eingeschaltet sein werden.
Hoffe ich habe das Problem schildern können. Bild 1 zeigt im groben was
ich vor habe bzw. will.
Die Instanz CL_PORT_SWITCH habe ich folgendermaßen die Ports verbunden:
Der Output "CLK_20_Y_diff_CAM" der Insantz CL_PORT_SWITCH wurde über ein
internes SIGNAL i_CLK_20_Y_diff (STD_LOGIC_VECTOR(1 DOWNTO 0)) mit dem
Input der Instanz CL_Camera verbunden.
Nun treten folgende Errors auf:
...
NgdBuild:455 - logical net 'u_CL_DATA_RECEIVER/i_CLK_20_Y_diff<0>' has
multiple driver(s):
pin PAD on block u_CL_DATA_RECEIVER/i_CLK_20_Y_diff<0> with type PAD,
pin O on block
u_CL_DATA_RECEIVER/u_CL_PORT_SWITCH/CLK_20_Y_diff_CAM<0>1 with type LUT3
NgdBuild:924 - input pad net 'u_CL_DATA_RECEIVER/i_CLK_20_Y_diff<0>' is
driving non-buffer primitives:
pin O on block
u_CL_DATA_RECEIVER/u_CL_PORT_SWITCH/CLK_20_Y_diff_CAM<0>1 with type LUT3
NgdBuild:455 - logical net 'u_CL_DATA_RECEIVER/i_CLK_20_Y_diff<1>' has
multiple driver(s):
pin PAD on block u_CL_DATA_RECEIVER/i_CLK_20_Y_diff<1> with type PAD,
pin O on block
u_CL_DATA_RECEIVER/u_CL_PORT_SWITCH/CLK_20_Y_diff_CAM<1>1 with type LUT3
NgdBuild:924 - input pad net 'u_CL_DATA_RECEIVER/i_CLK_20_Y_diff<1>' is
driving non-buffer primitives:
pin O on block
u_CL_DATA_RECEIVER/u_CL_PORT_SWITCH/CLK_20_Y_diff_CAM<1>1 with type LUT3
...
Irgendwie wird nach Multisource hingedeutet (?!), aber ist mir irgendwie
unverständlich warum. Es geht um das Signal i_CLK_20_Y_diff, welches
wohlmöglich mehrere Drivers hat.
Wenn ich mir das ganze in Floorplaning angucke, sieht es eigentlich in
Ordnung aus (Bild 2). Die Ports werden mit LUTS zu einem Ausgang
zusammengefasst, je nachdem wie das Control Signal anliegt.
Wo könnte jetzt das Problem denn liegen oder wie müsste man es den
eigentlich machen?
Bräuchte in der Hinsicht eure Hilfe. Ich hoffe dass ich das Problem gut
schildern konnte und freue mit schon auf eure Antworten.
mfg Cihan
Meines Wissens geht das nicht, weil sonst die eine Kamera den Ausgang
der anderen, inkativen treibt. Da brauchst du schon zwei physikalische
Ports und damit auch zwei Instanzen der SERDES, denke ich. Nur den
Verarbeiter hinter den SERDES kannst du multiplexen. Ich lasse mich aber
gerne vom Gegenteil überzeugen.
Ach ja, CAMERALINK-VHDL gibt es inzwischen als Core - Muss man nicht
selber machen.
Upp: Gerade sehe ich, dass Du einen einsetzt- Welchen?
So wie es aussieht, hängt der VHDL von oben hinter dem Core. Der dürfte
die SERDES / MCMs bedienen, denke ich. Die Nummer läuft ja so, dass eine
MCM auf den eingehenden Takt justiert wird und dann den hohen
SERDES-Takt liefert, z.B. 6,7,8,9 x 20,40,80 MHz. Bei mir waren es
damals 8 x 80 MHz auf zwei Kabeln. Die SERDES kann man vorne an den
Ports nicht multiplexen, weil die in den IOs sitzen. Du kannst sie nur
nutzen oder nicht nutzen.
Mehrfach benutzen könntest Du die MCM. Braucht dann aber einen zweiten
Ausgang von Input-Takt-Buffer zum sampelnden SERDES. Keine Ahnung, ob er
das bauen kann oder will.
Ich habe das mit Xilinx gemacht und lange rumgekämpft.
Die Core für CameraLink habe ich selber programmiert, da die IP-Core ja
auch etwas kostet. Ich habe die 20MHz CLK auf das 7 fache erweitert, um
die Datensynchronisation herzustellen. Klappt ja alles auch wunderbar,
nun wollte ich eine Zweite Camera mit verbinden, der im Prinzip genau
die gleiche Aufgabe und Steuerung hat wie die erste.
Dementsprechend wollte ich nur die Ports im VHDL Programm "Switchen",
doch leider irgendwie nicht realisierbar, so wie es aussieht. Schade.
Kommt man also nicht drumherum, alles zweimal zu instanzieren.
Nochmal nur am Rande, die Frage bezog sich jetzt eigentlich nicht direkt
auf CameraLink, sondern es könnten auch beispielsweise zwei Ports ins
FPGA reinkommen und in die selbe Instanziierung geführt sein. Da man nur
einen immer braucht, wäre es ja komfortabel wenn sich wählen könnte
welchen man benutzen will.
Cihan
A.S. schrieb:> Meines Wissens geht das nicht, weil sonst die eine Kamera den Ausgang> der anderen, inkativen treibt.
Eigentlich nicht oder?!
Die Datenleitungen kommen nur von der Camera ins FPGA rein und andersrum
tut sich nichts. D.H. beide Camera-Leitungen werden mit verschiedenen
Ports mit dem FPGA verbunden und intern in der Hardwarebeschreibung
(Programm) soll per EN entschieden werden, welcher im weiteren Programm
benutzt wird. Eigentlich ganz simpel, vllt. doch irgendwie
realisierbar?!?!
Cihan
Ich verwende keinen SERDES.
Der Eingang ist in der Komponente CL_CAMERA. Vorerst soll in der
Komponente CL_PORT_SWITCH entschieden werden, ob z.B. der I/O Pin der
CAM1 oder CAM2 in die Komponente CL_Camera übergeben werden soll. Die
Übergabe erfolgt im Anschluss über ein Top_Modul standardmäßig mit einem
internen Signal (wie oben auch beschrieben). Die Entscheidung wird mit
einem vom mir (per Befehl) gesteuertem Signal "CL_PORT_CONTROL"
realisiert.
Cihan
Cihan Kalayci schrieb:> ...> NgdBuild:455 - logical net 'u_CL_DATA_RECEIVER/i_CLK_20_Y_diff<0>' has> multiple driver(s):> pin PAD on block u_CL_DATA_RECEIVER/i_CLK_20_Y_diff<0> with type PAD,> pin O on block> u_CL_DATA_RECEIVER/u_CL_PORT_SWITCH/CLK_20_Y_diff_CAM<0>1 with type LUT3>> NgdBuild:924 - input pad net 'u_CL_DATA_RECEIVER/i_CLK_20_Y_diff<0>' is> driving non-buffer primitives:> pin O on block> u_CL_DATA_RECEIVER/u_CL_PORT_SWITCH/CLK_20_Y_diff_CAM<0>1 with type LUT3>> NgdBuild:455 - logical net 'u_CL_DATA_RECEIVER/i_CLK_20_Y_diff<1>' has> multiple driver(s):> pin PAD on block u_CL_DATA_RECEIVER/i_CLK_20_Y_diff<1> with type PAD,> pin O on block> u_CL_DATA_RECEIVER/u_CL_PORT_SWITCH/CLK_20_Y_diff_CAM<1>1 with type LUT3>> NgdBuild:924 - input pad net 'u_CL_DATA_RECEIVER/i_CLK_20_Y_diff<1>' is> driving non-buffer primitives:> pin O on block> u_CL_DATA_RECEIVER/u_CL_PORT_SWITCH/CLK_20_Y_diff_CAM<1>1 with type LUT3> ...
Wenn ich mir die Fehlerausgabe angucke, sehe ich, dass das interne
Signal i_CLK_20_Y_diff (std_logic_vector(1 dt 0) als PAD synthesiert
wird, welches dann auch den Multiple Driver hervorruft. Kann man per
Attribute Befehl bewirken, dass er das Signal nicht als PAD synthesieren
soll? Liegt evtl. der Fehler sogar hier?
Cihan
Cihan Kalayci schrieb:> da die IP-Core ja>> auch etwas kostet.
ist bei Xilinx kostenlos mit drin.
Cihan Kalayci schrieb:> Ich verwende keinen SERDES.
ist bei 20MHz auch kaum nötig. Dann kannst Du in der Tat machen was Du
willst. Ich würde sagen, beide Kameratakte auf einen
Clockbuffer-Umschalter, von dort PLL synchen und mit dem Ausgangstakt
beiden Eingänge abtasten und den richtigen wählen.