Forum: FPGA, VHDL & Co. Variabler Eingang in Portliste? std_logic_vector und std_logic


von Matthias G. (mgottke)


Lesenswert?

Gibt es eine Möglichkeit ein VHDL-Modul so zu deklarieren, dass man an 
den Eingang sowohl einen std_logic_vector mit variabler Breite als auch 
ein std_logic Signal anschließen kann. Generics können nach Außen keine 
Verwendung finden, da das Modul in einem Top-Level-Schematic eingebunden 
ist.

Also ähnlich wie bei Funktionen, nur eben als Modul.

von Morin (Gast)


Lesenswert?

> Generics können nach Außen keine Verwendung finden,
> da das Modul in einem Top-Level-Schematic eingebunden ist.

Du könntest es trotzdem als Generic schreiben und für konkrete Instanzen 
je einen nicht-generic-Wrapper schreiben. Ansonsten hängt es ganz von 
den Fähigkeiten des konkreten Schematic-Editors ab.

von Matthias G. (mgottke)


Lesenswert?

> Du könntest es trotzdem als Generic schreiben und für konkrete Instanzen
> je einen nicht-generic-Wrapper schreiben. ...

Sehr unschön. Das geht natürlich, der Aufwand ist aber nicht sehr schön. 
Eine andere Lösung gibt es nicht?

von Morin (Gast)


Lesenswert?

> Eine andere Lösung gibt es nicht?

Wie schon gesagt, das hängt ganz von den Features des Schematic-Editors 
ab, und wie der mit Vektoren ohne Größenangaben bzw. generics umgeht. 
Die Wrapper sind halt die einzige Möglichkeit, die mir einfällt, die mit 
jedem Schematic-Editor kann.

von Duke Scarring (Gast)


Lesenswert?

@Matthias G.:

Ein std_logic_vector(0 downto 0) gefällt Dir wohl nicht?

Duke

von Matthias G. (mgottke)


Lesenswert?

> Ein std_logic_vector(0 downto 0) gefällt Dir wohl nicht?

Das in der Portdliste bedeutet ja trotzdem, dass ich nur ein 
std_logic_vector(0 downto 0) anschließen kann (ev. klappt das auch mit 
std_logic) aber ich will ja auch beispielsweise ein std_logic_vector(3 
downto 0) anschließen ohne ein neues Modul zu generieren.

von Jan M. (mueschel)


Lesenswert?

Ich verstehe dein Argument gegen generics nicht. Warum kannst du die 
nicht verwenden?
1
generic(
2
  breite : integer:
3
  );
4
port(
5
  port : std_logic_vector(breite-1 downto 0);
6
  );
7
8
9
signal signal_0 : std_logic;
10
signal signal_3 : std_logic_vector(2 downto 0);

Dort kannst du dann die Breite einstellen und ein Signal der jeweils 
passenden Breite anschliessen:
1
generic map(breite => 1) port map (port(0) <= signal_0);
2
generic map(breite => 3) port map (port <= signal_3);

von Matthias G. (mgottke)


Lesenswert?

> Ich verstehe dein Argument gegen generics nicht. Warum kannst du die
> nicht verwenden?

Ich habe nichts gegen Generics, wie aber schon erwähnt sollen die Module 
in einem Top-Level-Schematic eingebunden werden. Dort sind Generics 
leider nicht möglich.

von Jan M. (mueschel)


Lesenswert?

Ach, schematics mal wieder... sorry, damit habe ich keine Erfahrungen.
Diese Variante hast du aber schon ausprobiert?
1
sel_in:    in std_logic_vector;
Mein kurzer Test in ise sieht so aus, als ob du da jetzt jeden 
beliebigen Vektor anschließen könntest - std_logic geht allerdings 
trotzdem nicht, signal(0 downto 0) hingegen schon.

von Matthias G. (mgottke)


Lesenswert?

Sollte sowas funktionieren, dass im Portmap ein std_logic_vector ohne 
Längendefinition verwendet werden kann?
So z.B.:
1
entity modul is port
2
(
3
   in_vector   : in  std_logic_vector;
4
   out_vector  : out std_logic_vector((in_vector'length - 1) downto 0);
5
   :
6
);
7
end modul;
8
architecture behavior of modul is
9
begin
10
   modul_proc: process(clk)
11
   begin
12
      if rising_edge(clk) then
13
         out_vector <= in_vector;
14
      endif;
15
   endif;
16
end process;

von Matthias G. (mgottke)


Lesenswert?

Hallo zusammen,

nochmal die Frage: Funktioniert der obige Code, bzw. ist so was 
zulässig?

von Klaus F. (kfalser)


Lesenswert?

Nein, du kannst die Länge von out_vector nicht als Funktion von 
in_vector angeben. Wenn schon, dann musst Du die Länge bei out_vector 
auch weglassen.

Im Prinzip kann man bei VHDL schon unconstraint arrays in den ports 
verwenden, aber was XST bei der Synthese macht, weiss ich nicht.
Wahrscheinlich akzeptiert es die VHDL Synthese aber nicht.

Die wenigsten arbeiten noch mit Schematics, deshalb können dir hier 
wahrscheinlich wenige helfen.
In den 2 Tagen zwischen deinen Anfragen hättest Du es ja selbst einmal 
probieren können ...

von Matthias G. (mgottke)


Lesenswert?

Hallo Klaus,
danke für Deine Antwort.

> Die wenigsten arbeiten noch mit Schematics, deshalb können dir hier
> wahrscheinlich wenige helfen.

Schematics sind als Topsheets bzw. für größere Blöcke durchaus sehr 
praktisch, da sie eine gute Übersicht über die Zusammenhänge der Module 
liefern. Sie sind damit auch gleichzeitig ein Stück Dokumentation und 
tragen zum Verständnis bei. Allerdings empfehle ich davon abstand zu 
nehmen komplexere Schaltungen eines FPGAs als Schematic auszuführen.

> In den 2 Tagen zwischen deinen Anfragen hättest Du es ja selbst einmal
> probieren können ...

Ja und nein. Leider habe ich schon mehrfach erlebt, dass einige Tools 
Dinge akzeptieren, die allerdings am Standard vorbei gehen. Dies führt 
immer wieder zu problemen. Deshalb ist es mir lieber es kann jemand eine 
fundierte Aussage machen.

von Thomas R. (Firma: abaxor engineering) (abaxor)


Lesenswert?

Jan M. wrote:
> Ach, schematics mal wieder... sorry, damit habe ich keine Erfahrungen.
> Diese Variante hast du aber schon ausprobiert?
>
1
sel_in:    in std_logic_vector;
> Mein kurzer Test in ise sieht so aus, als ob du da jetzt jeden
> beliebigen Vektor anschließen könntest

Mit Vektoren ohne Längenangabe in der Entität arbeite ich seit Jahren. 
Das geht sowohl in der ISE/Actel Libero als auch Modelsim. Nur
1
sel_in <= (others => '0');

geht nicht. Aber dafür gibt es das range Attribut.

Tom

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.