Hamming Code

General algorithm[edit]

The following general algorithm generates a single-error correcting (SEC) code for any number of bits.

  1. Number the bits starting from 1: bit 1, 2, 3, 4, 5, 6, 7, etc.
  2. Write the bit numbers in binary: 1, 10, 11, 100, 101, 110, 111, etc.
  3. All bit positions that are powers of two (have a single 1 bit in the binary form of their position) are parity bits: 1, 2, 4, 8, etc. (1, 10, 100, 1000)
  4. All other bit positions, with two or more 1 bits in the binary form of their position, are data bits.
  5. Each data bit is included in a unique set of 2 or more parity bits, as determined by the binary form of its bit position.
    1. Parity bit 1 covers all bit positions which have the least significant bit set: bit 1 (the parity bit itself), 3, 5, 7, 9, etc.
    2. Parity bit 2 covers all bit positions which have the second least significant bit set: bit 2 (the parity bit itself), 3, 6, 7, 10, 11, etc.
    3. Parity bit 4 covers all bit positions which have the third least significant bit set: bits 4–7, 12–15, 20–23, etc.
    4. Parity bit 8 covers all bit positions which have the fourth least significant bit set: bits 8–15, 24–31, 40–47, etc.
    5. In general each parity bit covers all bits where the bitwise AND of the parity position and the bit position is non-zero.

The form of the parity is irrelevant. Even parity is mathematically simpler, but there is no difference in practice.

This general rule can be shown visually:

Bit position1234567891011121314151617181920
Encoded data bitsp1p2d1p4d2d3d4p8d5d6d7d8d9d10d11p16d12d13d14d15
Parity
bit
coverage
p1No No No No No No No No No No 
p2 NoNo  NoNo  NoNo  NoNo  NoNo 
p4   NoNoNoNo    NoNoNoNo    No
p8       NoNoNoNoNoNoNoNo     
p16               NoNoNoNoNo

VHDL demo

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

ENTITY HAMMING IS
	PORT ( ENTRADA : IN STD_LOGIC_VECTOR(8 DOWNTO 1);
			 SAIDA : OUT STD_LOGIC_VECTOR(8 DOWNTO 1) );
END HAMMING;

ARCHITECTURE ARCH OF HAMMING IS
SIGNAL VERIFICADOR : STD_LOGIC_VECTOR(4 DOWNTO 1);
SIGNAL TRANSMISSOR : STD_LOGIC_VECTOR(12 DOWNTO 1);

COMPONENT HAMMING_SENDER
	PORT (ENTRADA : IN STD_LOGIC_VECTOR(8 DOWNTO 1);
			SAIDA : OUT STD_LOGIC_VECTOR(12 DOWNTO 1) );
END COMPONENT;

COMPONENT HAMMING_VERIF
	PORT( ENTRADA : IN STD_LOGIC_VECTOR(12 DOWNTO 1);
			VERIFICADOR : OUT STD_LOGIC_VECTOR(4 DOWNTO 1));
END COMPONENT;

COMPONENT HAMMING_RED
	PORT (ENTRADA : IN STD_LOGIC_VECTOR(12 DOWNTO 1);
			VERIFICADOR : IN STD_LOGIC_VECTOR(4 DOWNTO 1);
			SAIDA : OUT STD_LOGIC_VECTOR(8 DOWNTO 1));
END COMPONENT;

BEGIN
	ENVIO: HAMMING_SENDER PORT MAP(ENTRADA => ENTRADA, SAIDA => TRANSMISSOR);
	VERIFICACAO: HAMMING_VERIF PORT MAP(ENTRADA => TRANSMISSOR, VERIFICADOR => VERIFICADOR);
	REDUCAO_E_CORRECAO: HAMMING_RED PORT MAP(ENTRADA => TRANSMISSOR, VERIFICADOR => VERIFICADOR, SAIDA => SAIDA);
END ARCH;

 

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

ENTITY HAMMING_SENDER IS
	PORT (ENTRADA : IN STD_LOGIC_VECTOR(8 DOWNTO 1);
			SAIDA : OUT STD_LOGIC_VECTOR(12 DOWNTO 1) );
