Double dabble - Double dabble

Ve vědě o počítačích je dvojitý Dabble algoritmus se používá pro převod binárních čísel na BCD (BCD) notace. Je také známý jako algoritmus shift-and-add -3 a lze jej implementovat pomocí malého počtu bran v počítačovém hardwaru, ale na úkor vysoké latence .

Algoritmus

Algoritmus funguje následovně:

Předpokládejme, že původní počet má být převedena je uložena v registru , který je n  bitů široká. Vyhraďte si dostatečně široký stírací prostor, který udrží původní číslo i jeho BCD zastoupení; n + 4 × ceil ( n / 3) bitů bude stačit. Uložení každé desítkové číslice trvá binárně maximálně 4 bity.

Poté rozdělte stírací prostor na BCD číslice (vlevo) a původní registr (vpravo). Například pokud je původní číslo, které má být převedeno, široké osm bitů, stírací prostor by byl rozdělen takto:

100s Tens Ones   Original
0010 0100 0011   11110011

Výše uvedený diagram ukazuje binární reprezentaci 243 10 v původním registru a BCD reprezentaci 243 vlevo.

Zápisný prostor je inicializován na všechny nuly a poté je hodnota, která má být převedena, zkopírována do prostoru „původního registru“ vpravo.

0000 0000 0000   11110011

Algoritmus pak iteruje nkrát . Při každé iteraci se jakákoli číslice BCD, která je alespoň 5 (0101 v binární podobě), zvýší o 3 (0011); pak je celý stírací prostor posunut o jeden bit doleva. Přírůstek zajišťuje, že hodnota 5, inkrementovaná a posunutá doleva, se stane 16 (10 000), čímž se správně „přenese“ na další číslici BCD.

Algoritmus v podstatě funguje tak, že zdvojnásobuje hodnotu BCD na levé straně každé iterace a přidává buď jednu, nebo nulu podle původního bitového vzoru. Řazení doleva splňuje oba úkoly současně. Pokud je některá číslice pět nebo vyšší, přidají se tři, aby se zajistilo, že hodnota „nese“ v základně 10.

Algoritmus double-dabble, provedený na hodnotě 243 10 , vypadá takto:

0000 0000 0000   11110011   Initialization
0000 0000 0001   11100110   Shift
0000 0000 0011   11001100   Shift
0000 0000 0111   10011000   Shift
0000 0000 1010   10011000   Add 3 to ONES, since it was 7
0000 0001 0101   00110000   Shift
0000 0001 1000   00110000   Add 3 to ONES, since it was 5
0000 0011 0000   01100000   Shift
0000 0110 0000   11000000   Shift
0000 1001 0000   11000000   Add 3 to TENS, since it was 6
0001 0010 0001   10000000   Shift
0010 0100 0011   00000000   Shift
   2    4    3
       BCD

Nyní bylo provedeno osm směn, takže algoritmus končí. Číslice BCD nalevo od prostoru „původního registru“ zobrazují BCD kódování původní hodnoty 243.

Další příklad algoritmu double dabble - hodnota 65244 10 .

 104  103  102   101  100    Original binary
0000 0000 0000 0000 0000   1111111011011100   Initialization
0000 0000 0000 0000 0001   1111110110111000   Shift left (1st)
0000 0000 0000 0000 0011   1111101101110000   Shift left (2nd)
0000 0000 0000 0000 0111   1111011011100000   Shift left (3rd)
0000 0000 0000 0000 1010   1111011011100000   Add 3 to 100, since it was 7
0000 0000 0000 0001 0101   1110110111000000   Shift left (4th)
0000 0000 0000 0001 1000   1110110111000000   Add 3 to 100, since it was 5
0000 0000 0000 0011 0001   1101101110000000   Shift left (5th)
0000 0000 0000 0110 0011   1011011100000000   Shift left (6th)
0000 0000 0000 1001 0011   1011011100000000   Add 3 to 101, since it was 6
0000 0000 0001 0010 0111   0110111000000000   Shift left (7th)
0000 0000 0001 0010 1010   0110111000000000   Add 3 to 100, since it was 7
0000 0000 0010 0101 0100   1101110000000000   Shift left (8th)
0000 0000 0010 1000 0100   1101110000000000   Add 3 to 101, since it was 5
0000 0000 0101 0000 1001   1011100000000000   Shift left (9th)
0000 0000 1000 0000 1001   1011100000000000   Add 3 to 102, since it was 5
0000 0000 1000 0000 1100   1011100000000000   Add 3 to 100, since it was 9
0000 0001 0000 0001 1001   0111000000000000   Shift left (10th)
0000 0001 0000 0001 1100   0111000000000000   Add 3 to 100, since it was 9
0000 0010 0000 0011 1000   1110000000000000   Shift left (11th)
0000 0010 0000 0011 1011   1110000000000000   Add 3 to 100, since it was 8
0000 0100 0000 0111 0111   1100000000000000   Shift left (12th)
0000 0100 0000 1010 0111   1100000000000000   Add 3 to 101, since it was 7
0000 0100 0000 1010 1010   1100000000000000   Add 3 to 100, since it was 7
0000 1000 0001 0101 0101   1000000000000000   Shift left (13th)
0000 1011 0001 0101 0101   1000000000000000   Add 3 to 103, since it was 8
0000 1011 0001 1000 0101   1000000000000000   Add 3 to 101, since it was 5
0000 1011 0001 1000 1000   1000000000000000   Add 3 to 100, since it was 5
0001 0110 0011 0001 0001   0000000000000000   Shift left (14th)
0001 1001 0011 0001 0001   0000000000000000   Add 3 to 103, since it was 6
0011 0010 0110 0010 0010   0000000000000000   Shift left (15th)
0011 0010 1001 0010 0010   0000000000000000   Add 3 to 102, since it was 6
0110 0101 0010 0100 0100   0000000000000000   Shift left (16th)
   6    5    2    4    4
            BCD

