CRC并行运算原理分析,公式推导及MATLAB实现,并行CRC Verilog代码生成

  1. 本文参考了博客:https://blog.csdn.net/qq_16923717/article/details/83826856,但是对文章里面的推导和MATLAB实现有点看不太懂+ +,但是这篇博客确实很容易让人理解,这里是对此博客的补充。根据博客的内容下载了论文:Parallel_CRC_Realization,本文的公式均来自本篇文章,下载网址见下。http://citeseerx.ist.psu.edu/viewdoc/download;jsessionid=D55EB495178455E2B887E1157ABD951A?doi=10.1.1.75.387&rep=rep1&type=pdf
  2. 因为博客里面关于F矩阵的来源已经很详细了,所以本文直接从F矩阵开始。图1是F矩阵的一般形式,主要分为三部分:①、第一列与CRC多项式对应,因为最高项在每次计算CRC的时候都会被省去,所以在使用矩阵表示多项式时,不考虑最高项(如图中所示x^8+x^2+x^1+1对应的应是1 0000 0111,去掉最高位即是0000 01111,参考网址https://blog.csdn.net/jingling122/article/details/80116568,原因可见图4中画红线部分,图片来自此博客。②、F矩阵的右上是一个m-1阶的单位矩阵。③、最下面一行除了第一个元素均补零。图2和图3是8阶F矩阵,以及求出的F^8推导8位并行表达式。CRC并行运算原理分析,公式推导及MATLAB实现,并行CRC Verilog代码生成_第1张图片CRC并行运算原理分析,公式推导及MATLAB实现,并行CRC Verilog代码生成_第2张图片
  3. 使用代码生成器生成的并行CRC8 Verilog代码。网址:https://www.easics.com/webtools/crctool。查看代码除了数据Data,还有CRC的初始值crc,以及最后的返回值newcrc。
    //   * polynomial: x^8 + x^2 + x^1 + 1
    //   * data width: 8
    // convention: the first serial bit is D[7]
    module CRC8_D8;
    
      function [7:0] nextCRC8_D8;
    
        input [7:0] Data;
        input [7:0] crc;
        reg [7:0] d;
        reg [7:0] c;
        reg [7:0] newcrc;
      begin
        d = Data;
        c = crc;
    
        newcrc[0] = d[7] ^ d[6] ^ d[0] ^ c[0] ^ c[6] ^ c[7];%低位,对应F^8矩阵第一列数据的最后一个
        newcrc[1] = d[6] ^ d[1] ^ d[0] ^ c[0] ^ c[1] ^ c[6];
        newcrc[2] = d[6] ^ d[2] ^ d[1] ^ d[0] ^ c[0] ^ c[1] ^ c[2] ^ c[6];
        newcrc[3] = d[7] ^ d[3] ^ d[2] ^ d[1] ^ c[1] ^ c[2] ^ c[3] ^ c[7];
        newcrc[4] = d[4] ^ d[3] ^ d[2] ^ c[2] ^ c[3] ^ c[4];
        newcrc[5] = d[5] ^ d[4] ^ d[3] ^ c[3] ^ c[4] ^ c[5];
        newcrc[6] = d[6] ^ d[5] ^ d[4] ^ c[4] ^ c[5] ^ c[6];
        newcrc[7] = d[7] ^ d[6] ^ d[5] ^ c[5] ^ c[6] ^ c[7];%高位,对应F^8矩阵第一列数据的第一个
        nextCRC8_D8 = newcrc;
      end
      endfunction
    endmodule
    
  4. 是因为这里考虑了初始CRC不为零的情况,因为在多字节计算时,需要异或上一字节计算的校验和。论文中的推导因为不涉及这里,默认CRC的初始值为0。在添加CRC的初始值的计算过程是:Data^CRC_Init,再进行并行CRC计算。原理如图5。最后的结果与代码生成器里面的公式是一样的(根据异或交换律调换位置即可)。图5的计算过程不是单纯的矩阵相乘,如果是单纯的矩阵相乘,得到应该是图6。然后将第一行所有的数据进行异或,以第一列数据为例,D7^C7^D6^C6^D5^C5^0^0^0^0^0,因为^0还是原数据,所以化简为D7^C7^D6^C6^D5^C5。(问题:如果是进行并行CRC计算,再^CRC_Init,理论上是一致的结果,这一块没有理解到了)。 CRC并行运算原理分析,公式推导及MATLAB实现,并行CRC Verilog代码生成_第3张图片CRC并行运算原理分析,公式推导及MATLAB实现,并行CRC Verilog代码生成_第4张图片
  5. 对于求width=8,求其F^8矩阵的MATLAB代码如下,MATLAB求\oplus \otimes(异或、与)的函数分别为xor、and。对于其他位宽n的代码,对应修改F矩阵的阶数为n,第一列数据为去掉最高位后的数据。
    %构建F矩阵,8位输入,多项式:x^8 + x^2 + x^1 + 1,求F^8
    %Ploy为1 0000 0111,去掉最高位,为0000 0111对应第一列数据
    F=[0 1 0 0 0 0 0 0; 
       0 0 1 0 0 0 0 0;
       0 0 0 1 0 0 0 0;
       0 0 0 0 1 0 0 0;
       0 0 0 0 0 1 0 0;
       1 0 0 0 0 0 1 0;
       1 0 0 0 0 0 0 1;
       1 0 0 0 0 0 0 0];
    F8=mod(F^8,2);%求F^8矩阵,mod函数对2求余,原理暂时不明
    disp(F8);%在命令行窗口打印矩阵
  6. 公式推导:具体公式推导可以查看上文链接中的博客以及论文,《CRC查询表及其并行矩阵生成方法》这篇论文。链接:https://pan.baidu.com/s/1PL6DGn2T6Xy3Wmbp7HQglA提取码kgyb
    CRC并行运算原理分析,公式推导及MATLAB实现,并行CRC Verilog代码生成_第5张图片
  7. 下图求位宽为4的并行CRC求得的表达式矩阵,对应的MATLAB代码和运算结果和论文保持一致。CRC并行运算原理分析,公式推导及MATLAB实现,并行CRC Verilog代码生成_第6张图片
    %构建F矩阵,4位输入,多项式:x^4 + x^3 + 1,求F^4
    %Ploy为1 1001,去掉最高位,为1001对应第一列数据
    F=[1 1 0 0; 
       0 0 1 0;
       0 0 0 1;
       1 0 0 0];
    F4=mod(F^4,2);%求F^4矩阵,mod函数对2求余,原理暂时不明
    disp(F);%在命令行窗口打印矩阵
    disp(F4);%在命令行窗口打印矩阵

   CRC并行运算原理分析,公式推导及MATLAB实现,并行CRC Verilog代码生成_第7张图片

 

 

你可能感兴趣的:(MATLAB)