Addition mit Carry

Gast #4527657
Lesenswert?
• ▲
▼
Hallo Forum!

Gesucht wird eine schnelle Addition, die einen eventuellen Überlauf 
gleich mit addiert.
Hintergrund ist die Berechung von UDP-Checksummen.
Bisher verwende ich zwei Additionen:
1
function udp_checksum( valuea : unsigned( 15 downto 0); 
2
                       valueb : unsigned( 15 downto 0)) return unsigned is
3
    variable addcarry: unsigned( 16 downto 0);
4
    variable result:   unsigned( 15 downto 0);
5
begin
6
    addcarry := resize( valuea, addcarry'length) + valueb;
7
    result   := addcarry( 16 downto 16)          + addcarry( 15 downto 0);
8
    return result;
9
end function udp_checksum;
Geht das auch eleganter, sprich ohne zwei Additionen hintereinander?
Wie wurde das z.B. beim Z80 gelöst? Da gibt es auch einen ADC (add with 
carry) Befehl?

Duke
Gast #4527797
Lesenswert?
• ▲
▼
CarryIn und CarryOut für A+B:

Sei A,B : std_logic_vector(n-1 downto 0)

Damit:
A2 <= '0' & A & CarryIn
B2 <= '0' & B & '0'
C2 <= A2 + B2

CarryOut <= C2(n+1)     (oder n?)

(kostet kaum mehr Zeit als eine "normale" Addition)
Gast #4527874
Lesenswert?
• ▲
▼
Für diese Art der Prüfsummenbildung würde ich einen Carry-Select-Adder 
empfehlen.

Das würde dann in etwa so aussehen:
1
function udp_checksum( valuea : unsigned( 15 downto 0); 
2
                       valueb : unsigned( 15 downto 0)) return unsigned is
3
    variable addAB: unsigned( 16 downto 0);
4
    variable addAB1: unsigned( 15 downto 0);
5
    variable result:   unsigned( 15 downto 0);
6
begin
7
    addAB := resize( valuea, addAB'length) + valueb;
8
    addAB1 := valuea + valueb + 1;
9
    if addAB(addAB'left)='0' then
10
      result   := addAB( 15 downto 0);
11
    else
12
      result   := addAB1( 15 downto 0);
13
    end if;
14
    return result;
15
end function udp_checksum;

Damit werden die Additionen nicht mehr Kaskadiert und du solltest die 
maximal mögliche Frequenz erzielen.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.