Forum: FPGA, VHDL & Co. Mehrere Ports an eine Instanz!?


von Cihan K. (lazoboy61)


Angehängte Dateien:

Lesenswert?

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:
1
ENTITY CL_PORT_SWITCH IS
2
  PORT (
3
        CL_PORT_CONTROL    :  IN  STD_LOGIC;
4
        CLK_20_Y_diff_CAM1 :  IN  STD_LOGIC_VECTOR(1 DOWNTO 0);--LVDS
5
        CLK_20_Y_diff_CAM2 :  IN  STD_LOGIC_VECTOR(1 DOWNTO 0);--LVDS
6
        ...
7
        CLK_20_Y_diff_CAM  :  OUT STD_LOGIC_VECTOR(1 DOWNTO 0);--LVDS
8
        ...
9
        );
10
END CL_PORT_SWITCH;
11
12
ARCHITECTURE BEHAVIORAL OF CL_PORT_SWITCH IS
13
14
BEGIN
15
16
CLK_20_Y_diff_CAM <= CLK_20_Y_diff_CAM1 WHEN CL_PORT_CONTROL = '0' ELSE CLK_20_Y_diff_CAM2;
17
...
18
19
END BEHAVIORAL;

Die Entity der CL_Camera-Instanz sieht so aus:
1
COMPONENT CL_CAMERA
2
  PORT (
3
        ...
4
        CLK_20_Y_diff      :  IN  STD_LOGIC_VECTOR(1 DOWNTO 0);--LVDS
5
        ...

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

von A.S. (Gast)


Lesenswert?

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.

von A.S. (Gast)


Lesenswert?

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.

von Cihan K. (lazoboy61)


Lesenswert?

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

von Cihan K. (lazoboy61)


Lesenswert?

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

von DuArte (Gast)


Lesenswert?

Wo liegt der Eingang, wenn Du tatsächlich nur einen Eingang verwendest -
in einem Eingangsregister in einer IO-Zelle? Oder ist es ein 
Serdes-Eingang?

von Cihan K. (lazoboy61)


Lesenswert?

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

von Cihan K. (lazoboy61)


Lesenswert?

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

von DuArte (Gast)


Lesenswert?

>als PAD synthesiert

Du meinst als Eingangsregister in der IO-Zelle?

von Cihan K. (lazoboy61)


Lesenswert?

DuArte schrieb:
>>als PAD synthesiert
>
> Du meinst als Eingangsregister in der IO-Zelle?

Ja. Heisst das, dass es so nicht realisierbar ist?

Cihan

von DuArte (Gast)


Lesenswert?

Werden denn tatsächlich Eingangsregister verwendet (bei einem Interface) 
?

von Cihan K. (lazoboy61)


Lesenswert?

Wie kann ich das denn eigentlich prüfen? Dann könnte ich es dir besser 
sagen.

Cihan

von Pesto (Gast)


Lesenswert?

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.

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.