ECC校验算法以及硬件实现 PART 2

PART ONE: CRC原理

二、CRC算法实现

2.1 编码电路

对于编码电路我们采用了串行实现和并行实现两种方式。这两种实现方式各有优缺点,我们在Quartus II下对这两种实现方式分别进行了综合,发现其运行效率和占用面积之间的关系如下表2所示:

表2 串行CRC与并行CRC的比较
速度(bits/cycle)面积(total logic elements)
串行CRC一次1bit21
串行CRC一次16bit56

从上表我们不难看出串并行电路有着各自的特点,接下来我们将逐一介绍。

2.1.1串行实现

串行电路的实现是基于移位寄存器(LFSR),其过程类似于如图1.2所示的竖式计算:

  1. 每次计算得到的余数,都与除数相异或;
  2. 得到的结果进行右移,低位以data_in补足;
  3. 若右移后最高位仍为0,则下个时钟周期继续右移;
  4. 若右移后最高位为1,则与除数相异或得到新一轮的余数。
    按照上述过程描述,我们不难给出其移位寄存器(LFSR)的硬件实现如下图2.1所示:

在这里插入图片描述

图2.1 LFSR实现的CRC串行电路

其中LFSR需要添加反馈支路,只需要根据生成多项式中“1”的位置添加。例如图2.1所描述的CRC编码电路对应的生成多项式就是

1 , 0001 , 0000 , 0010 , 0001 = x 16 + x 12 + x 5 + 1 1,0001,0000,0010,0001 = x ^ {16} + x ^ {12} + x ^ {5} + 1 1,0001,0000,0010,0001=x16+x12+x5+1

我们不难发现图2.1中的反馈正是添加在12、5这两个中间节点前面的。
因此,我们从上面的分析中不难发现串行实现的电路具有以下特征:

  1. 电路直观,只需要根据生成多项式中“1”的位置添加反馈支路;
  2. 节省面积,不需要并行电路中大量的异或门阵列;
  3. 但是计算速度较慢,一个周期只能输入1bit的数据;

2.1.2 并行实现

假设我们需要一个时钟周期输入k比特个信息位,那么上面的算法就需要进行调整。但我们首先还是可以用串行法的思想,在算法上先得到len_data位数据的crc结果,在MATLAB平台,我们结合了串行算法的思想,实现了并行度为len_data的模二除过程,如图2.2所示:

模2除法的算法实现(基于串行CRC)

图2.2 模2除法的算法实现(基于串行CRC)

基于上述模2除,我们可以把一定并行度的并行实现由串行实现等效转换过来,最终得到的结果如图2.3所示:
在这里插入图片描述

图2.3 并行CRC的数据关系

不难发现,新一轮时钟周期的newcrc,由输入数据d和前一轮时钟周期的crc进位信号c之间相异或构成。也就是说我们可以把newcrc看成分块矩阵。

o l d c r c = [ d a t a n e w c r c ] old_{crc} = \left[\begin{matrix}data & new_{crc} \end{matrix}\right] oldcrc=[datanewcrc]

在这里插入图片描述

图2.4 并行CRC的异或门树

其中, d a t a data data矩阵是一个 l e n c r c × l e n d a t a len_{crc}\times len_{data} lencrc×lendata大小的矩阵, o l d c r c old_{crc} oldcrc矩阵是一个 l e n c r c × l e n c r c len_{crc}\times len_{crc} lencrc×lencrc的方阵。整个 n e w c r c newcrc newcrc的元素由0和1构成。因此,本项目的并行实现将主要目标定在求解 d a t a data data矩阵和 c r c crc crc矩阵上。如图2.4所示,最终实现的并行CRC看起来就像一个异或门树。
从上面的分析我们不难看出并行实现的CRC具有以下特点:

  1. 每一位crc校验位的结果,都由一个多输入异或门得到,整个校验位的生成电路就看起来是一个异或门树
  2. 可以在一个时钟周期同时处理多个数据位,处理速度快
  3. 但所占面积比串行电路大

2.2解码电路

解码和纠错的原理主要是将数据位和校验位,一并除以生成多项式,其余数一定为0。针对这个原理我们可以提出两种纠错方案,如图2.5所示。本项目主要采取了左侧的接受方案。
在这里插入图片描述

图2.5 两种CRC接受方案

因为我们可以在数学上可以证明,余数和发生错误的位数之间存在一一对应关系,且该关系只和生成多项式有关,而和数据无关。利用该对应关系,我们可以建立一个ErrorBitMap映射表,该表的产生仅仅与生成多项式有关,我们可以将接受到的码字除以生成多项式,得到的余数去查表,并实现纠错。
如图2.6所示,我们列出了两种生成多项式1011和1101的余数-错误位置映射表,可以发现它们都是一一对应的关系。

在这里插入图片描述

图2.6 余数和错误位置的一一对应关系示意图

具体的纠错步骤可以概括如下:

  1. 数据输入编码电路,生成len_crc位的校验码,附加在数据后面
  2. 解码电路输入上述的data+crc,除以生成多项式,计算余数
  3. 首先由生成多项式,产生ErrorBitMap
  4. 根据余数,查表看是否有错,并得知哪一位出错
  5. 错误位取反后输出

先更新到这儿,关于硬件实现部分PART 3见

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值