Forum: FPGA, VHDL & Co. Typenumwandlung von einer Variable in Vector.


von peter (Gast)


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

von daniel__m (Gast)


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ß

von peter (Gast)


Lesenswert?

Jup danke.

Ist also für meine led gedacht die mit :
leds : out STD_LOGIC_VECTOR(7 downto 0);
angelegt wurde.

Gruss

von berndl (Gast)


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

von berndl (Gast)


Lesenswert?

ok, 'xx<255' funktioniert hier, aber erklaer mal in eigenen Worten 
warum?

von peter (Gast)


Lesenswert?

Hmmm...
variable xx : integer range 0 to 255 := 0;
Range ist vorhanden.

ok, 'xx<255' funktioniert hier, aber erklaer mal in eigenen Worten

Ich brauche 0 bis 254 nicht die 255.

GRuss

von peter (Gast)


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

von peter (Gast)


Lesenswert?

Ich habe jetzt ja auch mal rausgefunden das bei Range wieder bei "0" 
angefangen wird wenn das Ende erreicht ist. Ich dachte vorher das es ins 
ungewisse geht mit dem Zählen.

GRuss

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


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

: Bearbeitet durch Moderator
von Duke Scarring (Gast)


Lesenswert?

peter schrieb:
> Ich wusste vorher auch nicht das
> Variable nur innerhalb vom Process Gültigkeit hat.
Sollte Dein VHDL-Buch nicht langsam mal da sein?
Falls ja, dann lies es auch!

Duke

von peter (Gast)


Lesenswert?

Mit QuartusSetupWeb-13.0.0.156 und ModelSimSetup-13.0.0.156

Gruss

von berndl (Gast)


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!

von peter (Gast)


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

von berndl (Gast)


Lesenswert?

peter schrieb:
> Kannst du halten wie ein Dachdecker....ämm Ueberlaufdetektor...
> Ich kann damit leben....

Gruss vom Dachdecker. Wollen wir wetten?

von Dachdecker-Kollege (Gast)


Lesenswert?

berndl schrieb:
> Wollen wir wetten?

Ich setze 10 Taler auf berndl ;-)

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


Angehängte Dateien:

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

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


Angehängte Dateien:

Lesenswert?

Und auch mit Synplify gibts keinen automatischen Überlauf am range...

: Bearbeitet durch Moderator
von berndl (Gast)


Lesenswert?

Dachdecker-Kollege schrieb:
> berndl schrieb:
>> Wollen wir wetten?
>
> Ich setze 10 Taler auf berndl ;-)

Hallo 'Kollege'. Danke fuer die moralische Unterstuetzung (gilt auch 
fuer Lothar) :o)

von peter (Gast)


Lesenswert?

LED 1-2 blinkt Zeitgleich, LED 3 blinkt überhaupt nicht.

Gruss

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


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;

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.