汉明纠错吗译码器(VHDL)

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;
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GJZGRB

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值