1 前言

在 前面的博客  CRC校验原理和verilog实现方法()  中,介绍了CRC校验的原理和手动计算过程。本文说一下我在学习CRC校验FPGA实现的一点心得体会。

2 线性反馈移位寄存器

线性反馈移位寄存器简称LFSR,用于产生可重复的伪随机序列,也可用来实现CRC校验。LFSR主要由触发器(寄存器)、异或门以及反馈线路组成。

已知多项式,其中gn~g0 是系数,g0取值为1,其他系数可以是0或1。该多项式用二进制表示为,用LFSR表示为:

或者表示为:

第一种表示法为伽罗瓦LFSR,第二种表示法叫斐波那契LFSR。

可以看出,对于一个n次多项式,可以使用n-1个移位寄存器和最多n-2个异或门实现。LFSR可以实现模二除法。

3 模2除法与LFSR

把被除数的数据,从第一个寄存器的输入端接入,就可以实现模二运算。

对于一个n次多项式,可以使用n-1个移位寄存器,和最多n-1个异或门,实现模二运算。

假如被除数是2位的数据S[1:0]=01b,多项式是10011b。CRC校验里面,习惯省略最高位的1,多项式用0011b表示。那么S除以0011b的模二运算数字电路结构为:

其中d1~d4是寄存器输入;q1~q4是寄存器输出。寄存器需要赋初值,一般赋全1或全0。

下面对模二运算的逻辑表达式进行推导。

首先MSB参与计算,此时:

d1=S[1]^q4;

d2= S[1]^q1^q4;

d3=q2;

d4=q3。

经过一次移位后:

q1=d1= S[1]^q4;

q2= d2= S[1]^q1^q4;

q3= d3=q2;

q4= d4=q3。

此时有:

d1=S[0]^q3;

d2= S[0]^ S[1]^q4^q3;

d3= S[1]^q1^q4;

d4= q2。

令c[3:0]={q4,q3,q2,q1},d[3:0]={d4,d3,d2,d1},那么d就是最终的运算结果表达式,如下

d[3]=c[1];

d[2]= S[1]^c[0]^c[3];

d[1]= S[0]^ S[1]^ c[3]^ c[2];

d[0]= S[0]^ c[2]。

令c的初值为0,则01b对0011b的模二除法的余数为0011。

与手动计算进行对比,结果一致。

上述的被除数S可以换成任意位宽,推导过程一样,当然S位宽越大,推导越复杂,最终的逻辑表达式也越复杂。

上面的逻辑表达式,用verilog异或逻辑门很容易实现。

4 CRC校验的verilog实现

知道如何用verilog实现模二除法,CRC校验的实现就很容易了。但是CRC校验模型一般会有一些特定要求,如输入输出翻转、CRC寄存器初始值等。下一篇博客继续分享。

参考链接:

1、 https://blog.csdn.net/qq_44113393/article/details/89852994

2、 https://www.cnblogs.com/weijianlong/p/11947741.html

