blob: db0d1c73abbe640c4cba596e0035646560a98fd9 [file] [log] [blame]
//////////////////////////////////////////////////////////////////////////////
// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// SPDX-License-Identifier: Apache-2.0
// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
//
//////////////////////////////////////////////////////////////////////
//// crc_32.v: CRC is generated on when run is asserted. ////
//// The 32-bit crc shift register is reset to ////
//// all 1's when either clear asserted ////
//// ////
//// ////
//// Author(s): ////
//// - Dinesh Annayya, dinesha@opencores.org ////
//// ////
//// Revision : ////
//// 0.1 - 28 Nov 2021, Dinesh A ////
//// Initial Version ////
//////////////////////////////////////////////////////////////////////
module crc_32 (
// List of outputs.
output logic [31:0] crc_out,
// List of inputs
input logic run, // when asserted, crc is generated
input logic clear , // When asserted crc is re-initialized
input logic [7:0] data_in,
input logic mclk,
input logic reset_n
);
//----------------------------------
// define local signals here.
//----------------------------------
logic[31:0] current_crc, next_crc;
assign crc_out = ~current_crc;
// 32-bit crc shift register for crc calculation.
always @(posedge mclk or negedge reset_n)
begin
if (!reset_n)
begin
current_crc <= 32'hffffffff;
end
else
begin
if (clear )
begin
current_crc <= 32'hffffffff;
end
else if (run) // generate crc
begin
current_crc <= next_crc;
end // else: !if(tx_reset_crc )
end // else: !if(reset_n)
end // always @ (posedge mclk or negedge reset_n)
// combinational logic to generate next_crc
always_comb
begin
next_crc[0] = current_crc[8] ^ current_crc[2] ^ data_in[2];
next_crc[1] = current_crc[9] ^ current_crc[0] ^ data_in[0] ^
current_crc[3] ^ data_in[3];
next_crc[2] = current_crc[10] ^ current_crc[0] ^ data_in[0] ^
current_crc[1] ^ data_in[1] ^ current_crc[4] ^
data_in[4];
next_crc[3] = current_crc[11] ^ current_crc[1] ^ data_in[1] ^
current_crc[2] ^ data_in[2] ^ current_crc[5] ^
data_in[5];
next_crc[4] = current_crc[12] ^ current_crc[2] ^ data_in[2] ^
current_crc[3] ^ data_in[3] ^ current_crc[6] ^
current_crc[0] ^ data_in[0] ^ data_in[6];
next_crc[5] = current_crc[13] ^ current_crc[3] ^ data_in[3] ^
current_crc[4] ^ data_in[4] ^ current_crc[7] ^
current_crc[1] ^ data_in[1] ^ data_in[7];
next_crc[6] = current_crc[14] ^ current_crc[4] ^ data_in[4] ^
current_crc[5] ^ data_in[5];
next_crc[7] = current_crc[15] ^ current_crc[5] ^ data_in[5] ^
current_crc[6] ^ current_crc[0] ^ data_in[0] ^
data_in[6];
next_crc[8] = current_crc[16] ^ current_crc[0] ^ data_in[0] ^
current_crc[6] ^ current_crc[0] ^ data_in[0] ^
data_in[6] ^ current_crc[7] ^ current_crc[1] ^
data_in[1] ^ data_in[7];
next_crc[9] = current_crc[17] ^ current_crc[1] ^ data_in[1] ^
current_crc[7] ^ current_crc[1] ^ data_in[1] ^
data_in[7];
next_crc[10] = current_crc[18] ^ current_crc[2] ^ data_in[2];
next_crc[11] = current_crc[19] ^ current_crc[3] ^ data_in[3];
next_crc[12] = current_crc[20] ^ current_crc[0] ^ data_in[0] ^
current_crc[4] ^ data_in[4];
next_crc[13] = current_crc[21] ^ current_crc[0] ^ data_in[0] ^
current_crc[1] ^ data_in[1] ^ current_crc[5] ^
data_in[5];
next_crc[14] = current_crc[22] ^ current_crc[0] ^ data_in[0] ^
current_crc[1] ^ data_in[1] ^ current_crc[2] ^
data_in[2] ^ current_crc[6] ^ current_crc[0] ^
data_in[0] ^ data_in[6];
next_crc[15] = current_crc[23] ^ current_crc[1] ^ data_in[1] ^
current_crc[2] ^ data_in[2] ^ current_crc[3] ^
data_in[3] ^ current_crc[7] ^ current_crc[1] ^
data_in[1] ^ data_in[7];
next_crc[16] = current_crc[24] ^ current_crc[0] ^ data_in[0] ^
current_crc[2] ^ data_in[2] ^ current_crc[3] ^
data_in[3] ^ current_crc[4] ^ data_in[4];
next_crc[17] = current_crc[25] ^ current_crc[0] ^ data_in[0] ^
current_crc[1] ^ data_in[1] ^ current_crc[3] ^
data_in[3] ^ current_crc[4] ^ data_in[4] ^
current_crc[5] ^ data_in[5];
next_crc[18] = current_crc[26] ^ current_crc[1] ^ data_in[1] ^
current_crc[2] ^ data_in[2] ^ current_crc[4] ^
data_in[4] ^ current_crc[5] ^ data_in[5] ^
current_crc[6] ^ current_crc[0] ^ data_in[0] ^
data_in[6];
next_crc[19] = current_crc[27] ^ current_crc[0] ^ data_in[0] ^
current_crc[2] ^ data_in[2] ^ current_crc[3] ^
data_in[3] ^ current_crc[5] ^ data_in[5] ^
current_crc[6] ^ current_crc[0] ^ data_in[0] ^
data_in[6] ^ current_crc[7] ^ current_crc[1] ^
data_in[1] ^ data_in[7];
next_crc[20] = current_crc[28] ^ current_crc[0] ^ data_in[0] ^
current_crc[1] ^ data_in[1] ^ current_crc[3] ^
data_in[3] ^ current_crc[4] ^ data_in[4] ^
current_crc[6] ^ current_crc[0] ^ data_in[0] ^
data_in[6] ^ current_crc[7] ^ current_crc[1] ^
data_in[1] ^ data_in[7];
next_crc[21] = current_crc[29] ^ current_crc[1] ^ data_in[1] ^
current_crc[2] ^ data_in[2] ^ current_crc[4] ^
data_in[4] ^ current_crc[5] ^ data_in[5] ^
current_crc[7] ^ current_crc[1] ^ data_in[1] ^
data_in[7];
next_crc[22] = current_crc[30] ^ current_crc[0] ^ data_in[0] ^
current_crc[2] ^ data_in[2] ^ current_crc[3] ^
data_in[3] ^ current_crc[5] ^ data_in[5] ^
current_crc[6] ^ current_crc[0] ^ data_in[0] ^
data_in[6];
next_crc[23] = current_crc[31] ^ current_crc[0] ^ data_in[0] ^
current_crc[1] ^ data_in[1] ^ current_crc[3] ^
data_in[3] ^ current_crc[4] ^ data_in[4] ^
current_crc[6] ^ current_crc[0] ^ data_in[0] ^
data_in[6] ^ current_crc[7] ^ current_crc[1] ^
data_in[1] ^ data_in[7];
next_crc[24] = current_crc[0] ^ data_in[0] ^ current_crc[1] ^
data_in[1] ^ current_crc[2] ^ data_in[2] ^
current_crc[4] ^ data_in[4] ^ current_crc[5] ^
data_in[5] ^ current_crc[7] ^ current_crc[1] ^
data_in[1] ^ data_in[7];
next_crc[25] = current_crc[1] ^ data_in[1] ^ current_crc[2] ^
data_in[2] ^ current_crc[3] ^ data_in[3] ^
current_crc[5] ^ data_in[5] ^ current_crc[6] ^
current_crc[0] ^ data_in[0] ^ data_in[6];
next_crc[26] = current_crc[2] ^ data_in[2] ^ current_crc[3] ^
data_in[3] ^ current_crc[4] ^ data_in[4] ^
current_crc[6] ^ current_crc[0] ^ data_in[0] ^
data_in[6] ^ current_crc[7] ^ current_crc[1] ^
data_in[1] ^ data_in[7];
next_crc[27] = current_crc[3] ^ data_in[3] ^ current_crc[4] ^
data_in[4] ^ current_crc[5] ^ data_in[5] ^
current_crc[7] ^ current_crc[1] ^ data_in[1] ^
data_in[7];
next_crc[28] = current_crc[4] ^data_in[4] ^ current_crc[5] ^
data_in[5] ^ current_crc[6] ^ current_crc[0] ^
data_in[0] ^ data_in[6];
next_crc[29] = current_crc[5] ^ data_in[5] ^ current_crc[6] ^
current_crc[0] ^ data_in[0] ^ data_in[6] ^
current_crc[7] ^ current_crc[1] ^ data_in[1] ^
data_in[7];
next_crc[30] = current_crc[6] ^ current_crc[0] ^ data_in[0] ^
data_in[6] ^ current_crc[7] ^ current_crc[1] ^
data_in[1] ^ data_in[7];
next_crc[31] = current_crc[7] ^ current_crc[1] ^ data_in[1] ^
data_in[7];
end // always
endmodule