OpenCores
URL https://opencores.org/ocsvn/core1990_interlaken/core1990_interlaken/trunk

Subversion Repositories core1990_interlaken

[/] [core1990_interlaken/] [trunk/] [gateware/] [sources/] [interlaken/] [crc/] [crc-24.vhd] - Rev 11

Compare with Previous | Blame | View Log

--******************************************************************************
--*                                                                            *
--*           Calculates a CRC-24 over the data at Din, data may               *
--*           already arrive when Reset is high                                *
--*           The process from Din to CRC takes 2 Clk cycles                   *
--*           Frans Schreuder (Nikhef) franss@nikhef.nl                        *
--*                                                                            *
--******************************************************************************
library ieee;
use ieee.std_logic_1164.all;
library work;
 
entity CRC_24 is
  --generic(
  --  Nbits :  positive 	:= 64;
  --  CRC_Width		  :  positive 	:= 24;
  --  G_Poly: Std_Logic_Vector :=x"32_8B63"; --c1acf --32_8B63
  --  G_InitVal: std_logic_vector:=x"11_1111"
  --  );
   port(
     CRC   : out    std_logic_vector(23 downto 0);
     Calc  : in     std_logic;
     Clk   : in     std_logic;
     DIn   : in     std_logic_vector(63 downto 0);
     Reset : in     std_logic);
end CRC_24;
 
 
architecture rtl of CRC_24 is
 
--    function ToIndirectInitVal(Direct:std_logic_vector; CRC_Width: positive; Poly: std_logic_vector) return std_logic_vector is 
--        variable InDirect: std_logic_vector(Direct'high downto Direct'low);
--    begin
--        for k in 0 to CRC_Width loop
--            if(k = 0) then
--                InDirect := Direct;
--            else
--                if(InDirect(0)='1') then
--                    InDirect := (('0'&InDirect(CRC_Width-1 downto 1)) xor ('1'&Poly(CRC_Width-1 downto 1)));
--                else
--                    InDirect := '0'&InDirect(CRC_Width-1 downto 1);
--                end if;
--            end if;
--        end loop;
--        return InDirect; 
--    end function ToIndirectInitVal;
--    
--    constant Poly: Std_Logic_Vector(CRC_Width-1 downto 0) := G_Poly;
--    constant InitVal: Std_Logic_Vector(CRC_Width-1 downto 0) := G_InitVal;
--    
--    constant InDirectInitVal: std_logic_vector(CRC_Width-1 downto 0):=ToIndirectInitVal(InitVal, CRC_Width, Poly);
--    signal Reg_s : std_logic_vector(CRC_Width-1 downto 0);  
--begin
--   
--  
--    process (Clk)
--        variable Reg, Reg2: Std_Logic_Vector (CRC_Width-1 downto 0);
--        variable ApplyPoly: std_logic;
--    begin
--
--        if rising_Edge(Clk) then
--            if Reset = '1' then
--                if(Calc = '1') then
--                    for k In 0 to Nbits loop
--                        if(k = 0) then
--                            Reg := (InDirectInitVal);--(CRC_Width-1 downto 0)&dinP(k))xor ('0'&Poly);
--                        else
--                            if Reg(CRC_Width-1) = '1' then
--                                Reg := (Reg(CRC_Width-2 downto 0)&din(Nbits - k))xor (Poly);
--                            else
--                                Reg := Reg(CRC_Width-2 downto 0)&din(Nbits - k);
--                            end if;
--                        end if;
--                    end loop;
--                else
--                    Reg := InDirectInitVal;
--                end if;
--            else
--                if Calc = '1' then
--                    for k In 1 to Nbits loop
--                        if Reg(CRC_Width-1) = '1' then
--                            Reg := (Reg(CRC_Width-2 downto 0)&din(Nbits - k))xor (Poly);
--                        else
--                            Reg := Reg(CRC_Width-2 downto 0)&din(Nbits - k);
--                        end if;
--                    end loop;
--                else
--                    Reg := Reg;
--                end if;
--            end if;
--            
--            Reg_s <= Reg;
--            Reg2 := Reg_s;
--            --we need one more loop to output the CRC register to the output.
--            for k In 1 to CRC_Width loop
--                if Reg2(CRC_Width-1) = '1' then
--                    Reg2 := (Reg2(CRC_Width-2 downto 0)&'0')xor (Poly);
--                else
--                    Reg2:= Reg2(CRC_Width-2 downto 0)&'0';
--                end if;
--            end loop;
--            CRC <= Reg2;--(CRC_width-1 downto 0);
--        end if;
--    end process;
signal c: std_logic_vector(23 downto 0);
signal d: std_logic_vector(63 downto 0);
signal crc_out: std_logic_vector(23 downto 0);
begin
 
