CRC-16/XMODEM串行计算的Verilog源码及仿真
文章目录
- 前言
- 一、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)=gnxn+gn−1xn−1+gn−2xn−2+⋯+g2x2+g1x1+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源码及仿真相关推荐
- 黄仁勋:串行计算过时并行计算是未来
上个月,NVIDIA公司联合创始人.总裁兼首席执行官黄仁勋先生亲自来华,主持了2010年度GPU高性能计算峰会(GPU High Performence Forum 2010),并且亲自带领NVIDI ...
- 串行计算、并行计算、分布式计算、网格计算与云计算
并行计算 并行计算可以划分成时间并行和空间并行.时间并行即流水线技术,空间并行使用多个处理器执行并发计算,当前研究的主要是空间的并行问题. 并行计算是相对于串行计算来说的.要理解并行计算,首先需要了解 ...
- #PRBS# PRBS7高速串行总线的常用测试码型
PRBS的定义: PRBS: Pseudo-Random Binary Sequence 伪随机二进制序列 PRBS 码具有"随机"特性,是因为在 PRBS 码流中,二进制数&qu ...
- FPGA学习之路—接口(3)—SPI详解及Verilog源码分析
FPGA学习之路--SPI详解及Verilog源码分析 概述 SPI = Serial Peripheral Interface,是串行外围设备接口,是一种高速,全双工,同步的通信总线. 优点 支持全 ...
- FPGA学习之路—接口(2)—I2C协议详解+Verilog源码分析
FPGA学习之路--I2C协议详解+Verilog源码分析 定义 I2C Bus(Inter-Integrated Circuit Bus) 最早是由Philips半导体(现被NXP收购)开发的两线时 ...
- 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 ...
- C语言实现方差variance计算(附完整源码)
实现方差variance计算 实现方差variance计算的完整源码(实现,main函数测试) 实现方差variance计算的完整源码(实现,main函数测试) #include <math.h ...
- 二维有限体积 matlab,二维有限体积法计算热传导及源码.pdf
二维有限体积法计算热传导及源码 //#include "stdafx.h" #include #include #include #include #include using n ...
- FPGA实现和ET1100通信verilog源码。 ethercat从站方案
FPGA实现和ET1100通信verilog源码. ethercat从站方案. YYID:34299659977307299
最新文章
- 最全技术剖析:百度视觉团队获世界最大规模目标检测竞赛冠军
- 受益终生的世界顶级八大思维
- 像证券交易员一样思考和行动_3纪律与心态
- blockly和Java交互_blockly 基础学习(一)
- [洛谷 1883]函数 三分法
- Unity3D 学习历程(二)
- 如何让我们的VMware虚拟机上网——转载
- oracle中冗余,各位有没有检查冗余索引的脚本
- RTEMS 网络资料的部分翻译
- R︱Rstudio 1.0版本尝鲜(R notebook、下载链接、sparkR、代码时间测试profile)
- 关于安装Turn服务器:coturn,TurnServer,Restund,reTurnServer
- 微机计算机继电保护原理,微机继电保护的装置构成
- antv/G6和antv/X6
- python 地形图_Python-Evoked地形图可视化
- CPU设计——CPU核解析——cv32e40p
- 【本地调试环境一键安装包】php+mysql平台搭建集成软件总汇【php环境汇总】
- 会抓老鼠的猫不一定是好猫
- Exception in thread' main” java. 1ang. Runt imeException: Error while running command to get file pe
- 驾驶员考试计算机辅助教学系统藏汉又(4),学科考试题库及维,汉模拟考试系统...
- c语言wscript.echo用法,2.4.3 用Wscript.Echo显示简单的文本信息
热门文章
- 关于OCA,OCP,OCM认证的的区别
- 40个Python的字符串内建函数(包含用例)
- HTML5实现网线连接路由器,只有一根网线怎么设置无线路由器?
- Android studio 4.2新特性及升级异常
- 木瓜移动SaaS平台:木瓜大橙白皮书 Part1 - 智能客服功能介绍
- 流浪宠物救助网站前端页面_基于SSM(spring+spring mvc+mybatis)开发流浪宠物(猫狗)救助系统,项目为maven项目,后台可配置化,系统可学习性高。...
- 其实我们都有一些穷人思维
- vue中定义组件 components(局部 / 全局)
- qzezoi 1572 能量收集
- UnityAR之旅-Vuforia ModelTarget模型识别(一)