Forum: FPGA, VHDL & Co. Array und Typkonvertierungs-Problem in VHDL


von Marius S. (lupin) Benutzerseite


Lesenswert?

Als Libraries habe ich:
library ieee;
use ieee.std_logic_1164.all;
USE ieee.numeric_std.all;



Im Entity habe ich folgenden Eingang:
addrB       : in  std_logic_vector(4 downto 0);



In der Architektur definiere ich folgenden Typ und folgendes Signal:
subtype word_t is std_logic_vector(3 downto 0);
type EinTollerTyp is array (0 to 1) of word_t;
signal tAddrB : unsigned(7 downto 0) := to_unsigned(0, 7);



Im Prozess habe ich folgende Zuweisung:
tAddrB <= unsigned(addrB & "000");



In der Konsole habe ich folgende Fehlermeldung:
HDLParsers:3329 - "C:/..." Line 95. Expression in type conversion to 
unsigned has 2 possible definitions in this scope, for example, 
EinTollerTyp  and std_logic_vector.



Im Kopf habe ich nur noch:
???



Was soll der Quatsch?

von Marius S. (lupin) Benutzerseite


Lesenswert?

Wenn ich den Umweg gehe und die Bit-Verknüpfung erst in eine 
SLV-Variable schreibe, kann ich die Variable anschließend auch mit 
unsigned() konvertieren und es gibt von der Ise keine Schimpfe mehr...

von Fpgakuechle K. (Gast)


Lesenswert?

Marius S. schrieb:
> Als Libraries habe ich:
> library ieee;
> use ieee.std_logic_1164.all;
> USE ieee.numeric_std.all;
>
>
>
> Im Entity habe ich folgenden Eingang:
> addrB       : in  std_logic_vector(4 downto 0);
>
>
>
> In der Architektur definiere ich folgenden Typ und folgendes Signal:
> subtype word_t is std_logic_vector(3 downto 0);
> type EinTollerTyp is array (0 to 1) of word_t;
> signal tAddrB : unsigned(7 downto 0) := to_unsigned(0, 7);
>
>
>
> Im Prozess habe ich folgende Zuweisung:
> tAddrB <= unsigned(addrB & "000");
>
>
>
> In der Konsole habe ich folgende Fehlermeldung:
> HDLParsers:3329 - "C:/..." Line 95. Expression in type conversion to
> unsigned has 2 possible definitions in this scope, for example,
> EinTollerTyp  and std_logic_vector.
>
>
>
> Im Kopf habe ich nur noch:
> ???
>
>
>
> Was soll der Quatsch?

