Forum: FPGA, VHDL & Co. Rechnen mit STD_LOGIC_UNSIGNED


von Bronco (Gast)


Lesenswert?

Mir ist ja bekannt, daß man mit NUMERIC_STD rechnen soll, aber nehmen 
wir mal an, ich würde dazu gezwungen, mit STD_LOGIC_UNSIGNED zu rechnen.

Nun finde ich einen Code wie
1
signal A : std_logic_vector(3 downto 0);
2
signal B : std_logic_vector(5 downto 0);
3
signal C : std_logic_vector(7 downto 0);
4
(...)
5
  if (A + B = C) then
6
(...)

und frage mich: Wie macht STD_LOGIC_UNSIGNED das genau?
Werden A und B mit '0' auf die Breite von C erweitert?
Oder werden B und C auf die Breite von A beschnitten?
Wie bzw. wo ist das spezifiziert?

Wo könnte ich dann das genaue Verhalten von STD_LOGIC_UNSIGNED 
nachlesen?

von Spartanius (Gast)


Lesenswert?

Ich habe mir irgendwann mal ein ModelSIM design gemacht, das einige 
Beispiele enthält, wie man umrechnet, erweitert und richtig abschneidet.

von Stachele (Gast)


Lesenswert?

Ja und?

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


Lesenswert?

Bronco schrieb:
> und frage mich: Wie macht STD_LOGIC_UNSIGNED das genau?
Sieh dir einfach mal den Quelltext des entsprechenden Packages an...
http://www.csee.umbc.edu/portal/help/VHDL/stdpkg.html

> Wie bzw. wo ist das spezifiziert?
Definiert von Synopsys und als Standard anerkannt vom IEEE...
http://www.cs.sfu.ca/~ggbaker/reference/std_logic/

von Duke Scarring (Gast)


Lesenswert?

Bronco schrieb:
> Werden A und B mit '0' auf die Breite von C erweitert?
Nein.

> Oder werden B und C auf die Breite von A beschnitten?
Ja, irgend sowas. Und vor allem ohne Warnung.
Damit kann man sich schön ins Knie schießen :-(
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.std_logic_arith.all;
4
use ieee.std_logic_unsigned.all;
5
6
entity tb is
7
end entity tb;
8
9
architecture testbench of tb is
10
11
    signal A : std_logic_vector(3 downto 0);
12
    signal B : std_logic_vector(5 downto 0);
13
    signal C : std_logic_vector(7 downto 0);
14
    
15
begin
16
17
    process
18
        variable expected_result : integer;
19
        variable ok : boolean;
20
    begin
21
        for a_in in 0 to 15 loop
22
            for b_in in 0 to 63 loop
23
24
                expected_result := a_in + b_in;
25
                
26
                a <= conv_std_logic_vector( a_in, 4);
27
                b <= conv_std_logic_vector( b_in, 6);
28
                c <= conv_std_logic_vector( expected_result, 8);
29
30
                wait for 1 ns;
31
32
                if (a + b = c) then
33
                    ok := true;
34
                else
35
                    report "Oh oh: not equal! " & integer'image( conv_integer(a + b)) & " /= " & integer'image( conv_integer(c));
36
                    ok := false;
37
                end if;
38
                
39
                wait for 10 ns;
40
41
            end loop;
42
            
43
        end loop;
44
        wait;
45
    end process;
46
47
end architecture testbench;

Duke

von Bronco (Gast)


Lesenswert?

Okay, danke!

von Andreas U. (Gast)


Lesenswert?

Auch ich habe mich da immer mal wieder getäsucht. Da werden plötzlich 
Ergebnisse in höhere Bitvektoren geschoben, wenn die Breite nicht 
stimmt, wobei eigentlich beim Abschneiden die niederen zugeweisen werden 
sollten.

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.