+ Post New Thread
Results 1 to 4 of 4
  1. #1
    Full Member level 4
    Points: 2,147, Level: 10

    Join Date
    Jul 2006
    Posts
    217
    Helped
    7 / 7
    Points
    2,147
    Level
    10

    Depending on CRC polynomial....How are new values calculated

    How the New CRC values are calculated.....in the below example


    ///////////////////////////////////////////////////////////////////////
    // File: CRC32_D32.v
    //
    // Copyright (C) 1999-2003 Easics NV.
    // This source file may be used and distributed without restriction
    // provided that this copyright statement is not removed from the file
    // and that any derivative work contains the original copyright notice
    // and the associated disclaimer.
    //
    // THIS SOURCE FILE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS
    // OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
    // WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
    //
    // Purpose: Verilog module containing a synthesizable CRC function
    // * polynomial: (0 1 2 4 5 7 8 10 11 12 16 22 23 26 32)
    // * data width: 32
    //
    // Info: tools(at)easics.be
    // http://www.easics.com
    ///////////////////////////////////////////////////////////////////////

    module crc32_D32(DATA_IN, CLK, RESET, START, init, CRC_OUT,neg_crc,crc);

    input [31:0] DATA_IN;
    input CLK;
    input RESET;
    input START;
    input init;
    output [31:0] CRC_OUT;
    output [31:0]neg_crc;
    output [31:0]crc;

    reg [31:0] CRC_OUT;
    reg [31:0]neg_crc;
    reg [31:0]crc;

    always @(posedge CLK)
    begin
    if (!RESET) begin
    // CRC_OUT = 32'h00;
    CRC_OUT = 32'hffffffff;
    end
    else if (init) begin
    CRC_OUT = 32'hffffffff;
    // CRC_OUT = 32'h00;
    end
    else if (START) begin
    CRC_OUT = nextCRC32_D32(DATA_IN, CRC_OUT);
    neg_crc = ~ (CRC_OUT);
    crc = {neg_crc[0],neg_crc[1],neg_crc[2],neg_crc[3],neg_crc[4],neg_crc[5],neg_crc[6],neg_crc[7],neg_crc[8],neg_crc[9],neg_crc[10],
    neg_crc[11],neg_crc[12],neg_crc[13],neg_crc[14],neg_crc[15],neg_crc[16],neg_crc[17],neg_crc[18],neg_crc[19],neg_crc[20],
    neg_crc[21],neg_crc[22],neg_crc[23],neg_crc[24],neg_crc[25],neg_crc[26],neg_crc[27],neg_crc[28],neg_crc[29],neg_crc[30],
    neg_crc[31]};
    end

    end

    // polynomial: (0 1 2 4 5 7 8 10 11 12 16 22 23 26 32)
    // data width: 32
    // convention: the first serial data bit is D[31]
    function [31:0] nextCRC32_D32;

    input [31:0] Data;
    input [31:0] CRC;

    reg [31:0] D;
    reg [31:0] C;
    reg [31:0] NewCRC;

    begin

    D = Data;
    C = CRC;

    NewCRC[0] = D[31] ^ D[30] ^ D[29] ^ D[28] ^ D[26] ^ D[25] ^ D[24] ^
    D[16] ^ D[12] ^ D[10] ^ D[9] ^ D[6] ^ D[0] ^ C[0] ^
    C[6] ^ C[9] ^ C[10] ^ C[12] ^ C[16] ^ C[24] ^ C[25] ^
    C[26] ^ C[28] ^ C[29] ^ C[30] ^ C[31];
    NewCRC[1] = D[28] ^ D[27] ^ D[24] ^ D[17] ^ D[16] ^ D[13] ^ D[12] ^
    D[11] ^ D[9] ^ D[7] ^ D[6] ^ D[1] ^ D[0] ^ C[0] ^ C[1] ^
    C[6] ^ C[7] ^ C[9] ^ C[11] ^ C[12] ^ C[13] ^ C[16] ^
    C[17] ^ C[24] ^ C[27] ^ C[28];
    NewCRC[2] = D[31] ^ D[30] ^ D[26] ^ D[24] ^ D[18] ^ D[17] ^ D[16] ^
    D[14] ^ D[13] ^ D[9] ^ D[8] ^ D[7] ^ D[6] ^ D[2] ^
    D[1] ^ D[0] ^ C[0] ^ C[1] ^ C[2] ^ C[6] ^ C[7] ^ C[8] ^
    C[9] ^ C[13] ^ C[14] ^ C[16] ^ C[17] ^ C[18] ^ C[24] ^
    C[26] ^ C[30] ^ C[31];
    NewCRC[3] = D[31] ^ D[27] ^ D[25] ^ D[19] ^ D[18] ^ D[17] ^ D[15] ^
    D[14] ^ D[10] ^ D[9] ^ D[8] ^ D[7] ^ D[3] ^ D[2] ^
    D[1] ^ C[1] ^ C[2] ^ C[3] ^ C[7] ^ C[8] ^ C[9] ^ C[10] ^
    C[14] ^ C[15] ^ C[17] ^ C[18] ^ C[19] ^ C[25] ^ C[27] ^
    C[31];
    NewCRC[4] = D[31] ^ D[30] ^ D[29] ^ D[25] ^ D[24] ^ D[20] ^ D[19] ^
    D[18] ^ D[15] ^ D[12] ^ D[11] ^ D[8] ^ D[6] ^ D[4] ^
    D[3] ^ D[2] ^ D[0] ^ C[0] ^ C[2] ^ C[3] ^ C[4] ^ C[6] ^
    C[8] ^ C[11] ^ C[12] ^ C[15] ^ C[18] ^ C[19] ^ C[20] ^
    C[24] ^ C[25] ^ C[29] ^ C[30] ^ C[31];
    NewCRC[5] = D[29] ^ D[28] ^ D[24] ^ D[21] ^ D[20] ^ D[19] ^ D[13] ^
    D[10] ^ D[7] ^ D[6] ^ D[5] ^ D[4] ^ D[3] ^ D[1] ^ D[0] ^
    C[0] ^ C[1] ^ C[3] ^ C[4] ^ C[5] ^ C[6] ^ C[7] ^ C[10] ^
    C[13] ^ C[19] ^ C[20] ^ C[21] ^ C[24] ^ C[28] ^ C[29];
    NewCRC[6] = D[30] ^ D[29] ^ D[25] ^ D[22] ^ D[21] ^ D[20] ^ D[14] ^
    D[11] ^ D[8] ^ D[7] ^ D[6] ^ D[5] ^ D[4] ^ D[2] ^ D[1] ^
    C[1] ^ C[2] ^ C[4] ^ C[5] ^ C[6] ^ C[7] ^ C[8] ^ C[11] ^
    C[14] ^ C[20] ^ C[21] ^ C[22] ^ C[25] ^ C[29] ^ C[30];
    NewCRC[7] = D[29] ^ D[28] ^ D[25] ^ D[24] ^ D[23] ^ D[22] ^ D[21] ^
    D[16] ^ D[15] ^ D[10] ^ D[8] ^ D[7] ^ D[5] ^ D[3] ^
    D[2] ^ D[0] ^ C[0] ^ C[2] ^ C[3] ^ C[5] ^ C[7] ^ C[8] ^
    C[10] ^ C[15] ^ C[16] ^ C[21] ^ C[22] ^ C[23] ^ C[24] ^
    C[25] ^ C[28] ^ C[29];
    NewCRC[8] = D[31] ^ D[28] ^ D[23] ^ D[22] ^ D[17] ^ D[12] ^ D[11] ^
    D[10] ^ D[8] ^ D[4] ^ D[3] ^ D[1] ^ D[0] ^ C[0] ^ C[1] ^
    C[3] ^ C[4] ^ C[8] ^ C[10] ^ C[11] ^ C[12] ^ C[17] ^
    C[22] ^ C[23] ^ C[28] ^ C[31];
    NewCRC[9] = D[29] ^ D[24] ^ D[23] ^ D[18] ^ D[13] ^ D[12] ^ D[11] ^
    D[9] ^ D[5] ^ D[4] ^ D[2] ^ D[1] ^ C[1] ^ C[2] ^ C[4] ^
    C[5] ^ C[9] ^ C[11] ^ C[12] ^ C[13] ^ C[18] ^ C[23] ^
    C[24] ^ C[29];
    NewCRC[10] = D[31] ^ D[29] ^ D[28] ^ D[26] ^ D[19] ^ D[16] ^ D[14] ^
    D[13] ^ D[9] ^ D[5] ^ D[3] ^ D[2] ^ D[0] ^ C[0] ^ C[2] ^
    C[3] ^ C[5] ^ C[9] ^ C[13] ^ C[14] ^ C[16] ^ C[19] ^
    C[26] ^ C[28] ^ C[29] ^ C[31];
    NewCRC[11] = D[31] ^ D[28] ^ D[27] ^ D[26] ^ D[25] ^ D[24] ^ D[20] ^
    D[17] ^ D[16] ^ D[15] ^ D[14] ^ D[12] ^ D[9] ^ D[4] ^
    D[3] ^ D[1] ^ D[0] ^ C[0] ^ C[1] ^ C[3] ^ C[4] ^ C[9] ^
    C[12] ^ C[14] ^ C[15] ^ C[16] ^ C[17] ^ C[20] ^ C[24] ^
    C[25] ^ C[26] ^ C[27] ^ C[28] ^ C[31];
    NewCRC[12] = D[31] ^ D[30] ^ D[27] ^ D[24] ^ D[21] ^ D[18] ^ D[17] ^
    D[15] ^ D[13] ^ D[12] ^ D[9] ^ D[6] ^ D[5] ^ D[4] ^
    D[2] ^ D[1] ^ D[0] ^ C[0] ^ C[1] ^ C[2] ^ C[4] ^ C[5] ^
    C[6] ^ C[9] ^ C[12] ^ C[13] ^ C[15] ^ C[17] ^ C[18] ^
    C[21] ^ C[24] ^ C[27] ^ C[30] ^ C[31];
    NewCRC[13] = D[31] ^ D[28] ^ D[25] ^ D[22] ^ D[19] ^ D[18] ^ D[16] ^
    D[14] ^ D[13] ^ D[10] ^ D[7] ^ D[6] ^ D[5] ^ D[3] ^
    D[2] ^ D[1] ^ C[1] ^ C[2] ^ C[3] ^ C[5] ^ C[6] ^ C[7] ^
    C[10] ^ C[13] ^ C[14] ^ C[16] ^ C[18] ^ C[19] ^ C[22] ^
    C[25] ^ C[28] ^ C[31];
    NewCRC[14] = D[29] ^ D[26] ^ D[23] ^ D[20] ^ D[19] ^ D[17] ^ D[15] ^
    D[14] ^ D[11] ^ D[8] ^ D[7] ^ D[6] ^ D[4] ^ D[3] ^
    D[2] ^ C[2] ^ C[3] ^ C[4] ^ C[6] ^ C[7] ^ C[8] ^ C[11] ^
    C[14] ^ C[15] ^ C[17] ^ C[19] ^ C[20] ^ C[23] ^ C[26] ^
    C[29];
    NewCRC[15] = D[30] ^ D[27] ^ D[24] ^ D[21] ^ D[20] ^ D[18] ^ D[16] ^
    D[15] ^ D[12] ^ D[9] ^ D[8] ^ D[7] ^ D[5] ^ D[4] ^
    D[3] ^ C[3] ^ C[4] ^ C[5] ^ C[7] ^ C[8] ^ C[9] ^ C[12] ^
    C[15] ^ C[16] ^ C[18] ^ C[20] ^ C[21] ^ C[24] ^ C[27] ^
    C[30];
    NewCRC[16] = D[30] ^ D[29] ^ D[26] ^ D[24] ^ D[22] ^ D[21] ^ D[19] ^
    D[17] ^ D[13] ^ D[12] ^ D[8] ^ D[5] ^ D[4] ^ D[0] ^
    C[0] ^ C[4] ^ C[5] ^ C[8] ^ C[12] ^ C[13] ^ C[17] ^
    C[19] ^ C[21] ^ C[22] ^ C[24] ^ C[26] ^ C[29] ^ C[30];
    NewCRC[17] = D[31] ^ D[30] ^ D[27] ^ D[25] ^ D[23] ^ D[22] ^ D[20] ^
    D[18] ^ D[14] ^ D[13] ^ D[9] ^ D[6] ^ D[5] ^ D[1] ^
    C[1] ^ C[5] ^ C[6] ^ C[9] ^ C[13] ^ C[14] ^ C[18] ^
    C[20] ^ C[22] ^ C[23] ^ C[25] ^ C[27] ^ C[30] ^ C[31];
    NewCRC[18] = D[31] ^ D[28] ^ D[26] ^ D[24] ^ D[23] ^ D[21] ^ D[19] ^
    D[15] ^ D[14] ^ D[10] ^ D[7] ^ D[6] ^ D[2] ^ C[2] ^
    C[6] ^ C[7] ^ C[10] ^ C[14] ^ C[15] ^ C[19] ^ C[21] ^
    C[23] ^ C[24] ^ C[26] ^ C[28] ^ C[31];
    NewCRC[19] = D[29] ^ D[27] ^ D[25] ^ D[24] ^ D[22] ^ D[20] ^ D[16] ^
    D[15] ^ D[11] ^ D[8] ^ D[7] ^ D[3] ^ C[3] ^ C[7] ^
    C[8] ^ C[11] ^ C[15] ^ C[16] ^ C[20] ^ C[22] ^ C[24] ^
    C[25] ^ C[27] ^ C[29];
    NewCRC[20] = D[30] ^ D[28] ^ D[26] ^ D[25] ^ D[23] ^ D[21] ^ D[17] ^
    D[16] ^ D[12] ^ D[9] ^ D[8] ^ D[4] ^ C[4] ^ C[8] ^
    C[9] ^ C[12] ^ C[16] ^ C[17] ^ C[21] ^ C[23] ^ C[25] ^
    C[26] ^ C[28] ^ C[30];
    NewCRC[21] = D[31] ^ D[29] ^ D[27] ^ D[26] ^ D[24] ^ D[22] ^ D[18] ^
    D[17] ^ D[13] ^ D[10] ^ D[9] ^ D[5] ^ C[5] ^ C[9] ^
    C[10] ^ C[13] ^ C[17] ^ C[18] ^ C[22] ^ C[24] ^ C[26] ^
    C[27] ^ C[29] ^ C[31];
    NewCRC[22] = D[31] ^ D[29] ^ D[27] ^ D[26] ^ D[24] ^ D[23] ^ D[19] ^
    D[18] ^ D[16] ^ D[14] ^ D[12] ^ D[11] ^ D[9] ^ D[0] ^
    C[0] ^ C[9] ^ C[11] ^ C[12] ^ C[14] ^ C[16] ^ C[18] ^
    C[19] ^ C[23] ^ C[24] ^ C[26] ^ C[27] ^ C[29] ^ C[31];
    NewCRC[23] = D[31] ^ D[29] ^ D[27] ^ D[26] ^ D[20] ^ D[19] ^ D[17] ^
    D[16] ^ D[15] ^ D[13] ^ D[9] ^ D[6] ^ D[1] ^ D[0] ^
    C[0] ^ C[1] ^ C[6] ^ C[9] ^ C[13] ^ C[15] ^ C[16] ^
    C[17] ^ C[19] ^ C[20] ^ C[26] ^ C[27] ^ C[29] ^ C[31];
    NewCRC[24] = D[30] ^ D[28] ^ D[27] ^ D[21] ^ D[20] ^ D[18] ^ D[17] ^
    D[16] ^ D[14] ^ D[10] ^ D[7] ^ D[2] ^ D[1] ^ C[1] ^
    C[2] ^ C[7] ^ C[10] ^ C[14] ^ C[16] ^ C[17] ^ C[18] ^
    C[20] ^ C[21] ^ C[27] ^ C[28] ^ C[30];
    NewCRC[25] = D[31] ^ D[29] ^ D[28] ^ D[22] ^ D[21] ^ D[19] ^ D[18] ^
    D[17] ^ D[15] ^ D[11] ^ D[8] ^ D[3] ^ D[2] ^ C[2] ^
    C[3] ^ C[8] ^ C[11] ^ C[15] ^ C[17] ^ C[18] ^ C[19] ^
    C[21] ^ C[22] ^ C[28] ^ C[29] ^ C[31];
    NewCRC[26] = D[31] ^ D[28] ^ D[26] ^ D[25] ^ D[24] ^ D[23] ^ D[22] ^
    D[20] ^ D[19] ^ D[18] ^ D[10] ^ D[6] ^ D[4] ^ D[3] ^
    D[0] ^ C[0] ^ C[3] ^ C[4] ^ C[6] ^ C[10] ^ C[18] ^
    C[19] ^ C[20] ^ C[22] ^ C[23] ^ C[24] ^ C[25] ^ C[26] ^
    C[28] ^ C[31];
    NewCRC[27] = D[29] ^ D[27] ^ D[26] ^ D[25] ^ D[24] ^ D[23] ^ D[21] ^
    D[20] ^ D[19] ^ D[11] ^ D[7] ^ D[5] ^ D[4] ^ D[1] ^
    C[1] ^ C[4] ^ C[5] ^ C[7] ^ C[11] ^ C[19] ^ C[20] ^
    C[21] ^ C[23] ^ C[24] ^ C[25] ^ C[26] ^ C[27] ^ C[29];
    NewCRC[28] = D[30] ^ D[28] ^ D[27] ^ D[26] ^ D[25] ^ D[24] ^ D[22] ^
    D[21] ^ D[20] ^ D[12] ^ D[8] ^ D[6] ^ D[5] ^ D[2] ^
    C[2] ^ C[5] ^ C[6] ^ C[8] ^ C[12] ^ C[20] ^ C[21] ^
    C[22] ^ C[24] ^ C[25] ^ C[26] ^ C[27] ^ C[28] ^ C[30];
    NewCRC[29] = D[31] ^ D[29] ^ D[28] ^ D[27] ^ D[26] ^ D[25] ^ D[23] ^
    D[22] ^ D[21] ^ D[13] ^ D[9] ^ D[7] ^ D[6] ^ D[3] ^
    C[3] ^ C[6] ^ C[7] ^ C[9] ^ C[13] ^ C[21] ^ C[22] ^
    C[23] ^ C[25] ^ C[26] ^ C[27] ^ C[28] ^ C[29] ^ C[31];
    NewCRC[30] = D[30] ^ D[29] ^ D[28] ^ D[27] ^ D[26] ^ D[24] ^ D[23] ^
    D[22] ^ D[14] ^ D[10] ^ D[8] ^ D[7] ^ D[4] ^ C[4] ^
    C[7] ^ C[8] ^ C[10] ^ C[14] ^ C[22] ^ C[23] ^ C[24] ^
    C[26] ^ C[27] ^ C[28] ^ C[29] ^ C[30];
    NewCRC[31] = D[31] ^ D[30] ^ D[29] ^ D[28] ^ D[27] ^ D[25] ^ D[24] ^
    D[23] ^ D[15] ^ D[11] ^ D[9] ^ D[8] ^ D[5] ^ C[5] ^
    C[8] ^ C[9] ^ C[11] ^ C[15] ^ C[23] ^ C[24] ^ C[25] ^
    C[27] ^ C[28] ^ C[29] ^ C[30] ^ C[31];

    nextCRC32_D32 = NewCRC;

    end

    endfunction

    endmodule

    •   AltAdvertisement

        
       

  2. #2
    Member level 4
    Points: 1,479, Level: 8

    Join Date
    Feb 2007
    Location
    Munich
    Posts
    71
    Helped
    10 / 10
    Points
    1,479
    Level
    8

    Re: Depending on CRC polynomial....How are new values calcul

    Ii is very easy. It is according to CRC-32 polynomial. you can draw LFSR strtucture according to the CRC-32 poly with data input on MSB i.e x^31.
    if you wont get tell me..i will explain you in detail



    •   AltAdvertisement

        
       

  3. #3
    Full Member level 4
    Points: 2,147, Level: 10

    Join Date
    Jul 2006
    Posts
    217
    Helped
    7 / 7
    Points
    2,147
    Level
    10

    Re: Depending on CRC polynomial....How are new values calcul

    Hi Chiru....

    Can you expalin me in Detail....

    I mean how the numbers..D[31],D[29].....in each bit calculation and other bits used in other calculation...are taken

    Thanks



    •   AltAdvertisement

        
       

  4. #4
    Member level 4
    Points: 1,479, Level: 8

    Join Date
    Feb 2007
    Location
    Munich
    Posts
    71
    Helped
    10 / 10
    Points
    1,479
    Level
    8

    Re: Depending on CRC polynomial....How are new values calcul

    Generate function CRC32_D1 i.e. for one bit data.
    Here is it:
    NewCRC(0) := D(0) xor C(31);
    NewCRC(1) := D(0) xor C(0) xor C(31);
    NewCRC(2) := D(0) xor C(1) xor C(31);
    NewCRC(3) := C(2);
    NewCRC(4) := D(0) xor C(3) xor C(31);
    NewCRC(5) := D(0) xor C(4) xor C(31);
    NewCRC(6) := C(5);
    NewCRC(7) := D(0) xor C(6) xor C(31);
    NewCRC(8) := D(0) xor C(7) xor C(31);
    NewCRC(9) := C(8);
    NewCRC(10) := D(0) xor C(9) xor C(31);
    NewCRC(11) := D(0) xor C(10) xor C(31);
    NewCRC(12) := D(0) xor C(11) xor C(31);
    NewCRC(13) := C(12);
    NewCRC(14) := C(13);
    NewCRC(15) := C(14);
    NewCRC(16) := D(0) xor C(15) xor C(31);
    NewCRC(17) := C(16);
    NewCRC(18) := C(17);
    NewCRC(19) := C(18);
    NewCRC(20) := C(19);
    NewCRC(21) := C(20);
    NewCRC(22) := D(0) xor C(21) xor C(31);
    NewCRC(23) := D(0) xor C(22) xor C(31);
    NewCRC(24) := C(23);
    NewCRC(25) := C(24);
    NewCRC(26) := D(0) xor C(25) xor C(31);
    NewCRC(27) := C(26);
    NewCRC(28) := C(27);
    NewCRC(29) := C(28);
    NewCRC(30) := C(29);
    NewCRC(31) := C(30);


    Say for second bit D(1),Newcrc(1) looks like

    Newcrc(1) :- D(1) xor D(0) xor C(0) xor C(31);


    ..
    Similarly ,u have to iterate for D(2),D(3),…..D(31) for 32 bits data.



--[[ ]]--