二、CRC算法实现
2.1 编码电路
对于编码电路我们采用了串行实现和并行实现两种方式。这两种实现方式各有优缺点,我们在Quartus II下对这两种实现方式分别进行了综合,发现其运行效率和占用面积之间的关系如下表2所示:
速度(bits/cycle) | 面积(total logic elements) | |
---|---|---|
串行CRC | 一次1bit | 21 |
串行CRC | 一次16bit | 56 |
从上表我们不难看出串并行电路有着各自的特点,接下来我们将逐一介绍。
2.1.1串行实现
串行电路的实现是基于移位寄存器(LFSR),其过程类似于如图1.2所示的竖式计算:
- 每次计算得到的余数,都与除数相异或;
- 得到的结果进行右移,低位以data_in补足;
- 若右移后最高位仍为0,则下个时钟周期继续右移;
- 若右移后最高位为1,则与除数相异或得到新一轮的余数。
按照上述过程描述,我们不难给出其移位寄存器(LFSR)的硬件实现如下图2.1所示:
其中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”的位置添加反馈支路;
- 节省面积,不需要并行电路中大量的异或门阵列;
- 但是计算速度较慢,一个周期只能输入1bit的数据;
2.1.2 并行实现
假设我们需要一个时钟周期输入k比特个信息位,那么上面的算法就需要进行调整。但我们首先还是可以用串行法的思想,在算法上先得到len_data位数据的crc结果,在MATLAB平台,我们结合了串行算法的思想,实现了并行度为len_data的模二除过程,如图2.2所示:
基于上述模2除,我们可以把一定并行度的并行实现由串行实现等效转换过来,最终得到的结果如图2.3所示:
不难发现,新一轮时钟周期的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]
其中,
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具有以下特点:
- 每一位crc校验位的结果,都由一个多输入异或门得到,整个校验位的生成电路就看起来是一个异或门树
- 可以在一个时钟周期同时处理多个数据位,处理速度快
- 但所占面积比串行电路大
2.2解码电路
解码和纠错的原理主要是将数据位和校验位,一并除以生成多项式,其余数一定为0。针对这个原理我们可以提出两种纠错方案,如图2.5所示。本项目主要采取了左侧的接受方案。
因为我们可以在数学上可以证明,余数和发生错误的位数之间存在一一对应关系,且该关系只和生成多项式有关,而和数据无关。利用该对应关系,我们可以建立一个ErrorBitMap映射表,该表的产生仅仅与生成多项式有关,我们可以将接受到的码字除以生成多项式,得到的余数去查表,并实现纠错。
如图2.6所示,我们列出了两种生成多项式1011和1101的余数-错误位置映射表,可以发现它们都是一一对应的关系。
具体的纠错步骤可以概括如下:
- 数据输入编码电路,生成len_crc位的校验码,附加在数据后面
- 解码电路输入上述的data+crc,除以生成多项式,计算余数
- 首先由生成多项式,产生ErrorBitMap
- 根据余数,查表看是否有错,并得知哪一位出错
- 错误位取反后输出
先更新到这儿,关于硬件实现部分PART 3见