SiZwei Vektoren zusammensetzen und dann zuweisen

Gast #4124757
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.
Gast #4125486
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
Moderator (Firma: Titel) Persönliche Seite #4125696
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);
Gast #4126122
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?
Gast #4126200
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren