USB2.0IP设计

最近,在学习USB2.0IP的设计,其中包含了CRC校验码的内容,之前学习千兆以太网曾经用到过CRC32校验(https://www.cnblogs.com/Xwangzi66/p/14185143.html),CRC详细原理可见括号的链接,今天则从怎么用工具快速生成Verilog代码的角度介绍。

一 确定CRC5的多项式

G(X)= X^5 + X^2 + 1,输入数据的位宽为11bit,即CRC5中的输入信号[10:0]data_i.

二 在线网页生成CRC5的Verilog代码

链接如下:https://www.easics.com/crctool/

在线生成CRC5校验代码如下图:第一步是确定多项式,此处是CRC5的多项式。第二步选择CRC的类别,如CRC16,CRC32等。第三步,选择待校验数据的位宽。第四步,选择输出的编程语言,用Verilog实现。第五步,下载打开就。注意填好邮箱,此处为了保护本人隐私则空着。

2.在线工具生成CRC5的Verilog代码

 1 module CRC5_D11;
2
3 // polynomial: x^5 + x^2 + 1
4 // data width: 11
5 // convention: the first serial bit is D[10]
6 function [4:0] nextCRC5_D11;
7
8 input [10:0] Data;
9 input [4:0] crc;
10 reg [10:0] d;
11 reg [4:0] c;
12 reg [4:0] newcrc;
13 begin
14 d = Data;
15 c = crc;
16
17 newcrc[0] = d[10] ^ d[9] ^ d[6] ^ d[5] ^ d[3] ^ d[0] ^ c[0] ^ c[3] ^ c[4];
18 newcrc[1] = d[10] ^ d[7] ^ d[6] ^ d[4] ^ d[1] ^ c[0] ^ c[1] ^ c[4];
19 newcrc[2] = d[10] ^ d[9] ^ d[8] ^ d[7] ^ d[6] ^ d[3] ^ d[2] ^ d[0] ^ c[0] ^ c[1] ^ c[2] ^ c[3] ^ c[4];
20 newcrc[3] = d[10] ^ d[9] ^ d[8] ^ d[7] ^ d[4] ^ d[3] ^ d[1] ^ c[1] ^ c[2] ^ c[3] ^ c[4];
21 newcrc[4] = d[10] ^ d[9] ^ d[8] ^ d[5] ^ d[4] ^ d[2] ^ c[2] ^ c[3] ^ c[4];
22 nextCRC5_D11 = newcrc;
23 end
24 endfunction
25 endmodule

三  修改成自己USB的IP设计的CRC5校验模块

通过在线工具生成后,自己可以修改模块名,输入输出信号名,寄存器名,以更好地用在自己的FPGA项目中,本人CRC5修改如下:

 1 module usbh_crc5
2 (
3 input [4:0] crc_i,
4 input [10:0] data_i,
5 output [4:0] crc_o
6 );
7
8 //-----------------------------------------------------------------
9 // Implementation
10 //-----------------------------------------------------------------
11 assign crc_o[0] = data_i[10] ^ data_i[9] ^ data_i[6] ^ data_i[5] ^ data_i[3] ^ data_i[0] ^
12 crc_i[0] ^ crc_i[3] ^ crc_i[4];
13
14 assign crc_o[1] = data_i[10] ^ data_i[7] ^ data_i[6] ^ data_i[4] ^ data_i[1] ^
15 crc_i[0] ^ crc_i[1] ^ crc_i[4];
16
17 assign crc_o[2] = data_i[10] ^ data_i[9] ^ data_i[8] ^ data_i[7] ^ data_i[6] ^ data_i[3] ^ data_i[2] ^ data_i[0] ^
18 crc_i[0] ^ crc_i[1] ^ crc_i[2] ^ crc_i[3] ^ crc_i[4];
19
20 assign crc_o[3] = data_i[10] ^ data_i[9] ^ data_i[8] ^ data_i[7] ^ data_i[4] ^ data_i[3] ^ data_i[1] ^
21 crc_i[1] ^ crc_i[2] ^ crc_i[3] ^ crc_i[4];
22
23 assign crc_o[4] = data_i[10] ^ data_i[9] ^ data_i[8] ^ data_i[5] ^ data_i[4] ^ data_i[2] ^
24 crc_i[2] ^ crc_i[3] ^ crc_i[4];
25
26 endmodule

通过修改后,代码更简洁高效,更方便调用,直接在USB中调用即可!

后续的CRC16的Verilog实现,同CRC5生成方法一样,先用在线工具生成,再修改一些模块名,输入输出信号即可。

CRC16代码如下:

 1 module usbh_crc16
2 (
3 input [15:0] crc_i,
4 input [7:0] data_i,
5 output [15:0] crc_o
6 );
7
8 //-----------------------------------------------------------------
9 // Implementation
10 //-----------------------------------------------------------------
11 assign crc_o[15] = data_i[0] ^ data_i[1] ^ data_i[2] ^ data_i[3] ^ data_i[4] ^
12 data_i[5] ^ data_i[6] ^ data_i[7] ^ crc_i[7] ^ crc_i[6] ^
13 crc_i[5] ^ crc_i[4] ^ crc_i[3] ^ crc_i[2] ^
14 crc_i[1] ^ crc_i[0];
15 assign crc_o[14] = data_i[0] ^ data_i[1] ^ data_i[2] ^ data_i[3] ^ data_i[4] ^ data_i[5] ^
16 data_i[6] ^ crc_i[6] ^ crc_i[5] ^ crc_i[4] ^
17 crc_i[3] ^ crc_i[2] ^ crc_i[1] ^ crc_i[0];
18 assign crc_o[13] = data_i[6] ^ data_i[7] ^ crc_i[7] ^ crc_i[6];
19 assign crc_o[12] = data_i[5] ^ data_i[6] ^ crc_i[6] ^ crc_i[5];
20 assign crc_o[11] = data_i[4] ^ data_i[5] ^ crc_i[5] ^ crc_i[4];
21 assign crc_o[10] = data_i[3] ^ data_i[4] ^ crc_i[4] ^ crc_i[3];
22 assign crc_o[9] = data_i[2] ^ data_i[3] ^ crc_i[3] ^ crc_i[2];
23 assign crc_o[8] = data_i[1] ^ data_i[2] ^ crc_i[2] ^ crc_i[1];
24 assign crc_o[7] = data_i[0] ^ data_i[1] ^ crc_i[15] ^ crc_i[1] ^ crc_i[0];
25 assign crc_o[6] = data_i[0] ^ crc_i[14] ^ crc_i[0];
26 assign crc_o[5] = crc_i[13];
27 assign crc_o[4] = crc_i[12];
28 assign crc_o[3] = crc_i[11];
29 assign crc_o[2] = crc_i[10];
30 assign crc_o[1] = crc_i[9];
31 assign crc_o[0] = data_i[0] ^ data_i[1] ^ data_i[2] ^ data_i[3] ^ data_i[4] ^ data_i[5] ^
32 data_i[6] ^ data_i[7] ^ crc_i[8] ^ crc_i[7] ^ crc_i[6] ^
33 crc_i[5] ^ crc_i[4] ^ crc_i[3] ^ crc_i[2] ^
34 crc_i[1] ^ crc_i[0];
35
36 endmodule

Crc16 Code

总结,一直都是根据多项式,确定硬件电路的形式,然后查表,如V3学院千兆以太网的CRC32校验教程,很繁琐,得理解原理,今天意外知道一种新的方法,通过在线工具生成Verilog实现:

USB中TOKEN的CRC5与CRC16校验(神奇的工具生成Verilog实现)的更多相关文章

  1. 最详细易懂的CRC-16校验原理(附源程序)(转)

    最详细易懂的CRC-16校验原理(附源程序) from:http://www.openhw.org/chudonganjin/blog/12-08/230184_515e6.html 最详细易懂的CR ...

  2. 最详细易懂的CRC-16校验原理(附源程序)

    from:http://www.openhw.org/chudonganjin/blog/12-08/230184_515e6.html 最详细易懂的CRC-16校验原理(附源程序) 1.循环校验码( ...

  3. C# 实现CRC16校验

    前言 本文将使用一个NuGet公开的组件技术来实现CRC16校验功能,提供了一些简单的API,来方便的实现. 在Visual Studio 中的NuGet管理器中可以下载安装,也可以直接在NuGet控 ...

  4. CRC-16校验原理

    最详细易懂的CRC-16校验原理(附源程序) 1.循环校验码(CRC码): 是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定. 2.生成CRC码的基本原理: 任意一 ...

  5. Delphi CRC16校验算法实现(转)

    循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC.它是利用除法及余数的原理来作错误侦测(Error Detecting)的.实际应用时,发送装置计算出CRC值并随 ...

  6. 基于Modbus三种CRC16校验方法的性能对比

    目录 1.背景介绍 2. CRC校验的三种方法 2.1. 直接计算CRC校验 2.2. 查短表法计算CRC16校验 2.3.查大表法计算CRC16校验 3.三种校验方式的测试方法 3.1.直接计算CR ...

  7. 讨论两种Redis中Token的存储方式

    摘要:本文讨论一个问题:存储token时,token与对应用户id谁来作为key? 问题起源问题起源于要给公司的后台管理系统添加权限管理,选用的是开源框架shiro,而原本系统上是采用token做了登 ...

  8. usb中的传输模式

    别人总结的一个usb传输模式,保存一下 usb中的endpoint(端点)和传输模式 端点: 端点位于USB 外设内部,所有通信数据的来源或目的都基于这些端点,是一个可寻址的FIFO. 每个USB 外 ...

  9. struts2中token防止重复提交表单

    struts2中token防止重复提交表单 >>>>>>>>>>>>>>>>>>>&g ...

随机推荐

  1. 大数翻倍法求解CRT

    目录 正文 引入 大数翻倍法 复杂度证明 大数翻倍法的优势 最后的最后:上代码! 注:做法和思路是 zhx 在一次讲课中提出的,如有侵权,请联系作者删除 其实别的题解也有提到过暴力做法,但这里将会给出 ...

  2. hdu1671 字典树记录前缀出现次数

    题意:       给你一堆电话号,问你这些电话号后面有没有相互冲突的,冲突的条件是当前这个电话号是另一个电话号的前缀,比如有 123456789 123,那么这两个电话号就冲突了,直接输出NO. 思 ...

  3. 路由器逆向分析------QEMU的基本使用方法(MIPS)

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/69258334 一.QEMU的运行模式 直接摘抄自己<揭秘家用路由器0day漏 ...

  4. LNMP环境搭建Wordpress博客

    目录 LNMP架构工作原理 yum源安装 网站源包安装 LNMP是Linux Nginx MySQL/MariaDB  Php/perl/python 的简称,是近些年才逐渐发展起来的构架,发展非常迅 ...

  5. 我为Dexposed续一秒——论ART上运行时 Method AOP实现

    转载于:http://weishu.me/2017/11/23/dexposed-on-art/ 两年前阿里开源了 Dexposed 项目,它能够在Dalvik上无侵入地实现运行时方法拦截,正如其介绍 ...

  6. 音视频开发:为什么推荐使用Jetpack CameraX?

    我们的生活已经越来越离不开相机,从自拍到直播,扫码再到VR等等.相机的优劣自然就成为了厂商竞相追逐的赛场.对于app开发者来说,如何快速驱动相机,提供优秀的拍摄体验,优化相机的使用功耗,是一直以来追求 ...

  7. 一起来看看java并发中volatile关键字的神奇之处

    并发编程中的三个概念: 1.原子性 在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断的,要么执行,要么不执行. 2.可见性 对于可见性,Java提供了volati ...

  8. java8中的Optional

    Optional类主要解决空指针异常NullPointerException.Optional 类(java.util.Optional)是一个容器类,代表一个值存在或不存在,原来用 null 表示一 ...

  9. Github + Picgo + Typora 让笔记远走高飞

    Github设置 登录 2.新建仓库 设置token 打开设置 然后点击,按钮生成Generate token Picgo设置 下载PicGo 参考视频 PicGo设置 设置Server 图床设置 上 ...

  10. 【vue-06】webpack npm

    什么是Webpack Webpack是一款模块加载器兼打包工具,他能把各种资源,比如js,css,less转化成一个静态文件,减少页面的请求,提高效率. 安装Webpack 在安装webpack之前, ...