Forum: FPGA, VHDL & Co. Toplevel - Bus mit gemischten IN / OUT /INOUT Signalen


von Michi (Gast)


Lesenswert?

Hallo ihr Experten,

in einem Design habe ich im Toplevel verschiedene Busse (Adressbus / 
Datenbus / usw.) die im Toplevel jeweils als std_logic_vector 
zusammengefasst als IN oder OUT oder INOUT deklariert sind.
Bei IN sowie INOUT sind diese im LPF-File (Constraint-File für Lattice 
Diamond) zusätzlich mit PULLUPs und einer Eingangshysterese versehen, 
bei OUT geht das nicht, da das FPGA diese Pins ja "immer" treibt.

Soweit funktioniert dies auch einwandfrei.

Im Projekt gab es nun eine Änderung, dass in einem Bus der bisher 
komplett INOUT war, nun eine Leitung nur noch als IN und eine nur noch 
als OUT verwendet wird, die restlichen Signale bleiben weiterhin INOUT. 
Da ich die Pinbelegungen als
   busxyz : INOUT std_logic_vector(20 downto 0);
deklariert habe nun die Frage, wie kann ich dies dem Synthesetool am 
geschicktesten klar machen, dass z.B. busxyz(5) nur noch als IN und 
busxyz(7) nur noch als OUT betrieben werden, der Rest aber INOUT bleibt?
-> Müsste ich nicht im Toplevel angeben, welcher Bereich des Busses als 
IN, welche als OUT und welcher als INOUT verwendet wird? Falls ja, wie 
muss dies genau erfolgen, denn ich habe ein paar Sachen ausprobiert - 
leider hatte die Synthese bzw. spätstens der Mapper immer etwas zu 
meckern.

Hintergrund:
------------
Obwohl ich die restlichen Signale als INOUT verwende, erscheint folgende 
Fehlermeldung für die restlichen INOUT-Signale, obwohl alle mit einem 
internen PULLUP versehen sein sollten:
WARNING - Invalid PULLMODE assignment of 'UP' for output PIO buffer 
'busxyz_pad[0]' (for busxyz[0] port). PULLMODE cannot be assigned to 
output buffers and will be ignored.

Wäre echt klasse, wenn mir einer von euch einen Tipp geben kann ;-)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Michi schrieb:
> erscheint folgende Fehlermeldung...
> WARNING
Naja, ein Fehler ist das ja nun nicht. Und ein Design ohne Warnung 
ist schwer zu schaffen (zumindest, wenn das Design über den 
obligatorischen Dreizeiler rausgeht).

Eine elegante Lösung für dein Problem kenne ich nicht. Ich könnte mir 
bestenfalls vorstellen, du definierst den Bus als einzelne Signale (oder 
Signalblöcke) und fasst die im Toplevel zu einem einzigen Vektor 
zusammen...

Du könntest aber im Constraint-File nur den Signalen, die auch Eingang 
sein können, Pullups zuweisen.

Denn das Problem kommt ja nicht aus der VHDL Beschreibung, sondern tritt 
erst später beim P&R auf...

: Bearbeitet durch Moderator
von J. S. (engineer) Benutzerseite


Lesenswert?

Wieso ist es nicht möglich, die Ein-Ausgänge individuell zu beschreiben, 
was pulls angeht? Wenn es da Daerivate gibt, könnte man es gfs von HDL 
aus per generate steuern, was gelten soll.

von Klaus F. (kfalser)


Lesenswert?

Michi schrieb:
> Da ich die Pinbelegungen als
>    busxyz : INOUT std_logic_vector(20 downto 0);

Ich glaube, Du solltest Dir überlegen, die einzelnen Signal vom Bus je 
nach funktion zu benennen, also nicht
1
  busxyz : INOUT std_logic_vector(20 downto 0);
sondern
1
  busxyz_clk  : OUT std_logic;
2
  busxyz_rd   : IN std_logic;
3
  busxyz_wr   : OUT std_logic;
4
  busxyz_data : INOUT std_logic_vector(15 downto 0);

Das ist einfach viel lesbarer.
Wenn einmal jemand anderes Dein Code zu verstehen versucht(oder Du in 2 
Jahren), muss er sich immer merken, dass busxyz[5] das RD Signal 
ist/war.

Das löst dann auch Dein IN/INOUT Problem.

von Michi (Gast)


Lesenswert?

Herzlichen Dank für eure schnellen und qualifizierten Rückmeldungen.

Ich splitte den Bus jetzt auf, ein Bereich mit nur IN / ein Bereich mit 
nur OUT / ein Bereich mit INOUT.
-> Ist zwar nicht meine Wunschlösung, aber es funktioniert und der 
Mapper meckert nicht mehr rum, sondern lässt das Projekt ohne Probleme 
weiter bauen :-)

Habe die Variante wie von Klaus F beschrieben umgesetzt

> Ich glaube, Du solltest Dir überlegen, die einzelnen Signal vom Bus je
> nach funktion zu benennen, also nicht  busxyz : INOUT
> std_logic_vector(20 downto 0);
> sondern  busxyz_clk  : OUT std_logic;
>   busxyz_rd   : IN std_logic;
>   busxyz_wr   : OUT std_logic;
>   busxyz_data : INOUT std_logic_vector(15 downto 0);

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.