CRC校验原理和verilog实现方法(二)的更多相关文章

  1. CRC校验原理和verilog实现方法(一)

    1.CRC简介 CRC全称循环冗余校验(Cyclic Redundancy Check, CRC),是通信领域数据传输技术中常用的检错方法,用于保证数据传输的可靠性.网上有关这方面的博客和资料很多,本 ...

  2. CRC校验原理和verilog实现方法(三)

    1 代码生成 verilog实现CRC校验,可以充分发挥FPGA的硬件特性,即并行运算的能力. 具体实现方式,可以参考我上一篇博客,关键是用线性反馈移位寄存器表示出多项式,另外注意校验数据高位在先.然 ...

  3. 流水线技术原理和Verilog HDL实现(转)

    源:流水线技术原理和Verilog HDL实现 所谓流水线处理,如同生产装配线一样,将操作执行工作量分成若干个时间上均衡的操作段,从流水线的起点连续地输入,流水线的各操作段以重叠方式执行.这使得操作执 ...

  4. 流水线技术原理和Verilog HDL实现

    所谓流水线处理,如同生产装配线一样,将操作执行工作量分成若干个时间上均衡的操作段,从流水线的起点连续地输入,流水线的各操作段以重叠方式执行.这使得操作执行速度只与流水线输入的速度有关,而与处理所需的时 ...

  5. golang中浮点型底层存储原理和decimal使用方法

    var price float32 = 39.29 float64和float32类似,只是用于表示各部分的位数不同而已,其中:sign=1位,exponent=11位,fraction=52位,也就 ...

  6. Verilog语言实现并行(循环冗余码)CRC校验

    1 前言 (1)    什么是CRC校验? CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定.循环冗余检查(CRC)是一种数据传输检错功能, ...

  7. 用C#实现的几种常用数据校验方法整理(CRC校验;LRC校验;BCC校验;累加和校验)

    CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定.循环冗余检查(CRC)是一种数据传输检错 ...

  8. 常用校验码(奇偶校验码、海明校验码、CRC校验码)

    一.奇偶校验码 二.海明校验码 三.CRC校验码   计算机系统运行时,各个部之间要进行数据交换.交换的过程中,会有发生误码的可能(即0变成1或1变成0),由于计算机的储存是通过二进制代码来实现的的, ...

  9. CRC校验的C语言实现

    文章转自 循环冗余校验(CRC)算法入门引导 - Ivan 的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/liyuanbhu/article/details/7 ...

随机推荐

  1. IDEA2020.2版本设置类和方法的自定义注释模板

    IDEA是目前普遍使用的Java开发编辑器,添加自定义的注释模板,一方面便捷好用,另外一方面可以规范开发.IDEA中设置模板分两种:1.创建Java类的注释,2.方法的注释. 一.Java类的注释模板 ...

  2. ES6学习笔记之函数(一)

    1.函数的默认参数 在ES6 之前,我们不能直接为函数的参数指定默认值,只能采用其他方法.如: function show (num, callback){ num = num || 6; callb ...

  3. Kubernetes之deployment

    Kubernetes实现了零停机的升级过程.升级操作可以通过使用ReplicationController或者ReplicaSet实现,但是Kubernetes提供了另一种基于ReplicaSet的资 ...

  4. redis优化小建议

    1.优化的一些小建议 1.尽量使用短的key 当然在精简的同时,不要为了key的"见名知意".对于value有些也可精简,比如性别使用0.1. 2.每个redis设置合理内存 每个 ...

  5. rsync 基本使用

    基本参数 # rsync -P test.tar.gz ./ test.tar.gz 395,706,368 48% 377.34MB/s 0:00:01 Or # rsync -avPh test. ...

  6. 29、vi和vim用法详解

    vi类似于windows中的文本文件,用于普通的文本文件 vim:专家版的文件编辑器,用于shell程序型文件,带颜色,自检查语法 一般模式快捷键 O:光标到一行的首 $:光标到一行的尾 H:光标到整 ...

  7. phpstorm之"Can not run PHP Code Sniffer"

    前言 其实我是不太愿意写这种工具使用博客的,因为实在没有营养,只是有些简单问题,搜索一番,却始终找不到答案,遂以博客记录下来,希望后面的人,可以省去搜索之苦. 相信你搜到这篇博客,肯定是已经安装好了P ...

  8. 合并N个长度为M的有序数组为一个N*M的有序数组

    题目:合并N个有序数组,每个数组的长度为M,合并为N*M的有序数组.时间复杂度要求最低 解法:N个数组进行两两合并,合并后的数组再继续执行合并过程,最后合成N*M的有序数组.可以认为合并这个递归过程发 ...

  9. Java实验项目二——打印某年某月日历

    Program:打印万年历(输入年份,月份,输出该月的日历,已知1900年1月1日是星期一), 要 求: (1)编写一个方法判断闰年: (2)编写一个方法判断某年某月有多少天: (3)编写一个方法计算 ...

  10. ScienceDirect内容爬虫

    爬虫违法,本贴方法只限于个人对数据的分析使用,其爬虫程序已作相关设置,以减小服务器压力.不适宜长期使用. 一.前期准备 1.使用chrome打开ScienceDirect网站(https://www. ...