Bylo provedeno šestnáct směn, takže algoritmus končí. Desetinná hodnota číslic BCD je: 6 * 10 4 + 5 * 10 3 + 2 * 10 2 + 4 * 10 1 + 4 * 10 0 = 65244.

Parametrická implementace Verilogu převaděče binárních dvojitých signálů na BCD

// parametric Verilog implementation of the double dabble binary to BCD converter
// for the complete project, see
// https://github.com/AmeerAbdelhadi/Binary-to-BCD-Converter

module bin2bcd
 #( parameter                W = 18)  // input width
  ( input      [W-1      :0] bin   ,  // binary
    output reg [W+(W-4)/3:0] bcd   ); // bcd {...,thousands,hundreds,tens,ones}

  integer i,j;

  always @(bin) begin
    for(i = 0; i <= W+(W-4)/3; i = i+1) bcd[i] = 0;     // initialize with zeros
    bcd[W-1:0] = bin;                                   // initialize with input vector
    for(i = 0; i <= W-4; i = i+1)                       // iterate on structure depth
      for(j = 0; j <= i/3; j = j+1)                     // iterate on structure width
        if (bcd[W-i+4*j -: 4] > 4)                      // if > 4
          bcd[W-i+4*j -: 4] = bcd[W-i+4*j -: 4] + 4'd3; // add 3
  end

endmodule
Parametrická implementace Verilogu dvojitého binárního binárního převodu na BCD, 18bitový příklad.
Parametrická implementace Verilogu převaděče binárních dvojitých signálů na BCD, příklad 18 bitů.


Reverzní dvojité fušování

Algoritmus je plně reverzibilní. Použitím algoritmu reverzního dvojitého dablování lze číslo BCD převést na binární. Obrácení algoritmu se provádí obrácením základních kroků algoritmu:

Základní kroky algoritmů
Double dabble
(binární na BCD)
Reverzní dvojitý dabble
(BCD na binární)
Pro každou skupinu vstupu čtyři bity:
   Pokud skupina> = 5, přidejte 3 do skupiny
Levý posun do výstupních číslic
Posun doprava do výstupního binárního
souboru Pro každou skupinu čtyř vstupních bitů:
   Pokud skupina> = 8 odečtěte 3 od skupiny

Příklad obráceného dvojitého fušování

Algoritmus reverzního dvojitého dablování, provedený na třech číslech BCD 2-4-3, vypadá takto:

    BCD Input      Binary 
                   Output
   2    4    3
 0010 0100 0011   00000000   Initialization
 0001 0010 0001   10000000   Shifted right
 0000 1001 0000   11000000   Shifted right
 0000 0110 0000   11000000   Subtracted 3 from 2nd group, because it was 9
 0000 0011 0000   01100000   Shifted right
 0000 0001 1000   00110000   Shifted right
 0000 0001 0101   00110000   Subtracted 3 from 3rd group, because it was 8
 0000 0000 1010   10011000   Shifted right
 0000 0000 0111   10011000   Subtracted 3 from 3rd group, because it was 10
 0000 0000 0011   11001100   Shifted right
 0000 0000 0001   11100110   Shifted right
 0000 0000 0000   11110011   Shifted right
==========================
                       24310

Historický

V šedesátých letech se termín double dabble používal také pro jiný mentální algoritmus, který programátoři používali k převodu binárního čísla na desítkové. Provádí se čtením binárního čísla zleva doprava, zdvojnásobením, pokud je další bit nula, a zdvojnásobením a přidáním jednoho, pokud je další bit jedna. Ve výše uvedeném příkladu 11110011 by myšlenkový proces byl: „jedna, tři, sedm, patnáct, třicet, šedesát, sto dvacet jedna, dvě stě čtyřicet tři“, stejný výsledek jako výše.

Viz také

Reference

Další čtení