📄 hammingerrloc.vhdl
字号:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Uncomment the following lines to use the declarations that are
-- provided for instantiating Xilinx primitive components.
--library UNISIM;
--use UNISIM.VComponents.all;
entity HammingERRloc is
Port (
DBGlocation: out std_logic_vector(11 downto 0);
clk : in std_logic;
Reset_L: in std_logic;
SHIFTdata: in std_logic_vector(7 downto 0);
SHIFTinnandECC: in std_logic;
HammingCALC : in std_logic_vector(23 downto 0);
ADDR: in std_logic_vector(2 downto 0);
NeedINT: out std_logic;
ERRORlocation8bit: out std_logic_vector(7 downto 0);
ERRORloading: in std_logic
);
end HammingERRloc;
architecture Behavioral of HammingERRloc is
signal StoredHAMMING: std_logic_vector(23 downto 0);
signal ERRloc : std_logic_vector(11 downto 0);
signal errSTATUS: std_logic_vector(1 downto 0);
signal internal_56bit: std_logic_vector(55 downto 0);
signal errorXOR: std_logic_vector(23 downto 0);
signal adjacency, LOCation: std_logic_vector(11 downto 0);
signal internalERRstatus: std_logic_vector(1 downto 0);
begin
DBGlocation <= ERRloc;
errorXOR <= (HammingCALC(23) xor StoredHAMMING(23)) &
(HammingCALC(22) xor StoredHAMMING(22)) &
(HammingCALC(21) xor StoredHAMMING(21)) &
(HammingCALC(20) xor StoredHAMMING(20)) &
(HammingCALC(19) xor StoredHAMMING(19)) &
(HammingCALC(18) xor StoredHAMMING(18)) &
(HammingCALC(17) xor StoredHAMMING(17)) &
(HammingCALC(16) xor StoredHAMMING(16)) &
(HammingCALC(15) xor StoredHAMMING(15)) &
(HammingCALC(14) xor StoredHAMMING(14)) &
(HammingCALC(13) xor StoredHAMMING(13)) &
(HammingCALC(12) xor StoredHAMMING(12)) &
(HammingCALC(11) xor StoredHAMMING(11)) &
(HammingCALC(10) xor StoredHAMMING(10)) &
(HammingCALC(9) xor StoredHAMMING(9)) &
(HammingCALC(8) xor StoredHAMMING(8)) &
(HammingCALC(7) xor StoredHAMMING(7)) &
(HammingCALC(6) xor StoredHAMMING(6)) &
(HammingCALC(5) xor StoredHAMMING(5)) &
(HammingCALC(4) xor StoredHAMMING(4)) &
(HammingCALC(3) xor StoredHAMMING(3)) &
(HammingCALC(2) xor StoredHAMMING(2)) &
(HammingCALC(1) xor StoredHAMMING(1)) &
(HammingCALC(0) xor StoredHAMMING(0));
adjacency <= (errorXOR(0) xor errorXOR(1)) &
(errorXOR(2) xor errorXOR(3)) &
(errorXOR(4) xor errorXOR(5)) &
(errorXOR(6) xor errorXOR(7)) &
(errorXOR(8) xor errorXOR(9)) &
(errorXOR(10) xor errorXOR(11)) &
(errorXOR(12) xor errorXOR(13)) &
(errorXOR(14) xor errorXOR(15)) &
(errorXOR(16) xor errorXOR(17)) &
(errorXOR(18) xor errorXOR(19)) &
(errorXOR(20) xor errorXOR(21)) &
(errorXOR(22) xor errorXOR(23));
LOCation <= (errorXOR(22) & errorXOR(20) & errorXOR(18) & errorXOR(16) &
errorXOR(14) & errorXOR(12) & errorXOR(10) & errorXOR(8) &
errorXOR(6) & errorXOR(4) & errorXOR(2) & errorXOR(0)) xor
x"FFF";
ErrorLocation: process(HammingCALC ,StoredHAMMING, errorXOR,
adjacency, LOCation)
begin
if(errorXOR = X"000000") then
internalERRstatus <= "00";
elsif(adjacency = "111111111111") then
internalERRstatus <= "01";
else
internalERRstatus <= "10";
end if;
ERRloc <= LOCation;
errSTATUS <= internalERRstatus;
end process ErrorLocation;
ShiftINcontent: process(clk, Reset_L, SHIFTinnandECC)
variable REGcontents: std_logic_vector(23 downto 0);
begin
if(Reset_L = '0') then
REGcontents := x"000000";
elsif(SHIFTinnandECC = '1') then
if (rising_edge(clk)) then
REGcontents := SHIFTdata & REGcontents(23 downto 8);
end if;
end if;
StoredHAMMING <= REGcontents;
end process ShiftINcontent;
OpREG8byte: process(clk, Reset_L, ADDR, errSTATUS, ERRloc, ERRORloading)
variable LoadERRORS: std_logic;
begin
--ERRORloading <= LoadERRORS;
LoadERRORS := ERRORloading;
if(rising_edge(clk)) then
if(Reset_L = '0') then
internal_56bit <= X"00000000000000";
elsif(LoadERRORS = '1') then
case ADDR(2 downto 1) is
when "00" =>
internal_56bit(13 downto 0) <= errSTATUS & ERRloc;
when "01" =>
internal_56bit(27 downto 14) <= errSTATUS & ERRloc;
when "10" =>
internal_56bit(41 downto 28) <= errSTATUS & ERRloc;
when "11" =>
internal_56bit(55 downto 42) <= errSTATUS & ERRloc;
when others =>
internal_56bit <= internal_56bit;
end case;
end if;
end if;
end process OpREG8byte;
NeedINT <= internal_56bit(13) or internal_56bit(12) or
internal_56bit(27) or internal_56bit(26) or
internal_56bit(41) or internal_56bit(40) or
internal_56bit(55) or internal_56bit(54);
OUTPUTreg: process(ADDR, internal_56bit)
begin
case ADDR is
when "000" =>
ERRORlocation8bit <= internal_56bit(7 downto 0);
when "001" =>
ERRORlocation8bit <= "00" & internal_56bit(13 downto 8);
when "010" =>
ERRORlocation8bit <= internal_56bit(21 downto 14);
when "011" =>
ERRORlocation8bit <= "00" & internal_56bit(27 downto 22);
when "100" =>
ERRORlocation8bit <= internal_56bit(35 downto 28);
when "101" =>
ERRORlocation8bit <= "00" & internal_56bit(41 downto 36);
when "110" =>
ERRORlocation8bit <= internal_56bit(49 downto 42);
when "111" =>
ERRORlocation8bit <= "00" & internal_56bit(55 downto 50);
when others =>
ERRORlocation8bit <= x"00";
end case;
end process OUTPUTreg;
end Behavioral;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -