Forum: FPGA, VHDL & Co. Xilinx ISE: output pad net 'locked_s' has an illegal load:


von Heinrich H. (Firma: Ich.AG) (hhanff)


Lesenswert?

Hallo,
in meinem Design habe ich eine standard DLL von Xilinx instantiiert um 
einen Clock zu multiplizieren. Laut Datenblatt der DLL kann der 
entsehende Clock erst genutzt werden, sobald die DLL eingeschwungen ist. 
Dies wird durch einen 0->1 Übergang des LOCKED Signals (wird von der DLL 
geliefert) signalisiert. Meine Idee war nun dieses Signal auf den Reset 
Zweig meines Designs zu geben. Hier der Code:
1
rst_s <= '0' when locked_s = '0' else '1';
In der Simulation läuft's, aber ISE schmeisst mir die folgende 
Fehlermeldung raus:

ERROR:NgdBuild:462 - output pad net 'locked_s' drives multiple buffers:
     pin I on block locked_s_inv1_INV_0 with type INV,
     pin I on block gen_sync_1/rst_54MHz_inv1_INV_0 with type INV,
     pin I on block gen_addr_1/rst_load_clk_inv1_INV_0 with type INV,
     pin I on block gen_addr_1/rst_54MHz_inv1_INV_0 with type INV,
     pin I on block data_to_ram_1/rst_load_clk_inv1_INV_0 with type INV
ERROR:NgdBuild:809 - output pad net 'locked_s' has an illegal load:
     pin I0 on block gen_sync_1/data_out_and0000_SW0 with type LUT2


Kann da jemand was mit anfangen...??? Wenn's so gar nicht geht, hat dann 
vielleicht jemand nen Vorschlag wie's eleganter lösbar ist???

Gruß,

Hendrik

von Jan M. (mueschel)


Lesenswert?

Eigentlich würde ich sagen, dass sollte so funktionieren... Vermutung: 
Benutzt deine DLL vielleicht auch rst_s als Resetsignal?

von Fpgakuechle K. (Gast)


Lesenswert?

Hm, es ist nicht unüblich das locked signal als reset zu verwenden.
(1)Vielleicht verwendest du den reset synchron aber erzeugst ihn 
asynchron (Locked könnte asynchron sein) und dann passiert das.

(2) warum bastelt das tool inverter in den resetpfad?

(3) du kannst statt
1
rst_s <= '0' when locked_s = '0' else '1';


natürlich auch
1
rst_s <= locked_s;

schreiben, falls die typen passen.

(4) Legst du locked_s auch auf ein Ausgangspin des FPGA? vielleicht kann 
er das nicht routen. Lass das output-pad testhalber weg.

von Heinrich H. (Firma: Ich.AG) (hhanff)


Lesenswert?

Fpga Kuechle wrote:
> Hm, es ist nicht unüblich das locked signal als reset zu verwenden.
> (1)Vielleicht verwendest du den reset synchron aber erzeugst ihn
> asynchron (Locked könnte asynchron sein) und dann passiert das.
Nein, der Reset wird in allen Prozessen ausschliesslich asynchron 
verwendet. Eine synchrone Verwendung ist ausgeschlossen. Alle meine 
Prozesse fangen so an:
1
  clk_108MHz_cnt : process (clk_108MHz_s, rst_108MHz_s)
2
  begin  -- process 108MHz_cnt
3
    if rst_108MHz_s = '0' then          -- asynchronous reset (active low)
4
      clk_108MHz_cnt_addr <= (others => '0');
5
    elsif clk_108MHz_s'event and clk_108MHz_s = '1' then  -- rising clock edge
6
...
7
8
  end process clk_108MHz_cnt;

>
> (2) warum bastelt das tool inverter in den resetpfad?
Gute Frage. Kann man das abstellen? Ist das eine Fehlerursache?

