Forum: FPGA, VHDL & Co. Unterschied to downto


von Sonke A. (soeni)


Lesenswert?

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.

von A. F. (artur-f) Benutzerseite


Lesenswert?

>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

von Der Forenclown (Gast)


Lesenswert?

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.

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


Lesenswert?

> 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)?

von Sonke A. (soeni)


Lesenswert?

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.

von Pauli (Gast)


Lesenswert?

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);

von Daniel -. (root)


Lesenswert?

>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 ;)

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


Lesenswert?

> 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) -->

von Daniel (root) (Gast)


Lesenswert?

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

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


Lesenswert?

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

von Danie (root) (Gast)


Lesenswert?

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 :)

von Danie (root) (Gast)


Lesenswert?

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;

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


Lesenswert?

>  (0 downto 3)
Das geht wirklich nicht ;-)

>  y <= x;
Das geht. Nur die Vektorbreite muß passen...

von D. I. (Gast)


Lesenswert?

Lothar Miller schrieb:
>>  (0 downto 3)
> Das geht wirklich nicht ;-)

Kommt da nicht einfach ein Vector der Laenge 0 raus?

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


Lesenswert?

> 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
Noch kein Account? Hier anmelden.