zoukankan      html  css  js  c++  java
  • CRC校验码

    例如:g(x)=x^4+x^3+x^2+1,(7,3)码,信息码110产生的CRC码就是1001。
    对于g(x)=x^4+x^3+x^2+1的解释:(都是从右往左数)x4就是第五位是1,因为没有x1所以第2位就是0。
    11101 | 110,0000(设a=11101 ,b=1100000)
    用b除以a做模2运算得到余数:1001
    余数是1001,所以CRC码是1001,传输码为:110,1001
    以原始数据长度为496的CRC16的译码程序为例,下面给出师兄的Verilog代码:

    module CRC16_cal(
      input clk,
      input rst,
      input data_in,
      input data_in_valid,
      output [15:0] CRC_out,
      output reg CRC_finish_flag
    );
    reg [511:0] data_reg;
    reg [5:0] state;
    reg [8:0] input_counter;
    reg [8:0] shift_counter;
    parameter state_input=6'b000001;
    parameter state_calculate=6'b000010;
    parameter gen_poly=17'b10000100000010001;

    assign CRC_out=data_reg[16:1];

    always @(posedge clk or posedge rst)
    if(rst==1'b1)
    begin
      CRC_finish_flag<=1'b0;
      data_reg<=512'd0;
      state<=state_input;
      input_counter<=9'd0;
      shift_counter<=9'd0;
    end
    else
    begin
      case(state)
        state_input:
        begin
          CRC_finish_flag<=1'b0;
          if(data_in_valid==1'b1)
          begin
            data_reg[495]<=data_in;
            data_reg[494:0]<=data_reg[495:1];
            if(input_counter==9'd495)
            begin
              state<=state_calculate;
              input_counter<=9'd0;
            end
            else
              input_counter<=input_counter+9'd1;
          end
        end
        state_calculate:
        begin
          if(data_reg[0]==1'b0)
          begin
            if(shift_counter==9'd495)
            begin
              CRC_finish_flag<=1'b1;
              state<=state_input;
              shift_counter<=9'd0;
            end
            else
            begin
              shift_counter<=shift_counter+9'd1;
              data_reg[510:0]<=data_reg[511:1];
              data_reg[511]<=1'b0;
            end
          end
          else
          begin
            data_reg[16:0]<=data_reg[16:0]^gen_poly;
          end
        end
        default state<=state_input;
      endcase
    end

    endmodule

    //以上代码的主体部分则为state_calculate中的一段代码,如下

    if(data_reg[0]==1'b0)
    begin
      data_reg[510:0]<=data_reg[511:1];
      data_reg[511]<=1'b0;
    end
    else
      data_reg[16:0]<=data_reg[16:0]^gen_poly;

    该段代码循环执行shift_counter次,shift_counter = length(data_CRC) - length(gen_poly)  = = 512 - 17 = length(data_org) - 1 = 496 - 1  = 495.

    补充:CRC的的“漏警率”为0.0047%

     
     [引文]:
     
     
  • 相关阅读:
    《Android 编程权威指南》读书总结
    hadoop记录-浅析Hadoop中的DistCp和FastCopy(转载)
    Hadoop记录-queue使用率
    Hadoop记录-切换NN
    Hadoop记录-退役
    Hadoop记录-queue mysql
    Linux记录-grafana opentsdb安装
    Hadoop记录-JMX参数
    Linux记录-open-falcon开源监控系统部署
    Hadoop记录- Yarn Job MAX
  • 原文地址:https://www.cnblogs.com/achangchang/p/11406183.html
Copyright © 2011-2022 走看看