| //----------------------------------------------------- | |
| // Design Name : parallel_crc_ccitt | |
| // File Name : parallel_crc.v | |
| // Function : CCITT Parallel CRC | |
| // Coder : Deepak Kumar Tala | |
| //----------------------------------------------------- | |
| module parallel_crc_ccitt ( | |
| clk , | |
| reset , | |
| enable , | |
| init , | |
| data_in , | |
| crc_out | |
| ); | |
| //-----------Input Ports--------------- | |
| input clk ; | |
| input reset ; | |
| input enable ; | |
| input init ; | |
| input [7:0] data_in ; | |
| //-----------Output Ports--------------- | |
| output [15:0] crc_out; | |
| //------------Internal Variables-------- | |
| reg [15:0] crc_reg; | |
| wire [15:0] next_crc; | |
| //-------------Code Start----------------- | |
| assign crc_out = crc_reg; | |
| // CRC Control logic | |
| always @ (posedge clk) | |
| if (reset) begin | |
| crc_reg <= 16'hFFFF; | |
| end else if (enable) begin | |
| if (init) begin | |
| crc_reg <= 16'hFFFF; | |
| end else begin | |
| crc_reg <= next_crc; | |
| end | |
| end | |
| // Parallel CRC calculation | |
| assign next_crc[0] = data_in[7] ^ data_in[0] ^ crc_reg[4] ^ crc_reg[11]; | |
| assign next_crc[1] = data_in[1] ^ crc_reg[5]; | |
| assign next_crc[2] = data_in[2] ^ crc_reg[6]; | |
| assign next_crc[3] = data_in[3] ^ crc_reg[7]; | |
| assign next_crc[4] = data_in[4] ^ crc_reg[8]; | |
| assign next_crc[5] = data_in[7] ^ data_in[5] ^ data_in[0] ^ crc_reg[4] ^ crc_reg[9] ^ crc_reg[11]; | |
| assign next_crc[6] = data_in[6] ^ data_in[1] ^ crc_reg[5] ^ crc_reg[10]; | |
| assign next_crc[7] = data_in[7] ^ data_in[2] ^ crc_reg[6] ^ crc_reg[11]; | |
| assign next_crc[8] = data_in[3] ^ crc_reg[0] ^ crc_reg[7]; | |
| assign next_crc[9] = data_in[4] ^ crc_reg[1] ^ crc_reg[8]; | |
| assign next_crc[10] = data_in[5] ^ crc_reg[2] ^ crc_reg[9]; | |
| assign next_crc[11] = data_in[6] ^ crc_reg[3] ^ crc_reg[10]; | |
| endmodule |