清霜一梦

CRC校验

0
阅读(1364)

小试一下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