Rechnen mit STD_LOGIC_UNSIGNED

Gast #2805725
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?
Moderator (Firma: Titel) Persönliche Seite #2806693
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/
Gast #2806982
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
Gast #2807932
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.

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