Lothar M. schrieb:> Und um die ganze Hin- und Herwandlerei zu sparen, kannst du den ADC> gleich als unsigned deklarieren:
Ja, nur irgendwo muss ich es konvertieren, da es nur die eine Stelle ist
belasse ich es in dem Fall so.
Lothar M. schrieb:> ADCx <= ADC * to_unsigned(15125,14);
Das war es, Vivado scheint die Bitbreite von dem integer anders zu
interpretieren.
in meinem Fall funktioniert es mit
Peter schrieb:> Das war es, Vivado scheint die Bitbreite von dem integer anders zu> interpretieren.
Ein Integer hat keine Bitbreite. Er hat lediglich einen Wertebereich.
Und das Problem hat nichts mit Vivado zu tun. Es hat mit der Definition
des Multiplikationsoperators zu tun.
Lies nochmal langsam und genau, was ich gepostet habe, und versuche es
zu verstehen. Setz dir einen Link auf den Quellcode der numeric_std. Du
wirst ihn immer wieder brauchen.
Peter schrieb:> 15125 sind 14 bit
Sicher? (Vorsicht Fangfrage!)
Falls das numerische Literal 15125 ein integer und damit
vorzeichenbehaftet ist, dann musst du noch ein bit für das Vorzeichen
'+' einrechnen das bitweise als '0'-bit ganz links dargestellt wird,
weil andernfalls 11101100010101 = - 6933. Beim type natural dagegen
würden 14 bit reichen, natural is ja als subtype von Integer eingeführt.
> Ein Integer hat keine Bitbreite. Er hat lediglich einen Wertebereich.
Njein. Ein Integer hat ab VHDL'87 32 bit, da gab es mal die Diskussion
das auf 64 per Standard-revision hochzusetzen.
Welchen typ jetzt eine 'nackte Zahl' hat ist wieder eine andere Frage
und um diese Frage nicht zu stellen, gibt man eigentlich immer den Typ
der nackten Zahl an. Entweder explizite Konvertierung, casz operator und
man definiert es gleich als Konstante (weil auch in VHDL sind 'magic
numbers' wegen schlechter Wartbarkeit und geringer Verständlichkeit
nicht gerne gesehen).
Und wenn man nicht will das für einen integer nicht 32 bit für den
vollen Bereich von -2147483648 bis +2147483647 'verheizt' werden, gibt
man den tatsächlichen Wertebereich an (range). Das nennt sich
unglücklichwerweise 'constrained subtype', obwohl es nichts mit 'timing
constraints' zu tun hat.
C. A. Rotwang schrieb:> unglücklichwerweise 'constrained subtype', obwohl es nichts mit 'timing> constraints' zu tun hat.
Das hat mit Glück oder Unglück nicht so sehr zu tun, denn "to constrain"
bedeutet ja lediglich "einschränken": einmal wird der Wertebereich
eingeschränkt und einmal das Timing.
> Falls das numerische Literal 15125 ein integer und damit> vorzeichenbehaftet ist, dann musst du noch ein bit für das Vorzeichen> '+' einrechnen
Im Kontext der Multiplikation wird ist die Zeichenkette 15125 als ein
auf natürliche Integerzahlen eingeschränkter Natural betrachtet, weil
die Multiplikation ja mit einem "linken" Unsigned und einem "rechten"
Natural durchgeführt wird:
function "*" ( L: UNSIGNED; R: NATURAL) return UNSIGNED;
> Beim type natural dagegen würden 14 bit reichen, natural is ja als> subtype von Integer eingeführt.
Und genau um so eine Multiplikation geht es hier zweifelsohne. Denn es
ist in der numeric_std keine Multiplikation eines Unsigned mit einem
Integer vorgesehen. Siehe im oben verlinkten Quelltext die Deklarationen
A.15 bis A.20: