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 #3651256
Lesenswert?

peter schrieb:
> 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;

a) Die 8 hat in diesem Fall nichts mit der Variablen zu tun.

b) Ich glaube, dass Stichwort hierzu heißt "VHDL Predefined Attributes"

gruß
Gast #3651295
Lesenswert?

es wird aber trotzdem wohl nicht so wie gedacht funktionieren, weil du 
fuer 'xx' eine Variable verwendest und auf '<255' abfragst. Warum 
Variable? Und wenn schon Variable, warum nicht mit 'range' Angabe?
Sorry, aber ich habe den Eindruck, du kopierst dir von irgendwoher 
irgendwas zusammen ohne Sinn und Verstand...
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
Gast #3651644
Lesenswert?

peter schrieb:
> Ich habe jetzt ja auch mal rausgefunden das bei Range wieder bei "0"
> angefangen wird wenn das Ende erreicht ist.

das glaube ich erstmal nicht! Range sagt nur dem Synthesizer, wieviel 
Bits er veranschlagen soll. Er baut dir aber bei range is 0 to 10 keinen 
Ueberlaufdetektor ein!
Gast #3651680
Lesenswert?

----------------------
das glaube ich erstmal nicht! Range sagt nur dem Synthesizer, wieviel
Bits er veranschlagen soll. Er baut dir aber bei range is 0 to 10 keinen
Ueberlaufdetektor ein!
------------------------

Kannst du halten wie ein Dachdecker....ämm Ueberlaufdetektor...
Ich kann damit leben....
Gruss
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