Turbo乘积码编码器的FPGA设计与实现

时间:2022-03-18 12:18:45

Turbo乘积码编码器的FPGA设计与实现

【摘要】Turbo乘积码(Turbo Product Codes)是一种先进的前向纠错(FEC,Forward Error Correction)信道编码,纠错性能好,编码效率高,同时由于其编码构造采用了线性分组码,所以译码方法简单,实现复杂度低。本文对Turbo乘积码编码技术进行了研究,给出了编码器的FPGA设计实现方案,该编码器的设计在Xilinx公司Virtex-II系列的FPGA平台上进行了实验验证。实验结果表明,本设计的编码器满足预期指标要求。

【关键词】Turbo编码;前向纠错码;FPGA

1.引言

随着微电子技术、通信技术和计算机技术的发展,新的通信业务和信息业务不断涌现,用户对信息传输的质量要求不断提高。由于通信信道固有的噪声和衰落特性,或者存在存储媒介的缺陷等原因,信号在信道传输(或存/取)过程中,必然会受到影响从而产生失真。因此通常需要采用差错控制编码技术来检测和纠正失真引起的传输错误。Turbo乘积码是一种先进的前向纠错信道编码,纠错性能好,编码效率高,同时由于其编码构造采用了线性分组码,所以译码方法简单,实现复杂度低。因此本文主要介绍Turbo乘积码的编码器技术,提出了一种编码器的FPGA设计实现方案。

2.Turbo乘积码编码技术

2.1 Turbo乘积码的编码方式

按照构成码子码种类的不同,Turbo乘积码可分为Reed Solomon乘积码,BCH乘积码,加了一个奇偶校验比特后构成的扩展Hamming乘积码以及单一的奇偶校验乘积码。乘积码由一系列多维的(n,k)分组码构成,在二维或三维空间使用不同长度的码可得到不同的码率。为了降低译码复杂度,Turbo乘积码通常由扩展汉明码、奇偶校验码或它们的组合构成。

一般而言,如果考虑两个系统线性分组码,如图1所示,这里分别表示码长,信息比特数和最小汉明距离。二维TPC编码可如下获得:

1)把()信息比特放入一矩阵中;

2)使用行编码器对行进行编码,产生行校验位,得到行、列的矩阵;

3)使用列编码器对列进行编码,产生列校验位,得到行、列的矩阵。

以上步骤2)和3)不能同时进行,因此这样的编码过程属串行级联方式。这样得到二维Turbo乘积码的参数为:,,。码率为,这里是码的码率,。为了降低编码器和译码器的复杂度,通常令。

2.2 Turbo乘积码编码器结构

图2所示是Turbo码编码器的结构,Turbo码编码器通过交织器把两个递归系统卷积码并行级联,这两个分量码编码器结构相同,编码器的输出端包括信息位和两个校验位,首先把输入码流划分为长度为N的数据信息块,送给每个编码器。第一个编码器产生N比特的校验码流;第二个编码器也处理同样的信息数据,但要经过一个具有固定交织方式的交织器的扰序,也生成N比特的校验码流。Turbo编码器把原始信息数据码流和校验码流、一起传送,经过复用器调制后,生成了Turbo码序列X。为了提高码率,校验码流、需要经过删余器,采用删余技术从这两个校验序列中周期地删除一些校验位,形成校验位序列X。

3.Turbo乘积码编码的FPGA设计与实现

为了实现实时编码,根据编码数据流向为单向性的特点,本设计采用流水线结构。整个编码器分成三部分,第一部分为输入数据缓存,第二部分为编码,第三部分为输出数据缓存。这种设计结构可以使数据接收、数据编码和数据输出三部分流水进行,从而大大提高了编码速率。按照上述的设计结构,对TPC编码器的FPGA设计实现进行模块的划分。原理框图如图3所示。

3.1 编码模块的设计

行编码模块和列编码模块基本相同,因此放在一起介绍。行/列编码模块又划分为三个子模块来完成编码功能,其子模块框图如图4所示。

从FIFO或者RAM中把要进行编码的串行数据读出,转换成57bits的并行数据,扩展汉明码编码模块对输入的57比特数据进行扩张汉明码编码,加上校验位后为64比特。然后再经过并串转换为串行数据存入缓存中,为下一步编码或编码输出做好准备。

