Forum: FPGA, VHDL & Co. VHDL: Unterschied Aggregat und Concatenation Operator &


von Christof C. (risto)


Lesenswert?

Kann mir jemand den Unterschied zwischen:

Test <= (Vektor1,Vektor2);

und

Test <= Vektor1 & Vektor2;

erklären oder gibt es keinen ?

von FPGAküchle (Gast)


Lesenswert?

Letzteres ("&") ist syntaktisch korrekt,
ersteres nicht ,jedenfalls bricht die Synthese (XST) ab.

von Christof C. (risto)


Lesenswert?

Sorry die Frage war nicht richtig so.

- Element1, Element2 sollen vom Typ std_logic sein.
- Vektor ist vom Tyo std_logic_vector ( 1 downto 0)

Gibt es nun einen Unterschied zwischen

 Vektor <= (Element1, Element2);

und

 Vektor <= Element1 & Element2;

von Tom (Gast)


Lesenswert?

Hallo Christof,

mE wird der Concatenate-Operator auch genutzt, um aus verschiedenen
Vektoren wieder einen Vektor zusammenzusetzen (zu "verketten" => to
concatenate)...

....sprich, wenn du zB 2 Datenwörter vom Typ
1
DW1 ... std_logic_vector(n DOWNTO 0)
2
DW2 ... std_logic_vector(m DOWNTO 0)
hast, kannst Du mit dem &-Operator ein DW (oder Vektor) aus beiden
"verkettenten" DW vom Typ
1
DW <= DW1 & DW2 .... std_logic_vector(n DOWNTO 0) & std_logic_vector(m
2
DOWNTO 0)
zusammenbauen.....

Gruß
Tom

von Mark (Gast)


Lesenswert?

Der Beitrag ist zwar schon uralt, aber trotzdem:

a <= (b, c);

und

a <= (b, c);

sind gleichbedeutend wenn z.B.

a  ein signal vom type std_logic_vector(7 downto 0) und
b,c ein signal vom type std_logic_vector (3 downto 0) ist.

ferner kann bei einem aggregat folgendes gemacht werden:

a <= (b, others => '0');

mit einer "concatenation" geht das nicht. folgendes ist ungültig:

a <= b & (others => '0');

also lieber auf das '&' verzichten !

Mark

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


Lesenswert?

Mark schrieb:
> a <= (b, c);
> und
> a <= (b, c);
> sind gleichbedeutend
Das möchte ich aber auch hoffen... ;-)

Was kommt da raus wenn die Typen so sind:
a  ein signal vom type std_logic_vector (7 downto 0)
b  ein signal vom type std_logic_vector (3 downto 0)
c  ein signal vom type std_logic_vector (7 downto 4)
a <= (b, c);
a <= b & c;

> also lieber auf das '&' verzichten !
Nur dort, wo es Sinn macht.
Bei der "impliziten" By-Order-Aggregat-Zuweisung könnten für den 
ungeübten Betrachter noch ein oder zwei Fragen offen bleiben...  :-/
Mit dem & Operator sehe ich sofort, was wo im Vektor steht.

Es ist eine Frage der Gewohnheit, aber häufiger als das Aggregat wird 
noch immer die Concatenation verwendet.

Ein Schieberegister sieht so etwas ungewöhnlich aus:
a <= (a(6 downto 0),'0');

Das ist die "übliche" (und m.E. übersichtlichere) Form:
a <= a(6 downto 0) & '0';

von Mark (Gast)


Lesenswert?

mein Fehler ! gemeint war:

a <= (b, c);
und
a <= b & c;

Lothar Miller schrieb:
> Was kommt da raus wenn die Typen so sind:
> a  ein signal vom type std_logic_vector (7 downto 0)
> b  ein signal vom type std_logic_vector (3 downto 0)
> c  ein signal vom type std_logic_vector (7 downto 4)
> a <= (b, c);
> a <= b & c;
jeweils:
a = [ b3, b2, b1, b0, c7, c6, c5, c4 ]

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.