Array und Typkonvertierungs-Problem in VHDL

OP Persönliche Seite #3174623
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?
Gast #3174665
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
OP Persönliche Seite #3174804
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.
OP Persönliche Seite #3174808
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 :-/
OP Persönliche Seite #3174898
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.
Gast #3175859
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
OP Persönliche Seite #3176038
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 :-/
Gast #3176059
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
Gast #3176107
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,

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