Forum: FPGA, VHDL & Co. vhdl typumwandlung


von Dergute W. (derguteweka)


Lesenswert?

Moin,


Ich hab' sowas:
1
signal vcl : integer range 0 to 2047;
2
signal evenodd : std_logic;


Wie greif' ich denn da in VHDL auf's LSB von vcl zu?
Also sows von dem Kaliber:
1
if (LSB_von(vcl) = evenodd) then
2
  ...
3
else
4
  ...
5
end if;

Das kotzt mich grad wieder ordentlich an bei vhdl. Da wird sich 
angestellt wie ein Profi-Informatiker, weil die Typen nicht 100% 
zusammenpassen wollen. Aber wenn man mal 2 std_logic_vector mit 
(versehentlich) unterschiedlichen laengen auf Groesse vergleicht, da 
geht natuerlich alles OK. Da muss man nicht mal ne Warning schmeissen. 
Grmpf.

Gruss
WK

von Duke Scarring (Gast)


Lesenswert?

Ich würde es so probieren:

> signal vcl : integer range 0 to 2047;
> signal evenodd : std_logic;

signal vcl_uns : unsigned( 10 downto 0);

vcl_uns <= unsigned( vcl);

if vcl_uns(0) = evenodd then
>   ...
> else
>   ...
> end if;



Dergute W. schrieb:
> Aber wenn man mal 2 std_logic_vector mit
> (versehentlich) unterschiedlichen laengen auf Groesse vergleicht
Nimmt da etwa jemand noch std_logic_arith?!?

Duke

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Dergute W. schrieb:
> Wie greif' ich denn da in VHDL auf's LSB von vcl zu?
Evtl. solltest du den vcl gleich als unsigned Vektor definieren, wenn 
du da sowieso auf einzelne Bits zugreifen willst.

Duke Scarring schrieb:
> vcl_uns <= unsigned( vcl);
... to_unsigned(vcl);
bringt hier weniger Fehlermeldungen ;-)

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Merci - ich seh' schon: An der Grundproblematik aendert sich nix. 
Elegant isses nicht. Naja. Maguggn obs geht...
1
vclstlv <= std_logic_vector(to_unsigned(vcl,11));

Gruss
WK

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Dergute W. schrieb:
> vclstlv <= std_logic_vector(to_unsigned(vcl,11));
Den Cast zum std_logic_vector kannst du im Prinzip weglassen, denn auch 
von einem unsigned Vektor lassen sich einzelne Bits indizieren.

von Maus (Gast)


Lesenswert?

Lothar M. schrieb:
>> vclstlv <= std_logic_vector(to_unsigned(vcl,11));
> Den Cast zum std_logic_vector kannst du im Prinzip weglassen, denn auch
> von einem unsigned Vektor lassen sich einzelne Bits indizieren.

Und damits noch universeller wird:
1
vclstlv <= std_logic_vector(to_unsigned(vcl, vclstlv'legnth));


Maus

von Kinderkacke Entsorger (Gast)


Lesenswert?

Dergute W. schrieb:
> Moin,
>
> Merci - ich seh' schon: An der Grundproblematik aendert sich nix.
> Elegant isses nicht. Naja. Maguggn obs geht...

Wir sind hier aber nicht auf dem Bolschoi Theater beim Schwanensee, hier 
geht's nicht um Eleganz, sondern um lösungsorientiertes Code 
runterschreiben.
Diese Geseire um "Eleganz" ist so ziemlich das Gegenteil von "geradlinig 
auf die Problemlösung zu arbeiten".

von T.U.Darmstadt (Gast)


Lesenswert?

Es geht bei Eleganz und zwei Dinge : Schreibarbeit und Lesbarkeit. 
Beides ist bei VHDL und konkret dem Konstrukt so dolle  nicht.

Maus schrieb:
> vclstlv <= std_logic_vector(to_unsigned(vcl, vclstlv'legnth));

Ich würde "length" nehmen und darüber nachdenken, ob man dem Vector 
nicht einen aussagefähigen Namen verpasst. Sowas wie:

Katze.Type <= conv_to_std_animal (resize (Maus.Type, size_of (Maus) * 
10);

von Duke Scarring (Gast)


Lesenswert?

Lothar M. schrieb:
> ... to_unsigned(vcl);
> bringt hier weniger Fehlermeldungen ;-)
Ja, natürlich. Die Modelsim-Session war schon wieder zu für heute...

Dergute W. schrieb:
> Aber wenn man mal 2 std_logic_vector mit
> (versehentlich) unterschiedlichen laengen auf Groesse vergleicht, da
> geht natuerlich alles OK.
Das andere Problem ist doch viel interessanter als der Syntaxkram:

WIMRE hatte ich auch mal den Fall, wo
1
signal vec5 : std_logic_vector( 2 downto 0) := "101";
2
signal vec3 : std_logic_vector( 1 downto 0) := "11";
3
4
if vec5 < vec3 then
5
...
ohne Warnung 'true' war. Da habe ich auch eine Weile nach dem Fehler 
suchen müssen.

Wenn man den Code auf numeric_std umstellt, kommt auch die erwartete 
Warnung beim Cast auf unsigned.

Duke

von Markus F. (mfro)


Lesenswert?

Das lässt sich auch einfach so schreiben:
1
if to_unsigned(vcl, 1)(0) = evenodd then
2
...

von Hans (Gast)


Lesenswert?

Markus F. schrieb:
> if to_unsigned(vcl, 1)(0) = evenodd then
ja, aber ist das wirklich vorteihaft(er)?

von Markus F. (mfro)


Lesenswert?

Hans schrieb:
> Markus F. schrieb:
>> if to_unsigned(vcl, 1)(0) = evenodd then
> ja, aber ist das wirklich vorteihaft(er)?

Ich versteh' die Frage nicht.

Ich brauch' doch keinen Vektor mit 11 Bits, wenn mich nur eins davon 
interessiert?

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.