www.mikrocontroller.net

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


Autor: Heinrich H. (Firma: Ich.AG) (hhanff)
Datum:

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

Autor: Jan M. (mueschel)
Datum:

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

Autor: Fpga Kuechle (fpgakuechle) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
rst_s <= '0' when locked_s = '0' else '1';


natürlich auch
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.

Autor: Heinrich H. (Firma: Ich.AG) (hhanff)
Datum:

Bewertung
0 lesenswert
nicht 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:
  clk_108MHz_cnt : process (clk_108MHz_s, rst_108MHz_s)
  begin  -- process 108MHz_cnt
    if rst_108MHz_s = '0' then          -- asynchronous reset (active low)
      clk_108MHz_cnt_addr <= (others => '0');
    elsif clk_108MHz_s'event and clk_108MHz_s = '1' then  -- rising clock edge
...

  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
>
>
> rst_s <= '0' when locked_s = '0' else '1';
> 
>
>
> natürlich auch
>
>
> rst_s <= locked_s;
> 
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.
  lckpad : OBUF port map (
    I => LOCKED4X_dll,
    O => LOCKED);

Ich hab die Zeilen mal auskommentiert und durch folgendes ersetzt:
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

Autor: Heinrich H. (Firma: Ich.AG) (hhanff)
Datum:

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

Autor: Heinrich H. (Firma: Ich.AG) (hhanff)
Datum:

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

Autor: Jan M. (mueschel)
Datum:

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

Autor: Fpga Kuechle (fpgakuechle) Benutzerseite
Datum:

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

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.