Forum: FPGA, VHDL & Co. VHDL Error "cannot index the result of a type conversion"


von X. X. (chrissu)


Lesenswert?

Hallo,

Ich habe folgenden VHDL Code, Übersetzung mit dem ALTIUM-Compiler...

Soll:
( RCYC_S_FrequValOut(23..0) * 244140 ) / 2^20 )
Division über Indexierung... = Bitshift...


RCYC_STAT_REG_RO und RCYC_S_FrequValOut sind vom Typ (IS ARRAY OF) 
STD_LOGIC_VECTOR()


Mit Altium Designer 14 war dies kein Problem.
Compiliert ohne Fehlermeldung, gerechnet ohne Fehler.

1
--..AAD14, OK // AD16 Fehlermelddung...
2
RCYC_STAT_REG_RO(8)(31 DOWNTO 0) <= "0000000000" & (       
3
    STD_LOGIC_VECTOR(
4
        (UNSIGNED(RCYC_S_FrequValOut(23 DOWNTO 0)))
5
         *244140
6
    )
7
    (41 DOWNTO 20));


Nun, mit AD16 bekomme ich die Fehlermeldung:
"cannot index the result of a type conversion"
?


Ich habe nun versucht noch den Qualifier für die Länge zu nutzen, aber 
ohne Erfolg... gleiche Fehlermeldung bleibt in AD16:

1
--AD16 Fehlermeldung...
2
RCYC_STAT_REG_RO(8)(31 DOWNTO 0) <= "0000000000" & (
3
    STD_LOGIC_VECTOR(
4
        resize(
5
            ((UNSIGNED(RCYC_S_FrequValOut(23 DOWNTO 0)))
6
            *244140),
7
            42
8
            )
9
        )
10
        (41 DOWNTO 20));


Mache ich was falsch? Bzw. was kann ich hier noch tun?
Ich sehe eigentlich nichts, warum das nicht indizierbar sein soll...

Besten Dank für Hilfe.

: Bearbeitet durch User
von Klakx (Gast)


Lesenswert?

1
STD_LOGIC_VECTOR(<irgendwas>)(41 DOWNTO 20));
scheint AD16 wohl nicht zu unterstützen, probier mal diese Zeile 
aufzuteilen. z.b.
1
temp_slv <= STD_LOGIC_VECTOR(<irgendwas>)
2
RCYC_STAT_REG_RO(8)(31 DOWNTO 0) <= temp_slv(41 DOWNTO 20);

von X. X. (chrissu)


Lesenswert?

Hallo,

Ja, mit Aufteilung funktioniert es schon...
Auch ohne das "resize" wieder... Sehe ich auch nicht für nötig an.

Aber trotzdem sollte mein ursprüngliches Konstrukt doch konformes VHDL 
sein, und entsprechend auch vom Compiler unterstützt werden... Oder?

Ich habe mal noch einen AD-Support-Case eröffnet...

Weil ich habe dass an ca. 30 weiteren Stellen so...

Zur Info:
Fehler tritt schon beim Wechsel von AD14->AD15 (nicht AD16) auf.

von Duke Scarring (Gast)


Lesenswert?

Chriss X. schrieb:
> Aber trotzdem sollte mein ursprüngliches Konstrukt doch konformes VHDL
> sein, und entsprechend auch vom Compiler unterstützt werden... Oder?
Willkommen in der wunderbaren Welt der Realität...

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


Lesenswert?

Chriss X. schrieb:
> Aber trotzdem sollte mein ursprüngliches Konstrukt doch konformes VHDL
> sein, und entsprechend auch vom Compiler unterstützt werden... Oder?
VHDL "kann" viel mehr als der Synthesizer. Was der Synthesizer/Compiler 
vom defnierten Sprachumfang tatsächlich umsetzen kann, das steht in 
seinem Handbuch.

Denn die Synthese scheitert ja schon an allereinfachsten Konstrukten. 
Nicht mal sowas Simples bekommt sie ins FPGA:
blinker <= not blinker after 500 ms;

Oder sowas hier:
http://www.lothar-miller.de/s9y/archives/79-use_new_parser-YES.html

> Zur Info:
> Fehler tritt schon beim Wechsel von AD14->AD15 (nicht AD16) auf.
Ich kenne auch 2 Synthesizer, die das nicht können...

> Ich habe mal noch einen AD-Support-Case eröffnet...
Lass hören, was rauskommt... ;-)

: Bearbeitet durch Moderator
von X. X. (chrissu)


Lesenswert?

Ja, das ist mir so schon klar, dass der Sprachumfang größer ist, als der 
Synthesizer/Compiler kann...

Aber es ging ja mal, mit einer früheren Version des Compilers... und 
jetzt nicht mehr...

Hat jemand noch vielleicht noch eine andere Idee für den indizerten 
Cast, als hierzu eine Hilsvariable(Hilfssignal :-)) zu nutzen?

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


Lesenswert?

Chriss X. schrieb:
> Hat jemand noch vielleicht noch eine andere Idee für den indizerten
> Cast, als hierzu eine Hilsvariable(Hilfssignal :-)) zu nutzen?
Wie gesagt: bisher konnte das keiner meiner Synthesizer, ich habe mich 
mit der "Zwischensignal" Lösung abgefunden...  :-/

Du könntest evtl. eine Funktion schreiben und der den Indexbereich 
mitgeben.

von X. X. (chrissu)


Lesenswert?

Oder ich könnte natürlich die Division vor dem Cast ausschreiben 
(/2^20)... anstatt die Indizierung...

Und hoffen dass der Compiler schlau genug ist, und nicht wirklich 
dividiert...

von Duke Scarring (Gast)


Lesenswert?

Chriss X. schrieb:
> Und hoffen dass der Compiler schlau genug ist, und nicht wirklich
> dividiert...
Bei den üblichen Verdächtigen wird die Division mit 2^n wie erwartet 
durch abschneiden optimiert.

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.