作者:tcystars_628 | 来源:互联网 | 2023-09-25 09:17
CRC校验代码:(已经验证可行)moduleCRC_7(BITVAL,Enable,CLK,RST,CRC);inputBITVAL;Nextinputbit
CRC校验代码:(已经验证可行)
module CRC_7(BITVAL, Enable, CLK, RST, CRC);
input BITVAL;// Next input bit
input Enable;
input CLK; // Current bit valid (Clock)
input RST; // Init CRC value
output [6:0] CRC; // Current output CRC value
reg [6:0] CRC;
// We need output registers
wire inv;
assign inv = BITVAL ^ CRC[6]; // XOR required
always @(posedge CLK or posedge RST) begin
if (RST) begin
CRC = 0;
end
else begin
if (Enable==1) begin
CRC[6] = CRC[5];
CRC[5] = CRC[4];
CRC[4] = CRC[3];
CRC[3] = CRC[2] ^ inv;
CRC[2] = CRC[1];
CRC[1] = CRC[0];
CRC[0] = inv;
end
end
end
endmodule
使用方法,将需要进行CRC校验的数据在一位一位的赋值给BITVAL(每个时钟沿到来之前赋值给BITVAL),在最后一位赋值完成之后,经过最后一个时钟,output产生的CRC7就是得到的7位CRC校验位
modelsim仿真代码和仿真图如下:对数据40'b01_010001_00000000000000000000000000000000进行40个时钟处理,校验得到结果“0101010”
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 17:03:38 10/23/2013
// Design Name:
// Module Name: crc_tb
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 15:59:02 10/23/2013
// Design Name:
// Module Name: crc7_tb
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module crc7_tb;
parameter ClockPeriod=10;
reg BITVAL,Enable,CLK,RST;
integer i=0;
wire [6:0] CRC;
reg [39:0] cmd=40'b01_010001_00000000000000000000000000000000;
sd_crc_7 crc_7_1(BITVAL, Enable, CLK, RST, CRC);
initial begin
CLK=1'b0;
forever CLK =#(ClockPeriod /2) ~CLK;
end
initial begin
RST=0;
#10 RST=1;
#8 RST=0;
end
initial begin
Enable=0;
#18 Enable=1;
#410 Enable=0;
end
initial begin
BITVAL=0;
#10 ;
for(i=39;i>=0;i=i-1)
#10 BITVAL= cmd[i];
$display ("crc is %b",CRC);
#20 $stop();
end
endmodule