Forum: FPGA, VHDL & Co. Einzelne bits addieren


von LilaLauneBart (Gast)


Lesenswert?

Hallo,

ich habe das Forum durchforstet, bin aber nicht auf die passende Loesung 
gestossen...

Es gibt haufenweise Loesungen fuer STD_LOGIC_VECTOR aber bisher habe ich 
keine Loesung fuer STD_LOGIC gefunden...

Was ich gerne machen wuerde ist folgendes: (ich weiss das ist jetzt 
falsch, aber so koennt ihr mein Problem erknnen)
1
...
2
......
3
signal a,b,c,d,e,f : std_logic := '0';
4
signal ADDITION : std_logic_vector(3 downto 0) := (others => '0');
5
...
6
ADDITION <= a + b + c + d + e + f;
7
.....

Auch mit dem Convertieren funktioniert das nicht, wenn ich folgende 
versuche:
1
...
2
......
3
signal a,b,c,d,e,f : std_logic := '0';
4
signal ADDITION : integer range 3 to 0 := 0;
5
...
6
ADDITION <= to_integer(unsigned(a)) + to_integer(unsigned(b)) + .... + to_integer(unsigned(f));

Es kommt folgender Fehler:
The expression can not be converted to type unsigned.

Welche Moeglichkeit gibt es hier die einzelnen Bits zu addieren?

Vielen Dank im voraus.

von Josef G. (bome) Benutzerseite


Lesenswert?

1
signal a,b,c,d,e,f : std_logic;
2
signal ADDITION    : std_logic_vector(3 downto 0);
3
4
ADDITION <= std_logic_vector(unsigned("000" & a) + unsigned("000" & b)
5
                           + unsigned("000" & c) + unsigned("000" & d)
6
                           + unsigned("000" & e) + unsigned("000" & f));

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


Lesenswert?

Josef G. schrieb im Beitrag #4140687:
> Der Moderator hat meinen Beitrag so verfälscht,
> dass er mit meinem Text nichts mehr zu tun hat.
Entschuldigung, da ging was schief, mal sehen, ob ich das wieder 
hinbekomme... Hat geklappt...

LilaLauneBart schrieb:
> Es kommt folgender Fehler:
> The expression can not be converted to type unsigned.
Die Ursache: ein einzelnes std_logic-Bit kann nicht in einen 
unsigned-Vektor konvertiert werden. Wenn, dann müsstest du einem 
std_logic_vector(0 downto 0) den Wert des Bits zuweisen, danach könntest 
du diesen "1-Bit-Vector" in einen unsigned casten...

Josef G. schrieb:
> signal ADDITION    : std_logic_vector(3 downto 0);
>
> ADDITION <= std_logic_vector(unsigned(...
Ich würde hier vorschlagen, NICHT mit std_logic(_vector) zu rechnen, man 
castet sich ja zu Tode. Zudem sind hier eigentlich 3 Bits ausreichend...

Mein Vorschlag also:
1
signal a,b,c,d,e,f : std_logic;
2
signal ADDITION    : unsigned(2 downto 0);
3
4
ADDITION <= unsigned("00" & a) + unsigned("00" & b) + unsigned("00" & c)
5
          + unsigned("00" & d) + unsigned("00" & e) + unsigned("00" & f));

von Duke Scarring (Gast)


Lesenswert?

Ich werfe mal ein resize in die Runde:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;
4
5
entity add_bits is
6
end entity add_bits;
7
8
architecture rtl of add_bits is
9
10
    signal a : std_logic := '0';
11
    signal b : std_logic := '1';
12
    signal c : std_logic := '0';
13
    signal d : std_logic := '0';
14
    signal e : std_logic := '0';
15
    signal f : std_logic := '1';
16
    signal ADDITION : unsigned(3 downto 0) := (others => '0');
17
18
begin
19
20
    ADDITION <= resize( "0" & a, ADDITION'length) + b + c + d + e + f;
21
22
end architecture rtl;
Man muß nur dafür sorgen, das in ADDITION genügend Platz für's Ergebnis 
ist.

Duke

von FPGA-Pongo (Gast)


Lesenswert?

Duke Scarring schrieb:
> Man muß nur dafür sorgen, das in ADDITION genügend Platz für's Ergebnis
> ist.

Was wohl mehr, als der Fall ist, weil die 5 Bitleit zusammen maximal 5 
ergeben, was nach dem Riesigen Adam nur 3 Bit füllen kann und nicht 4.

von Duke Scarring (Gast)


Lesenswert?

FPGA-Pongo schrieb im Beitrag #4146475:
> was nach dem Riesigen Adam nur 3 Bit füllen kann und nicht 4
In der Tat.

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.