其中,串并/并串转换可以通过移位寄存器来实现,按照相应的时钟节拍,每输入一位数据进行相应的移位。串并转换实现的Verilog代码为:

par_data

并串转换实现的Verilog代码为:

par_data [62:0]

ser_data

扩展汉明码编码模块把并串转换后57位宽的并行数据,按照扩展汉明码的编码规则,在高位添加7个校验比特,输出数据位64位宽的并行数据,每一组数据代表一个扩展汉明码组。按照扩展汉明码的编码规则,其核心部分的Verilog代码如下所示:

assign data_out[63] = ( ^ data_out[62:57]) ^ ( ^ din_r);

assign data_out[62] = din_r[56] ^ din_r[55] ^ din_r[54] ^din_r[52]^ din_r[50] ^din_r[48]^din_r[47]^din_r[46]^din_r[44]^din_r[42]^din_r[40]^din_r[38]^din_r[36]^din_r[34]^din_r[32]^din_r[30]^din_r[28]^din_r[26]^din_r[24]^din_r[22]^din_r[20]^din_r[18]^din_r[16]^ din_r[14] ^ din_r[12] ^ din_r[10] ^ din_r[8] ^ din_r[6] ^ din_r[4] ^ din_r[2] ^ din_r[0];

assign data_out[61] = din_r[56] ^ din_r[55] ^ din_r[53] ^din_r[52]^ din_r[49] ^din_r[48]^din_r[45] ^ din_r[44] ^din_r[41] ^ din_r[40] ^ din_r[37] ^ din_r[36] ^din_r[33] ^din_r[32]^din_r[31]^din_r[29]^din_r[28]^din_r[25]^din_r[24] ^ din_r[21]^din_r[20]^din_r[17]^din_r[16]^din_r[13]^din_r[12]^din_r[9]^din_r[8]^din_r[5]^din_r[4] ^ din_r[1] ^ din_r[0];

assign data_out[60] = din_r[56]^(^din_r[51:47])^(^din_r[43:40])^(^ din_r[35:31])^(^din_r[27:24])^(^din_r[19:16])^(^din_r[11:8]) ^ ( ^ din_r[3:0]);

assign data_out[59] =(^ din_r[54:48])^(^ din_r[39:32]) ^ ( ^ din_r[23:16]) ^ ( ^ din_r[7:0]);

assign data_out[58]=(^ din_r[46:32]) ^ ( ^ din_r[15:0]);

assign data_out[57]= ( ^ din_r[30:0]);

assign data_out[56:0]= din_r[56:0];

其中,data_out[63]为所有前63位的奇偶校验,data_out[62:57]为汉明码校验,data_out[56:0]为原始数据。

3.2 交织RAM模块的设计

在编码过程中要先进行行编码再进行列编码,中间必须进过行列的交织。本项目中行列交织采用双端口RAM实现,行列交织时存在RAM地址的跳变,在设计时采用两个计数器实现,设两个计数器分别为i[5:0]、j[5:0],则可按照以下公式计算跳变的列地址:

不难发现,64=26,由于其特殊性,公式的乘法实现也相对比较简单,用Verilog语言可以描述为:

assign addr_col = {i[5:0],j[5:0]};

使用这样的方法就很好地解决了编码过程中的行列交织问题,亦即先进行行编码再进行列编码的问题。

4.结束语

本文采用可编程逻辑器件FPGA实现了一种先进的前向纠错编码Turbo乘积码的编码,使用Verilog硬件描述语言完成了编码器的设计工作,在Xilinx FPGA芯片上完成了编码器的硬件验证,从实验结果可看出设计的编码器满足预期指标要求。

参考文献

[1]刘东华编著.Turbo码原理与应用技术[M].北京:电子工业出版社,2004,1.

[2]王新梅,肖国镇编著.纠错码——原理与方法(修订版)[M].西安:西安电子科技大学出版社,2001,4.

[3]田耘,徐文波,张延伟等编著.无线通信FPGA设计[M].北京:电子工业出版社,2008,2

[4]夏宇闻编著.Verilog数字系统设计教程(第2版)[M].北京:北京航空航天大学出版社,2008,6

作者简介:史亚维(1982—),女,陕西咸阳人,硕士研究生,助教,现供职于咸阳职业技术学院,主要研究方向:FPGA和数字电路设计。

上一篇:微网的光伏系统并网运行和离网运行的控制策略 下一篇:2006—我国关联数据研究论文的定量分析