CRC7校验的Verilog实现

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


你可能感兴趣的:(CRC7校验的Verilog实现)