文章目录

  • 前言
  • 一、CRC是什么?
  • 二、硬件串行计算原理分析
    • 1. 串行计算原理分析
      • (1) 原理图
      • (2) 计算过程
      • (3) 以CRC-16/XMODEM为例
    • 2. Verilog代码
    • 3. 仿真结果分析
      • (1)Modelsim仿真结果
      • (2) 在线计算结果
  • 三、总结

未经授权,严禁转载。

前言

本文主要讲解使用Verilog实现CRC串行计算的方法。

一、CRC是什么?

CRC在线计算:http://www.ip33.com/crc.html

二、硬件串行计算原理分析

1. 串行计算原理分析

(1) 原理图

多项式公式:Gn(x)=gnxn+gn−1xn−1+gn−2xn−2+⋯+g2x2+g1x1+1G_n(x)=g_nx^n+g_{n-1}x^{n-1}+g_{n-2}x^{n-2}+\cdots+g_2x^2+g_1x^1+1Gn​(x)=gn​xn+gn−1​xn−1+gn−2​xn−2+⋯+g2​x2+g1​x1+1

图1 串行计算原理图

(2) 计算过程

多项式中g0,g1,⋯,gng_0,g_1,\cdots,g_ng0​,g1​,⋯,gn​为0或1,不管多项式是什么样的形式,图1中的g0g_0g0​和gng_ngn​都为1,其中input_bit为输入的单bit数据(发送数据的某一个bit)。在每个时钟周期下进行一次计算,经过n个时钟周期后得到最终的计算结果。

(3) 以CRC-16/XMODEM为例

采用CRC-16/XMODEM计算发送数据的CRC码时,n=16,多项式公式为G16(x)=x16+x12+x5+1G_{16}(x)=x^{16}+x^{12}+x^{5}+1G16​(x)=x16+x12+x5+1。

CRC算法名称 多项式公式 宽度 多项式 初始值 结果异或值 输入反转 输出反转
CRC-16/XMODEM x16+x12+x5+1x^{16}+x^{12}+x^5+1x16+x12+x5+1 16 1021 0000 0000 false false

以计算一个16bit位宽的发送数据的CRC-16/XMODEM码为例,在计算时,首先向串行计算电路中输入发送数据的最高位,再在下一个时钟输入次高位,依次类推,直到发送数据的最低位输入到串行计算电路后,得到最终的CRC码。

2. Verilog代码

(1) 单次计算Verilog代码如下:
    模块接口定义:

name direction width description
data input 1 串行输入的单bit数据,相当于原理图中的input bit
crc_pre input 16 前一个时钟周期运算的crc结果
crc output 16 当前时钟周期下crc运算结果
module crc16ccitt_d1(input           data,input  [15:0]   crc_pre,output [15:0]   crc
);assign crc[0] = crc_pre[15] ^ data;assign crc[1] = crc_pre[0];assign crc[2] = crc_pre[1];assign crc[3] = crc_pre[2];assign crc[4] = crc_pre[3];assign crc[5] = crc_pre[4] ^ crc_pre[15] ^ data;assign crc[6] = crc_pre[5];assign crc[7] = crc_pre[6];assign crc[8] = crc_pre[7];assign crc[9] = crc_pre[8];assign crc[10] = crc_pre[9];assign crc[11] = crc_pre[10];assign crc[12] = crc_pre[11] ^ crc_pre[15] ^ data;assign crc[13] = crc_pre[12];assign crc[14] = crc_pre[13];assign crc[15] = crc_pre[14];
endmodule

(2) 计算一个16bit数据的CRC码:
    模块接口定义:

