2. Kody numeryczne i arytmetyka cyfrowa

2.12. Kody BCD

Ogólnie rzecz biorąc, kod BCD (od ang. Binary Coded Decimal czyli cyfra dziesiętna zakodowana binarnie) to każde odwzorowanie k: {0,1,...9}→{01}n. Zbiór obiektów kodowanych jest więc zbiorem V1 = {0,1,...9} cyfr dziesiętnych. Kod BCD można traktować jako kod alfanumeryczny lub kod liczbowy. Kody BCD nazywa się również w literaturze polskiej kodami dwójkowo-dziesiętnymi.

Ponieważ zależy nam na tym, żeby kod był możliwie krótki, kody BCD są z reguły funkcjami k: {0,1,...9}→{01}n.. Oczywiście nie możemy przyjąć tu krótszych słów kodowych niż 4 bitowe (bo funkcja k nie będzie różnowartościowa) tak więc n ≥ 4.

Wszystkich możliwych kodów 4 bitowych BCD jest bardzo dużo bo tyle ile 10 elementowych wariacji bez powtórzeń ze zbioru 16 elementowego czyli

\frac{16!}{(16-10)!} = \frac{16!}{6!}

a różnych kodów BCD n bitowych dla ≥ 4 mamy tyle ile 10 elementowych wariacji bez powtórzeń ze zbioru 2n elementowego czyli 

\frac{2^n!}{(2^n - 10)!}

Kodów BCD używanych w praktyce jest jednak zaledwie kilka

  • kod BCD 8421 – kod naturalny, najbardziej popularny kod BCD.
  • kod BCD 2421 tzw. kod Aikena (kod 4 bitowy)
  • kod z nadmiarem 3 tzw. kod excess 3 (kod 4 bitowy)
  • kod 2 z 5 (kod 5 bitowy)
  • kod 1 z 10 (kod 10 bitowy)
  • kod Graya z nadmiarem 3 (kod 4 bitowy)
  • kod wskaźników cyfrowych 7 –mio segmentowych (kod 7 bitowy)

Kod BCD 8421 jest następujący

0 → 0000
1 → 0001
2 → 0010
3 → 0011
4 → 0100
5 → 0101
6 → 0110
7 → 0111
8 → 1000
9 → 1001

Czterobitowy kod BCD w naturalny sposób umożliwia zapisanie 2 słów kodowych BCD na jednym bajcie. Taką sytuację nazywamy spakowanym kodem BCD. Czasem jednak wygodnie jest w jednym bajcie mieć tylko jedno słowo kodowe BCD na mniej znaczących bitach. Taką sytuację nazywamy nie spakowanym kodem BCD. Kod BCD 8421 w postaci nie spakowanej ma tę zaletę, że słowa kodowe dają się łatwo i w naturalny sposób zastąpić odpowiednimi słowami kodowymi kodu alfanumerycznego ASCII.

Zapiszmy w postaci spakowanej w jednym bajcie w kodzie BCD 8421 liczbę 45. Odszukujemy w tabelce definiującej kod BCD 8421 słowa kodowe odpowiadające liczbie 4 i liczbie 5, zestawiamy te słowa razem i dostajemy: 01000101 

Korekcja wyniku dodawania 2 cyfr zapisanych w kodzie BCD 8421. Sumator mikroprocesora z reguły nie ma specjalnego sumatora sumującego w kodzie BCD i używa do sumowania zwykłego sumatora sumującego w kodzie NKB. Dlatego też wynik dodawania 2 cyfr (zwykłego dodawania 4 bitowych słów binarnych) nie musi być wynikiem prawidłowym. Jeśli uzyskany wynik jest mniejszy równy 9 (w kodzie NKB) wynik jest prawidłowy. Jeśli jest większy od 9 lub pojawiło się przeniesienie na pozycję 4-tą (przy numeracji bitów od 0). wynik należy skorygować. Korekcja polega na dodaniu do 4 bitowego wyniku liczby 6.

Kody BCD używane są z reguły połączeniu z innymi kodami numerycznymi np. BCD i naturalny kod dziesiętny. Algorytm dodawania tak zapisanych liczb dziesiętnych kodowanych kodem BCD 8421 polega na kolejnym dodawaniu tetrad (tetrada to słowo 4 bitowe) z ewentualną korekcją wyniku.

