📄 汉明纠错码编码器_译码器.vhd
字号:
--Hamming Encoder--A 4-bit Hamming Code encoder using concurrent assignments. The output vector is connected to the individual parity bits using an aggregate assignment.ENTITY hamenc ISPORT(datain : IN BIT_VECTOR(0 TO 3); --d0 d1 d2 d3hamout : OUT BIT_VECTOR(0 TO 7)); --d0 d1 d2 d3 p0 p1 p2 p4END hamenc;ARCHITECTURE ver2 OF hamenc ISSIGNAL p0, p1, p2, p4 : BIT; --check bitsBEGIN--generate check bitsp0 <= (datain(0) XOR datain(1)) XOR datain(2);p1 <= (datain(0) XOR datain(1)) XOR datain(3);p2 <= (datain(0) XOR datain(2)) XOR datain(3);p4 <= (datain(1) XOR datain(2)) XOR datain(3);--connect up outputshamout(4 TO 7) <= (p0, p1, p2, p4);hamout(0 TO 3) <= datain(0 TO 3);END ver2;--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.ENTITY hamdec ISPORT(hamin : IN BIT_VECTOR(0 TO 7); --d0 d1 d2 d3 p0 p1 p2 p4dataout : OUT BIT_VECTOR(0 TO 3); --d0 d1 d2 d3sec, ded, ne : OUT BIT); --diagnostic outputsEND hamdec;ARCHITECTURE ver1 OF hamdec ISBEGINPROCESS(hamin)VARIABLE syndrome : BIT_VECTOR(3 DOWNTO 0);BEGIN--generate syndrome bitssyndrome(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 errorsne <= '1';ded <= '0';sec <= '0';dataout(0 TO 3) <= hamin(0 TO 3);ELSIF (syndrome(0) = '1') THEN --single bit errorne <= '0';ded <= '0';sec <= '1';CASE syndrome(3 DOWNTO 1) ISWHEN "000"|"001"|"010"|"100" =>dataout(0 TO 3) <= hamin(0 TO 3); -- parity errorsWHEN "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 errorELSIF (syndrome(0) = '0') AND (syndrome(3 DOWNTO 1) /= "000") THENne <= '0';ded <= '1';sec <= '0';dataout(0 TO 3) <= "0000";END IF;END PROCESS;END ver1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -