文章部分转自https://blog.csdn.net/yongan1006/article/details/8716456

LFSR主要用于通信加扰解扰;CRC主要用于通信传输数据校验。

一 、LFSR

线性反馈移位寄存器(LFSR)是内测试电路中最基本的标准模块结构,既用作伪随机测试码产生器,也作为压缩测试结果数据的特征分析器。

一个n阶的LFSR由n个触发器和若干个异或门组成。在实际应用当中,主要用到两种类型的LFSR,即异或门外接线性反馈移位寄存器(IE型LFSR,图1)和异或门内接线性反馈移位寄存器(EE型LFSR,图2)。其中g0 g1g2 gn为’0’或’1’,Q1 Q2Q3 Qn为LFSR的输出,M(x)是输入的码字多项式,如M(x)=x4+ x1+1,表示输入端的输入顺序为11001,同样,LFSR的结构也可以表示为多项式G(x),称为生成多项式:

G(x)=gn*xn+ …+g1*x1+g0;

图1 IE型LFSR

图2 EE型LFSR

需要注意的是一位寄存器的初始值不能为全0;

二 、CRC

循环冗余校验码(CRC)的基本原理是:在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码又叫(N,K)码。对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x)可以使整个编码被除余数为0。根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。校验码的具体生成过程为:假设发送信息用信息多项式C(X)表示,将C(x)左移R位,则可表示成C(x)*2的R次方,这样C(x)的右边就会空出R位,这就是校验码的位置。通过C(x)*2的R次方除以生成多项式G(x)得到的余数就是校验码。

通过CRC的生成原理知道CRC的检验码生成是通过除法得到,由此联想到可以通过LFSR来产生校验码。

假设原信息码子多项式为

生成多项式为

那么CRC的码字为 ,使用用LFSR电路来进行实现,将M(x)向左移r位在电路中的意义即为输入完信息码后再输入r个0,所以在电路上的表现就如图5所示。

图5 使用LFSR来产生CRE校验码

需要注意的是移位寄存器的初始值不同结果是不一致的。

三、并行实现CRC校验

上面介绍的CRC校验主要是用于单比特流的校验,但是很多实际应用中位宽很大的一组数据需要做CRC校验的情况时以上一位寄存器是不能实现的。例如M位宽的并行数据,我们可以根据移位前的N位寄存器值和M位并行数据的位宽数据做逻辑运算计算出(N+1)阶的CRC值。

代码生成工具网站:https://www.easics.be/webtools/crctool

此网站可以生成Verilog和VHDL的逻辑代码,如果是时序电路把逻辑电路可以修改成时序电路。

生成代码的“Data”是每次输入位宽的数据;“CRC”是初始CRC值和上次生成的CRC。

例如:生成多项式是x^16+x^15+x^2+1,初始值为全1;

生成代码为


// Copyright (C) 1999-2008 Easics NV.
// This source file may be used and distributed without restriction
// provided that this copyright statement is not removed from the file
// and that any derivative work contains the original copyright notice
// and the associated disclaimer.
//
// THIS SOURCE FILE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS
// OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
// WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
//
// Purpose : synthesizable CRC function
//   * polynomial: x^16 + x^15 + x^2 + 1
//   * data width: 16
//
// Info : tools@easics.be
//        http://www.easics.commodule CRC16_D16;// polynomial: x^16 + x^15 + x^2 + 1// data width: 16// convention: the first serial bit is D[15]function [15:0] nextCRC16_D16;input [15:0] Data;input [15:0] crc;reg [15:0] d;reg [15:0] c;reg [15:0] newcrc;begind = Data;c = crc;newcrc[0] = d[15] ^ d[13] ^ d[12] ^ d[11] ^ d[10] ^ d[9] ^ d[8] ^ d[7] ^ d[6] ^ d[5] ^ d[4] ^ d[3] ^ d[2] ^ d[1] ^ d[0] ^ c[0] ^ c[1] ^ c[2] ^ c[3] ^ c[4] ^ c[5] ^ c[6] ^ c[7] ^ c[8] ^ c[9] ^ c[10] ^ c[11] ^ c[12] ^ c[13] ^ c[15];newcrc[1] = d[14] ^ d[13] ^ d[12] ^ d[11] ^ d[10] ^ d[9] ^ d[8] ^ d[7] ^ d[6] ^ d[5] ^ d[4] ^ d[3] ^ d[2] ^ d[1] ^ c[1] ^ c[2] ^ c[3] ^ c[4] ^ c[5] ^ c[6] ^ c[7] ^ c[8] ^ c[9] ^ c[10] ^ c[11] ^ c[12] ^ c[13] ^ c[14];newcrc[2] = d[14] ^ d[1] ^ d[0] ^ c[0] ^ c[1] ^ c[14];newcrc[3] = d[15] ^ d[2] ^ d[1] ^ c[1] ^ c[2] ^ c[15];newcrc[4] = d[3] ^ d[2] ^ c[2] ^ c[3];newcrc[5] = d[4] ^ d[3] ^ c[3] ^ c[4];newcrc[6] = d[5] ^ d[4] ^ c[4] ^ c[5];newcrc[7] = d[6] ^ d[5] ^ c[5] ^ c[6];newcrc[8] = d[7] ^ d[6] ^ c[6] ^ c[7];newcrc[9] = d[8] ^ d[7] ^ c[7] ^ c[8];newcrc[10] = d[9] ^ d[8] ^ c[8] ^ c[9];newcrc[11] = d[10] ^ d[9] ^ c[9] ^ c[10];newcrc[12] = d[11] ^ d[10] ^ c[10] ^ c[11];newcrc[13] = d[12] ^ d[11] ^ c[11] ^ c[12];newcrc[14] = d[13] ^ d[12] ^ c[12] ^ c[13];newcrc[15] = d[15] ^ d[14] ^ d[12] ^ d[11] ^ d[10] ^ d[9] ^ d[8] ^ d[7] ^ d[6] ^ d[5] ^ d[4] ^ d[3] ^ d[2] ^ d[1] ^ d[0] ^ c[0] ^ c[1] ^ c[2] ^ c[3] ^ c[4] ^ c[5] ^ c[6] ^ c[7] ^ c[8] ^ c[9] ^ c[10] ^ c[11] ^ c[12] ^ c[14] ^ c[15];nextCRC16_D16 = newcrc;endendfunction
endmodule

