Processing math: 100%

Error Codes

concept
In real world systems mistakes happen, logic highs and lows can sometimes be corrupted and show as the wrong value. In fact, it happens pretty regularly, especially when transmitting data wirelessly. An error code is an extra bit of data stuck onto the end of the data you want to send that lets the receiver know whether it was sent correctly. The error code won't prevent error but if one occurs it lets the receiver know and the receiver can tell the transmitter to send that piece again. Without error codes and error checking almost every website you visited would have bizarre garbage scattered throughout it as errors in the transmitting sent data that didn't make sense to your browser.
The simplest type of error checking is the parity bit. A parity bit will let the receiver know if an odd number of the bits in the transmitted data have been corrupted. That just one bit gets corrupted is quite common so this kind of error checking is more convenient than it might seem. Additionally parity checking is very fast and doesn't require sending much extra data, so it's a popular error checking method.
fact
A parity bit is an extra bit at the end of a piece of transmitted data which tells the receiver whether the number of "1"s in the data is even or odd.
fact
An even parity system sets the parity bit to "0" when the number of "1"s in the data is even. An odd parity system sets the parity bit to "0" when the number of "1"s in the data is odd.
fact
The total number of "1"s (including the parity bit) is always even for even parity systems and always odd for odd parity system.
fact
The parity bit is added either at the beginning of the data or at the end, both the receiver and transmitter must know beforehand which it will be.
example

Determine the parity bit for the data 0110 in an even parity system.

In an even parity system the total number of 1s is even, our data already has two 1s so our parity bit will be 0. 01100with parity bit at the end
So say our transmitter is an even parity system and wants to send the 0110 data like in the above example, it generates the parity bit 0 and sticks it on the end to send 01100 to the receiver. Along the way the first bit gets corrupted and becomes a 1 so our receiver actually gets 11100 at its end. Now it counts all the 1s and realises something terrible. Odd number of 1s in even parity system11100 It's an even parity system but it received an odd number of 1s, so somewhere along the way there must have been an error. So our receiver tells our transmitter than the last lot of data didn't transmit properly so the transmitter can try again.
fact
A parity bit can't tell the receiver which bit is corrupted when there's an error, only that there was a corruption
Now what if two bits get flipped during transmission? Say our transmitter is again trying to transmit 0110 and it sticks on the even parity bit 0 and transmits 01100 Along the way the first two bits get corrupted and the receiver actually receives: 10100 Now the receiver checks the parity and sees everything as fine, even though the data has been corrupted the receiver thinks everything worked! Luckily as long as we keep our data segments short the parity bit checker is quite good as having only one bit flip is the most common error (unless you're trying to send dozens, or hundreds, of bits per parity bit).
Parity bits are nice but for some situations we need something that's able to detect errors in 2, 4, 6, 8 bits etc. One very popular method for this is Cyclic Redundancy Check (CRC). CRC is a more complex method but once you get it you'll have no troubles.
fact
CRC is able to detect more errors than parity bits.
fact
In CRC a code is generated (just like a parity bit, but multiple bits) and appended to the end of the data to be sent.
fact
Part of the CRC process requires modulo-2 division. This is just like usual long division but the subtraction steps are replaced by the XOR (you'll learn this later) operation on each column. If two bits are the same the result is 0 if they're different the result is 1.
This modulo-2 division process is simple but sounds complicated when you try to read the instructions so instead we're going to do an example to cover the steps. To calculate a CRC code we don't need the quotient of the division, just the remainder, so we won't be writing anything above the division line, this also makes the steps a little simpler to explain.
example

Compute the remainder of the modulo-2 division of 100111110

First we'll write this up like a regular binary long division problem. 1110 ¯)10011 Now the leftmost bit of our dividend is 1 so we write our divisor beneathe it and do our XOR operation on the columns of bits: 1110 ¯)10011         1110         ¯0111 You can see that whenever the bits were different we wrote a "1" and whenever they were the same we wrote a "0". Now for the next step you can see that our XOR operation result has a single "0" out the front, that means we bring down a single number from the dividend. If there had been two leading "0"s we'd have brought down two new numbers and so on. So we bring down the next number and repeat our process: 1110 ¯)10011           1110|           ¯01111             1110             ¯0001 Now we're out of digits in the dividend so our remainder is 1.
fact
To generated a CRC code:
  1. Sender and receiver agree on a fixed generator code
  2. Append a number of 0s to the data equal to the number of bits in the generator code 1
  3. Divide this new data by the generator code using modulo-2 division
  4. Add the remainder of the division to the 0-padded data
  5. Send your new data code
example

Find the data transmitted by a CRC system with data 10011 and generator 1110

This question is asking us to find what a CRC system will send if the data it's given is 10011 and it uses a generator 1110 to find the CRC code. So we'll follow the above steps. First we padd the data bits with three 0s. We use three because our generator is four bits long. So our new data string is: 10011000 Now we need to find the remainder when we use modulo-2 division of 100110001110 (that's our padded data over our generator). The division starts out the same as before so we'll skip right to that point: 1110 ¯)10011000           1110|           ¯01111             1110             ¯0001 Now our XOR operation gave us a result with THREE leading 0s so we bring down the next THREE digits from the dividend. 1110 ¯)10011000           1110||||           ¯01111|||             1110|||             ¯0001000 Now we write down our divisor and do our XOR operation again: 1110 ¯)10011000           1110||||           ¯01111|||             1110|||             ¯0001000                   1110                   ¯0110 So we're out of digits in the dividend and our remainder is 0110. Our final step is to add this remainder to our padded data: 10011000+0110=10011110 And we send that off to our receiver.
When the receiver gets the data they'll divide it by the generator and if the remainder is 0 they know it probably isn't corrupted. If the remainder ISN'T 0 then the receiver knows the data definitely was corrupted and they request that data from the transmitter again.
practice problems