www.mikrocontroller.net

Forum: FPGA, VHDL & Co. mehrere Signale mit Vektor verbinden beim Instanziieren?


Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte ein VHDL Modul instanziieren welches einen sagen wir 5 bit 
breiten Eingangsvektor besitzt (zum Beispiel das Busy Signal von 5 
Kanälen eines anderen Moduls).
Ich wollte das so machen

instanz_name : modul

port map ( busy  => busy_1 & busy_2 & busy_3 & busy_4 & busy_5
         );
....


das scheint so aber nicht zu gehen (Fehlermeldung beim Synthetisieren).

Geht das wirklich nicht oder mache ich nur einen Formfehler? 
(theroetisch ist ja damit klar ausgedrückt was womit verbunden werden 
soll, also könnte es eigentlich gehen)

Wenn es wirklich so nicht geht wie macht man sowas dann?

Was ich mir vorstellen könnte wäre eine nebenläufige Anweisung wie:

zwischensignal (4 downto 0) <= busy_1 & busy_2 & busy_3 & busy_4 & 
busy_5;

und dann die zuweisung des zwischensignals bei der Instanziierung.

Wäre das der richtige Weg?

Grüße
Tom

Autor: Fpga Kuechle (fpgakuechle) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit den zwischensignal ist richtig, die erste Variante geht nicht, 
da links kein Signal steht sondern eine Operation ( &).

Tom wrote:

> ich möchte ein VHDL Modul instanziieren welches einen sagen wir 5 bit
> breiten Eingangsvektor besitzt (zum Beispiel das Busy Signal von 5
> Kanälen eines anderen Moduls).
> Ich wollte das so machen
>
> instanz_name : modul
>
> port map ( busy  => busy_1 & busy_2 & busy_3 & busy_4 & busy_5
>          );

>
> Was ich mir vorstellen könnte wäre eine nebenläufige Anweisung wie:
>
> zwischensignal (4 downto 0) <= busy_1 & busy_2 & busy_3 & busy_4 &
> busy_5;
>
> und dann die zuweisung des zwischensignals bei der Instanziierung.

Autor: Fpga Kuechle (fpgakuechle) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry rechts und links verwechselt.

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK dann werde ich das über das Zwischensignal lösen.

Warum funktioniert dann aber eigentlich die Sache mit dem 
Verkettungsoperator & beim Erstellen des Zwischensignals? Da ist es doch 
auch eine Signalzuweisung und man schreibt eine Operation hin?

Autor: Fpga Kuechle (fpgakuechle) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tom wrote:
> OK dann werde ich das über das Zwischensignal lösen.
>
> Warum funktioniert dann aber eigentlich die Sache mit dem
> Verkettungsoperator & beim Erstellen des Zwischensignals? Da ist es doch
> auch eine Signalzuweisung und man schreibt eine Operation hin?

Hm interessant. "Weil es VHDL nicht zuläßt!" - wäre eine korrekte 
Antwort, aber damit wäre ich auch nicht zufrieden.
"Weil man so Hardware nicht vollständig beschreiben kann" scheint den 
nagel auf den Kopf zu treffen, ist aber auch nicht für den frager 
verständlich.

Also:
Port Map (=>)und Signalzuweisung (<=) sind zweierlei, der Effekt nur 
scheinbar derselbe. Wenn man VHDL laut list sagt man bei dem Portmap 
Pfeil
"gets" und bei der Signalzuweisung "is connected to". Der feine 
Unterschied
liegt im zeitliche Verhalten. In der Signalzuweisung ist immer eine 
Verzögerung enthalten. Mindestens ein Simulationsschritt (Delta-cycle) 
in echt einige Pico bis Nanosekunden. Die zeit schreibt man für die 
Simulation auch an die Zuweisung (a <= b after 2 ns;) ran. Bei der 
Portmap wird die verzögerung nicht mit beschrieben, die Portmap ist 
verzögerungsfrei. In Echt
hast du nun 4 leitungen die du an die Komponente führst, jede 
unterschiedlich lang und dadurch mit unterschiedlichen Verzögerungen 
behaftet. Ohne das Zwischensignal kann die Simulation keine 
Verzögerungen berechnen, also wirst du gezwungen diese Zwischensignal 
vorzugeben. Daher stammt wohl die festlegeung nur signale (Modelle mit 
verzögerung) in portmaps zu verwenden und keine Operatoren.

Wenn ich es mir recht Überlege ist "&" das Problem, weil dadurch das 
Verzögerungsmodel verkürzt wird.

Meint
 a <= b & c & d after 3 ns;
verschleiert die unterschiedlichen verzögerungen. Ist aber leichter zu 
überschauen als.

a(2) <= b after 3 ns;
a(1) <= c after 3 ns;
a(0) <= d after 3 ns;

Also kurz gesagt, da in VHDL Signale mit Verzögerungen modelleirt 
werden,
kann man die Signalzuweisung nicht wie eine Speicherstellenzuweisung in 
C
verwenden. ist halt ne andere Philosophie di dahinter steht.

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank, für die ausführliche Antwort. Den Unterschied habe ich erst 
nicht gesehn und konnte deshalb nicht nachvollziehen warum es in der 
port map nicht gehen soll. Aus der von Dir beschriebenen Sicht macht 
diese Regel (Operatoren in port maps unzulässig) aber jetzt auch für 
mich Sinn.

Grüße
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.