END HAMMING_SENDER;

ARCHITECTURE SENDER OF HAMMING_SENDER IS
BEGIN	
	-- PRIMEIRAMENTE COLOCO OS BITS DA MENSAGEM NA POSIÇÃO CERTA
	SAIDA(3) <= ENTRADA(1);
	SAIDA(5) <= ENTRADA(2);
	SAIDA(6) <= ENTRADA(3);
	SAIDA(7) <= ENTRADA(4);
	SAIDA(9) <= ENTRADA(5);
	SAIDA(10) <= ENTRADA(6);
	SAIDA(11) <= ENTRADA(7);
	SAIDA(12) <= ENTRADA(8);
	
	-- AGORA CALCULO OS BITS DE PARIDADE
	SAIDA(1) <= ENTRADA(1) XOR ENTRADA(2) XOR ENTRADA(4) XOR ENTRADA(5) XOR ENTRADA(7);
	SAIDA(2) <= ENTRADA(1) XOR ENTRADA(3) XOR ENTRADA(4) XOR ENTRADA(6) XOR ENTRADA(7);
	SAIDA(4) <= ENTRADA(2) XOR ENTRADA(3) XOR ENTRADA(4) XOR ENTRADA(8);
	SAIDA(8) <= ENTRADA(5) XOR ENTRADA(6) XOR ENTRADA(7) XOR ENTRADA(8);

END SENDER;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

ENTITY HAMMING_VERIF IS
	PORT ( ENTRADA : IN STD_LOGIC_VECTOR(12 DOWNTO 1);
			 VERIFICADOR : OUT STD_LOGIC_VECTOR(4 DOWNTO 1) );
END HAMMING_VERIF;

ARCHITECTURE ARCH OF HAMMING_VERIF IS

BEGIN
	VERIFICADOR(1) <= ENTRADA(1) XOR ENTRADA(3) XOR ENTRADA(5) XOR ENTRADA(7) XOR ENTRADA(9) XOR ENTRADA(11);
	VERIFICADOR(2) <= ENTRADA(2) XOR ENTRADA(3) XOR ENTRADA(6) XOR ENTRADA(7) XOR ENTRADA(10) XOR ENTRADA(11);
	VERIFICADOR(3) <= ENTRADA(4) XOR ENTRADA(5) XOR ENTRADA(6) XOR ENTRADA(7) XOR ENTRADA(12);
	VERIFICADOR(4) <= ENTRADA(8) XOR ENTRADA(9) XOR ENTRADA(10) XOR ENTRADA(11) XOR ENTRADA(12);
END ARCH;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

ENTITY HAMMING_RED IS
	PORT (ENTRADA : IN STD_LOGIC_VECTOR(12 DOWNTO 1);
			VERIFICADOR : IN STD_LOGIC_VECTOR(4 DOWNTO 1);
			SAIDA : OUT STD_LOGIC_VECTOR(8 DOWNTO 1));
END HAMMING_RED;

ARCHITECTURE RED OF HAMMING_RED IS
BEGIN
	SAIDA(1) <= NOT ENTRADA(3) WHEN VERIFICADOR = "0011" ELSE ENTRADA(3);
	SAIDA(2) <= NOT ENTRADA(5) WHEN VERIFICADOR = "0101" ELSE ENTRADA(5);
	SAIDA(3) <= NOT ENTRADA(6) WHEN VERIFICADOR = "0110" ELSE ENTRADA(6);
	SAIDA(4) <= NOT ENTRADA(7) WHEN VERIFICADOR = "0111" ELSE ENTRADA(7);
	SAIDA(5) <= NOT ENTRADA(9) WHEN VERIFICADOR = "1001" ELSE ENTRADA(9);
	SAIDA(6) <= NOT ENTRADA(10) WHEN VERIFICADOR = "1010" ELSE ENTRADA(10);
	SAIDA(7) <= NOT ENTRADA(11) WHEN VERIFICADOR = "1011" ELSE ENTRADA(11);
	SAIDA(8) <= NOT ENTRADA(12) WHEN VERIFICADOR = "1100" ELSE ENTRADA(12);
END RED;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值