Das ist kein Quatsch, das fehlende Information. Die ISE kann den typ vom 
literal "000" nicht erkennen. Es könnte unsigned (typ auf der anderen 
Seite des Operators oder EinTollerTyp (type auf der anderen Seite der 
Zuweisung (oder ausserhalb dieser Zeile sogar std_logic_vector, signed, 
...) sein.

http://www.gstitt.ece.ufl.edu/vhdl/refs/vhdl_math_tricks_mapld_2003.pdf 
p.9


Du kannst einen type cast davorsetzen,oder die "000" in eine 
Varible/Konstante vom gewünschten Typ setzen. VHDL prüft nun mal den Typ 
aller Beteiligten und muss ihn daher kennen bzw eindeutig ableiten 
können.

MfG

von Marius S. (lupin) Benutzerseite


Lesenswert?

Fpga Kuechle schrieb:
> Die ISE kann den typ vom
> literal "000" nicht erkennen.

Genau das habe ich mir auch gedacht, da es ohne das Literal auch 
funktioniert hat.

Also habe ich versucht es ganz genau zu beschreiben:
tAddrB <= unsigned(addrB & std_logic_vector(to_unsigned(0,3)));

Ich definiere mein Literal über den Integer 0, konvertiere den in 
unsigned und dann in einen SLV. Sollte doch eindeutig sein?! Die 
Fehlermeldung bleibt unverändert.

Fpga Kuechle schrieb:
> Du kannst einen type cast davorsetzen,oder die "000" in eine
> Varible/Konstante vom gewünschten Typ setzen.

Habe jetzt im Architecture-Header:
CONSTANT test1 : STD_LOGIC_VECTOR(2 downto 0) := "000";
Und im Prozess:
tAddrB <= unsigned(addrB & test1);

Geht leider nicht. Habe es auch mit test1 als Signal oder Variable 
versucht.

von Marius S. (lupin) Benutzerseite


Lesenswert?

Fpga Kuechle schrieb:
> Es könnte unsigned (typ auf der anderen
> Seite des Operators oder EinTollerTyp (type auf der anderen Seite der
> Zuweisung

Auf der anderen Seite der Zuweisung (also die Variable tAddrB) steht 
doch eine Variable des Typs SLV und nicht des Typs EinTollerTyp. Das 
wundert mich ja, ich definiere den Typ zwar, aber nutze ihn gar nicht 
und trotzdem führt er zu Problemen :-/

von Cihan K. (lazoboy61)


Lesenswert?

versuch es mal folgendermaßen:

tAddrB <= unsigned(addrB) & "000";

Cihan

von Cihan K. (lazoboy61)


Lesenswert?

evtl. schaust du mal hier rein:
http://www.lothar-miller.de/s9y/archives/82-Qualifier.html

Cihan

von Marius S. (lupin) Benutzerseite


Lesenswert?

Cihan Kalayci schrieb:
> tAddrB <= unsigned(addrB) & "000";

Jo, so geht es.


Cihan Kalayci schrieb:
> evtl. schaust du mal hier rein:
> http://www.lothar-miller.de/s9y/archives/82-Qualifier.html
>
> Cihan

Und so geht es auch:
tAddrB := unsigned(std_logic_vector'(addrB & "000"));


Anscheinend ist er sich nicht sicher, was bei der Verknüpfung von zwei 
SLVs als Ergebnis raus kommen soll. Jetzt ist die Frage, wie ISE 
überhaupt darauf kommt, dass das ganze irgendwas mit meinem 
selbst-definierten Typen zu tun haben könnte - addrB und "000" sind doch 
zwei SLVs.

von Fpgakuechle K. (Gast)


Lesenswert?

Marius S. schrieb:

> Und so geht es auch:
> tAddrB := unsigned(std_logic_vector'(addrB & "000"));
>
>
> Anscheinend ist er sich nicht sicher, was bei der Verknüpfung von zwei
> SLVs als Ergebnis raus kommen soll. Jetzt ist die Frage, wie ISE
> überhaupt darauf kommt, dass das ganze irgendwas mit meinem
> selbst-definierten Typen zu tun haben könnte - addrB und "000" sind doch
> zwei SLVs.

Nein, "000" ist nicht zwingend vom Typ slv, das literal kann auch 
unsigned oder signed odr jeder anderer typ sein der definiert ist und 
mehrere '0' verkettet zuläßt (wie dein selbstdefinierter typ). Lass mal 
alle typdefinitionen außer std_logic_vector weg (also auch keine 
ieee.numeric_std.all einbinden), dann könnte es klappen (vorausgesetzt 
in der std_logic_1164 finden sich keine "ähnliche" typen.

MfG

von Marius S. (lupin) Benutzerseite


Lesenswert?

Okay, verstehe. Generell zur Vorgehensweise heißt das, dass ich wenn ich 
richtig eindeutigen/sauberen Code schreiben will bei jedem Literal 
eigentlich auch einen Type-Qualifier mit angeben muss?

Also auch std_logic'('0') anstatt einfach '0' zu schreiben? Kann ja 
sein, dass der Code irgendwann mit einem weiteren Typ erweitert wird 
welcher auch zu '0' passt.

Ist Verilog da eigentlich besser (intuitiver)? Diese "striktheit" von 
VHDL nervt irgendwie :-/

von Duke Scarring (Gast)


Lesenswert?

Marius S. schrieb:
> Generell zur Vorgehensweise heißt das, dass ich wenn ich
> richtig eindeutigen/sauberen Code schreiben will bei jedem Literal
> eigentlich auch einen Type-Qualifier mit angeben muss?
Ich würde die Kirche im Dorf lassen und die Qualifier nur an den 
neuralgischen Stellen verwenden.

Duke

von Fpgakuechle K. (Gast)


Lesenswert?

Marius S. schrieb:
> Okay, verstehe. Generell zur Vorgehensweise heißt das, dass ich wenn ich
> richtig eindeutigen/sauberen Code schreiben will bei jedem Literal
> eigentlich auch einen Type-Qualifier mit angeben muss?
>
> Also auch std_logic'('0') anstatt einfach '0' zu schreiben? Kann ja
> sein, dass der Code irgendwann mit einem weiteren Typ erweitert wird
> welcher auch zu '0' passt.

Ein klassischer tipp ist "No Magic Numbers", also Constanten verwenden 
statt Literale. Dann ist auch der Typ klar. Bei "Nullvectoren" kann man 
das beispielsweise so machen:

constant C_SLV_ZERO is std_logic_vector(63 downto 0) := (others => '0');


und aus
.. & "0000000000000000";      wird
.. & C_SLV_ZERO(15 downto 0);

Und falls es statt der 9-wertigen Logik von standard_logic auch eine 
zweiwertige tut, kann man den typ boolean (hat nur die elemente true und 
false) verwenden.

Die strenge typprüfung von VHDL macht hier das richtig schreiben 
einfacher als die schwache typprüfung von C.
Wenn VHDL etwas unklar ist ("ambigous") bricht der "Compiler" ab, 
während C einfach weiter läuft.  Code der auf diese weise nicht sauber 
ist, läuft eben nicht.

MfG,

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.