www.mikrocontroller.net

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


Autor: Matthias G. (mgottke)
Datum:

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

Autor: Morin (Gast)
Datum:

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

Autor: Matthias G. (mgottke)
Datum:

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

Autor: Morin (Gast)
Datum:

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

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Matthias G.:

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

Duke

Autor: Matthias G. (mgottke)
Datum:

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

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich verstehe dein Argument gegen generics nicht. Warum kannst du die 
nicht verwenden?
generic(
  breite : integer:
  );
port(
  port : std_logic_vector(breite-1 downto 0);
  );


signal signal_0 : std_logic;
signal signal_3 : std_logic_vector(2 downto 0);

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

Autor: Matthias G. (mgottke)
Datum:

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

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach, schematics mal wieder... sorry, damit habe ich keine Erfahrungen.
Diese Variante hast du aber schon ausprobiert?
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.

Autor: Matthias G. (mgottke)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sollte sowas funktionieren, dass im Portmap ein std_logic_vector ohne 
Längendefinition verwendet werden kann?
So z.B.:
entity modul is port
(
   in_vector   : in  std_logic_vector;
   out_vector  : out std_logic_vector((in_vector'length - 1) downto 0);
   :
);
end modul;
architecture behavior of modul is
begin
   modul_proc: process(clk)
   begin
      if rising_edge(clk) then
         out_vector <= in_vector;
      endif;
   endif;
end process;

Autor: Matthias G. (mgottke)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

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

Autor: Klaus Falser (kfalser)
Datum:

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

Autor: Matthias G. (mgottke)
Datum:

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

Autor: Thomas Reinemann (Firma: abaxor engineering) (abaxor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jan M. wrote:
> Ach, schematics mal wieder... sorry, damit habe ich keine Erfahrungen.
> Diese Variante hast du aber schon ausprobiert?
>
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
sel_in <= (others => '0');

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

Tom

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.