mirror of https://github.com/lnis-uofu/SOFA.git
43 lines
1.6 KiB
Verilog
43 lines
1.6 KiB
Verilog
// ==========================================================================
|
|
// CRC Generation Unit - Linear Feedback Shift Register implementation
|
|
// (c) Kay Gorontzi, GHSi.de, distributed under the terms of LGPL
|
|
// ==========================================================================
|
|
module sd_crc_16(BITVAL, ENABLE, BITSTRB, CLEAR, CRC);
|
|
input BITVAL; // Next input bit
|
|
input ENABLE; // Enable calculation
|
|
input BITSTRB; // Current bit valid (Clock)
|
|
input CLEAR; // Init CRC value
|
|
output [15:0] CRC; // Current output CRC value
|
|
|
|
reg [15:0] CRC; // We need output registers
|
|
wire inv;
|
|
|
|
assign inv = BITVAL ^ CRC[15]; // XOR required?
|
|
|
|
always @(posedge BITSTRB or posedge CLEAR) begin
|
|
if (CLEAR) begin
|
|
CRC <= 0; // Init before calculation
|
|
end
|
|
else begin
|
|
if (ENABLE == 1) begin
|
|
CRC[15] <= CRC[14];
|
|
CRC[14] <= CRC[13];
|
|
CRC[13] <= CRC[12];
|
|
CRC[12] <= CRC[11] ^ inv;
|
|
CRC[11] <= CRC[10];
|
|
CRC[10] <= CRC[9];
|
|
CRC[9] <= CRC[8];
|
|
CRC[8] <= CRC[7];
|
|
CRC[7] <= CRC[6];
|
|
CRC[6] <= CRC[5];
|
|
CRC[5] <= CRC[4] ^ inv;
|
|
CRC[4] <= CRC[3];
|
|
CRC[3] <= CRC[2];
|
|
CRC[2] <= CRC[1];
|
|
CRC[1] <= CRC[0];
|
|
CRC[0] <= inv;
|
|
end
|
|
end
|
|
end
|
|
|
|
endmodule |