仅供参考的时序电路为:

module CRC_16(input clk,input reset,input sync,input [15:0] Data,output [15:0] newcrc);reg [15:0] d;// wire [15:0] newcrc;reg [15:0] c;reg r_sync;always@(posedge clk)r_sync<=sync;always@(posedge clk or posedge reset) beginif(reset) begind<=16'd0;c<=16'd0;endelse if(sync) begind<=16'd0;c<=16'd0;endelse if(r_sync) begind <= Data;c <= 16'hFFFF;endelse begind <= Data;c <= newcrc;endendassign newcrc[0] = d[15] ^ d[13] ^ d[12] ^ d[11] ^ d[10] ^ d[9] ^ d[8] ^ d[7] ^ d[6] ^ d[5] ^ d[4] ^ d[3] ^ d[2] ^ d[1] ^ d[0] ^ c[0] ^ c[1] ^ c[2] ^ c[3] ^ c[4] ^ c[5] ^ c[6] ^ c[7] ^ c[8] ^ c[9] ^ c[10] ^ c[11] ^ c[12] ^ c[13] ^ c[15];assign newcrc[1] = d[14] ^ d[13] ^ d[12] ^ d[11] ^ d[10] ^ d[9] ^ d[8] ^ d[7] ^ d[6] ^ d[5] ^ d[4] ^ d[3] ^ d[2] ^ d[1] ^ c[1] ^ c[2] ^ c[3] ^ c[4] ^ c[5] ^ c[6] ^ c[7] ^ c[8] ^ c[9] ^ c[10] ^ c[11] ^ c[12] ^ c[13] ^ c[14];assign newcrc[2] = d[14] ^ d[1] ^ d[0] ^ c[0] ^ c[1] ^ c[14];assign newcrc[3] = d[15] ^ d[2] ^ d[1] ^ c[1] ^ c[2] ^ c[15];assign newcrc[4] = d[3] ^ d[2] ^ c[2] ^ c[3];assign newcrc[5] = d[4] ^ d[3] ^ c[3] ^ c[4];assign newcrc[6] = d[5] ^ d[4] ^ c[4] ^ c[5];assign newcrc[7] = d[6] ^ d[5] ^ c[5] ^ c[6];assign newcrc[8] = d[7] ^ d[6] ^ c[6] ^ c[7];assign newcrc[9] = d[8] ^ d[7] ^ c[7] ^ c[8];assign newcrc[10] = d[9] ^ d[8] ^ c[8] ^ c[9];assign newcrc[11] = d[10] ^ d[9] ^ c[9] ^ c[10];assign newcrc[12] = d[11] ^ d[10] ^ c[10] ^ c[11];assign newcrc[13] = d[12] ^ d[11] ^ c[11] ^ c[12];assign newcrc[14] = d[13] ^ d[12] ^ c[12] ^ c[13];assign newcrc[15] = d[15] ^ d[14] ^ d[12] ^ d[11] ^ d[10] ^ d[9] ^ d[8] ^ d[7] ^ d[6] ^ d[5] ^ d[4] ^ d[3] ^ d[2] ^ d[1] ^ d[0] ^ c[0] ^ c[1] ^ c[2] ^ c[3] ^ c[4] ^ c[5] ^ c[6] ^ c[7] ^ c[8] ^ c[9] ^ c[10] ^ c[11] ^ c[12] ^ c[14] ^ c[15];endmodule

testbench

module tb_crc_16;// Inputsreg clk;reg reset;reg sync;reg [15:0] Data;// Outputswire [15:0] c;// Instantiate the Unit Under Test (UUT)CRC_16 uut (.clk(clk), .reset(reset), .sync(sync), .Data(Data), .newcrc(c));initial beginclk=0;forever #5 clk=~clk;endinitial beginreset=1;#30 reset=0;endinitial beginsync=1;#50 sync=0;endinitial begin#50 Data<=16'h3132;#10 Data<=16'h3334;endendmodule