name direction width description
clk input 1 模块时钟信号
rst_n input 1 模块复位信号
data_in input 16 对发送数据data_in计算CRC校验码
en input 1 计算使能信号,单周期高电平有效
crc_rst output 16 CRC计算结果
crc_rst_vld output 1 CRC计算结果有效标志,单周期高脉冲有效
module crc16ccitt_d16(input              clk         , // 时钟input            rst_n       , // 复位input  [15:0]    data_in     , // 对data_in计算CRC码input            en          , // 使能信号output [15:0]  crc_rst     , // CRC码output         crc_rst_vld   // CRC码有效标志信号
);
reg     [15:0]              crc_pre     ;
reg     [15:0]              data_cal    ;
reg     [ 3:0]              cnt         ;
reg                         state       ;
parameter   IDLE    =  1'b0,SHIFT =  1'b1;
always @(posedge clk or negedge rst_n)if (!rst_n) beginstate       <=      IDLE    ;data_cal   <=      16'd0  ;   crc_pre     <=      16'd0  ;cnt            <=      4'd0   ;end    else if (en) beginstate         <=      SHIFT   ;data_cal   <=      data_in ;crc_pre        <=      16'd0  ;cnt            <=      4'd0   ;end else begincase (state)IDLE :beginstate    <= IDLE      ;data_cal <= 16'd0 ;crc_pre     <= 16'd0  ;cnt         <= 4'd0   ;endSHIFT   : begindata_cal <= data_cal << 1;crc_pre   <= crc_rst ;cnt         <= cnt + 1'b1;if (cnt == 4'd14)state <= IDLE;elsestate <= SHIFT;enddefault:begindata_cal <= 16'd0 ;cnt        <= 4'd0  ;endendcaseendassign crc_rst_vld = (cnt == 4'd15);crc16ccitt_d1 crc16ccitt_d1(.data     (data_cal[15]),.crc_pre  (crc_pre     ),.crc      (crc_rst     )
);
endmodule

测试文件:

