Bity w elektronice
Generator bitu parzystości


Bramki logiczne
Cyfrowe układy scalone TTL i CMOS
Zasilanie układów TTL i CMOS
Zjawisko hazardu w sieciach logicznych
  Projekty
Bramka sterowana OR - AND - EXOR - NAND
Czytnik klawiatury numerycznej
Konwerter kodu 8421 na kod Gray'a
Konwerter kodu Gray'a na kod 8421
8-bitowy generator bitu parzystości
Konwerter kodu BCD na kod Aikena
Konwerter kodu Aikena na kod BCD
Sterowanie wyświetlaczem kostki do gry
Sterowanie wyświetlaczem cyfrowym LED
Konwerter kodu BCD na kod 1 z 10
Sterownik wskaźnika postępu z 10 diod LED
4-bitowy multiplekser
4-bitowy demultiplekser
1-bitowy sumator

Określenie funkcji logicznych

Bit parzystości umożliwia pewną ochronę transmisji danych przed błędami. Dokładnie opisaliśmy jego zastosowanie w rozdziale o kodach EDC. W tym projekcie naszym zadaniem jest stworzenie sieci logicznej, która generuje bit parzystości dla 8 bitów danych informacyjnych. Sieć będzie posiadała 8 wejść, na które podajemy kolejne bity informacyjne, oraz jedno wyjście, na którym pojawia się bit parzystości. Poniżej przedstawiamy schemat blokowy takiej sieci:

 

 

Stworzenie układu cyfrowego dodającego bit parzystości na pierwszy rzut oka wydaje się trudne. W rzeczywistości tak nie jest. Przypomnijmy sobie funkcję różnicy symetrycznej realizowaną przez bramkę EX-OR (układ TTL - SN7486, CMOS - CD4070) :

 

Bramka EX-OR

a b y
0 0 0
0 1 1
1 0 1
1 1 0

 

Na wyjściu otrzymujemy 1, jeśli na wejściu bramki jest nieparzysta liczba jedynek. Własność tą wykorzystamy w układzie generacji bitu parzystości. Nad każdą parą bitów w zbiorze wejściowym {b1,b2,b3,b4,b5,b6,b7,b8} wykonujemy operację różnicy symetrycznej:

 

w1 = b1 Å b2
w2 = b3 Å b4
w3 = b5 Å b6
w4 = b7 Å b8

 

W wyniku otrzymujemy nowy zbiór 4-elementowy:

 

{w1,w2,w3,w4}

 

Jeśli w zbiorze {b1,b2,b3,b4,b5,b6,b7,b8} była parzysta liczba jedynek, to w zbiorze {w1,w2,w3,w4} również musi ich być ilość parzysta. Ta sama własność jest również spełniona dla nieparzystości. Po prostu operacja różnicy symetrycznej zachowuje parzystość i nieparzystość. Uzasadnienie jest bardzo proste:

 

Parzystość:

Zakładamy, iż zbiór {b1,b2,b3,b4,b5,b6,b7,b8} zawiera parzystą liczbę jedynek. Jeśli w parze kolejnych bitów występują dwie jedynki lub dwa zera, to różnica symetryczna da nam w wyniku 0, które jest zawsze parzyste. Jeśli w jednej z par bity są różne, to dostaniemy w wyniku 1, lecz z uwagi na parzystość zbioru wejściowego, w innej parze również muszą być dwa różne bity. Zatem dostaniemy dwie jedynki, a to jest ilość parzysta. W wyniku zawsze dostaniemy parzystą ilość bitów 1. Innych możliwości nie ma.

 

Nieparzystość:

Zakładamy, iż zbiór {b1,b2,b3,b4,b5,b6,b7,b8} zawiera nieparzystą liczbę jedynek. Wynika z tego, iż ilość par kolejnych bitów, które różnią się od siebie jest liczbą nieparzystą. Każda taka para zostanie zamieniona przez różnicę symetryczną na 1. Zatem w zbiorze wynikowym ilość jedynek będzie nieparzysta. Innych możliwości nie ma.

 

Udowodniliśmy, iż zbiór wynikowy {w1,w2,w3,w4} zachowuje parzystość/nieparzystość zbioru wejściowego {b1,b2,b3,b4,b5,b6,b7,b8}, ale liczba bitów jest dwukrotnie mniejsza. Nad zbiorem wynikowym znów wykonujemy operację różnicy symetrycznej:

 

x1 = w1 Å w2
x2 = w3 Å w4

 

Otrzymujemy kolejny zbiór wynikowy {x1,x2}, który zachowuje parzystość/nieparzystość zbioru {w1,w2,w3,w4}, a zatem także parzystość/nieparzystość zbioru wejściowego {b1,b2,b3,b4,b5,b6,b7,b8}. Nad bitami x1 i x2 znów wykonujemy operację różnicy symetrycznej:

 

y = x1 Å x2

 

