基于FPGA的CRC校验原理

概念
线性反馈移位寄存器(Linear feedback shift register,LFSR)是指给定前一状态的输出,将该输出的线性函数再用作输入的移位寄存器。异或运算是最常见的单比特线性函数:对寄存器的某些位进行异或操作后作为输入,再对寄存器中的各比特进行整体移位。
赋给寄存器的初始值叫做“种子”,因为线性反馈移位寄存器的运算是确定性的,所以,由寄存器所生成的数据流完全决定于寄存器当时或者之前的状态。而且,由于寄存器的状态是有限的,它最终肯定会是一个重复的循环。然而,通过本原多项式,线性反馈移位寄存器可以生成看起来是随机的且循环周期非常长的序列。

线性反馈移位寄存器的应用包括生成伪随机数,伪随机噪声序列,快速数字计数器,还有扰频器。线性反馈移位寄存器在硬件和软件方面的应用都非常得普遍。 循环冗余校验中用于快速校验传输错误的数学原理,就与线性反馈移位寄存器密切相关。

Fibonacci LFSRs
影响下一个状态的比特位叫做抽头。图中,抽头序列为[16,14,13,11]。LFSR最右端的比特为输出比特。抽头依次与输出比特进行异或运算,然后反馈回最左端的位。最右端位置所生成的序列被称为输出流。



影响LFSR下一个状态的比特位叫做抽头(图中白色数字)
最大长度的LFSR生成一个M序列(例如,只有与有一定抽序列的LFSR才能通过所有 2n − 1 个内部状态,不包括全零状态),除非它本身为全零,亦即状态永不改变
作为基于异或运算的LFSR的替换,LFSR也可以给予同或运算。与使用异或门的LFSR全零状态下为无效状态相应的,使用同或门的LFSR在全“1”状态下也是无效的。
以上内容来自:中文维基百科:线性反馈移位寄存器

Cyclic redundancy check——CRC
如何设计CRC线性反馈移位寄存器?

移位寄存器的排列。从左到右:Reg0-Regn,最右方为输出比特流
特征多项式的排列。从左到右:x0-xn


基于FPGA的线性反馈移位寄存器
利用移位寄存器实现 CRC校验的一般形式为:



其中f(x) f(x)f(x)为特征多项式。

VCRC-7的Verilog实现为:

module crc_7(
    input    clk, rst,
    input    crc_en,                //使能信号
    input    sda_i,                 //data in,1bit
    output   reg [ 6: 0] crc_o      //data out,7bit
    );

    wire  inv = sda_i ^ crc_o[6];   //输入数据与输出数据的最高位进行异或
    //CRC-7        = x7 + x3 + 1
    always @(posedge clk or posedge rst)  begin
        if (rst) begin
            crc_o <= 0;
        end
        else begin
            if (crc_en == 1)  begin
                crc_o[6] <= crc_o[5];
                crc_o[5] <= crc_o[4];
                crc_o[4] <= crc_o[3];
                crc_o[3] <= crc_o[2] ^ inv;
                crc_o[2] <= crc_o[1];
                crc_o[1] <= crc_o[0];
                crc_o[0] <= inv;
            end
        end
     end

endmodule
 

你可能感兴趣的:(python)