Typenumwandlung von einer Variable in Vector.

Gast #3651223
Lesenswert?

Hallo, guten Tag.
Ich möchte bitte eine Typenumwandlung von einer Variable in Vector.
Das unten funktioniert.
Wie macht man es denn ohne die "8" hinten in der Klammer wenn die 
Variable zb so heisst: variable xx : integer range 0 to 45 := 0;

Danke.
GRuss
-------------------------------------------
begin
   process(clk)
   variable xx : integer range 0 to 255 := 0;

   begin
     if rising_edge(clk) then
       if (c<12499999 ) then
         c <= c+1;
       else
         c <= 0;
         if (xx<255) then
           xx := xx+1;
         else
           xx :=0;
         end if;
       end if;
    end if;

    leds <= std_logic_vector(to_unsigned(xx,8));
   end process;
end Behavioral;
------------------------------------------------
Gast #3651367
Lesenswert?

Ich wollte mal Testen wie sich eine Variable verhält wenn die zur led 
umgelenkt wird durch Typenwandlung. Ich wusste vorher auch nicht das 
Variable nur innerhalb vom Process Gültigkeit hat. Mit signal xx : 
integer range 0 to 255 := 0; habe ich auch schon getestet. Die befindet 
sich ausserhalb vom Process. Das mußte mir erst mal klar werden.

GRuss
Moderator (Firma: Titel) Persönliche Seite #3651387
Lesenswert?

peter schrieb:
> Ich habe jetzt ja auch mal rausgefunden das bei Range wieder bei "0"
> angefangen wird
Sag auch mit welcher Toolchain und welcher Version...

> Ich dachte vorher das es ins ungewisse geht mit dem Zählen.
Es ging noch nie bis ins Ungewisse, sondern immer nur bis zur nächsten 
Zweierpotenz...
Moderator (Firma: Titel) Persönliche Seite #3653834
Lesenswert?

Dachdecker-Kollege schrieb:
> Ich setze 10 Taler auf berndl ;-)
Ich glaube es auch frühestens, wenn ich den RTL-Plan gesehen habe.

Aber der Test ist einfach:
Peter, lass diese Beschreibung mal auf 3 nebeneinander liegende LEDs 
laufen und mach ein kurzes Filmchen davon:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4

5
entity RangeTest is
6
    Port ( clk : in  STD_LOGIC;
7
           led1 : out  STD_LOGIC;
8
           led2 : out  STD_LOGIC;
9
           led3 : out  STD_LOGIC);
10
end RangeTest;
11

12
architecture Behavioral of RangeTest is
13
signal cnt1 : integer range 0 to 67108863 := 0; --> 26 Bits nötig
14
signal cnt2 : integer range 0 to 33554433 := 0; --> 26 Bits nötig
15
signal cnt3 : integer range 0 to 33554433 := 0; --> 26 Bits nötig
16
begin
17

18
  process begin
19
    wait until rising_edge(clk);
20
    cnt1 <= cnt1 + 1;       -- Überlauf implizit
21
    
22
    cnt2 <= cnt2 + 1;       -- wie cnt1 oder wie cnt3?
23
    
24
    if cnt3 < 33554433 then -- Überlauf explizit
25
      cnt3 <= cnt3 + 1;
26
    else 
27
      cnt3 <= 0;
28
    end if;
29
  end process;
30
  
31
  led1 <= to_unsigned(cnt1,26)(25);
32
  led2 <= to_unsigned(cnt2,26)(25);
33
  led3 <= to_unsigned(cnt3,26)(25);
34
  
35
end Behavioral;
Für die Xilinx ISE sind auf jeden Fall led1 und led2 das Selbe 
(siehe Screenshot vom Technology Schematic).
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #3654869
Lesenswert?

peter schrieb:
> LED 1-2 blinkt Zeitgleich, LED 3 blinkt überhaupt nicht.
Mit einem Oszi würde man an der LED 3 ganz kurze Peaks sehen 
(Tastverhältnis 2:33554431).
Fazit: auch Quartus macht keinen automatischen Überlauf an den range 
Grenzen.
Denn sonst müsste konsequenterweise so ein Überlauf hier auch gehen:
... range 10 to 20;
... range -10 to 10;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren