//
// CRC.V
//
// This module calculates the 32-bit CRC code.
// The module is general purpose and can be used any where.
// The polynomial is (0 1 2 4 5 7 8 10 11 12 16 22 23 26 32)
// Interfaces with the Receiver and the Transmitter module.
// The CRC calculated is same as that of the
// IEEE-802 LANs and the X3T9.5 FDDI.
//
module crc
(
//Inputs
reset_n,
BCLK,
D, //Input Data
crc_in, // signal to indicate that the data is available on D bus
//Outputs
Calc_CRC// Calculated CRC bus, updated after each crc_in
);
input BCLK, reset_n, crc_in;
input [31:0] D;
output [31:0]Calc_CRC;
wire [31:0]Calc_CRC;
reg [15:0]C1;// C1 and C2 are 16 bits registers to form a 32-bit word of
reg [15:0]C2;//calculated CRC. This was done as Altera has some problem with 32-bit registers
assign Calc_CRC={C1, C2};
// C1 : C2
//31 16:15 0
always@(negedge reset_n or negedge BCLK)
begin
if(!reset_n)
begin
C1<=16'hFFFF; //The algorithm implemented requires that the initial value be all ones
C2<=16'hFFFF;
end
else if(crc_in)
begin
//These equations are used to calculate the CRC word. The equations are generated by the
//CRC-tool avialable at www.easics.com
C2[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] ^ C2[0] ^
C2[6] ^ C2[9] ^ C2[10] ^ C2[12] ^ C1[0] ^ C1[8] ^ C1[9] ^
C1[10] ^ C1[12] ^ C1[13] ^ C1[14] ^ C1[15];
C2[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] ^ C2[0] ^ C2[1] ^
C2[6] ^ C2[7] ^ C2[9] ^ C2[11] ^ C2[12] ^ C2[13] ^ C1[0] ^
C1[1] ^ C1[8] ^ C1[11] ^ C1[12];
C2[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] ^ C2[0] ^ C2[1] ^ C1[2] ^ C2[6] ^ C2[7] ^ C2[8] ^
C2[9] ^ C2[13] ^ C2[14] ^ C1[0] ^ C1[1] ^ C1[2] ^ C1[8] ^
C1[10] ^ C1[14] ^ C1[15];
C2[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] ^ C2[1] ^ C1[2] ^ C2[3] ^ C2[7] ^ C2[8] ^ C2[9] ^ C2[10] ^
C2[14] ^ C2[15] ^ C1[1] ^ C1[2] ^ C1[3] ^ C1[9] ^ C1[11] ^
C1[15];
C2[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] ^ C2[0] ^ C2[2] ^ C2[3] ^ C2[4] ^ C2[6] ^
C2[8] ^ C2[11] ^ C2[12] ^ C2[15] ^ C1[2] ^ C1[3] ^ C1[4] ^
C1[8] ^ C1[9] ^ C1[13] ^ C1[14] ^ C1[15];
C2[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] ^
C2[0] ^ C2[1] ^ C2[3] ^ C2[4] ^ C2[5] ^ C2[6] ^ C2[7] ^ C2[10] ^
C2[13] ^ C1[3] ^ C1[4] ^ C1[5] ^ C1[8] ^ C1[12] ^ C1[13];
C2[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] ^
C2[1] ^ C1[2] ^ C2[4] ^ C2[5] ^ C2[6] ^ C2[7] ^ C2[8] ^ C2[11] ^
C2[14] ^ C1[4] ^ C1[5] ^ C1[6] ^ C1[9] ^ C1[13] ^ C1[14];
C2[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] ^ C2[0] ^ C1[2] ^ C2[3] ^ C2[5] ^ C2[7] ^ C2[8] ^
C2[10] ^ C2[15] ^ C1[0] ^ C1[5] ^ C1[6] ^ C1[7] ^ C1[8] ^
C1[9] ^ C1[12] ^ C1[13];
C2[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] ^ C2[0] ^ C2[1] ^
C2[3] ^ C2[4] ^ C2[8] ^ C2[10] ^ C2[11] ^ C2[12] ^ C1[1] ^
C1[6] ^ C1[7] ^ C1[12] ^ C1[15];
C2[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] ^ C2[1] ^ C2[2] ^ C2[4] ^
C2[5] ^ C2[9] ^ C2[11] ^ C2[12] ^ C2[13] ^ C1[2] ^ C1[7] ^
C1[8] ^ C1[13];
C2[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] ^ C2[0] ^ C2[2] ^
C2[3] ^ C2[5] ^ C2[9] ^ C2[13] ^ C2[14] ^ C1[0] ^ C1[3] ^
C1[10] ^ C1[12] ^ C1[13] ^ C1[15];
C2[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] ^ C2[0] ^ C2[1] ^ C2[3] ^ C2[4] ^ C2[9] ^
C2[12] ^ C2[14] ^ C2[15] ^ C1[0] ^ C1[1] ^ C1[4] ^ C1[8] ^
C1[9] ^ C1[10] ^ C1[11] ^ C1[12] ^ C1[15];
C2[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] ^ C2[0] ^ C2[1] ^ C1[2] ^ C2[4] ^ C2[5] ^
C2[6] ^ C2[9] ^ C2[12] ^ C2[13] ^ C2[15] ^ C1[1] ^ C1[2] ^
C1[5] ^ C1[8] ^ C1[11] ^ C1[14] ^ C1[15];
C2[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] ^ C2[1] ^ C1[2] ^ C2[3] ^ C2[5] ^ C2[6] ^ C2[7] ^
C2[10] ^ C2[13] ^ C2[14] ^ C1[0] ^ C1[2] ^ C1[3] ^ C1[6] ^
C1[9] ^ C1[12] ^ C1[15];
C2[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] ^ C1[2] ^ C2[3] ^ C2[4] ^ C2[6] ^ C2[7] ^ C2[8] ^ C2[11] ^
C2[14] ^ C2[15] ^ C1[1] ^ C1[3] ^ C1[4] ^ C1[7] ^ C1[10] ^
C1[13];
C2[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] ^ C2[3] ^ C2[4] ^ C2[5] ^ C2[7] ^ C2[8] ^ C2[9] ^ C2[12] ^
C2[15] ^ C1[0] ^ C1[2] ^ C1[4] ^ C1[5] ^ C1[8] ^ C1[11] ^
C1[14];
C1[0] <= 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] ^
C2[0] ^ C2[4] ^ C2[5] ^ C2[8] ^ C2[12] ^ C2[13] ^ C1[1] ^
C1[3] ^ C1[5] ^ C1[6] ^ C1[8] ^ C1[10] ^ C1[13] ^ C1[14];
C1[1] <= 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] ^
C2[1] ^ C2[5] ^ C2[6] ^ C2[9] ^ C2[13] ^ C2[14] ^ C1[2] ^
C1[4] ^ C1[6] ^ C1[7] ^ C1[9] ^ C1[11] ^ C1[14] ^ C1[15];
C1[2] <= 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] ^ C1[2] ^
C2[6] ^ C2[7] ^ C2[10] ^ C2[14] ^ C2[15] ^ C1[3] ^ C1[5] ^
C1[7] ^ C1[8] ^ C1[10] ^ C1[12] ^ C1[15];
C1[3] <= D[29] ^ D[27] ^ D[25] ^ D[24] ^ D[22] ^ D[20] ^ D[16] ^
D[15] ^ D[11] ^ D[8] ^ D[7] ^ D[3] ^ C2[3] ^ C2[7] ^
C2[8] ^ C2[11] ^ C2[15] ^ C1[0] ^ C1[4] ^ C1[6] ^ C1[8] ^
C1[9] ^ C1[11] ^ C1[13];
C1[4] <= D[30] ^ D[28] ^ D[26] ^ D[25] ^ D[23] ^ D[21] ^ D[17] ^
D[16] ^ D[12] ^ D[9] ^ D[8] ^ D[4] ^ C2[4] ^ C2[8] ^
C2[9] ^ C2[12] ^ C1[0] ^ C1[1] ^ C1[5] ^ C1[7] ^ C1[9] ^
C1[10] ^ C1[12] ^ C1[14];
C1[5] <= D[31] ^ D[29] ^ D[27] ^ D[26] ^ D[24] ^ D[22] ^ D[18] ^
D[17] ^ D[13] ^ D[10] ^ D[9] ^ D[5] ^ C2[5] ^ C2[9] ^
C2[10] ^ C2[13] ^ C1[1] ^ C1[2] ^ C1[6] ^ C1[8] ^ C1[10] ^
C1[11] ^ C1[13] ^ C1[15];
C1[6] <= 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] ^
C2[0] ^ C2[9] ^ C2[11] ^ C2[12] ^ C2[14] ^ C1[0] ^ C1[2] ^
C1[3] ^ C1[7] ^ C1[8] ^ C1[10] ^ C1[11] ^ C1[13] ^ C1[15];
C1[7] <= 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] ^
C2[0] ^ C2[1] ^ C2[6] ^ C2[9] ^ C2[13] ^ C2[15] ^ C1[0] ^
C1[1] ^ C1[3] ^ C1[4] ^ C1[10] ^ C1[11] ^ C1[13] ^ C1[15];
C1[8] <= 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] ^ C2[1] ^
C1[2] ^ C2[7] ^ C2[10] ^ C2[14] ^ C1[0] ^ C1[1] ^ C1[2] ^
C1[4] ^ C1[5] ^ C1[11] ^ C1[12] ^ C1[14];
C1[9] <= 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] ^ C1[2] ^
C2[3] ^ C2[8] ^ C2[11] ^ C2[15] ^ C1[1] ^ C1[2] ^ C1[3] ^
C1[5] ^ C1[6] ^ C1[12] ^ C1[13] ^ C1[15];
C1[10] <= 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] ^ C2[0] ^ C2[3] ^ C2[4] ^ C2[6] ^ C2[10] ^ C1[2] ^
C1[3] ^ C1[4] ^ C1[6] ^ C1[7] ^ C1[8] ^ C1[9] ^ C1[10] ^
C1[12] ^ C1[15];
C1[11] <= 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] ^
C2[1] ^ C2[4] ^ C2[5] ^ C2[7] ^ C2[11] ^ C1[3] ^ C1[4] ^
C1[5] ^ C1[7] ^ C1[8] ^ C1[9] ^ C1[10] ^ C1[11] ^ C1[13];
C1[12] <= 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] ^
C1[2] ^ C2[5] ^ C2[6] ^ C2[8] ^ C2[12] ^ C1[4] ^ C1[5] ^
C1[6] ^ C1[8] ^ C1[9] ^ C1[10] ^ C1[11] ^ C1[12] ^ C1[14];
C1[13] <= 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] ^
C2[3] ^ C2[6] ^ C2[7] ^ C2[9] ^ C2[13] ^ C1[5] ^ C1[6] ^
C1[7] ^ C1[9] ^ C1[10] ^ C1[11] ^ C1[12] ^ C1[13] ^ C1[15];
C1[14] <= 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] ^ C2[4] ^
C2[7] ^ C2[8] ^ C2[10] ^ C2[14] ^ C1[6] ^ C1[7] ^ C1[8] ^
C1[10] ^ C1[11] ^ C1[12] ^ C1[13] ^ C1[14];
C1[15] <= 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] ^ C2[5] ^
C2[8] ^ C2[9] ^ C2[11] ^ C2[15] ^ C1[7] ^ C1[8] ^ C1[9] ^
C1[11] ^ C1[12] ^ C1[13] ^ C1[14] ^ C1[15];
end
end
endmodule