Hallo, ich habe ein Problem und zwar soll ich den Unterschied zwischen "to" und "downto" bei der erstellung eines Bitvektors darstellen. Leider finde ich keinen. Welche gibt es denn? Der einzige der mir aufgefallen ist, ist, das die Indexierung jeweils andersrum ist.
>Der einzige der mir aufgefallen ist, ist, das die Indexierung jeweils >andersrum
ist.
mehr ist da auch nicht dran.
7 downto 0 -> MSB first
0 to 7 -> LSB first
Was ist der Unterschied zwischen rot und grün? Ich finde keinen, beides sind ja Farben. Der einzige Unterschied ist, dass sie sich in der Farbe unterscheiden. Aber wo ist nun ein Unterschied? Ich sehen keinen.
> Der einzige der mir aufgefallen ist, > ist, das die Indexierung jeweils andersrum ist. Ja, und alle Welt betrachtet Zahlen so, dass die höchstwertige Zahl (bzw. das höchstwertige Bit) links steht. Das Bit 7 in einem 8Bit Vektor ist das MSB. Das Bit 0 ist das LSB. Welchen Wert hätte Bit 0, wenn
1 | vect : std_logic_vector(0 to 7); |
den Wert "1000000" hätte? Richtig: vect(0) hätte den Wert '1' :-o Und das wäre schlicht verwirrend. Und was käme hier heraus:
1 | vect : std_logic_vector(0 to 7); |
2 | vekt : std_logic_vector(7 downto 0); |
3 | :
|
4 | vekt <= "10000000"; |
5 | vect <= vekt; |
Welchen Wert hat vect(7)?
Ich würde schäzten, das vec(7) ne 0 ist, sicher bin ich mir nicht. (Der Vektor wird doch gedreht oder?) Danke aber dafür.
Du kannst das benutzen, wenn Du Busse gegeneinender drehen willst, z.B. wenn es keine echten Busse sondern nur Leitungsbündel sind und ein Hansel (welcher konkret Thomas heisst) am Ausgang den Stecker anders benannt hat. output(63 downto 0) <= input(0 to 63);
>und ein Hansel (welcher konkret Thomas heisst) am Ausgang den Stecker >anders
benannt hat.
hehe :)
Man benutzt downto meistens auch dann, wenn es eigentlich gar nicht
um die Zahlen geht. Man gewöhnt sich dran und benutzt sogut wie immer^^
Deswegen weiss ich jetzt zB nicht mal ob es unsigned(0 to 7) gibt.
Aber wahrscheinlich wird es das auch geben. Wahrscheinlch wird es
auch to_unsigned(int_value, 8) geben. Ohne Garantie, muss ich mal
testen ;)
> Wahrscheinlch wird es auch to_unsigned(int_value, 8) geben.
Das ist eine 8-Bit Konvertierung aus dem numeric_std Package.
1 | KONVERTIERUNG CAST |
2 | |
3 | <-- to_integer(u) ----- UNSIGNED <-- unsigned(v) -------- |
4 | --- to_unsigned(i,len) --> --- std_logic_vector(u) --> |
5 | INTEGER STD_LOGIC_VECTOR |
6 | <-- to_integer(s) --- SIGNED <--- signed(v) -------- |
7 | --- to_signed(i,len) --> --- std_logic_vector(s) --> |
Ne, mir ging es eher umsowas
1 | signal x: unsigned(0 to 7) := "1000" & "0000"; |
2 | signal i: integer range 0 to 255; |
3 | |
4 | i <= to_integer(x, x'length); |
ich würde vermuten, dass i gleich 1 ist. Grüsse
Das geht nicht:
1 | i <= to_integer(x, x'length); |
to_integer nimmt nur 1 Parameter:
1 | i <= to_integer(x); |
Kurz mal getestet, Ergebnis: i = 128 :-o
1 | function TO_INTEGER(ARG: UNSIGNED) return NATURAL is |
2 | constant ARG_LEFT:INTEGER:= ARG'length-1; |
3 | alias XXARG:UNSIGNED(ARG_LEFT downto 0) is ARG; |
4 | variable XARG:UNSIGNED(ARG_LEFT downto 0); |
5 | variable RESULT: NATURAL:= 0; |
6 | variable w : INTEGER:= 1; -- weight factor |
7 | begin
|
8 | if (ARG'length<1) then |
9 | assert NO_WARNING |
10 | report "numeric_std.TO_INTEGER: null arg" |
11 | severity warning; |
12 | return 0; |
13 | end if; |
14 | XARG:= TO_01(XXARG); |
15 | if (XARG(XARG'left)='X') then |
16 | assert NO_WARNING |
17 | report "numeric_std.TO_INTEGER: metavalue arg set to 0" |
18 | severity warning; |
19 | return 0; |
20 | end if; |
21 | for i in XARG'reverse_range loop |
22 | if XARG (i) = '1' then |
23 | RESULT:= RESULT + w; |
24 | end if; |
25 | if (i /= XARG'left) then w := w + w; |
26 | end if; |
27 | end loop; |
28 | return RESULT; |
29 | end TO_INTEGER; |
interessant, dass hier grundsätzlich downto verwendet wird alias XXARG:UNSIGNED(ARG_LEFT downto 0) is ARG; Ok, jetzt weiss man mehr :)
interessant, dass alias andere Zählrichtung verwenden kann. ARG ist ja unconstrained, sowohl in Arraygrösse wie Richtung. Ich hab gerade hier keine Möglichkeit zum Testen. Aber ich meine, dass ich sowas schon mal ausprobiert habe und es nicht ging. signal x: std_logic_vector(3 downto 0); signal y: std_logic_vector(0 downto 3); y <= x;
> (0 downto 3) Das geht wirklich nicht ;-) > y <= x; Das geht. Nur die Vektorbreite muß passen...
Lothar Miller schrieb: >> (0 downto 3) > Das geht wirklich nicht ;-) Kommt da nicht einfach ein Vector der Laenge 0 raus?
> Kommt da nicht einfach ein Vector der Laenge 0 raus?
Richtig.
Nur kann man damit irgendwie nichts Sinnvolles anfangen :-/
Freundlicherweise weist eine Warnung auf den Typo hin:
1 | Null range: 0 downto 3 |
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.