Hallo,
kann mir jemand erklären:
wieso es möglich ist, std_ulogic Signale an std_logic zu hängen, ebenso
wie std_ulogic an Ports von einem std_logic_vector, es aber nicht
möglich ist, einen std_ulogic_vector an einen std_logic_vector zu
hängen? Der Unterschied zwischen beiden Typen ist mir klar, ich verstehe
nur nicht, wieso es bei einem ganzen vektor nicht geht, wohl aber bei
signalen.
Gibts es dafür irgendwelche Hintergründe? Ich würde mich auch über
Literaturhinweise freuen!
VARIABLEresult:std_ulogic:='Z';-- weakest state default
3
BEGIN
4
-- the test for a single driver is essential otherwise the
5
-- loop would return 'X' for a single driver of '-' and that
6
-- would conflict with the value of a single driver unresolved
7
-- signal.
8
IF(s'LENGTH=1)THENRETURNs(s'LOW);
9
ELSE
10
FORiINs'RANGELOOP
11
result:=resolution_table(result,s(i));
12
ENDLOOP;
13
ENDIF;
14
RETURNresult;
15
ENDresolved;
Deshalb findet der & Operator, der ja nur gleiche Datentypen verknüpfen
kann für die zu verknüpfenden Vektoren keine Umwandlungsmöglichkeit.
Du müsstest also den & Operator überladen, dass auch deine Kombination
geht:
Danke für deine Antwort.
Ich meinte allerdings nicht den &-Operator, sondern die gewöhnlichen
Zuweisungen:
-- Bestehendes VHDL:
a : out std_logic,
b : out std_logic,
a_vector : out std_ulogic_vector(0 to 31),
-- Generierter VHDL-Code:
mb_gpio_data : out std_logic_vector(0 to 31),
-- Anbindung:
-- das hier funktioniert:
Inst_test: test PORT MAP(
mb_gpio_data(31) => a,
mb_gpio_data(30) => b,
mb_gpio_data(0 to 29) => open
);
-- das hier funktioniert NICHT, ohne zu casten:
Inst_test: test PORT MAP(
mb_gpio_data => a_vector
);
Du meintest ja, dass die Auflösungsfunktion nur für einzelne Bits
definiert ist. Gibt es dazu einen bestimmten Hintergund? Was ist hier
der Unterschied zwischen einzelnen Signalen und Vektoren?
Beginner schrieb:> Gibt es dazu einen bestimmten Hintergund?
Man macht in VHDL lieber eine explizite und sichtbare Umwandlung, als
sich auf windige Automatismen zu verlassen.
> Du meintest ja, dass die Auflösungsfunktion nur für einzelne Bits> definiert ist.
Ich meinte nicht, sondern es ist so. Siehe dazu den Ausschnitt aus
der std_logic_1164... ;-)
> Was ist hier der Unterschied zwischen einzelnen Signalen und Vektoren?
Die Datentypen!
Nehmen wir mal das hier
signal onebitvector : std_logic_vector( 0 to 0) := "0";
und das hier
signal onebitsignal : std_logic := '0';
Hier wird augenscheinlich das selbe gemacht/gemeint/realisiert, aber
VHDL lässt sowas nicht zu:
onebitsignal <= onbitvector;
Da muss man schreiben:
onebitsignal <= onbitvector(0);
Lothar Miller schrieb:>> Gibt es dazu einen bestimmten Hintergund?> Man macht in VHDL lieber eine explizite und sichtbare Umwandlung, als> sich auf windige Automatismen zu verlassen.
Anscheinend ist es ja problemlos möglich sich bei einzelnen Signalen
hierauf zu verlassen? Mich interessiert eigentlich nur, wieso dies bei
einzelnen Signalen so implementiert wurde und bei Vektoren nicht!
Irgendeinen Grund wird es hierfür doch geben? Wenn man dies generell
nicht tun sollte, wäre es ja auch nicht nur bei einzelnen Signalen
realisiert worden.
>> Was ist hier der Unterschied zwischen einzelnen Signalen und Vektoren?> Die Datentypen!> Nehmen wir mal das hier> signal onebitvector : std_logic_vector( 0 to 0) := "0";> und das hier> signal onebitsignal : std_logic := '0';> Hier wird augenscheinlich das selbe gemacht/gemeint/realisiert, aber> VHDL lässt sowas nicht zu:> onebitsignal <= onbitvector;> Da muss man schreiben:> onebitsignal <= onbitvector(0);
Ich meinte nicht generell der Unterschied! Der ist klar! Ich meinte den
Unterschied, wieso es eben bei einzelnen Signalen automatisiert gecastet
wird und bei einem Vektor nicht. Woran hier der Unterschied liegt, dass
es beim einen gemacht wird und beim anderen nicht.
Beginner schrieb:> Mich interessiert eigentlich nur, wieso dies bei> einzelnen Signalen so implementiert wurde
Da ist es quasi ein "Abfallprodukt", weil ja der std_logic ein
Untertyp des std_ulogic ist.