Xilinx FPGA中RS编码IP核之Generator Start

前一阵子,学习如何调用ISE中RS编码的IP核,进行信息序列的编码,多亏了有现成的IP核,大大减轻了工作量,于是便翻起了RS编码的Datasheet,发现用起来还蛮简单的,直到编了一段代码测试完,发现编码后的符号和MATLAB中RS编码函数输出的结果不一样,找了一天没发现两种结果不一致的原因出现在哪,直到对RS码的编码过程做了一点了解之后,才找到了原因。

1. RS编码简介
RS码是一类具有很强纠错能力的多进制BCH码,适用于有突发错误的信道纠错。RS(n,k)码可以由m,n和k这3个参数表示,其中m表示码元符号取自域GF(2^m),n为码字长度,k为信息符号长度。对于一个可以纠正t个符号错误的RS码,有以下参数:
(1) 码字长度:n=2^m-1个符号或m(2^m-1)个比特;
(2) 信息符号:k(k=1,2,...)个符号段或km个比特;
(3) 监督码:2t=n-k个符号或2mt=m(n-k)个比特;
(4) 最小码距:dmin=2t+1个符号,或mdmin = m(2t+1)个比特。

RS码的基本思想就是选择一个合适的生成多项式g(x),使得信息码字生成的编码码字除以g(x)的余式为0,说的明白点RS码属于BCH码,而BCH码也是一种循环码,所以RS码也是循环码,只是RS码是多进制的,其码字的生成方式仍然与循环码字的生成方式一致,主要区别在于生成多项式的选择上,RS码可以预先设计纠错能力t,然后产生对应的能纠t个符号错误的码字生成多项式。RS码生成多项式一般按照下面的公式选择:

上式中,a^i是GF(2^m)中的一个元素。

2. MATLAB与FPGA之RS编码比较
MATLAB中,可以通过rsenc(msg,n,k)这个函数来进行RS编码,需要注意的是msg必须是经过gf函数后的符号,具体而言,在matlab中实现RS编码需要下面两步:
msg = gf(msg0, m);
msg_coded = rsenc(msg, n, k);

这种情况下,根据m确定了GF(2^m)上的本原多项式,根据t=(n-k)/2确定了t的值,进一步确定了生成多项式。

ISE中,RS编码IP核中存在Generator Start项,默认情况下为0,这个Generator Start代表什么含义呢?Datasheet上做了解释,其给出的生成多项式如下:

其中的n,k就不用解释了,n-k=2t,需要注意的是,这里下标i是从0开始的,matalb默认的生成多项式下标i是从1开始的,因此ISE中RS编码IP核如果Generator Start采用默认的值0的话,则编码结果与MATLAB结果必然不一致,这里只要在配置IP核时,将Generator Start改为1,则生成多项式与MATLAB中一致,编码的结果也与MATLAB的结果一致了。另外,需要强调的是,译码的时候,RS译码的IP核配置时,Generator Start应与编码的一致,这样才能保证两边的生成多项式一致,才能正确译码。

文章转载自:fallen-queen的博客