>
> (3) du kannst statt
>
>
1
> rst_s <= '0' when locked_s = '0' else '1';
2
>
>
>
> natürlich auch
>
>
1
> rst_s <= locked_s;
2
>
Hab ich probiert. Leider ändert das nichts an der Fehlermeldung von ISE.

>
> schreiben, falls die typen passen.
>
> (4) Legst du locked_s auch auf ein Ausgangspin des FPGA? vielleicht kann
> er das nicht routen. Lass das output-pad testhalber weg.
Ja, das Output Pad wird in dem VHDL Modell instantiiert dass von Xilinx 
bereitgestellt wird.
1
  lckpad : OBUF port map (
2
    I => LOCKED4X_dll,
3
    O => LOCKED);
Ich hab die Zeilen mal auskommentiert und durch folgendes ersetzt:
1
LOCKED <= LOCKED4X_dll;
Jetzt tut's. Mir stellt sich aber die Frage, ob der OBUF da nicht ne 
feste Bedeutung hatte. Die fügen das Teil da ja nicht umsonst ein. Oder 
ist das nur für den Fall vorgesehen, dass jemand den DLL Block nutzt, um 
den verdoppelten Takt auf einen Pin zu mappen und das LOCKED signal 
ebenso.

Gruß und gute N8,

Hendrik

von Heinrich H. (Firma: Ich.AG) (hhanff)


Lesenswert?

Und kann mir mal bitte jemand erklären wann ich
OBUF
IBUF
OBUFG
IBUFG
BUFG
u.s.w. verwenden muss und wo der Unterschied liegt? **Verwirrt-sei...

von Heinrich H. (Firma: Ich.AG) (hhanff)


Lesenswert?

Jan M. wrote:
> Eigentlich würde ich sagen, dass sollte so funktionieren... Vermutung:
> Benutzt deine DLL vielleicht auch rst_s als Resetsignal?
Ja, tut es. Aber das habe ich schon vor längerer Zeit abgestellt und 
anders gelöst. Danke für den Hinweis.

von Jan M. (mueschel)


Lesenswert?

O = Output
I = Input
BUF = Buffer
G = Glock ... äh, Global clock

Ein OBUFG wäre dann ein Output Buffer zusammen mit einem Global Clock 
Buffer.
Also du hast die Wahl zwischen Input/Output/Allgemein aka (I/O/-) und 
für Clock oder andere Signale (G/-). Je nach dem, was du machst, ist 
also genau festgelegt, welchen BUF du benutzen musst. In der Regel 
werden diese Buffer aber automatisch instantiiert.
Ein solcher Buffer ist immer dann nötig, wenn das Netzwerk gewechselt 
wird: Es gibt Clock-Netze, Routing-Netze und die I/O-Bereiche. Ein BUFG 
hängt mit dem Eingang in einem lokalen Routingpfad und mit dem Ausgang 
im Clocknetzwerk, ein IBUF entsprechend mit dem Eingang an einem Eingang 
und mit dem Ausgang in einem lokalen Routingpfad.


Die Inverter in der Resetleitung kommen daher, dass dein Reset-Signal 
low-active ist, die Hardware aber high-active-Signale braucht.

Dein Problem lag darin, dass ein Signal, dass an einen OBUF 
angeschlossen ist, nicht gleichzeitig auch an interne Routes 
angeschlossen sein kann. Das kannst du aber umgehen, indem du da ein 
weiteres Signal einfügst: DLLlocked => reset_s => reset_s_out => Output.

von Fpgakuechle K. (Gast)


Lesenswert?

(1) Zustimmung zu Jan + Ergänzung. Das zusätzliche Signal reset_s_out 
könnte wegoptimiert werden, dann bleibt das Problem bestehen. da hilft 
oft mit direkter Intstanzierung eine LUT etc einzufügen, die werden in 
der Regel nicht wegoptimiert.

(2) Die bedeutung  von OBUF
IBUF
OBUFG
IBUFG
BUFG
wird im libraries guide erklärt. Den findest du über 
doc/usenglish/books/manuals.pdf im ISE verzeichniss

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.