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?
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...
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
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.
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 :-/
versuch es mal folgendermaßen: tAddrB <= unsigned(addrB) & "000"; Cihan
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.
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
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 :-/
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.