小试一下CRC校验的verilog实现,采用最stupid的直接法。
/* date : 2014/06/06 designer : pengxiaoen virsion : Altera-Modelsim 6.6d function Straightforward CRC Implementation */ module CRC_stra ( clock , reset , and_crc_code ); input clock,reset ; output [13:0] and_crc_code ; parameter un_crc_code = 10'b11_0101_1011, //10位 待测数据 gener_code = 5'b10011; //生成项 reg [3:0] cnt ; //计算次数 = 待测数据的位数 - 1 reg [4:0] crc_code ; //余数缓存器 reg [9:0] code_reg ; //待测数据缓存 always @ (posedge clock ) if(!reset) begin cnt <= 3'd0 ; crc_code <= 5'd0 ; code_reg <= un_crc_code ; end else begin if(cnt==0) begin cnt <= cnt + 4'd1; code_reg <= code_reg<<1 ; // crc_code <= {gener_code[3:0] ^ code_reg[8:5] ,code_reg[4]}; end else if((cnt<=4'd8) &&(cnt)) begin cnt <= cnt + 4'd1; code_reg <= code_reg<<1 ; if(crc_code[4]) crc_code <= {gener_code[3:0] ^ crc_code[3:0] ,code_reg[4]}; else crc_code <= {crc_code[3:0], code_reg[4]}; end else begin cnt = 4'd9; end end assign and_crc_code = (cnt == 4'd9) ? {un_crc_code,crc_code[3:0]} : 14'dz; endmodule