Forum: FPGA, VHDL & Co. Type Unsigned


von hans (Gast)


Lesenswert?

Guten Morgen liebes Forum,

ich habe eine Frage zum Typ Unsigned.

Folgender Aufbau:
1
architecture xxx of yyy is
2
signal count: unsigned (11 downto 0) := (others => '0');
3
begin
4
5
process(clk)
6
begin
7
if rising_edge(clk) then
8
  if (enable = '1') then
9
    if(count < 10) then
10
       .... dann mache irgendwas
11
    end if;
12
  end if;
13
  count <= count + 1;
14
end if;
15
16
end process
17
18
end Behavioral;

Nun möchte ich jedoch die Zählweite ausserhalb des Prozesses definieren. 
Also nicht mehr
1
if (count < 10) then
 sondern
1
if (count < var_cnt) then
haben. Wie definiere ich nun var_cnt bzw. als welchen Datentyp (soll 
synthesefähig sein)?
1
signal var_cnt: unsigned (5 downto 0) := 64;
 ?

oder

wäre es auch möglich, nur eine Konstante vom Typ Integer oder vielleicht 
Natural  zu nehmen? (da ich ja auch nur 10 im if Zweig schreibe) ?

Sonnige Grüße,

hans

von Thomas R. (Firma: abaxor engineering) (abaxor)


Lesenswert?

Hallo,

in deinem Beispiel ist die Zählweite immer 1, denn das Erhöhen des 
Zähler steht am weitesten hinten im Prozess und überschreibt (da 
unbedingt) jede andere Zuweisung an count.

Selbstverständlich kannst du count mit jeder Konstanten und jedem Signal 
vom Typ integer vergleichen.

Tom

von hans (Gast)


Lesenswert?

Thomas Reinemann schrieb:
> Selbstverständlich kannst du count mit jeder Konstanten und jedem Signal
> vom Typ integer vergleichen.

Genau das ist meine Frage, dann würde ich ja einen Wert vom Typ unsigned 
(was ja ein array of std_logic ist) mit einem Wert eines anderes 
Datentyps vergleichen.

Also könnte ich jetzt var_cnt auch so
1
signal var_cnt : integer := 64
 deklarieren?

Jedoch wäre dann folgende Variante besser, da nur 6 Bits und nicht 32 
Bits wie für Integer benötigt werden, oder?
1
signal var_cnt: unsigned (5 downto 0) := 64;

vorrausgesetzt es soll nur bis 64 gezählt werden.

von hans (Gast)


Lesenswert?

jedoch müsste ich die 64 in 1000000 schreiben, oder?

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


Lesenswert?

hans schrieb:
> Wie definiere ich nun var_cnt bzw. als welchen Datentyp
> signal var_cnt: unsigned (5 downto 0)
Doweit passt das schon ...
> := 64;
Das geht allerdings nicht mehr, weil
a) 64 nicht in 6 Bits passt
und
b) die Zahl ein Integer ist, und ein Integer nicht so einfach
   an einen unsigned zugewiesen werden kann.

Du könntest jetzt:
1. einen Vektor definieren:  := "100000";   oder  : = x"20";
oder
2. einen integer in einen unsigned umwandeln   := to_unsigend(64,6);
oder
3. am einfachsten: mach den Zähler doch gleich als Integer, dann wirds 
mit dem Lesen der Zähler- und Vergleichswerte einfacher...


> architecture xxx of yyy is
Was kommt davor? Welche Packages verwendest du?
1
:
2
use ieee.numeric_std.all;
3
:
4
:
5
signal count : integer range 0 to 1023 := 0;
6
signal increment : integer range 0 to 63 := 63;
7
:
8
:
9
process(clk) begin
10
 if rising_edge(clk) then
11
   if (enable = '1') then
12
    count <= count + increment;
13
    if(count < 10) then
14
         -- .... dann mache irgendwas
15
    end if;
16
    --- irgendwann sollte der Zähler dann evtl. auch zurückgesetzt werden...
17
  end if;
18
 end if;
19
end process;


> Jedoch wäre dann folgende Variante besser, da nur 6 Bits und nicht
> 32 Bits wie für Integer benötigt werden, oder?
Den Integer kann und sollte man mit range einschränken!

Thomas Reinemann schrieb:
> Selbstverständlich kannst du count mit jeder Konstanten und jedem Signal
> vom Typ integer vergleichen.
Aber eben keinen Integer zuweisen...

von hans (Gast)


Lesenswert?

Lothar Miller schrieb:
> Was kommt davor? Welche Packages verwendest du?

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

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.