Wynik y jest równy 1, jeśli zbiór wejściowy zawierał nieparzystą ilość bitów 1, a 0, gdy liczba bitów 1 była parzysta. Zatem y jest poszukiwanym bitem parzystości. Aby otrzymać pełną funkcję zastąpmy kolejne symbole x i w wykonanymi operacjami:

 

y = x1 Å x2
y = (w1 Å w2) Å (w3 Å w4)
y
= {(b1 Å b2) Å (b3 Å b4)} Å {(b5 Å b6) Å (b7 Å b8)}

 

Testowy program w języku C++

Otrzymaliśmy poszukiwaną funkcję logiczną. Poniżej przedstawiamy program w C++, który wykorzystuje tę funkcję do generacji bitu parzystości.

 

// Generacja bitu parzystości
// (C)2006 mgr Jerzy Wałaszek
// I LO w Tarnowie

#include <iostream>

using namespace std;

int main()
{
  for(int i = 0; i < 256; i++)
  {
    int v = i;

// Generujemy bit parzystości

    v ^= v >> 1;
    v ^= v >> 2;
    v ^= v >> 4;

// Bit parzystości wstawiamy ponad bit b8 w słowie danych

    v = (i | (v << 8)) & 0x1ff;
    
// Wyświetlamy wynik

    for(int m = 0x100; m; m >>= 1) cout << ((v & m) ? 1 : 0);
    cout << " ";
  }
  cout << endl << endl;
  return 0;      
}
000000000 100000001 100000010 000000011 100000100 000000101 000000110 100000111
100001000 000001001 000001010 100001011 000001100 100001101 100001110 000001111
100010000 000010001 000010010 100010011 000010100 100010101 100010110 000010111
000011000 100011001 100011010 000011011 100011100 000011101 000011110 100011111
100100000 000100001 000100010 100100011 000100100 100100101 100100110 000100111
000101000 100101001 100101010 000101011 100101100 000101101 000101110 100101111
000110000 100110001 100110010 000110011 100110100 000110101 000110110 100110111
100111000 000111001 000111010 100111011 000111100 100111101 100111110 000111111
101000000 001000001 001000010 101000011 001000100 101000101 101000110 001000111
001001000 101001001 101001010 001001011 101001100 001001101 001001110 101001111
001010000 101010001 101010010 001010011 101010100 001010101 001010110 101010111
101011000 001011001 001011010 101011011 001011100 101011101 101011110 001011111
001100000 101100001 101100010 001100011 101100100 001100101 001100110 101100111
101101000 001101001 001101010 101101011 001101100 101101101 101101110 001101111
101110000 001110001 001110010 101110011 001110100 101110101 101110110 001110111
001111000 101111001 101111010 001111011 101111100 001111101 001111110 101111111
110000000 010000001 010000010 110000011 010000100 110000101 110000110 010000111
010001000 110001001 110001010 010001011 110001100 010001101 010001110 110001111
010010000 110010001 110010010 010010011 110010100 010010101 010010110 110010111
110011000 010011001 010011010 110011011 010011100 110011101 110011110 010011111
010100000 110100001 110100010 010100011 110100100 010100101 010100110 110100111
110101000 010101001 010101010 110101011 010101100 110101101 110101110 010101111
110110000 010110001 010110010 110110011 010110100 110110101 110110110 010110111
010111000 110111001 110111010 010111011 110111100 010111101 010111110 110111111
011000000 111000001 111000010 011000011 111000100 011000101 011000110 111000111
111001000 011001001 011001010 111001011 011001100 111001101 111001110 011001111
111010000 011010001 011010010 111010011 011010100 111010101 111010110 011010111
011011000 111011001 111011010 011011011 111011100 011011101 011011110 111011111
111100000 011100001 011100010 111100011 011100100 111100101 111100110 011100111
011101000 111101001 111101010 011101011 111101100 011101101 011101110 111101111
011110000 111110001 111110010 011110011 111110100 011110101 011110110 111110111
111111000 011111001 011111010 111111011 011111100 111111101 111111110 011111111

 

Na powyższym wydruku bit parzystości jest pierwszym bitem każdej wyświetlonej danej. Ponieważ program działa poprawnie, to wnioskujemy, iż nasza funkcja również jest poprawna.

 

Symulacja sieci logicznej

Zestawienie elementów

SN7486 x 2

 



List do administratora Serwisu Edukacyjnego Nauczycieli I LO

Twój email: (jeśli chcesz otrzymać odpowiedź)
Temat:
Uwaga: ← tutaj wpisz wyraz  ilo , inaczej list zostanie zignorowany

Poniżej wpisz swoje uwagi lub pytania dotyczące tego rozdziału (max. 2048 znaków).

Liczba znaków do wykorzystania: 2048

 

W związku z dużą liczbą listów do naszego serwisu edukacyjnego nie będziemy udzielać odpowiedzi na prośby rozwiązywania zadań, pisania programów zaliczeniowych, przesyłania materiałów czy też tłumaczenia zagadnień szeroko opisywanych w podręcznikach.



   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2017 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.