综合资讯 技术文章 原文阅读 在线商城 下载专区 DATASHEET 技术论坛 商务频道

电子技术 | 技术资料 | 嵌入式系统 | 单片机专题 | DSP专题
EDA/PLD专题 | 电源技术专题 | 电子制作专题 | 其他综合 | 芯片选型

所在的位置:首页在线阅读EDA/PLD专题VHDL程序举例-组合逻辑正文
 
汉明纠错码译码器

-- Hamming Decoder
-- This Hamming decoder accepts an 8-bit Hamming code (produced by the encoder above) and performs single error correction and double error detection.
-- download from: www.pld.com.cn & www.fpga.com.cn


LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
 
ENTITY hamdec IS
   PORT(hamin : IN BIT_VECTOR(0 TO 7);  --d0 d1 d2 d3 p0 p1 p2 p4 
        dataout : OUT BIT_VECTOR(0 TO 3); --d0 d1 d2 d3
        sec, ded, ne : OUT BIT);  --diagnostic outputs
END hamdec;

ARCHITECTURE ver1 OF hamdec IS

BEGIN

    PROCESS(hamin)
       VARIABLE syndrome : BIT_VECTOR(3 DOWNTO 0);
    BEGIN
       --generate syndrome bits
       syndrome(0) := (((((((hamin(0) XOR hamin(1)) XOR hamin(2)) XOR hamin(3)) 
                        XOR hamin(4)) XOR hamin(5)) XOR hamin(6)) XOR hamin(7));
       syndrome(1) := (((hamin(0) XOR hamin(1)) XOR hamin(3)) XOR hamin(5));
       syndrome(2) := (((hamin(0) XOR hamin(2)) XOR hamin(3)) XOR hamin(6));
       syndrome(3) := (((hamin(1) XOR hamin(2)) XOR hamin(3)) XOR hamin(7));
       IF (syndrome = "0000") THEN   --no errors
           ne <= '1';
           ded <= '0';
           sec <= '0';
           dataout(0 TO 3) <= hamin(0 TO 3);
       ELSIF (syndrome(0) = '1') THEN --single bit error
            ne <= '0';
            ded <= '0';
            sec <= '1';

            CASE syndrome(3 DOWNTO 1) IS  
                WHEN "000"|"001"|"010"|"100" => 
                       dataout(0 TO 3) <= hamin(0 TO 3);   -- parity errors
                                
                WHEN "011" => dataout(0) <= NOT hamin(0); 
                       dataout(1 TO 3) <= hamin(1 TO 3);
                                
                WHEN "101" => dataout(1) <= NOT hamin(1); 
                       dataout(0) <= hamin(0);
                       dataout(2 TO 3) <= hamin(2 TO 3);
                                
                WHEN "110" => dataout(2) <= NOT hamin(2); 
                       dataout(3) <= hamin(3);
                       dataout(0 TO 1) <= hamin(0 TO 1);
                                
                WHEN "111" => dataout(3) <= NOT hamin(3);
                       dataout(0 TO 2) <= hamin(0 TO 2); 
            END CASE;
       --double error
       ELSIF (syndrome(0) = '0') AND (syndrome(3 DOWNTO 1) /= "000") THEN
            ne <= '0';
            ded <= '1';
            sec <= '0';
            dataout(0 TO 3) <= "0000";

       END IF;

    END PROCESS;

END ver1;

返回 上一页 下一页   信息发布:工号01   转引自: 【 】 【打印】 【关闭

关于我们 ┋ 友情链接


深圳市福田区海滨广场福业大厦12C
电话:0755-88305880 25960580 传真:0755-88305880
Copyright©2005-2007 无忧电子开发网版权所有

粤ICP备05064233号