| @@ -0,0 +1,47 @@ | |||||
| `timescale 1ns / 1ps | |||||
| module crc_gen #( | |||||
| parameter int CRC_SIZE = 24, | |||||
| parameter int DATA_WIDTH = 140, | |||||
| parameter bit [63 : 0] INIT = 'h0 | |||||
| )( | |||||
| input clk_i, | |||||
| input rst_n, | |||||
| input [24:0] POLY, | |||||
| input [DATA_WIDTH - 1 : 0] data_i, // Input Information bit | |||||
| output reg [CRC_SIZE - 1 : 0] crc_o // output CRC of information Input | |||||
| ); | |||||
| logic [CRC_SIZE - 1 : 0] crc = 0; | |||||
| logic [CRC_SIZE - 1 : 0] crc_next; | |||||
| logic [CRC_SIZE - 1 : 0] crc_prev; | |||||
| always_ff @( posedge clk_i ) | |||||
| if( !rst_n ) | |||||
| crc_o <= INIT[CRC_SIZE - 1 : 0]; | |||||
| else | |||||
| begin | |||||
| crc_o <= crc_prev; | |||||
| end | |||||
| generate | |||||
| always_comb | |||||
| begin | |||||
| crc_next = crc; | |||||
| crc_prev = crc; | |||||
| for( int i = 0; i < DATA_WIDTH; i ++ ) | |||||
| begin | |||||
| crc_next[0] = crc_prev[CRC_SIZE - 1] ^ data_i[DATA_WIDTH - 1 - i]; | |||||
| for( int j = 1; j < CRC_SIZE; j++ ) | |||||
| if( POLY[j] ) | |||||
| crc_next[j] = crc_prev[j - 1] ^ crc_prev[CRC_SIZE - 1] ^ data_i[DATA_WIDTH - 1 - i]; | |||||
| else | |||||
| crc_next[j] = crc_prev[j - 1]; | |||||
| crc_prev = crc_next; | |||||
| end | |||||
| end | |||||
| endgenerate | |||||
| endmodule | |||||