+ Post New Thread
Results 1 to 5 of 5
  1. #1
    Member level 3
    Points: 311, Level: 3

    Join Date
    Jul 2019
    Posts
    64
    Helped
    0 / 0
    Points
    311
    Level
    3

    Using calculated CRC as seed for the next CRC calculation

    We use seed as all F's when we calculate CRC. I have to work on a large data; which is broken down into slabs and fed to the CRC engine to calculate the CRC of that particular slab. Now this CRC needs to be used as a seed for the next slab of data. How can this be implemented?

    My data slabs are 256 bits each. And the CRC is a 32 bit CRC. I have an online generated code. I just need to know how to use the CRC generated as the seed for the next slab of data.

    I am pasting a part of the code. How the CRC is calculated is not important here as its available online.

    Code Verilog - [expand]
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    
    module crc(
      input [255:0] data_in,
      input crc_en,
      output [31:0] crc_out,
      input rst,
      input clk);
     
      reg [31:0] lfsr_q,lfsr_c;
     
      assign crc_out = lfsr_q;
     
      always @(*) begin
        lfsr_c[0] = lfsr_q[0] ^ lfsr_q[2] ^ lfsr_q[3] ^ lfsr_q[4] ^ lfsr_q[6] ^ lfsr_q[10] ^ lfsr_q[13] ^ lfsr_q[19] ^ lfsr_q[24] ^ lfsr_q[28] ^ lfsr_q[31] ^ data_in[0] ^ data_in[6] ^ data_in[9] ^ data_in[10] ^ data_in[12] ^ data_in[16] ^ data_in[24] ^ data_in[25] ^ data_in[26] ^ data_in[28] ^ data_in[29] ^ data_in[30] ^ data_in[31] ^ data_in[32] ^ data_in[34] ^ data_in[37] ^ data_in[44] ^ data_in[45] ^ data_in[47] ^ data_in[48] ^ data_in[50] ^ data_in[53] ^ data_in[54] ^ data_in[55] ^ data_in[58] ^ data_in[60] ^ data_in[61] ^ data_in[63] ^ data_in[65] ^ data_in[66] ^ data_in[67] ^ data_in[68] ^ data_in[72] ^ data_in[73] ^ data_in[79] ^ data_in[81] ^ data_in[82] ^ data_in[83] ^ data_in[84] ^ data_in[85] ^ data_in[87] ^ data_in[94] ^ data_in[95] ^ data_in[96] ^ data_in[97] ^ data_in[98] ^ data_in[99] ^ data_in[101] ^ data_in[103] ^ data_in[104] ^ data_in[106] ^ data_in[110] ^ data_in[111] ^ data_in[113] ^ data_in[114] ^ data_in[116] ^ data_in[117] ^ data_in[118] ^ data_in[119] ^ data_in[123] ^ data_in[125] ^ data_in[126] ^ data_in[127] ^ data_in[128] ^ data_in[132] ^ data_in[134] ^ data_in[135] ^ data_in[136] ^ data_in[137] ^ data_in[143] ^ data_in[144] ^ data_in[149] ^ data_in[151] ^ data_in[155] ^ data_in[156] ^ data_in[158] ^ data_in[161] ^ data_in[162] ^ data_in[166] ^ data_in[167] ^ data_in[169] ^ data_in[170] ^ data_in[171] ^ data_in[172] ^ data_in[182] ^ data_in[183] ^ data_in[186] ^ data_in[188] ^ data_in[190] ^ data_in[191] ^ data_in[192] ^ data_in[193] ^ data_in[194] ^ data_in[197] ^ data_in[198] ^ data_in[199] ^ data_in[201] ^ data_in[202] ^ data_in[203] ^ data_in[207] ^ data_in[208] ^ data_in[209] ^ data_in[210] ^ data_in[212] ^ data_in[214] ^ data_in[216] ^ data_in[224] ^ data_in[226] ^ data_in[227] ^ data_in[228] ^ data_in[230] ^ data_in[234] ^ data_in[237] ^ data_in[243] ^ data_in[248] ^ data_in[252] ^ data_in[255];
        lfsr_c[1] = lfsr_q[0] ^ lfsr_q[1] ^ lfsr_q[2] ^ lfsr_q[5] ^ lfsr_q[6] ^ lfsr_q[7] ^ lfsr_q[10] ^ lfsr_q[11] ^ lfsr_q[13] ^ lfsr_q[14] ^ lfsr_q[19] ^ lfsr_q[20] ^ lfsr_q[24] ^ lfsr_q[25] ^ lfsr_q[28] ^ lfsr_q[29] ^ lfsr_q[31] ^ data_in[0] ^ data_in[1] ^ data_in[6] ^ data_in[7] ^ data_in[9] ^ data_in[11] ^ data_in[12] ^ data_in[13] ^ data_in[16] ^ data_in[17] ^ data_in[24] ^ data_in[27] ^ data_in[28] ^ data_in[33] ^ data_in[34] ^ data_in[35] ^ data_in[37] ^ data_in[38] ^ data_in[44] ^ data_in[46] ^ data_in[47] ^ data_in[49] ^ data_in[50] ^ data_in[51] ^ data_in[53] ^ data_in[56] ^ data_in[58] ^ data_in[59] ^ data_in[60] ^ data_in[62] ^ data_in[63] ^ data_in[64] ^ data_in[65] ^ data_in[69] ^ data_in[72] ^ data_in[74] ^ data_in[79] ^ data_in[80] ^ data_in[81] ^ data_in[86] ^ data_in[87] ^ data_in[88] ^ data_in[94] ^ data_in[100] ^ data_in[101] ^ data_in[102] ^ data_in[103] ^ data_in[105] ^ data_in[106] ^ data_in[107] ^ data_in[110] ^ data_in[112] ^ data_in[113] ^ data_in[115] ^ data_in[116] ^ data_in[120] ^ data_in[123] ^ data_in[124] ^ data_in[125] ^ data_in[129] ^ data_in[132] ^ data_in[133] ^ data_in[134] ^ data_in[138] ^ data_in[143] ^ data_in[145] ^ data_in[149] ^ data_in[150] ^ data_in[151] ^ data_in[152] ^ data_in[155] ^ data_in[157] ^ data_in[158] ^ data_in[159] ^ data_in[161] ^ data_in[163] ^ data_in[166] ^ data_in[168] ^ data_in[169] ^ data_in[173] ^ data_in[182] ^ data_in[184] ^ data_in[186] ^ data_in[187] ^ data_in[188] ^ data_in[189] ^ data_in[190] ^ data_in[195] ^ data_in[197] ^ data_in[200] ^ data_in[201] ^ data_in[204] ^ data_in[207] ^ data_in[211] ^ data_in[212] ^ data_in[213] ^ data_in[214] ^ data_in[215] ^ data_in[216] ^ data_in[217] ^ data_in[224] ^ data_in[225] ^ data_in[226] ^ data_in[229] ^ data_in[230] ^ data_in[231] ^ data_in[234] ^ data_in[235] ^ data_in[237] ^ data_in[238] ^ data_in[243] ^ data_in[244] ^ data_in[248] ^ data_in[249] ^ data_in[252] ^ data_in[253] ^ data_in[255];
       
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    .
    end // always
     
      always @(posedge clk, posedge rst) begin
        if(rst) begin
          lfsr_q <= {32{1'b1}};
        end
        else begin
          lfsr_q <= crc_en ? lfsr_c : lfsr_q;
        end
      end // always
    endmodule // crc

    •   AltAdvertisement

        
       

  2. #2
    Advanced Member level 3
    Points: 7,438, Level: 20
    Achievements:
    7 years registered

    Join Date
    Jul 2010
    Location
    Sweden
    Posts
    992
    Helped
    381 / 381
    Points
    7,438
    Level
    20

    Re: Using calculated CRC as seed for the next CRC calculation

    You should just feed more data into the crc module.
    Apply the new data and crc_en='1' for one clock cycle.

    Do you really need to process 256 input bits per clock cycle?
    You will get the same result with a crc calculator that takes the input in multiple clock cycles.



    •   AltAdvertisement

        
       

  3. #3
    Newbie level 4
    Points: 44, Level: 1

    Join Date
    Sep 2019
    Location
    Germany
    Posts
    7
    Helped
    0 / 0
    Points
    44
    Level
    1

    Re: Using calculated CRC as seed for the next CRC calculation

    You'll achieve what you've asked in your post if you do what comment # 2 says, but you'll probably also need to implement some logic to check if the last slab of data has been received and then reset your lfsr_q register.



    •   AltAdvertisement

        
       

  4. #4
    Member level 3
    Points: 311, Level: 3

    Join Date
    Jul 2019
    Posts
    64
    Helped
    0 / 0
    Points
    311
    Level
    3

    Re: Using calculated CRC as seed for the next CRC calculation

    Quote Originally Posted by std_match View Post
    You should just feed more data into the crc module.
    Apply the new data and crc_en='1' for one clock cycle.

    Do you really need to process 256 input bits per clock cycle?
    You will get the same result with a crc calculator that takes the input in multiple clock cycles.
    Yes, my data bus is 256 bits. So i can only process 256 bits at a time. I need to do this over several iterations and keep using the previous CRC as the new seed. I dont think I will need any logic to check if last data was received because a CRC module that takes 256 bits as input will produce the CRC for that data in one clock cycle. I just need some logic that will work on clock and take the CRC from the previous clock cycle as the new seed.

    Or do the codes found on online generators take care of this already?
    Last edited by rrucha; 12th September 2019 at 17:46.



  5. #5
    Super Moderator
    Points: 31,563, Level: 43
    ads-ee's Avatar
    Join Date
    Sep 2013
    Location
    USA
    Posts
    7,302
    Helped
    1718 / 1718
    Points
    31,563
    Level
    43

    Re: Using calculated CRC as seed for the next CRC calculation

    You do understand that a CRC has a feedback that uses whatever is already there to compute the next CRC of the input data. This is why you have to INITIALIZE the CRC to all 1's normally at the start of a CRC calculation. If you are chaining the CRC between blocks then you don't reset anything just keep using the CRC value left from the last CRC calculation. Just make sure the CRC isn't clocked if you don't have input data and are just looking at the result.


    1 members found this post helpful.

--[[ ]]--