在CRC在线计算器网站http://www.ip33.com/crc.html   设置如下,验证结果:

LFSR和CRC串行实现移位寄存器结构,并行CRC时序实现相关推荐

  1. I2C总线串行串行输入输出结构

    I2C总线串行串行输入输出结构                 本文章以8XC552(飞利浦的一款微控制器)的IIC总线串行串行输入输出结构为例,深入理解IIC总线协议:               ...

  2. 8位串行输入串行输出移位寄存器的Verilog设计

    1 Verilog描述 module shift_s2s(     input         din,     input         clk,     output reg     dout ...

  3. 我要理解的CPU、核心,进程、线程,串行、并发、并行

    注意看修饰词. 1.计算机硬件基本组成 一个计算机(冯·诺依曼结构)[主要]硬件组成: 主板:是"交通枢纽",各个部件工作的所在平台,它负责将各个部件紧密连接在一起,各部件通过主板 ...

  4. Verilog 串行FIR滤波器、并行FIR滤波器设计、FIR IP核实现

    fpga设计 使用MATLAB设计一个2kHz采样,500Hz截止的15阶低通滤波器(h(n)长度为16),量化位数为12bit,输入信号位宽也为12bit. 根据FIR直接型结构可知,滤波器实际上就 ...

  5. 入门系列:基础认知——串行、并发、并行

    说明:   本文章旨在总结备份.方便以后查询,由于是个人总结,如有不对,欢迎指正:另外,内容大部分来自网络.书籍.和各类手册,如若侵权请告知,马上删帖致歉.   QQ 群 号:513683159 [相 ...

  6. 浅谈 串行信号 转换成 并行信号 原理

    注 :  文中讲述的原理是推理和探讨 , 和现实中的实现不一定完全相同 . 开始之前, 可以先参考看看我之前写的两篇文章 : <设计一个 硬件 实现的 Dictionary(字典)>  h ...

  7. CRC校验 串行 并行 长除 移位 查表 矩阵

    CRC校验的几种类型: 长除法,也叫直接计算法 移位寄存器,也叫线性移位 查表法 并行算法 一些有用的网页: CRC并行推导 https://blog.csdn.net/Old_Street/arti ...

  8. 串行总线技术(一)-串行总线结构(以PCIe为例)

    串行总线技术(一)-串行总线结构(以PCIe为例) 串行总线的出现 在早期的计算机系统中,多数外围设备使用并行总线结构.这些总线包括PCI和PATA(并行ATA).当通信速率较低时,并行总线结构可以设 ...

  9. 51单片机串行口的使用与串行通信

    51单片机串行口的使用与串行通信 串行通信: 俩个概念: RS232接口标准: 串行口的使用: 串行口的结构: 串行口相关寄存器: 串行口的工作方式: 方式0:同步移位寄存器方式 利用方式0扩展并行I ...

最新文章

  1. pvrect r语言 聚类_R语言一条命令实现基于样本和距离的聚类分析
  2. 键盘I/O中断调用(INT 16H)和常见的int 17H、int 1A H
  3. 企业云计算架构--笔记
  4. reactor使用方法_Project Reactor展开方法
  5. 请移步到我的新浪博客
  6. 你见过哪些操蛋的代码?
  7. oracle 如何终止存储过程的运行
  8. ZBlog插件简洁轻巧的编辑器 iceEditor修复版
  9. (二)为AI时尚分类准备数据
  10. 什么是应用管理与运维平台(ServiceStage)?
  11. Mac安装numpy
  12. WWDC22 - In App Purchase 更新总结
  13. 如何提高计算机软件的性能,如何提高计算机性能?
  14. EPLAN教程——工具栏详解(2)默认工具栏
  15. 软件开发工具【十】 之 调试程序
  16. 端午节谋定顺应自然-农业大健康·万祥军:根植古代农耕文化
  17. 怎样提高计算机内存,电脑物理内存不足怎么提高 电脑物理内存占用过高的解决方法...
  18. Ubuntu下安装GParted并分区,进行虚拟机内存扩展
  19. 抗战史上知名的戚家刀PK日本真三武士刀刀型
  20. 3D游戏编程与设计作业六

热门文章

  1. 创新实训——第三周2
  2. C++ 标准库 底层接口thread()、promise、packaged_task
  3. 最多能创建多少个 TCP 连接?
  4. 关于整型转字符串的三种方法
  5. Java 中字符串转整型和整型转字符串
  6. 即学即用- URL Scheme、Universal Links
  7. 合规设置去除福昕阅读器(foxit reader)右上角广告方法
  8. 问题解决:Java解压文件时报错:MALFORMED
  9. 安装显卡GTX1080Ti显卡在Ubuntu16.04 安装教程
  10. mt6592 [Speech]修改acoustic loopback时延时