Forum: FPGA, VHDL & Co. Verstädnisproblem bezüglich des Carry Bits


von Hans Peter (Gast)


Lesenswert?

Liebe mikrocontroller Forenbesucher :)

Ich bin gerade dabei, aus einem Buch die Sprache VHDL zu erlernen. 
Eigentlich lief es bis jetzt ziemlich gut nur bin ich gerade auf ein 
Problem gestoßen, wo mein Wissen hinsichtlich der Digitaltechnik 
(glaube ich zumindest) nicht mehr ausreicht.

Ich bin in dem Buch auf ein Quellcode einer skalierbaren 
Addier/Subtrahier Einheit gestoßen, wo ich leider nicht alles ganz 
verstanden habe. Wie im Betreff schon beschrieben, haut es mich beim 
Carry Bit um. Ich weiß, dass das Carry Bit der Übertrag ist aber in 
diesem Kontext ist es mir ein Rätsel, wie man in manchen 
case-abschnitten diese auf '1' setzt.

Der Quellcode ist:
1
use IEEE.std_logic_1164.all;
2
use IEEE.std_logic_arith.all;
3
entity V_AD_SUB_2 is 
4
generic (WB : positive := 3);     
5
     port( A_IN ,B_IN : in bit_vector(WB - 1 downto 0); 
6
           OP, CIN : in bit ;   
7
           SUM : out bit_vector(WB - 1 downto 0); 
8
           OV, C_B : out bit); 
9
end V_AD_SUB_2; 
10
architecture VECTOR_ADD of V_AD_SUB_2 is
11
Signal CIN: bit_vector(0 downto 0);
12
begin 
13
CIN(0) <= C_IN;
14
ADD_SUB:   process(OP, CIN, A_IN, B_IN) 
15
           variable ZW, VI, V2, V3 : signed(WB - 1 downto 0);
16
           variable TEMP           : signed( 2 downto 0);
17
           variable NULL_V         : signed(WB - 2 downto 0)
18
           begin 
19
              NULL_V := (others => '0');
20
              VI := signed(To_StdLogicVector(A_IN(WB - 1 downto 0)));
21
              V2 := signed(To_StdLogicVector(B_IN(WB - 1 downto 0)));
22
              V3 := NULL_V & signed(To_StdLogicVector(CIN));
23
              if OP = '1' then  
24
                  ZW := VI + V2 + V3; 
25
                  TEMP := (ZW(WB - 1) , V2 (WB - 1) , VI(WB 1) ) ; 
26
                  case TEMP is
27
                      when "001" => C_Β <= '1'; OV <= '0'; 
28
                      when "010" => C_Β <= '1'; OV <= '0';
29
                      when "011" => C_Β <= '0'; OV <= '1';
30
                      when "100" => C_Β <= '1'; OV <= '1'; 
31
                      when "1ll" => C_Β <= '1'; OV <= '0';
32
                      when others => C_Β <= '0'; OV <= '0'; 
33
                end case;
34
          else ZW : = VI - V2 - V3; 
35
               TEMP := (ZW(WB - 1) , V2 (WB - 1),VI(WB - 1) ) ; 
36
               case TEMP is 
37
                      when "001" => C_Β <= '1'; OV <= '1';
38
                      when "010" => C_B <= '1'; OV <= '0';
39
                      when "100" => C_B <= '1'; OV <= '0';
40
                      when "110" => C_B <= '0'; OV <= '1';
41
                      when "111" => C_B <= '1'; OV <= '0';
42
                      when others => C_B <= '0'; OV <= '0';
43
              end case;
44
          end if; 
45
          SUM <= To_bitvector(std_logic_vector(ZW(WB - 1 downto 0)));
46
     end process ADD_SUB; 
47
end VECTOR_ADD;


Das setzen des Overflow Bits verstehe ich nur beim Carry Bit, sowohl bei 
der Addition als auch bei der Subtraktion ist mir ein Rätsel und ich 
hoffe ihr könnt mir da weiter helfen.

Lg

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


Lesenswert?

