Forum: FPGA, VHDL & Co. SiZwei Vektoren zusammensetzen und dann zuweisen


von Fragender (Gast)


Lesenswert?

Hallo,

Diese Zeile gibt einen Fehler aus:
1
SEQ_RAM_ADDRA <= (RxUdpData(RxUdpDataSeqRamAddrLocation) & RxUdpData(RxUdpDataSeqRamAddrLocation-1))(SEQ_RAM_ADDRA'length-1 downto 0);

Frage: Wie kann man das anders formulieren? Ich setze zwei 8bit Vectoren 
zusammen und möchte dann von dem sich ergebenden 16 Bit Vector jene Bits 
dem linken Operanden zuweisen, welche in der Summe der Länge dieses 
Operanden entsprechen (die niederwertigsten Bits). Ein weiteres 
Hilfssignal wollte ich jetzt eigentlich vermeiden.

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


Lesenswert?

Fragender schrieb:
> Diese Zeile gibt einen Fehler aus:
Welchen?

> Ich setze zwei 8bit Vectoren zusammen
Welche?
Wenigstens die Deklaration der verwendeten Signale sind zur 
Fehleranalyse nötig...

von Fragender (Gast)


Lesenswert?

Lothar Miller schrieb:
> Fragender schrieb:
>> Diese Zeile gibt einen Fehler aus:
> Welchen?
>
>> Ich setze zwei 8bit Vectoren zusammen
> Welche?
> Wenigstens die Deklaration der verwendeten Signale sind zur
> Fehleranalyse nötig...

Hallo Lothar,

Danke für die Rückmeldung und sorry das du mir die Infos aus der Nase 
ziehen musst (ich weiß wie nervig das ist). Ich versuche mal alle 
wichtigen Infos aufzulisten:

Signale/Ports/Typen...:

Konstanten:
1
constant seq_ram_address_width_c : INTEGER := 11;
1
constant RxUdpDataWidth  : INTEGER := 128;

Typen:
1
type ByteArrayType is array (natural range <>) of std_logic_vector(7 downto 0);
1
subtype RxUdpDataType is ByteArrayType(RxUdpDataWidth-1 downto 0);

Ports:
1
SEQ_RAM_ADDRA : OUT STD_LOGIC_VECTOR(seq_ram_address_width_c-1 DOWNTO 0);

Signale:
1
signal RxUdpData: RxUdpDataType := (others =>(others => '0'));

--> Diese Zeile ergibt dann den Fehler:
1
SEQ_RAM_ADDRA <= (RxUdpData(RxUdpDataSeqRamAddrLocation) & RxUdpData(RxUdpDataSeqRamAddrLocation-1))(SEQ_RAM_ADDRA'length-1 downto 0);

Fehlermeldung:
Line 518. parse error, unexpected OPENPAR, expecting SEMICOLON

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


Lesenswert?

Fragender schrieb:
> Line 518. parse error, unexpected OPENPAR, expecting SEMICOLON
Er erwartet ein Zeilenende nach der Concatenation. Du willst indizieren. 
Das geht so nicht... :-/

Du kannst einen Zwischenschritt über ein zusätzliches Signal gehen:
1
h <= RxUdpData(RxUdpDataSeqRamAddrLocation) & RxUdpData(RxUdpDataSeqRamAddrLocation-1);
2
SEQ_RAM_ADDRA <= h(SEQ_RAM_ADDRA'length-1 downto 0);

Oder du setzt den Vektor gleich in der richtigen Breite zusammen:
1
SEQ_RAM_ADDRA <= RxUdpData(RxUdpDataSeqRamAddrLocation)(SEQ_RAM_ADDRA'length-8-1 donto 0) 
2
                 & RxUdpData(RxUdpDataSeqRamAddrLocation-1);

: Bearbeitet durch Moderator
von Fragender (Gast)


Lesenswert?

Lothar Miller schrieb:
> Fragender schrieb:
>> Line 518. parse error, unexpected OPENPAR, expecting SEMICOLON
> Er erwartet ein Zeilenende nach der Concatenation. Du willst indizieren.
> Das geht so nicht... :-/
>
> Du kannst einen Zwischenschritt über ein zusätzliches Signal gehen:h <=
> RxUdpData(RxUdpDataSeqRamAddrLocation) &
> RxUdpData(RxUdpDataSeqRamAddrLocation-1);
> SEQ_RAM_ADDRA <= h(SEQ_RAM_ADDRA'length-1 downto 0);
>
> Oder du setzt den Vektor gleich in der richtigen Breite
> zusammen:SEQ_RAM_ADDRA <=
> RxUdpData(RxUdpDataSeqRamAddrLocation)(SEQ_RAM_ADDRA'length-8-1 donto 0)
>                  & RxUdpData(RxUdpDataSeqRamAddrLocation-1);

Hallo Lothar,

Danke für die Antwort!
Die zweite Option sieht okay aus. Ich habe hier eine Frage: Was 
passiert, wenn SEQ_RAM_ADDRA'length-8-1 kleiner als 0 wird? Wie reagiert 
da die Synthese?

von Duke Scarring (Gast)


Lesenswert?

Fragender schrieb:
> Was
> passiert, wenn SEQ_RAM_ADDRA'length-8-1 kleiner als 0 wird? Wie reagiert
> da die Synthese?
Ich würde eine Fehlermeldung erwarten  (und ich bilde mir ein, die bei 
xst auch schon gesehen zu haben).
Im Zweifelsfall: testen (und das Ergebnis hier mitteilen).

Duke

von Fragender (Gast)


Lesenswert?

Duke Scarring schrieb:
> Fragender schrieb:
>> Was
>> passiert, wenn SEQ_RAM_ADDRA'length-8-1 kleiner als 0 wird? Wie reagiert
>> da die Synthese?
> Ich würde eine Fehlermeldung erwarten  (und ich bilde mir ein, die bei
> xst auch schon gesehen zu haben).
> Im Zweifelsfall: testen (und das Ergebnis hier mitteilen).
>
> Duke

Grade getestet. Er spuckt nur eine Warnung aus:

WARNING:HDLParsers:3350 -  Line 508. Null range: -2 downto 0

von Duke Scarring (Gast)


Lesenswert?

Fragender schrieb:
> Grade getestet. Er spuckt nur eine Warnung aus:
Schade, die Warnungen übersieht man so leicht...

Ich weiß auch nicht, wie der Simulator mit der Situation umgeht.
Im Zweifelsfall hilft ein
1
assert busbreite > 0 report "Fehler: Busbreite zu klein" severity error;
im Code.

Duke

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.