W systemach mikroprocesorowych korekcję wyniku przy operacjach w kodzie BCD 8421 realizuje specjalny rozkaz zwykle o mnemonice (czyli symbolicznym oznaczeniu rozkazu) DAA (Decimal Addition Adjust).

W kodzie BCD 8421 korekcja może być „łańcuchowa” w tym sensie, że korekcja na najmniej znaczącej tetradzie może powodować korekcję w następnej, i tak dalej. Ale o potrzebie korekcji na danej pozycji dowiemy się po skorygowaniu poprzedniej. Czas ustalania poprawnej wartości wyniku, przy dodawaniu z użyciem tego kodu, może być więc długi.

Kod BCD excess 3. Kod excess 3 uzyskujemy dodając arytmetycznie 3 (czyli 0011) do słów kodu BCD 8421. Kod BCD excess 3 jest następujący

0 → 0011
1 → 0100
2 → 0101
3 → 0110
4 → 0111
5 → 1000
6 → 1001
7 → 1010
8 → 1011
9 → 1100

Algorytm korekcji wyniku dodawania dla kodu excess 3 jest następujący

  • Jeśli nie pojawiło się przeniesienie z danej pozycji, to odejmij 3 od wyniku.
  • Jeśli pojawiło się przeniesienie z danej pozycji, to dodaj 3 do wyniku.

Algorytm korekcji jest więc sterowany jest przeniesieniem, jest to proste i wygodne, (tzn. potrzeba korekcji sygnalizowana jest przez przeniesienie). Korekcja przeprowadzana jest „jakby na boku”. Maksymalne opóźnienie tego algorytmu może być znacznie mniejsze niż w przypadku algorytmu dla kodu BCD 8421. Uzasadnienie opisanego algorytmu korekcji pozostawiamy Czytelnikowi.

Kod BCD excess 3 to tzw. kod samouzupełniający się. Jest to bardzo użyteczna własność polegająca na tym, że negacja bitów słowa kodowego daje uzupełnienie do 9.

Kod 2 z 5 . Kod 2 z 5 (należy do grupy kodów BCD i kodów o stałej liczbie jedynek w słowie kodowym tzw. kodów m z n). Słowo kodowe dla kodu 2 z 5 ma długość 5. Zbiór obiektów kodowanych V1 = {0,1,...9} czyli jest taki jak w każdym kodzie BCD. Alfabet kodu V= {0,1} :

\left.\begin{array}{}{0 → 00011\\ 1 →00101\\ 2 → 01001\\ 3 → 10001} \end{array}\right\}  4 słowa z 1 na pozycji 5

\left.\begin{array}{}{4 → 00110\\ 5 →01010\\ 6 → 10010} \end{array}\right\}  3 słowa z 1 na pozycji 4 i 0 na pozycji 5

\left.\begin{array}{}{7 → 01100\\ 8 →10100} \end{array}\right\}  2 słowa z 1 na pozycji 3 i 0 na pozycji 5 i 4

\left.\begin{array}{}{9 → 11000} \end{array}\right\}  1 słowo z 1 na pozycji 2 i 0 na pozycji 5,4 i 3

Cechy charakterystyczne kodu 2 z 5:

  • długość podstawowego słowa kodowego jest zawsze równa 5
  • mamy w słowie kodowym stałą równą 2, liczbie jedynek,
  • kod 2 z 5 może być traktowany jako alfanumeryczny, jeśli 0,1,...,9 uważamy za symbole lub jako liczbowy, jeśli 0,1,...,9 uważamy za liczby;
  • jako kod numeryczny, kod 2 z 5 jest kodem niewagowym;
  • 16
  • kod 2 z 5 jest kodem redundancyjnym.

Kod 1 z 10. Dla takiego kodu mamy jak dla każdego kodu BCD V1 = {0,1,2,3,...,8,9}

0→1000000000
1→0100000000
2→0010000000
3→0001000000
4→0000100000
5→0000010000
6→0000001000
7→0000000100
8→0000000010
9→0000000001

Zasada tworzenia kolejnych słów kodowych jest przesuwająca się jedynka od lewej strony do prawej. Kod 1 z 10 jest oczywiście przykładem redundancyjnego kodu BCD.