`timescale 1ns / 1ps
module testbench;reg                clk         ;
reg             rst_n       ;
reg     [15:0]  data_in     ;
reg             en          ;
wire    [15:0]  crc_rst     ;
wire            crc_rst_vld ;initial clk = 0;
always #10 clk = ~clk;initial beginrst_n = 1'b0;#100;rst_n = 1'b1;
endinitial begindata_in = 16'd0;en        = 1'b0;#200;@(posedge clk) #5;data_in = 16'h5afc;en        = 1'b1;@(posedge clk) #5;en      = 1'b0;#5000;$stop;
endcrc16ccitt_d16 dut(.clk       (clk          ),.rst_n      (rst_n        ),.data_in    (data_in      ),.en             (en           ),.crc_rst    (crc_rst      ),.crc_rst_vld (crc_rst_vld  )
);
endmodule

3. 仿真结果分析

(1)Modelsim仿真结果


在端口data_in输入16’h5afc,同时拉高en信号一个时钟周期,使能该模块对输入的数据计算CRC码,经过16个时钟周期后,crc_rst_vld信号变为高电平,标志计算结果crc_rst有效,得到计算结果为16’hcfe7。

(2) 在线计算结果


使用CRC在线计算工具,计算16’h5afc的CRC-16/XMODEM码,计算结果同样为CFE7。


三、总结

以上就是本文介绍的内容,本文简要介绍了CRC码的串行计算的原理以及过程,并且给出了Verilog代码和仿真结果。

CRC-16/XMODEM串行计算的Verilog源码及仿真相关推荐

  1. 黄仁勋:串行计算过时并行计算是未来

    上个月,NVIDIA公司联合创始人.总裁兼首席执行官黄仁勋先生亲自来华,主持了2010年度GPU高性能计算峰会(GPU High Performence Forum 2010),并且亲自带领NVIDI ...

  2. 串行计算、并行计算、分布式计算、网格计算与云计算

    并行计算 并行计算可以划分成时间并行和空间并行.时间并行即流水线技术,空间并行使用多个处理器执行并发计算,当前研究的主要是空间的并行问题. 并行计算是相对于串行计算来说的.要理解并行计算,首先需要了解 ...

  3. #PRBS# PRBS7高速串行总线的常用测试码型

    PRBS的定义: PRBS: Pseudo-Random Binary Sequence 伪随机二进制序列 PRBS 码具有"随机"特性,是因为在 PRBS 码流中,二进制数&qu ...

  4. FPGA学习之路—接口(3)—SPI详解及Verilog源码分析

    FPGA学习之路--SPI详解及Verilog源码分析 概述 SPI = Serial Peripheral Interface,是串行外围设备接口,是一种高速,全双工,同步的通信总线. 优点 支持全 ...

  5. FPGA学习之路—接口(2)—I2C协议详解+Verilog源码分析

    FPGA学习之路--I2C协议详解+Verilog源码分析 定义 I2C Bus(Inter-Integrated Circuit Bus) 最早是由Philips半导体(现被NXP收购)开发的两线时 ...

  6. android s905 编译_NanoPi K2 (Amlogic S905) Ubuntu 16.04 编译Android 5.1系统源码

    NanoPi K2 (Amlogic S905) Ubuntu 16.04 编译Android 5.1系统源码 1. 下载源码 在这里下载https://www.mediafire.com/folde ...

  7. C语言实现方差variance计算(附完整源码)

    实现方差variance计算 实现方差variance计算的完整源码(实现,main函数测试) 实现方差variance计算的完整源码(实现,main函数测试) #include <math.h ...

  8. 二维有限体积 matlab,二维有限体积法计算热传导及源码.pdf

    二维有限体积法计算热传导及源码 //#include "stdafx.h" #include #include #include #include #include using n ...

  9. FPGA实现和ET1100通信verilog源码。 ethercat从站方案

    FPGA实现和ET1100通信verilog源码. ethercat从站方案. YYID:34299659977307299

最新文章

  1. 最全技术剖析:百度视觉团队获世界最大规模目标检测竞赛冠军
  2. 受益终生的世界顶级八大思维
  3. 像证券交易员一样思考和行动_3纪律与心态
  4. blockly和Java交互_blockly 基础学习(一)
  5. [洛谷 1883]函数 三分法
  6. Unity3D 学习历程(二)
  7. 如何让我们的VMware虚拟机上网——转载
  8. oracle中冗余,各位有没有检查冗余索引的脚本
  9. RTEMS 网络资料的部分翻译
  10. R︱Rstudio 1.0版本尝鲜(R notebook、下载链接、sparkR、代码时间测试profile)
  11. 关于安装Turn服务器:coturn,TurnServer,Restund,reTurnServer
  12. 微机计算机继电保护原理,微机继电保护的装置构成
  13. antv/G6和antv/X6
  14. python 地形图_Python-Evoked地形图可视化
  15. CPU设计——CPU核解析——cv32e40p
  16. 【本地调试环境一键安装包】php+mysql平台搭建集成软件总汇【php环境汇总】
  17. 会抓老鼠的猫不一定是好猫
  18. Exception in thread' main” java. 1ang. Runt imeException: Error while running command to get file pe
  19. 驾驶员考试计算机辅助教学系统藏汉又(4),学科考试题库及维,汉模拟考试系统...
  20. c语言wscript.echo用法,2.4.3 用Wscript.Echo显示简单的文本信息

热门文章

  1. 关于OCA,OCP,OCM认证的的区别
  2. 40个Python的字符串内建函数(包含用例)
  3. HTML5实现网线连接路由器,只有一根网线怎么设置无线路由器?
  4. Android studio 4.2新特性及升级异常
  5. 木瓜移动SaaS平台:木瓜大橙白皮书 Part1 - 智能客服功能介绍
  6. 流浪宠物救助网站前端页面_基于SSM(spring+spring mvc+mybatis)开发流浪宠物(猫狗)救助系统,项目为maven项目,后台可配置化,系统可学习性高。...
  7. 其实我们都有一些穷人思维
  8. vue中定义组件 components(局部 / 全局)
  9. qzezoi 1572 能量收集
  10. UnityAR之旅-Vuforia ModelTarget模型识别(一)