Forum: FPGA, VHDL & Co. [ghdl] Rechnen mit unsigned


von Jannick (Gast)


Lesenswert?

Hallo,

ich möchte in einem VHDL-Programm mit unsigned Werten rechnen. Konkret 
sieht das so aus:

1
phase_inc : in  std_logic_vector(31 downto 0);
2
3
[...]
4
5
signal phase_acc : std_logic_vector(31 downto 0);
6
7
[...]
8
9
process
10
  variable tmp : integer;
11
begin
12
  wait until rising_edge(clk);
13
  if reset = '0' then
14
    phase_acc <= (others => '0');
15
  else
16
    tmp := to_integer(unsigned(phase_acc));
17
    tmp := tmp + to_integer(unsigned(phase_inc));
18
    phase_acc <= std_logic_vector(to_unsigned(tmp, 32));
19
  end if;
20
end process;

GHDL bricht allerdings mit der Fehlermeldung "./testbench:error: bound 
check failed (#11)" ab. Was bedeutet das? Die Bitbreiten müsste doch 
eigentlich stimmen. Wie kann ich den Fehler beheben?

von berndl (Gast)


Lesenswert?

du rechnest aber mit integern, nicht mit unsigned. Und bei der Addition 
von 2 32bit Integern entsteht nun mal ein 33bit Wert...

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


Lesenswert?

> Und bei der Addition
> von 2 32bit Integern entsteht nun mal ein 33bit Wert...
Und dazu kommt, dass der positive Bereich eines Integers nur 31 Bit 
umfasst.

von Jannick (Gast)


Lesenswert?

Integers sind doch nur 32 Bit breit. Findet da kein automatischer 
Überlauf ("111..." -> "000...") statt?

von Jannick (Gast)


Lesenswert?

> > Und bei der Addition
> > von 2 32bit Integern entsteht nun mal ein 33bit Wert...
> Und dazu kommt, dass der positive Bereich eines Integers nur 31 Bit
> umfasst.

Achso. Und wie rechne ich dann mit vorzeichenlosen 32bit Werten? Das 
nicht-standard-Paket std_logic_unsigned möchte ich nicht verwenden.

von nicht "Gast" (Gast)


Lesenswert?

Rechne noch einfach direkt mit den unsigned-Werten:

phase_acc <= std_logic_vector(unsigned(phase_acc) + 
unsigned(phase_inc));

von Jannick (Gast)


Lesenswert?

Dankö. ^^

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


Lesenswert?

Jannick schrieb:
> Integers sind doch nur 32 Bit breit. Findet da kein automatischer
> Überlauf ("111..." -> "000...") statt?
Was ist ein Integer mit lauter Einsen?
Richtig: er hat einen Wert von -1 (minus 1)...  :-o

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.