process(clk)
begin
    if rising_edge(clk) then
        if Reset = '1' then
            c <= (others => '1');
            d <= Din;
        else
            if Calc = '1' then
                d <= Din;
                c <= crc_out;
            end if;
        end if;
        CRC <= not crc_out;
    end if;
end process;
 
 crc_out(0) <=
    c(1) xor c(6) xor c(8) xor c(9) xor c(12) xor c(13) xor 
    c(16) xor c(18) xor c(19) xor c(20) xor c(22) xor c(23) xor d(63) xor 
    d(62) xor d(60) xor d(59) xor d(58) xor d(56) xor d(53) xor d(52) xor 
    d(49) xor d(48) xor d(46) xor d(41) xor d(39) xor d(38) xor d(37) xor 
    d(36) xor d(34) xor d(32) xor d(31) xor d(30) xor d(29) xor d(23) xor 
    d(16) xor d(14) xor d(11) xor d(10) xor d(8) xor d(7) xor d(6) xor 
    d(4) xor d(3) xor d(0);
 
 crc_out(1) <=
    c(0) xor c(1) xor c(2) xor c(6) xor c(7) xor c(8) xor 
    c(10) xor c(12) xor c(14) xor c(16) xor c(17) xor c(18) xor c(21) xor 
    c(22) xor d(62) xor d(61) xor d(58) xor d(57) xor d(56) xor d(54) xor 
    d(52) xor d(50) xor d(48) xor d(47) xor d(46) xor d(42) xor d(41) xor 
    d(40) xor d(36) xor d(35) xor d(34) xor d(33) xor d(29) xor d(24) xor 
    d(23) xor d(17) xor d(16) xor d(15) xor d(14) xor d(12) xor d(10) xor 
    d(9) xor d(6) xor d(5) xor d(3) xor d(1) xor d(0);
 
 crc_out(2) <=
    c(1) xor c(2) xor c(3) xor c(7) xor c(8) xor c(9) xor 
    c(11) xor c(13) xor c(15) xor c(17) xor c(18) xor c(19) xor c(22) xor 
    c(23) xor d(63) xor d(62) xor d(59) xor d(58) xor d(57) xor d(55) xor 
    d(53) xor d(51) xor d(49) xor d(48) xor d(47) xor d(43) xor d(42) xor 
    d(41) xor d(37) xor d(36) xor d(35) xor d(34) xor d(30) xor d(25) xor 
    d(24) xor d(18) xor d(17) xor d(16) xor d(15) xor d(13) xor d(11) xor 
    d(10) xor d(7) xor d(6) xor d(4) xor d(2) xor d(1);
 
 crc_out(3) <=
    c(2) xor c(3) xor c(4) xor c(8) xor c(9) xor c(10) xor 
    c(12) xor c(14) xor c(16) xor c(18) xor c(19) xor c(20) xor c(23) xor 
    d(63) xor d(60) xor d(59) xor d(58) xor d(56) xor d(54) xor d(52) xor 
    d(50) xor d(49) xor d(48) xor d(44) xor d(43) xor d(42) xor d(38) xor 
    d(37) xor d(36) xor d(35) xor d(31) xor d(26) xor d(25) xor d(19) xor 
    d(18) xor d(17) xor d(16) xor d(14) xor d(12) xor d(11) xor d(8) xor 
    d(7) xor d(5) xor d(3) xor d(2);
 
 crc_out(4) <=
    c(3) xor c(4) xor c(5) xor c(9) xor c(10) xor c(11) xor 
    c(13) xor c(15) xor c(17) xor c(19) xor c(20) xor c(21) xor d(61) xor 
    d(60) xor d(59) xor d(57) xor d(55) xor d(53) xor d(51) xor d(50) xor 
    d(49) xor d(45) xor d(44) xor d(43) xor d(39) xor d(38) xor d(37) xor 
    d(36) xor d(32) xor d(27) xor d(26) xor d(20) xor d(19) xor d(18) xor 
    d(17) xor d(15) xor d(13) xor d(12) xor d(9) xor d(8) xor d(6) xor 
    d(4) xor d(3);
 
 crc_out(5) <=
    c(0) xor c(1) xor c(4) xor c(5) xor c(8) xor c(9) xor 
    c(10) xor c(11) xor c(13) xor c(14) xor c(19) xor c(21) xor c(23) xor 
    d(63) xor d(61) xor d(59) xor d(54) xor d(53) xor d(51) xor d(50) xor 
    d(49) xor d(48) xor d(45) xor d(44) xor d(41) xor d(40) xor d(36) xor 
    d(34) xor d(33) xor d(32) xor d(31) xor d(30) xor d(29) xor d(28) xor 
    d(27) xor d(23) xor d(21) xor d(20) xor d(19) xor d(18) xor d(13) xor 
    d(11) xor d(9) xor d(8) xor d(6) xor d(5) xor d(3) xor d(0);
 
 crc_out(6) <=
    c(2) xor c(5) xor c(8) xor c(10) xor c(11) xor c(13) xor 
    c(14) xor c(15) xor c(16) xor c(18) xor c(19) xor c(23) xor d(63) xor 
    d(59) xor d(58) xor d(56) xor d(55) xor d(54) xor d(53) xor d(51) xor 
    d(50) xor d(48) xor d(45) xor d(42) xor d(39) xor d(38) xor d(36) xor 
    d(35) xor d(33) xor d(28) xor d(24) xor d(23) xor d(22) xor d(21) xor 
    d(20) xor d(19) xor d(16) xor d(12) xor d(11) xor d(9) xor d(8) xor 
    d(3) xor d(1) xor d(0);
 
 crc_out(7) <=
    c(0) xor c(3) xor c(6) xor c(9) xor c(11) xor c(12) xor 
    c(14) xor c(15) xor c(16) xor c(17) xor c(19) xor c(20) xor d(60) xor 
    d(59) xor d(57) xor d(56) xor d(55) xor d(54) xor d(52) xor d(51) xor 
    d(49) xor d(46) xor d(43) xor d(40) xor d(39) xor d(37) xor d(36) xor 
    d(34) xor d(29) xor d(25) xor d(24) xor d(23) xor d(22) xor d(21) xor 
    d(20) xor d(17) xor d(13) xor d(12) xor d(10) xor d(9) xor d(4) xor 
    d(2) xor d(1);
 
 crc_out(8) <=
    c(0) xor c(4) xor c(6) xor c(7) xor c(8) xor c(9) xor 
    c(10) xor c(15) xor c(17) xor c(19) xor c(21) xor c(22) xor c(23) xor 
    d(63) xor d(62) xor d(61) xor d(59) xor d(57) xor d(55) xor d(50) xor 
    d(49) xor d(48) xor d(47) xor d(46) xor d(44) xor d(40) xor d(39) xor 
    d(36) xor d(35) xor d(34) xor d(32) xor d(31) xor d(29) xor d(26) xor 
    d(25) xor d(24) xor d(22) xor d(21) xor d(18) xor d(16) xor d(13) xor 
    d(8) xor d(7) xor d(6) xor d(5) xor d(4) xor d(2) xor d(0);
 
 crc_out(9) <=
    c(0) xor c(5) xor c(6) xor c(7) xor c(10) xor c(11) xor 
    c(12) xor c(13) xor c(19) xor d(59) xor d(53) xor d(52) xor d(51) xor 
    d(50) xor d(47) xor d(46) xor d(45) xor d(40) xor d(39) xor d(38) xor 
    d(35) xor d(34) xor d(33) xor d(31) xor d(29) xor d(27) xor d(26) xor 
    d(25) xor d(22) xor d(19) xor d(17) xor d(16) xor d(11) xor d(10) xor 
    d(9) xor d(5) xor d(4) xor d(1) xor d(0);
 
 crc_out(10) <=
    c(0) xor c(1) xor c(6) xor c(7) xor c(8) xor c(11) xor 
    c(12) xor c(13) xor c(14) xor c(20) xor d(60) xor d(54) xor d(53) xor 
    d(52) xor d(51) xor d(48) xor d(47) xor d(46) xor d(41) xor d(40) xor 
    d(39) xor d(36) xor d(35) xor d(34) xor d(32) xor d(30) xor d(28) xor 
    d(27) xor d(26) xor d(23) xor d(20) xor d(18) xor d(17) xor d(12) xor 
    d(11) xor d(10) xor d(6) xor d(5) xor d(2) xor d(1);
 
 crc_out(11) <=
    c(0) xor c(2) xor c(6) xor c(7) xor c(14) xor c(15) xor 
    c(16) xor c(18) xor c(19) xor c(20) xor c(21) xor c(22) xor c(23) xor 
    d(63) xor d(62) xor d(61) xor d(60) xor d(59) xor d(58) xor d(56) xor 
    d(55) xor d(54) xor d(47) xor d(46) xor d(42) xor d(40) xor d(39) xor 
    d(38) xor d(35) xor d(34) xor d(33) xor d(32) xor d(30) xor d(28) xor 
    d(27) xor d(24) xor d(23) xor d(21) xor d(19) xor d(18) xor d(16) xor 
    d(14) xor d(13) xor d(12) xor d(10) xor d(8) xor d(4) xor d(2) xor 
    d(0);
 
 crc_out(12) <=
    c(0) xor c(1) xor c(3) xor c(7) xor c(8) xor c(15) xor 
    c(16) xor c(17) xor c(19) xor c(20) xor c(21) xor c(22) xor c(23) xor 
    d(63) xor d(62) xor d(61) xor d(60) xor d(59) xor d(57) xor d(56) xor 
    d(55) xor d(48) xor d(47) xor d(43) xor d(41) xor d(40) xor d(39) xor 
    d(36) xor d(35) xor d(34) xor d(33) xor d(31) xor d(29) xor d(28) xor 
    d(25) xor d(24) xor d(22) xor d(20) xor d(19) xor d(17) xor d(15) xor 
    d(14) xor d(13) xor d(11) xor d(9) xor d(5) xor d(3) xor d(1);
 
 crc_out(13) <=
    c(0) xor c(1) xor c(2) xor c(4) xor c(8) xor c(9) xor 
    c(16) xor c(17) xor c(18) xor c(20) xor c(21) xor c(22) xor c(23) xor 
    d(63) xor d(62) xor d(61) xor d(60) xor d(58) xor d(57) xor d(56) xor 
    d(49) xor d(48) xor d(44) xor d(42) xor d(41) xor d(40) xor d(37) xor 
    d(36) xor d(35) xor d(34) xor d(32) xor d(30) xor d(29) xor d(26) xor 
    d(25) xor d(23) xor d(21) xor d(20) xor d(18) xor d(16) xor d(15) xor 
    d(14) xor d(12) xor d(10) xor d(6) xor d(4) xor d(2);
 
 crc_out(14) <=
    c(1) xor c(2) xor c(3) xor c(5) xor c(9) xor c(10) xor 
    c(17) xor c(18) xor c(19) xor c(21) xor c(22) xor c(23) xor d(63) xor 
    d(62) xor d(61) xor d(59) xor d(58) xor d(57) xor d(50) xor d(49) xor 
    d(45) xor d(43) xor d(42) xor d(41) xor d(38) xor d(37) xor d(36) xor 
    d(35) xor d(33) xor d(31) xor d(30) xor d(27) xor d(26) xor d(24) xor 
    d(22) xor d(21) xor d(19) xor d(17) xor d(16) xor d(15) xor d(13) xor 
    d(11) xor d(7) xor d(5) xor d(3);
 
 crc_out(15) <=
    c(1) xor c(2) xor c(3) xor c(4) xor c(8) xor c(9) xor 
    c(10) xor c(11) xor c(12) xor c(13) xor c(16) xor d(56) xor d(53) xor 
    d(52) xor d(51) xor d(50) xor d(49) xor d(48) xor d(44) xor d(43) xor 
    d(42) xor d(41) xor d(30) xor d(29) xor d(28) xor d(27) xor d(25) xor 
    d(22) xor d(20) xor d(18) xor d(17) xor d(12) xor d(11) xor d(10) xor 
    d(7) xor d(3) xor d(0);
 
 crc_out(16) <=
    c(2) xor c(3) xor c(4) xor c(5) xor c(9) xor c(10) xor 
    c(11) xor c(12) xor c(13) xor c(14) xor c(17) xor d(57) xor d(54) xor 
    d(53) xor d(52) xor d(51) xor d(50) xor d(49) xor d(45) xor d(44) xor 
    d(43) xor d(42) xor d(31) xor d(30) xor d(29) xor d(28) xor d(26) xor 
    d(23) xor d(21) xor d(19) xor d(18) xor d(13) xor d(12) xor d(11) xor 
    d(8) xor d(4) xor d(1);
 
 crc_out(17) <=
    c(1) xor c(3) xor c(4) xor c(5) xor c(8) xor c(9) xor 
    c(10) xor c(11) xor c(14) xor c(15) xor c(16) xor c(19) xor c(20) xor 
    c(22) xor c(23) xor d(63) xor d(62) xor d(60) xor d(59) xor d(56) xor 
    d(55) xor d(54) xor d(51) xor d(50) xor d(49) xor d(48) xor d(45) xor 
    d(44) xor d(43) xor d(41) xor d(39) xor d(38) xor d(37) xor d(36) xor 
    d(34) xor d(27) xor d(24) xor d(23) xor d(22) xor d(20) xor d(19) xor 
    d(16) xor d(13) xor d(12) xor d(11) xor d(10) xor d(9) xor d(8) xor 
    d(7) xor d(6) xor d(5) xor d(4) xor d(3) xor d(2) xor d(0);
 
 crc_out(18) <=
    c(0) xor c(2) xor c(4) xor c(5) xor c(6) xor c(9) xor 
    c(10) xor c(11) xor c(12) xor c(15) xor c(16) xor c(17) xor c(20) xor 
    c(21) xor c(23) xor d(63) xor d(61) xor d(60) xor d(57) xor d(56) xor 
    d(55) xor d(52) xor d(51) xor d(50) xor d(49) xor d(46) xor d(45) xor 
    d(44) xor d(42) xor d(40) xor d(39) xor d(38) xor d(37) xor d(35) xor 
    d(28) xor d(25) xor d(24) xor d(23) xor d(21) xor d(20) xor d(17) xor 
    d(14) xor d(13) xor d(12) xor d(11) xor d(10) xor d(9) xor d(8) xor 
    d(7) xor d(6) xor d(5) xor d(4) xor d(3) xor d(1);
 
 crc_out(19) <=
    c(0) xor c(1) xor c(3) xor c(5) xor c(6) xor c(7) xor 
    c(10) xor c(11) xor c(12) xor c(13) xor c(16) xor c(17) xor c(18) xor 
    c(21) xor c(22) xor d(62) xor d(61) xor d(58) xor d(57) xor d(56) xor 
    d(53) xor d(52) xor d(51) xor d(50) xor d(47) xor d(46) xor d(45) xor 
    d(43) xor d(41) xor d(40) xor d(39) xor d(38) xor d(36) xor d(29) xor 
    d(26) xor d(25) xor d(24) xor d(22) xor d(21) xor d(18) xor d(15) xor 
    d(14) xor d(13) xor d(12) xor d(11) xor d(10) xor d(9) xor d(8) xor 
    d(7) xor d(6) xor d(5) xor d(4) xor d(2);
 
 crc_out(20) <=
    c(0) xor c(2) xor c(4) xor c(7) xor c(9) xor c(11) xor 
    c(14) xor c(16) xor c(17) xor c(20) xor d(60) xor d(57) xor d(56) xor 
    d(54) xor d(51) xor d(49) xor d(47) xor d(44) xor d(42) xor d(40) xor 
    d(38) xor d(36) xor d(34) xor d(32) xor d(31) xor d(29) xor d(27) xor 
    d(26) xor d(25) xor d(22) xor d(19) xor d(15) xor d(13) xor d(12) xor 
    d(9) xor d(5) xor d(4) xor d(0);
 
 crc_out(21) <=
    c(3) xor c(5) xor c(6) xor c(9) xor c(10) xor c(13) xor 
    c(15) xor c(16) xor c(17) xor c(19) xor c(20) xor c(21) xor c(22) xor 
    c(23) xor d(63) xor d(62) xor d(61) xor d(60) xor d(59) xor d(57) xor 
    d(56) xor d(55) xor d(53) xor d(50) xor d(49) xor d(46) xor d(45) xor 
    d(43) xor d(38) xor d(36) xor d(35) xor d(34) xor d(33) xor d(31) xor 
    d(29) xor d(28) xor d(27) xor d(26) xor d(20) xor d(13) xor d(11) xor 
    d(8) xor d(7) xor d(5) xor d(4) xor d(3) xor d(1) xor d(0);
 
 crc_out(22) <=
    c(4) xor c(6) xor c(7) xor c(10) xor c(11) xor c(14) xor 
    c(16) xor c(17) xor c(18) xor c(20) xor c(21) xor c(22) xor c(23) xor 
    d(63) xor d(62) xor d(61) xor d(60) xor d(58) xor d(57) xor d(56) xor 
    d(54) xor d(51) xor d(50) xor d(47) xor d(46) xor d(44) xor d(39) xor 
    d(37) xor d(36) xor d(35) xor d(34) xor d(32) xor d(30) xor d(29) xor 
    d(28) xor d(27) xor d(21) xor d(14) xor d(12) xor d(9) xor d(8) xor 
    d(6) xor d(5) xor d(4) xor d(2) xor d(1);
 
 crc_out(23) <=
    c(0) xor c(5) xor c(7) xor c(8) xor c(11) xor c(12) xor 
    c(15) xor c(17) xor c(18) xor c(19) xor c(21) xor c(22) xor c(23) xor 
    d(63) xor d(62) xor d(61) xor d(59) xor d(58) xor d(57) xor d(55) xor 
    d(52) xor d(51) xor d(48) xor d(47) xor d(45) xor d(40) xor d(38) xor 
    d(37) xor d(36) xor d(35) xor d(33) xor d(31) xor d(30) xor d(29) xor 
    d(28) xor d(22) xor d(15) xor d(13) xor d(10) xor d(9) xor d(7) xor 
    d(6) xor d(5) xor d(3) xor d(2);
 
 
end architecture rtl ; -- of CRC

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.