汉明纠错吗译码器.txt
上传用户:easylife05
上传日期:2013-03-21
资源大小:42k
文件大小:2k
源码类别:

VHDL/FPGA/Verilog

开发平台:

C/C++

  1. -- Hamming Decoder
  2. -- This Hamming decoder accepts an 8-bit Hamming code (produced by the encoder above) and performs single error correction and double error detection.
  3. -- download from: www.pld.com.cn & www.fpga.com.cn
  4. LIBRARY ieee;
  5. USE ieee.std_logic_1164.ALL;
  6.  
  7. ENTITY hamdec IS
  8.    PORT(hamin : IN BIT_VECTOR(0 TO 7);  --d0 d1 d2 d3 p0 p1 p2 p4 
  9.         dataout : OUT BIT_VECTOR(0 TO 3); --d0 d1 d2 d3
  10.         sec, ded, ne : OUT BIT);  --diagnostic outputs
  11. END hamdec;
  12. ARCHITECTURE ver1 OF hamdec IS
  13. BEGIN
  14.     PROCESS(hamin)
  15.        VARIABLE syndrome : BIT_VECTOR(3 DOWNTO 0);
  16.     BEGIN
  17.        --generate syndrome bits
  18.        syndrome(0) := (((((((hamin(0) XOR hamin(1)) XOR hamin(2)) XOR hamin(3)) 
  19.                         XOR hamin(4)) XOR hamin(5)) XOR hamin(6)) XOR hamin(7));
  20.        syndrome(1) := (((hamin(0) XOR hamin(1)) XOR hamin(3)) XOR hamin(5));
  21.        syndrome(2) := (((hamin(0) XOR hamin(2)) XOR hamin(3)) XOR hamin(6));
  22.        syndrome(3) := (((hamin(1) XOR hamin(2)) XOR hamin(3)) XOR hamin(7));
  23.        IF (syndrome = "0000") THEN   --no errors
  24.            ne <= '1';
  25.            ded <= '0';
  26.            sec <= '0';
  27.            dataout(0 TO 3) <= hamin(0 TO 3);
  28.        ELSIF (syndrome(0) = '1') THEN --single bit error
  29.             ne <= '0';
  30.             ded <= '0';
  31.             sec <= '1';
  32.             CASE syndrome(3 DOWNTO 1) IS  
  33.                 WHEN "000"|"001"|"010"|"100" => 
  34.                        dataout(0 TO 3) <= hamin(0 TO 3);   -- parity errors
  35.                                 
  36.                 WHEN "011" => dataout(0) <= NOT hamin(0); 
  37.                        dataout(1 TO 3) <= hamin(1 TO 3);
  38.                                 
  39.                 WHEN "101" => dataout(1) <= NOT hamin(1); 
  40.                        dataout(0) <= hamin(0);
  41.                        dataout(2 TO 3) <= hamin(2 TO 3);
  42.                                 
  43.                 WHEN "110" => dataout(2) <= NOT hamin(2); 
  44.                        dataout(3) <= hamin(3);
  45.                        dataout(0 TO 1) <= hamin(0 TO 1);
  46.                                 
  47.                 WHEN "111" => dataout(3) <= NOT hamin(3);
  48.                        dataout(0 TO 2) <= hamin(0 TO 2); 
  49.             END CASE;
  50.        --double error
  51.        ELSIF (syndrome(0) = '0') AND (syndrome(3 DOWNTO 1) /= "000") THEN
  52.             ne <= '0';
  53.             ded <= '1';
  54.             sec <= '0';
  55.             dataout(0 TO 3) <= "0000";
  56.        END IF;
  57.     END PROCESS;
  58. END ver1;