Hans Peter schrieb:
> Ich weiß, dass das Carry Bit der Übertrag ist aber in diesem Kontext
> ist es mir ein Rätsel, wie man in manchen case-abschnitten diese auf '1'
> setzt.
Ja nun, abhängig von den führenden Bits der Eingangswerte und der 
Rechenoperation, die in der Zeile
TEMP := (ZW(WB-1), V2(WB-1), VI(WB-1));
zu einem 3-Bit-Wort zusammengefasst werden, ergibt sich eben ein 
entsprechender Wert für das Carry-Bit.

> Das setzen des Overflow Bits verstehe ich nur beim Carry Bit, sowohl bei
> der Addition als auch bei der Subtraktion ist mir ein Rätsel
Ich erkenne die worte, allein der Sinn bleibt mir verschlossen... ;-)

> ich hoffe ihr könnt mir da weiter helfen.
Und was war jetzt nochmal die Frage? Wo klemmt es denn genau? Hast du 
Probleme bei bestimmten Syntaxelementen, oder verstehst du nicht, wann 
und warum bei einer Addition ein Carry auftritt und wie man das erkennt?

von Hans Peter (Gast)


Lesenswert?

Lothar M. schrieb:
> Und was war jetzt nochmal die Frage? Wo klemmt es denn genau? Hast du
> Probleme bei bestimmten Syntaxelementen, oder verstehst du nicht, wann
> und warum bei einer Addition ein Carry auftritt und wie man das erkennt?

Ja genau, ich verstehe nicht warum das Carry Flag gesetzt wird.

Bei Overflow weiß ich, dass (zum Beispiel) wenn bei der Addition von 
zwei positiven Zahlen ein negatives Ergebnis rauskommt, es zu einem 
Overflow gekommen ist, wie hier :
1
when "100" => C_B <= '1'; OV <= '1';

Ehrlich gesagt, hätte ich mir gedacht, dass ich beim Verstehen des 
Overflows Schwierigkeiten bekommen würde, aber jetzt ist es genau 
umgekehrt :)

Ich gehe immer von der Überlegung aus, dass wenn ich z.B die Bits 1 + 1 
zusammenaddiere, das Ergebnis 0 ist und dass das Carry Flag auf 1 
gesetzt wird, aber in diesem Beispiel kann ich das irgendwie nicht 
anwenden.

von Duke Scarring (Gast)


Lesenswert?

Hans Peter schrieb:
> Ich gehe immer von der Überlegung aus, dass wenn ich z.B die Bits 1 + 1
> zusammenaddiere, das Ergebnis 0 ist und dass das Carry Flag auf 1
> gesetzt wird, aber in diesem Beispiel kann ich das irgendwie nicht
> anwenden.
Das mit den zwei Bits klappt ja nur bei der kleinsten Stelle (quasi ganz 
rechts, Halbadder). Bei allen anderen Stellen muß auch das vorhergehende 
Carry-Bit berücksichtigt werden. Dort gibt es eine Drei-Bit-Addition 
(Volladder).

Duke

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


Lesenswert?

Hans Peter schrieb:
> Ja genau, ich verstehe nicht warum das Carry Flag gesetzt wird.
Letztlich ist das augenscheinlich ein Rechenwerk für signed Werte. Und 
anhand des Kriteriums "sind die Eingangswerte und das Ergebnis positiv 
oder negativ" werden die beiden Flags gesetzt:
http://teaching.idallen.com/dat2343/10f/notes/040_overflow.txt

Zur Beruhigung: so ein hirnrissig kompliziertes Gebilde macht im realen 
Leben niemand. Und vor Allem: du hast da kein Problem mit VHDL, sondern 
mit der Umsetzung der Logiktabelle. Mach weiter beim nächsten 
Beispiel... ;-)

BTW: ein richtiger Schwachpunkt im Buch "VHDL-Synthese" ist übrigens die 
Verwendung von bit_vector. Das macht im realen Leben niemand.

von Hans Peter (Gast)


Lesenswert?

Ok super jetzt bin ich beruhigt und vielen Dank nochmals für die Hilfe 
:)

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.