在线刊号(2278-8875)印刷版(2320-3765)
Dhiraj Jain教授1, Hiren G. Patel先生2
|
有关文章载于Pubmed,谷歌学者 |
更多相关文章请访问国际电气、电子和仪器工程高级研究杂志
CRC或循环冗余检查是在数据传输中使用的许多协议中广泛使用的错误检查技术。本项目的目的是设计CRC RTL生成器或一个工具,用于计算给定CRC多项式的CRC方程,并生成Verilog RTL代码。该模块处理标准多项式的方程计算,如CRC-4, CRC-8, CRC-16, CRC-32和CRC-48, CRC-64以及用户定义的专有多项式。为了使用PERL作为平台,它还旨在拥有一个更简单的用户界面。为了为任何数据宽度和任何标准多项式或用户定义的多项式生成rtl,本设计的目标是完全通用的。该工具生成的rtl通过System Verilog约束随机测试进行验证,使其更加健壮和可靠。
关键字 |
HDL, CRC-tools, PERL, RTL。 |
I.INTRODUCTION |
循环冗余校验(CRC)[1]是一种常用的通过二进制多项式除法计算的错误检测码。为了生成CRC,发送方将二进制数据视为二进制多项式,并通过标准生成器(例如CRC-32[2])对多项式进行模-2除。这一除法的其余部分成为数据的CRC,它附加到原始数据并传输给接收方。接收端在接收到数据和CRC后,对接收到的数据和相同的生成器多项式进行模- 2除法运算。通过比较计算出的CRC与接收到的CRC来检测错误。CRC算法在不考虑原始数据长度的情况下,只在消息中增加少量的比特(CRC-32为32位),在检测单个错误和错误突发方面表现出良好的性能。由于CRC算法擅长检测错误,并且在硬件上易于实现,因此CRC目前被广泛用于检测在生产、传输或存储过程中可能发生的数字数据损坏。最近,CRCs在通用移动通信系统变长消息通信的消息长度检测标准[3]中有了新的应用。 |
传统上,LFSR(线性反馈移位寄存器)电路是在超大规模集成(VLSI)中实现的,用于进行CRC计算,每个周期只能处理一个比特[4]。在本项目中,用于生成CRC多项式的方法基于LFSR CRC实现,其中CRC是通过每个周期传递每个数据位来计算的,首先输入最有效的位。根据LFSR中MSB寄存器的数据,会发生移位和异或操作。这种串行LFSR实现被转换为一个单次或单周期操作,该操作被实现到一个组合电路中。在此基础上,生成CRC多项式。 |
2循环冗余检查 |
CRC是一种错误检测码。它的计算类似于一个多项式长除法运算,其中商被舍弃,余数成为结果,重要的区别是多项式系数是根据有限域的无进位算法计算的。余数的长度总是小于除数的长度(称为生成多项式),因此决定了结果的长度。特定CRC的定义指定了要使用的除数等。 |
CRC基于多项式算法,特别是计算GF(2)中一个多项式除以另一个多项式的余数。这有点像将消息视为一个非常大的二进制数,并将其除以一个相当大的素数(如2^32-5)来计算余数。直观地,人们会期望这将给出可靠的校验和。GF(2)中的多项式是一个系数为0或1的单变量x的多项式。 |
加减法是按2模运算的,也就是说,它们与异或运算符相同。例如,多项式的和: |
X3 + x + 1和 |
X4 + x3 + x2 + x |
等于x4 + x2 + 1,这是它们的差值。这些多项式通常不写负号,但它们可以,因为系数-1等价于系数1。这种多项式的乘法很简单。一个系数与另一个系数的乘积与逻辑运算符与它们的组合相同,部分乘积用异或求和。不需要乘法来计算CRC校验和。对GF(2)进行多项式除法的方法与对整数进行多项式长除法的方法大致相同。下面是一个示例[5]。 |
读者可能想验证一下,x4 + x3 + 1的商乘以x3 + x + 1的除数,再加上x2 + 1的余数,等于被除数。 |
![]() |
在GF(2)中,CRC方法将消息视为多项式。例如,消息11001001,其中传输顺序从左到右(110…)被视为多项式x7 + x6 + x3 + 1的表示。 |
![]() |
为了开发一个计算CRC校验和的硬件电路,我们将多项式除法过程简化到最基本的部分。 |
该过程使用移位寄存器,我们用CRC表示。它的长度是r (G的度数)比特,与你想象的不同。当做减法(排他性或减法)时,不需要表示高阶位,因为G的高阶位和被减法的量都是1。除法过程可以非正式地描述如下[5]: |
![]() |
3CRC RTL生成器的实现 |
CRC生成器是一个命令行应用程序,它为从1位开始的任何数据宽度的CRC生成verilog代码,并且没有固有的上限和任何标准多项式或用户定义的多项式。代码是用Perl编写的,并且是跨平台兼容的。该工具提供了CRC RTL生成器,可以在发送端用于CRC校验和生成和接收端用于验证。 |
生成的CRC模块是可合成的verilog RTL。用于生成CRC多项式的方法基于LFSR CRC实现,其中CRC是通过每个周期传递每个数据位来计算的,首先输入最有效的位。 |
![]() |
根据LFSR中MSB寄存器的数据,会发生移位和异或操作。这种串行LFSR实现被转换为一个单次或单周期操作,该操作被实现到一个组合电路中。在此基础上,生成CRC多项式。一旦生成了所有不同多项式的RTL,用户就可以使用这些RTL来计算整个包的CRC。 |
IV.CRC参数 |
数据宽度:数据的宽度从1位开始,没有固有的上限。 |
Poly:标准或任何用户定义的多项式。 |
方程:余数方程,这些是数据输入和初始状态余数的函数。 |
Data in:在verilog代码中输入数据。 |
Crc_ini:向verilog代码输入初始余数。 |
RTL引擎:生成CRC位的RTL引擎。 |
输入多项式:是上面提到的标准多项式之一或用户定义的专有多项式。 |
数据宽度:-从1位开始,没有固有的上限。 |
输出-Verilog RTL代码,依次将其输入作为部分余数,数据(具有计算块中提到的相同宽度)和输出作为最终余数。 |
RTL引擎- RTL引擎以数据流、初始余数作为输入,并直接使用程序块中的方程生成RTL代码作为输出。 |
程序块-程序块是设计的主要部分。它计算有助于构建异或树的多项式方程。 |
V.PLATFORM使用 |
PERL(实用提取和报告语言):PERL解释器中表示PERL语言元素的主要内部数据结构。我们的提取器在Perl脚本执行阶段之前查询Perl内部。此时,内部数据结构已准备好用于事实提取。Perl是一个编译解释器。它不是逐行解释脚本文件,而是读取整个脚本文件,将其转换为内部表示,然后执行指令[18]。 |
PERL(实用提取和报告语言)被用作生成RTL代码的平台,因为可用的构造。PERL有有用的数据结构,如哈希,数组,哈希数组,数组哈希,这在生成多项式方程时非常有用。 |
六、模拟与结果 |
![]() |
![]() |
VI.CONCLUSION |
在本报告中,目标是设计一个生成verilog RTL的工具,该工具在Perl上计算给定数据多项式和CRC多项式的校验和,并为任何数据宽度和任何多项式生成RTL。 |
为了计算给定CRC多项式的CRC方程,设计了一个工具,可以为任何标准多项式(如CRC8, CRC16, CRC24, CRC32)以及任何用户定义的多项式和数据宽度生成verilog代码。该工具生成的rtl通过系统verilog约束的随机验证进行验证,使其更加健壮和可靠。因此,CRC应用程序的设计和验证是成功的。 |
参考文献 |
|