摘 要
Turbo码将卷积码和随机交织器结合在一起,巧妙地实现了随机编码的思想,同时采用软输出迭代译码来逼近最大似然译码。Turbo码已经在实际的通信系统中得到应用,但是随着通信技术的发展和人们对通信业务需求的不断提高,对Turbo码的编译码技术进行研究很有必要。
通用异步收发器(Universal Asynchronous Receiver Transmitter,UART)是一种能同时支持短距离和长距离数据传输的串行通信接口,被广泛应用于微机和外设之间的数据交换。像8251、NS8250、NSl6550等都是常用的UART芯片,但是这些专用的串行接口芯片的缺点是数据传输速率比较慢,难以满足高速率数据传输的场合,而更重要的就是它们都具有不可移植性,因此要利用这些芯片来实现PC机和FPGA芯片之间的通信,势必会增加接口连线的复杂程度以及降低整个系统的稳定性和有效性。
本课题就是针对UART的特点以及FPGA设计具有可移植性的优势,提出了一种基于FPGA芯片的嵌入式UART设计方法,其中主要包括状态机的描述形式以及自顶向下的设计方法,利用硬件描述语言来编制UART的各个子功能模块以及顶层模块,之后将其集成到FPGA芯片的内部,这样不仅能解决传统UART芯片的缺点而且同时也使整个系统变得更加具有紧凑性以及可靠性。
本课题主要设计有波特率发生器模块,接收启动模块,接收模块与发送模块。在具体的设计过程中,利用利用VHDL语言对各个模块进行编程,并通过Modelsim进行仿真测试。
关键词:Turbo码;SOVA算法;VHDL;Modelsim
I
Abstact
Turbo code convolution code and randomly intertwined together, cleverly realized,random coding idea, at the same time soft output of iterative decoding is used to approximate maximum likelihood decoding. Turbo code has been applied in the actual communication system, but with the development of communication technology and the increasing demand for communication service people, study of Turbo code compiled code technology is necessary.
Universal Asynchronous transceiver (Universal Asynchronous Receiver Transmitter, UART) is a kind of can support both short and long distance data transmission in serial communication interface, is widely used in the data exchange between computer and peripherals. Like 8251, NS8250, NSl6550 are common UART chip, but the dedicated serial interface chip disadvantage is that the data transmission speed is slow, difficult to meet the high speed data transmission occasions, but more important is that they are not portable, so to use these chips to realize communication between PC and FPGA chip, is bound to increase the complexity of the interface connections and reduce the stability and efficiency of the whole system.
This topic is according to the characteristics of UART and the FPGA design with the advantages of portability, put forward a kind of embedded UART design method based on the FPGA chip, which mainly includes the description of the state machine form as well as the top-down design method, hardware description language was used to prepare the UART of each function module as well as the top-level module, after the internal integrated into FPGA chips, such not only can solve the traditional UART chip faults and at the same time also become more compact and the whole system reliability.
This topic main design baud rate generator module, receives the start module, receiving module and sending module. In the detailed design process, with each module using verilog language programming, and through the Modelsim simulation test.
Key Words:Turbo codes;SOVA algorithm;VHDL;Modelsim
II
目录
1 绪论 .............................................................................................................................. 1
1.1 Turbo码编译码器的研究目的和意义 ............................................................ 1 1.2 国内外研究现状 ............................................................................................... 2 1.3 论文的安排 ....................................................................................................... 5 2 Turbo码编译码器的原理及算法 ............................................................................... 6
2.1 Turbo码编码原理 ............................................................................................ 6 2.2 交织器 ............................................................................................................... 7
2.2.1 规则交织器 ............................................................................................ 7 2.2.2 伪随机交织器 ........................................................................................ 8 2.3 系统卷积码编码器 ......................................................................................... 10 2.4 Turbo码译码原理 .......................................................................................... 11
2.4.1 SISO译码模块 .................................................................................... 11 2.4.2 软判决译码与硬判决译码 .................................................................. 12 2.4.3 译码器结构 .......................................................................................... 12 2.5 SOVA译码算法 ............................................................................................. 13
2.5.1 累积路径度量的计算 .......................................................................... 13 2.5.2 计算软判决值 ...................................................................................... 14 2.5.3 软判决值的更新 .................................................................................. 14 2.5.4 外部信息值的计算 .............................................................................. 14 2.5.5 改进的SOVA译码算法 ..................................................................... 14
3 编码器的设计与实现 ................................................................................................ 17
3.1 伪随机序列发生器 ......................................................................................... 17 3.2 交织器 ............................................................................................................. 17 3.3 分量编码器模块 ............................................................................................. 32 3.4 截余模块 ......................................................................................................... 35 3.5 帧同步机 ......................................................................................................... 35 3.6 信道模型 ......................................................................................................... 37 3.7 接收机的分接插入模块 ................................................................................. 37
III
4 译码器的设计与实现 ................................................................................................ 38
4.1 定点量化 ......................................................................................................... 38 4.2 译码器的实现 ................................................................................................. 38
4.2.1 单译码器的设计 .................................................................................. 38 4.2.2 译码器总体框图 .................................................................................. 39 4.2.3 SOVA译码器的设计 .......................................................................... 40 4.2.4 反相计算模块工作原理 ...................................................................... 45 4.2.5 交织与解交织 ...................................................................................... 46
5 Turbo码编译码器的系统仿真 ................................................................................. 48
5.1 仿真工具 ......................................................................................................... 48 5.2 仿真语言 ......................................................................................................... 49
5.2.1 集成开发环境的选择 .......................................................................... 49 5.2.2 设计语言的选择 .................................................................................. 49 5.3 仿真流程 ......................................................................................................... 50 结论 .................................................................................................................................. 56 致谢 .................................................................................................................................. 57 参考文献 .......................................................................................................................... 58 附录A 英文原文 ............................................................................................................ 60 附录B 汉语翻译 ............................................................................................................ 66
IV
1 绪论
1.1 Turbo码编译码器的研究目的和意义
1948年,Shannon发表了题为《A Mathematical Theory of the Communication》的著名论文,在这一论文中,Shannon提出的理论为信息编码以及现代通信理论纠错码的奠定了基础,它的发表标志着信息与编码这一学科的创立。该论文从数学的角度出发,定义了信源的嫡和信道容量,并且给出这样的证明,认为只要信源的嫡和信道容量相比要小,则存在某种差错控制编码方法,能够使信道输出的错误概率减小为任意小,从而在噪声信道上实现质量较好的可靠通信[1]。
当时,在通信学界的研究者当中普遍存在这样的观点,他们认为在数据传输速率不为零的情况下,是不可能使差错率为任意小的,而Shannon提出的理论改变了这一观点,为信道编码界做出了重大的贡献,同时也引出了两个比较实际的问题,其一,Shannon的编码定理只是在理论上提出存在这样的“好码”能够达到信道容量极限,但并没有提出有效的方法来构造这种“好码”;其二,为了实现很低的差错概率,必须增加码字的长度,但是译码的复杂性会随着码字长度的增加而变得更加复杂,围绕着这两个实际问题,研究者们对信道编码理论展开了研究和实际应用。
Shannon的这一论断引出了两个实际的问题:第一,能达到信道容量极限的“好码”是确实存在的,但是Shannon并没有明确的指出这样的码该如何构造;第二,一个随机选择的码将以极高的概率表现为“好码”,同时,增加码字的长度能够提高性能,但是,对于随机选择的码,译码的复杂性是同码字的个数成正比的,事实上,寻找一种可实现的译码方法比发现一个“好码”更为困难。可以说,整个信道编码理论的研究和实际应用,都是围绕着这两个问题展开的。
从上世纪40年代末开始,人们就不断地努力试图找出Shannon所说的“好码”。在这一过程中,许多性能优良的码被发现,如BCH码,RS码,Reed-Mule码以及一些特定的卷积码等等,这些码在实际的通信系统中得到了广泛的应用,并收到了良好的效果,但是这些码同Shannon指出的信道编码极限仍有不小的距离,因为这些码都具有很强的数学结构而不够“随机”。以至于人们开始对Shannon的论断产生了怀疑。直到1982年,Ungerbock将编码和调制结合起来,提出了格状编码调制(Trellis Code Modulation
1
TCM)后,信道编码理论才有了大的突破。格状编码调制在带限信道下能够比较接近Shannon极限,因此TCM的提出成为信道编码领域的一个重要里程碑。
在Ungerbock提出TCM之后的10年时间里,信道编码理论在通向Shannon极限的道路上又陷入了困境,一直没有太大的进展。直到1993年,在ICC (International Information Conference)大会上,C.Berrou, A.Glavieux和P.Thitimaj shima提出Turbo码的概念。Turbo码巧妙的将卷积码和随机交织码结合起来,实现了随机编码的思想;同时采用软输出迭代译码来逼近最大似然译码。Berrou等人使用约束长度为5的子码,长度为65536的交织器,码率为1/2的Turbo码,经过18次迭代译码之后,在AWGN信道上当Eb/No>0.7dB时的误比特率(BER) <10-5,达到了近Shannon限的性能(1/2码率的Shannon限为0dB)。Turbo码的提出更新了编码理论研究的一些概念和方法:编码理论的研究从早期的基于代数结构的构造和译码方法,变为了现在主要是基于概率的软判决译码方法;编码方案的比较也由以前的相互比较过渡到了现在大多与Shannon限进行比较;同时部分编码理论家也开始变为实验科学家。因此,Turbo码被认为是继1982年TCM技术问世以来,信道编码理论与技术研究上所取得的最伟大的成就,具有里程碑的意义。
目前Turbo码已经应用在许多领域,例如在CDMA多用户检测技术、均衡技术等方面都有用到Turbo码的理论。在信道编码中,Turbo码在低信噪比情况下优势十分明显。在AWGN信道上,归一化信噪比SNR >7dB时,若交织长度为65536bit,同时译码采用最大似然判决译码方式,经过18次迭代,码率为1/2的Turbo码的误比特率可达10-5。而对于同样条件下的系统卷积码,要达到如此低的误比特率,至少应满足SNR>7dB才可以实现Turbo码作为一种高性能的信道编码,在低信噪比情况下以其优异的性能及逼近Shannon容量限的编码方式,在通信领域得到了广泛应用。特别适用于对功率要求严格的情形,如卫星通信、移动通信及军事通信中,因此Turbo码是极具吸引力的信道编码[2]。
1.2 国内外研究现状
自从1993年Claude Berrou教授等人提出Turbo码以来,在编码领域引起了轰动,研究的人越来越多,并且取得了很大的成果。
十几年以来,人们在Turbo码的理论研究方面做了大量的工作,尤其是在Turbo码
2
的编码结构,交织器设计和译码算法等方面取得了一定的进展,但是到目前为止,还没有形成系统而完善的分析Turbo码的理论。虽然理论尚有欠缺,但是通过多年来学者们在降低Turbo码译码复杂度方面的努力,Turbo码己经走向了实用化的道路:在第三代移动通信系统中,Turbo码被各种标准采用为高速数据业务的信道编码方式;在深空通信中,Turbo码也作为标准被写入CCSDS建议中;移动通信的研究方案中,Turbo码作为信道编码的备选方案之一[3]。
随着距离谱的进一步发展,Perez教授从距离谱的角度分析了Turbo码的性能,重点研究的是在低信噪比的情况下Turbo码在编码的过程中,交织器是非常重要的部分,它起到的作用是“谱窄化”,从而导致了Turbo码在小重量的码字在整个码中的比率降低了很多,进而就可以提升译码的性能。不仅是这些,Perez教授还对距离谱加深一步理解和研究,得出了Turbo码译码过程中产生误码底限的原因。
1996年,S.Benedetto与G.Montorsi教授提出了均匀交织器的概念,还推测出了我们可以设计出好的交织器,使得误比特率可以达到最低。随后两位教授又开始对递归系统卷积码进行了深入研究,在1998年发现了许多性能优秀的RSC成员码。
此外,也有很多研究员在研究Turbo码迭代译码。主要包括MAP类与SOVA类译码算法。他们主要做了如下几方面研究:
(1) 对两类译码算法进行了比较,总结出了各自的优缺点; (2) 对译码结构进行调整; (3) 译码时延的调整; (4) 译码算法的优化调整;
(5) 实现固定位数译码器时,影响译码性能的是数据量化。
和其它的信道编码方案相比较,Turbo码虽然采用了迭代译码的原理,具有优异的译码性能,但是仍存在有待于改进的缺陷:
(1) 译码算法相对较为复杂,计算量大;
(2) 编译码器中交织器的引入,译码器采用迭代译码,导致译码延时较大,从而了Turbo码在高速实时通信系统中的应用;
(3) 存在着所谓的地板效应(error-floor),即在误码率下降到一定程度以后,再增加信噪比的情况下,误码率就下降得很慢,并趋于恒定;
(4) 理论分析困难,目前尚未有对Turbo码编译码器进行完整的理论分析与估计,一般都是通过计算机仿真模拟其性能。
3
在硬件实现方面,许多的科研院所和大公司都己经推出了Turbo码的相关芯片和正在研究更适于现代通信系统的Turbo码芯片。南澳大利亚大学Small World通信研究组最先开始开发Turbo编译码器并推出了Turbo码产品,新加坡Oki公司推出了用于Turbo编解码的专用芯片EMIK07 ,Advanced Hardwar推出了单芯片Turbo乘积码(TCP)编解码器Astro LE,世界上两大著名的FPGA供应商Xilinx和Altera公司都推出了基于自己FPGA芯片的Turbo码编译码器的IP Core。总的来说,推出的专用芯片和IP Core是用于特殊用途的,参数单一,缺乏灵活性,存储量大,功耗较大,而且价格昂贵,专用芯片还有一定的起订数量要求,阻碍了Turbo码的实用化推广。
在译码算法方面,主要采用的都是软输入/软输出译码算法(Soft-Input/Soft-Output;SISO )。自Turbo码出现以来这方面的研究也引起了许多学者的关注。Hagenauer等利用对数似然比对存在的软输入/软输出算法进行分析。这些方法包括逐符号最大后验概率译码(Maximum A Posteriori;MAP)算法或称BCJR算法;软输出Viterbi(Soft Output Viterbi Algorithm;SOVA)算法以及相应的次最优算法等。
MAP算法是一种基于码元的最大后验概率译码算法,对于线性块编码的卷积码,它能使比特错误率最小。也是最早应用于Turbo译码中的译码算法。但是采用此算法计算量大,译码复杂度高,在实际中应用起来比较困难。这主要是因为;在算法中求对数似然比和中间变量的迭代过程中存在着大量的指数,乘法和加法运算;随着状态数与分组序列长度的增长,中间变量所需的内存呈指数性增长;需要接收完整的序列才能获得信息位的软输出。针对这些译码算法的复杂性,人们对其进行了修正和改进。
在实际应用中,无论采用数字信号处理(DSP)还是可编程门阵列(FPGA)等其它芯片实现,算法中大量的指数和乘法运算的存在都将会严重制约处理速度,势必会为迭代译码增加延时,且不利于信息传输速率的提高。因此,如何消除MAP算法中的指数和乘法运算成为简化算法的首要任务。而最为有效的方法就是利用对数函数的单调性,对算法中的变量统一取对数,将其中的乘法运算化为加法运算并消除部分指数运算。
另外,由于状态变量向后递归迭代的需要,MAP算法要接收到完整的序列才能得到信息位软输出,译码过程缺乏连续性,且编码器必须终止于某一确定状态(如零状态),这意味着每传送一帧(编码分组)数据就必须在末尾添加一些额外的“迫零比特”。如果信息序列的编码分组(帧)比较短,则将会严重的降低实际编码效率;相反,如果为保证编码效率而一味扩大帧长,则采用MAP算法又会因中间变量过度膨胀而带来难以忍受的内存需求。实际上,为简单起见,采用迭代译码的Turbo码信息位帧长度一般与
4
交织器的交织深度一致,而交织深度的选取多半根据所需支持的通信业务的性质及其要求达到的误码率等因素决定。为此,受有限译码约束长度维特比算法的启发,人们提出了准最佳的活动窗BCJR算法;或把长帧的信息分成W段用W个并行子译码算法同时进行译码。
Turbo码译码算法的复杂度还表现在向前和向后迭代运算中,由于减少迭代次数可以有效地减少向前和向后迭代运算,也就会降低译码复杂度。因此如何减少迭代次数或对信息符号及早判决成为人们研究的热点,针对这种情况,人们提出了各种改进的算法。
由于Turbo码是面向第三代移动通信的纠错编码,因此需要高速率的传输数据信息并且功率消耗要小,针对高码率的Turbo码,有相应的译码方法,同时人们对如何减小译码的功率损耗也提出了相应的译码算法[4]。
由于Turbo码的译码过程中,每一个系统都为SISO算法。软判决值(通常为对数似然比)送入下一级。最后一级软输出反馈至第一级,作为第二次迭代的初始值。目前正研究将Turbo译码思想进一步推广到更为广泛的检测和译码结构中,如串行级联译码、均衡、编码调制、多用户检测、联合信源与信道译码等。
相比之下,Turbo码译码中,软输出维特比译码(SOVA)算法计算简单,存储量小,易于硬件实现的优点,受到人们广泛的关注。但由于它的输出不是对MAP算法结果的一个近似,因此是次最优算法,它在性能上与MAP算法相差1dB左右[5]。
1.3 论文的安排
各章的内容安排如下:
第1章为绪论部分,主要介绍了Turbo码的产生背景,现阶段国内外研究现状,以及论文内容的安排。
第2章介绍Turbo码编译码原理以及算法。 第3章介绍了编码器的设计与实现。 第4章介绍了译码器的设计与实现。 第5章介绍了系统仿真。
5
2 Turbo码编译码器的原理及算法
2.1 Turbo码编码原理
Turbo码编码器包含一个交织器分成的两组卷积码,由图2.1所示,生成的码是两组同码率的二进制组合码。
图 2.1 Turbo码编码器原理框图
Turbo码将卷积码和随机交织器结合在一起,巧妙地实现了随机编码的思想,同时采用软输出迭代译码来逼近最大似然译码。计算机仿真结果表明,采用交织深度为65536的随机交织器,迭代次数选为18次,码率为1/2的Turbo码在AWGN信道上当Eb/No ≥0.7dB时的误比特率BER≤10-5,达到了近Shannon限的性能。正是由于Turbo码超乎寻常的性能,它的出现立即引起了编码学界的极大轰动,围绕Turbo码的研究也成为了通信系统研究中的一个热点。Turbo码的出现对信道编码理论和技术的研究产生了深远的影响,结束了长期以来将信道截止速率作为实际容量限的历史,从原先的基于代数的构造和译码方法转变为基于概率的软判决译码方法,从之前的编码方法之间的相对比较变成了与Shannon限进行比较等等。
Turbo码编码器的实现框图如图2.1所示。其中,编码器1和编码器2均为递归系统卷积码(RSC)编码器,整个编码器采用并行级联卷积码(PCCC)的形式。编码器的输出比特经过删除(Puncturing)和复用(Multiplexing)可形成不同码率的Turbo码。两个分量编
6
码器采用的都是RSC(递归系统卷积)码。RSC码由前馈多项式和反馈多项式共同决定。
𝑐𝑐反馈变量𝑎𝑖=𝑚𝑖+∑𝑗=𝑖𝑎𝑖−𝑗𝑔𝑏𝑖,校验输出𝑎𝑖=𝑚𝑖+∑𝑗=𝑖𝑎𝑖−𝑗𝑔𝑓𝑖,𝑢𝑘为编码器输
𝑚𝑚
入比特。课题采编码框图如图2.2所示。交织器的使用是实现Turbo码近似随机编码的关键。
DkΣΤΤXkCkYkAkΣ图2.2(7,5)递归系统卷积码的编码框图
2.2 交织器
交织器是一个单输入、单输出的信号处理器,输入序列经过交织器之后,所得到的输出序列的顺序将发生改变。长度为N的交织器可以用N个整数π(0),π(1),π(2),……π(N-1)来表示,交织的过程可以理解为:交织器在第s时刻的输出等于第π(s)时刻的输入信号。
目前,常用的Turbo码交织器有分组交织器,伪随机S交织器和分组螺旋交织器等。 2.2.1 规则交织器
分组交织器的一种结构如表2.1所示。由表可见,经过这种交织器的置换,信息序列中首尾比特位置在交织前后保持不变。当分量编码器不归零时,由于分量译码器对一帧数据中的最后几比特译码的可信度较低,这样如果原数据帧中的最后几比特交织后仍然处于帧数据的尾部,则整个Turbo码性能的提高就受到了,这种现象称为尾效应(tail effect)。为了避免这个问题,在交织器的设计中应该将原数据帧中的最后几比特置换到编码器二的输入序列的非尾部位置。当分量编码器归零时,则不存在尾效应。
7
表2.1行写列读的分组交织器
0 3 6
1 4 7
2 5 8
分组螺旋交织器也是规则交织器的一种,其交织过程为:在一个m*n的矩阵中,将原始序列按行的顺序写入,然后从矩阵的左上角开始读数,每读下一行的同时右移一位读取数据,读完为止。同样,数据也可从交织矩阵的左下角开始向右上角读取,即每读上一行数据的同时,右移一位,图2.3 (a) (b) 分别为两种读取数据方式的分组螺旋交织器的交织过程。
图2.3 分组螺旋交织器
此类交织器便于硬件的实现,交织与解交织工作可用同一个模块来完成。与分组交织器相比,由于其交织后相邻码元之间产生的距离较大,则在去相关性方面更优于分组交织器。
2.2.2 伪随机交织器
关于伪随机交织器,目前所公认的性能较好的是伪随机S交织器,即每一个随机产生的置换位置π(i)均与它前面的S个值,π(i-1),π(i-2),……π(i-s) 进行比较,如果距离|𝜋(𝑖)−𝜋(𝑖−𝑗)|<𝑠,j=1,2,3,……s则π(i)被拒绝,必须重新产生。除此之外,伪随机S交织器的设计同随机交织器。
如果Turbo码不进行删余,则码率为1/3,这样的低码率对于深空通信场合是适合的,但是对于卫星通信,个人移动通信等对带宽利用率要求较高的场合,希望有更高的编码效率。所以这时有必要引入删余机制,周期性的删除选定的比特,以减少编码信息
8
的冗余度,提高码率。对于迭代译码的情况,一般只删除校验位,特别的,对于1/2删节,一般可以删除RSC1的所有偶数校验比特,删除RSC2的所有奇数校验比特。对于码率大于1/2的情况,选择别的删余方案可以获得更优异的性能。删余矩阵的作用是提高编码效率,其元素取自集合{0,1}。矩阵中每一行分别与两个分量编码器相对应,其中“0”表示相应位置上的校验比特被删除,而“1”表示保留相应位置上的校验比特。根据删余矩阵的不同形式,就可以得到不同码率的Turbo码。
在信息论当中,交织器在Turbo码编码器中起到了随机性编码的作用。伪随机交织器的采用使得交织后的序列随机性增大,更加切合随机性编码的原理,因此伪随机交织器是最佳交织器,模拟结果证明在交织长度较长的情况下伪随机交织器的优势确实非常明显。
伪随机交织器的映射规则不是具体的而是随机生成的。对于一个交织长度为N的伪随机交织器,那么它的交织形式可有N!种,则设计伪随机交织器的步骤如下:
(1) 以随机的方式在集合𝑆={1,2,3……N}中选择一个整数𝑖1,则其被取到的概率为𝑃(𝑖1)=1⁄𝑁,将𝑖1放入新的集合𝑆1中,记为I(0),并将其从原有的集合S中删除。
(2) 在第k步,以随机的方式在集合𝑆𝑘−1={𝑖∈S,𝑖≠𝑖1,𝑖2……𝑖𝑁−𝑘+1}中选择一个整数𝑖𝑘,其被取到的概率为𝑃(𝑖𝑘)=1/(𝑁−𝑘+1),将𝑖𝑘放入新的集合𝑆𝑘中,记为I(k),并将其从原有的集合𝑆𝑘−1中删除。
(3) 当k=N时,即相应得到I(N),其选取概率为p(𝑖𝑛)=1,此时𝑆𝑁=Φ。完成交织过程。课题中采用对编码器输出信号混入噪声的方法来模拟通信信道,如图2.4所示。其中S(t)为编码器输出序列;n(t)为加性高斯白噪声;r(t)为接收端收到的混有噪声的序列。编码器输出{𝑢𝑘,𝑣1𝑘 ,𝑣2𝑘 }经过加性高斯白噪声(AWGN)信道模型后接收到的数据流为𝑦𝑘={𝑎𝑘,𝑏𝑘}={𝑎𝑘,𝑏1𝑘,𝑏2𝑘},其中 𝑎𝑘= (2𝑢𝑘-1) + 𝑛𝑠,𝑏𝑘= (2𝑣𝑘-1) + 𝑛𝑝。𝑛𝑠和𝑛𝑝是两个同分布的高斯噪声样值,并且它们的均值为0,方差为δ2=𝑁0/2 。
9
n(t)TurboEncoderS(t)+r(t)图2.4 AWGN信道模拟
2.3 系统卷积码编码器
Turbo码中级联的两个编码器必须是系统码。然而Forney等己经证明过,对于经典前馈型的卷积码而言,在同样记忆长度和较大信噪比SNR条件下,非系统卷积码(NSC, Non Systematic Convolutional)比系统码有着更大的自由距离和更低的误比特率BER。这个结论导致目前实用的前馈型卷积码绝大多数是非系统卷积码。为此C.Berrou等在1993年提出Turbo码的同时提出了一类新的递归型系统卷积码(RSC, Recursive Systematic Convolutional ),该码在高码率时比最好的NSC还要好。Turbo码既然要求采用系统码,理所当然地选择了递归型系统卷积码RSC在截余形式下,递归型系统卷积码RSC比非递归系统卷积码NSC具有更好的重量谱分布和更佳的误码率性能,并且在码率越高,信噪比越低的时候其优势越明显。
截余是通过删除冗余的校验位来调整码率,Turbo码由于采用两个编码器,产生的冗余比特比一般情况多一倍,这在很多场合下并不需要。但又不能排斥两个编码器中的任何一个,于是折衷的办法就是按一定规律轮流选用两个编码器的校验比特。举例来说,采用两个码率R=1/2的系统卷积码时,如果不采用截余,系统信息位加两个编码器的各一个校验位将产生码率R=1/3的码流。但如果令编码器1的校验比特序列乘以截余矩阵,而让编码器2的校验比特序列乘以截余矩阵,就产生了在编码器1, 2之间轮流取值的效果。此时,虽然1位比特信息仍产生2位校验,但发送到信道上的只是1位系统信息位和1位轮流取值的校验位,于是码率被调整为R=1/2。
10
2.4 Turbo码译码原理
Turbo码获得优异性能的根本原因之一是采用了迭代译码,通过分量译码器之间的软信息的交换来提高译码性能。对于Turbo码这样的并行级联码,如果分量译码器的输出为硬判决,则不可能实现分量译码器之间软信息的交换,从而了系统性能的进一步提高。从信息论的角度来看,任何硬判决都会损失部分信息,因此,如果分量译码器(内码译码器)能够提供一个反映其输出可靠性的软输出,则其它分量译码器(外码译码器)也可以采用软判决译码,从而系统的性能可以得到进一步提高。为此,人们提出了软输入软输出译码(SISO)的概念和方法。Turbo码的分量码SISO译码算法总体上可以分为SOVA和MAP两类主要算法。 2.4.1 SISO译码模块
由于Turbo码译码需要采用分量译码器之间的软信息的交换来提高译码性能,所以分量译码器必须能接受软信息以及能输出软信息,即需要采用软输入软输出(SISO)译码器。SISO译码器的输入信息应有三个:系统信息,校验信息和先验信息。SISO译码器的输出应该为软判决信息。这里将介绍SISO译码器输入输出信息的定义和产生。
在这里首先给出遵循的变量名及下标使用规则。k表示时刻,𝑆𝑘表示k时刻分量编
𝑝𝑠码器的状态,𝑥𝑘=𝑢𝑘表示分量编码器k时刻输出的信息位,𝑥𝑘表示分量编码器k时刻输𝑝𝑠出的校验位,𝑋={𝑥𝑘}表示分量编码器输出的码序列,𝑦𝑘和𝑦𝑘分别表示k时刻译码器接
收到的信息位和校验位,Y={𝑦𝑘}表示接收到的码序列。
当发送比特𝑥𝑘为+1或者-1时,接收到𝑦𝑘的条件似然比见公式(2.1)。
𝐿(𝑦𝑘|𝑥𝑘)=𝑙𝑛((2.1)
假定被编码后的符号比特采用BPSK调制,并经过高斯信道或者衰落信道传送,因此我们可以得到在接收端接收为𝑦𝑘的概率见公式(1.2)。
𝑃=(y𝑘|𝑥𝑘=±1)=𝛿1√𝑏2
𝑒𝑥𝑝(−(𝑦∓𝑎)) (2.2) 𝑘22𝜋2𝛿
𝑃(𝑦𝑘|𝑥𝑘=+1)
𝑃(𝑦𝑘=𝑥𝑘=−1)
)
𝐸
其中,𝐸𝑏为每个传输比特的能量,𝛿2为噪声方差,a为信道的衰落幅度(对于无衰落的AWGN信道,a=1)。
11
2.4.2 软判决译码与硬判决译码
在以往的通信系统当中译码器与解调器是分开的,当接收到信号时,首先由解调器对信息进行最佳判决,再将判决的结果输出到译码器中,译码器再对输入的信息进行最佳判决,纠正调制器产生的错误判决,此为硬判决译码的思想慢慢的人们意识到这样会造成译码性能的下降。在现代通信系统当中,人们采用将编码与调制相结合,解调与译码相结合的办法,即解调器不对输入信息进行硬判决,而是将符号可能出现的概率值输出给译码器,这样就不会将错误信息传递给译码器,从而降低了误码率,提高了译码性能。译码器通过解调器输出的对符号判决的概率值与编码器输出的信息相结合,进行最终判决,这就是软判决的思想。经过研究表明,当解调器采用软判决译码时,得到的编码增益要比采用硬判决译码时高出2dB左右。 2.4.3 译码器结构
𝑝1𝑝2𝑝𝑠𝑝
经过删余后,编码器的输出为𝐶𝑘=(𝑥𝑘,𝑥𝑘),其中𝑥𝑘由𝑥𝑘和𝑥𝑘交替组成。将𝐶𝑘送入
调制器中经调制后送入到信道中传输,在接收端进行解调,经过接收机匹配滤波器的输
𝑠𝑝出采样值为𝑦𝑘=(𝑦𝑘,𝑦𝑘),将采样序列输入到译码器中进行译码,来估计出发送的原始信
息如图2.5所示为Turbo码译码器结构框图。
图2.5 译码器结构框图
12
2.5 SOVA译码算法
基于SOVA算法的Turbo码译码器结构如图2.6所示。
解交织交织器SOVA1SOVA2YtSOVA算法是在Viterbi算法的基础上,使其具有提供软判决输出和利用外部信息能力的一种算法。对于典型Turbo码编码器结构中的编码存储级数为v,码率为1/1V的递归系统卷积码(RSC)编码器,栅格图中状态总数为s=20,每个状态都只有两个输入分支和两个输出分支。传统的SOVA算法包括以下步骤: 2.5.1 累积路径度量的计算
在时刻k,每一状态的路径m的累积路径度量由公式(2.3)得
𝑚𝑚𝑚
𝑀𝑘𝑚=𝑀𝑘−1+∑𝑁𝑛=1𝑥𝑘,𝑛𝐿𝑐𝑦𝑘,𝑛+𝑥𝑘,1𝐿(𝑢𝑘),𝑚=1,2 (2.3) ()
()
()
()
其中x和y分别为编码输出的码字序列和对应的接收序列,𝐿𝑐=4·𝐸𝑠/𝑁0,且有𝐿(𝑢𝑘) 为 𝐿(𝑢𝑘)=
𝑝(𝑢𝑘=+1⁄𝑦)
𝑙𝑛{𝑝(𝑢=−1)},𝑢𝑘为
⁄𝑦𝑘
解复用13
图2.6 SOVA算法的Turbo码译码器
k时刻编码器输入的信息比特。
交织器解交织
2.5.2 计算软判决值
时刻k路径m的概率由公式(2.4)
𝑚𝑃𝑘
=𝐶×𝑒
𝑀𝑘
(𝑚)
/2
,𝑚=1,2 (2,4)
式中C为常数。选择错误路径的概率由公式(2.5)
𝑒Φ𝑘
=𝑃𝑠+𝑃𝑐=
𝑘
𝑘
𝑐𝑃𝑘
𝑠𝑐1+𝑒(𝑀𝑘−𝑀𝑘)/2
1
(2.5)
𝑠𝑠𝑐𝑐
式中𝑀𝑘和𝑃𝑘 表示幸存路径的累积路径度量和概率,𝑀𝑘和𝑃𝑘表示幸存路径的并行路
径的累积路径度量和概率。由此可得到时刻k的路径判决的对数似然比(软判决值)为公式(2.6)
Δ𝑘=𝑙𝑜𝑔
2.5.3 软判决值的更新
在每一个时刻k,软判决值的更新规则有HR-SOVA和BR-SOVA两种。
𝑐𝑠𝑠
𝑢𝑗𝑠≠𝑢𝑗→𝐿𝑗=min(𝐿𝑗,Δ𝑘) (HR-SOVA) (2.7)
𝑐𝑠𝑠𝑐
𝑢𝑗𝑠≠𝑢𝑗→𝐿𝑗=min(𝐿𝑗+𝐿𝑗,Δ𝑘) (BR-SOVA) (2.8) 𝑐式(2.7)和(2.8)中的𝑢𝑗𝑠和𝑢𝑗分别为时刻k幸存路径和幸存路径的并行路径的第J比特。
1−Φ𝑒𝑘Φ𝑒𝑘
𝑠𝑐
=(𝑀𝑘−𝑀𝑘)⁄2 (2.6)
BR-SOVA比HR-SOVA的性能要好,但是算法的复杂度要增加不少,所以实际中经常使用的是HR-SOVA。 2.5.4 外部信息值的计算
由最大似然路径上的硬判决序列{𝑢𝑘}的条件对数似然比减去固有信息值,即可得到外部信息的估计值由公式(2.9)。
𝐿𝐸(𝑢𝑘)=𝐿(𝑢𝑘)−𝐿𝐼(𝑢𝑘)=𝐿(𝑢𝑘)−𝑦𝑘,1 (2.9)
𝑦𝑘,1为接收码字在k时刻的系统码元,L(𝑢𝑘)为输入译码器的先验信息值。 2.5.5 改进的SOVA译码算法
改进SOVA算法主要有限幅SOVA,双向SOVA,限幅SOVA。
14
SOVA算法较MAP算法性能下降的原因之一是SOVA的输出软判决值偏大,或者说对判决可信度的估计过高,限幅SOVA通过设置门限对软判决值进行来解决这一问题。其译码流程、路径度量、对数似然比的计算与传统SOVA相同,唯一要修正的是利用公式(2.10)对软判决值Δ𝑘值进行限幅。
Δ𝑘
>Δ𝑇𝐻→Δ𝑘=Δ𝑇𝐻 (2.10)
对于限幅SOVA,挑选合适的门限值Δ𝑇𝐻是比较困难的,如果Δ𝑇𝐻取值过大,限幅处理基本不起作用;而Δ𝑇𝐻取值过小,则会由于过多地修正软判决值而降低译码性能。门限Δ𝑇𝐻与判决可信度的统计特性有关,最优的软判决值门限应该根据信道特性(如信噪比)的变化而变化。
SOVA算法译码时,可以按正向或者反向的网格图进行。由于正向和反向SOVA译码的方向不同,路径的选择以及各条路径度量的累积值也不同,因而正向和反向译码产生的软输出值之间存在差异。双向SOVA算法在传统SOVA译码结构的基础上,增加了反向SOVA译码单元,使每个译码模块能够同时进行正向和反向SOVA译码操作,并提供各自的软判决输出,通过综合两个方向的软输出,为下一轮译码提供更为可靠的外部信息,达到改善SOVA译码性能的目的。
SOVA算法较MAP算法性能下降原因之一是SOVA的软输出值偏大,双向SOVA通过引入反向SOVA译码单元,来减小SOVA的软值偏差。目前,在各种SOVA改进算法中,双向SOVA的性能最好,但是由于引入了正反两个方向的计算,所以译码复杂度增加较大。限幅SOVA算法采用预先设定的门限值Δ𝑇𝐻对Δ𝑘值进行,在一定程度上提高了SOVA的性能。但是限幅SOVA只对大的软判决值进行,对小于门限的软判决值不作任何处理。实际上,SOVA译码器对软判决值的估计偏差在Δ𝑘的整个实数域上存在,所以仅仅对超过门限的软判决值进行限幅处理,改进的效果有限,这在一定程度上影响了SOVA算法性能的进一步提高。
借鉴量化中的非均匀量化提高量化信噪比的思想,引入软判决值修正函数H(Δ𝑘),其特性应类似于非均匀量化中的A律或群律压缩特性曲线。首先总体特性上要对Δ𝑘进行压缩,其次当Δ𝑘比较小时减小压缩而当Δ𝑘比较大时增大压缩。利用修正函数对Δ𝑘进行整个非负实数域的校正,进而改善SOVA软输出值的精确度。由于引入修正函数的缘故,将这一方法称为修正SOVA。
修正函数H(Δ𝑘)的选取直接影响译码性能。如果完全按照非均匀量化中的A律或μ律压缩特性曲线,或者类似的连续压缩特性函数,则系数A/μ或者解析函数式难以确
15
定。出于简化算法考虑,对H(*)作分段处理[5,6]。
16
3 编码器的设计与实现
在新的CCSDS标准中,把Turbo码作为一种推荐的信道纠错码。它由两个相同的寄存器长度是4的RSC编码器组成。交织器的长度有1784,3568,7136,20,16384五种,编码速率有1/2,1/3,1/4和1/6四种。关于帧同步机和伪随机序列生成器都在标准中有着详细的规定,下面本文将对Turbo编码器的各个功能模块逐一进行设计与实现。
3.1 伪随机序列发生器
伪随机序列具有某种随机序列的随机特性,它是通过设置数学乱源产生的,它之所以称为伪随机序列是因为它是预先确定的,并且是可以重复产生和复制的,当序列周期足够长时,他也具有良好的随机序列统计特性。Turbo码编码器输入的原始信息由伪随机序列发生器产生,本文采用移位寄存器来实现伪随机序列发生器,其结构如图3.1所示。
图3.1 伪随机序列发生器
采用9个D触发器(D0~D8),构造周期为29-1的伪随机序列发生器,其输出为触发器D8的输出取反,并将D8与D4的输出经过异或后反馈给D0,使其连续产生输出比特。
3.2 交织器
交织器被认为是Turbo码的核心思想,它对Turbo码的纠错性能有着重要影响Turbo码交织器的作用具体体现在2个方面:第一,它增大了校验码重,尤其是改善了低码重输入信息序列的输出校验码重,从而增大了码的最小自由距离,提高了纠错能力;第二,它最大可能地置乱输入信息序列的顺序,降低了输入/输出数据的相关性,使得邻近码元同时被噪声淹没的可能性都大大减小,从而增强了抗突发噪声的能力。
交织器算法:在空间数据咨询委员会(CCSDS)的遥感信道编码(Telemetry Channel
17
Coding)建议中,对其交织器作了详细的规定。
令交织器长度𝑘1×𝑘2,参数𝑘1,𝑘2(相对数值)由k的大小决定,如表3.1所示:
表3.1 交织器参数选取
帧数据信息比特长度
1784 3568 7136 02 16384
𝑘1 8 8 8 8
𝑘2 223 223*2 223*4 223*5
待定
接着作后面的步骤,若s=1到k可以获得更换顺序的数字π(s),这里s指的是输入到第二个编码器RSC2的第S位数据,而π(s)是初始帧的比特数字。指的是输在下面等式中,[X]表示的是小于X的最大整数,𝑝𝑞表示8个主要整数中的一个。
𝑚=(𝑠−1)mod2 (3.1)
𝑖=[𝑠−1⁄2𝑘]
2
(3.2)
𝑗=[(𝑠−1)/2]−𝑖𝑘2 (3.3)
𝑡=(19𝑖+1)mod(𝑘1/2) (3.4)
𝑞=𝑡mod8+1 (3.5)
c=(𝑝𝑞𝑗+21𝑚)mod𝑘2 (3.6)
𝜋=2(𝑡+c∗(𝑘/2)+1)−𝑚 (3.7) 其中:
P1=31; P2=37; P3=43; P4=47; P5=53; P6=59; P7=61; P8=67;
18
由于上述算法采用了大量的乘除(取模)运算,如果直接进行硬件实现,将使电路变得过于复杂和庞大,为了在资源有限的硬件上实现,本文针对𝑘1,𝑘2的具体数据及使用的具体环境,将该算法进行了优化。
伪随机交织器的设计原则是尽可能打乱原始数据排列顺序,使得交织前相邻的数据在交织后不能再次相邻。在Turbo码编码与译码的过程中都会用到交织器,且数据交织一般是通过控制数据RAM的读写地址来实现,即只要获得数据的交织地址就可完成交织和解交织过程。在交织过程中,利用交织地址读数据,解交织时利用解交织地址存储数据,大大减少了计算量与地址存储量。对于伪随机交织器,随机地址的产生是实现随机交织器的关键问题。本文采用的随机交织器,其结构框图如图3.2所示。
图3.2 伪随机交织器结构图
256位顺序地址Wad由计数器产生,作为数据写入RAM的地址,计数器产生Cr信号控制选择器产生读、写数据的使能信号一,分别为Ren和Wen,选择器控制随机地址产生器产生256位随机地址Rad,并发出写使能信号Wen控制数据按照顺序地址Wad写入RAM中,然后当Ren使能时,按照随机地址产生器产生的地址Rad读出数据,完成交织过程。其中,随机地址产生的方法如下:采用m序列来产生随机数,可将输出的串行随机序列转换成并行数据输出作为RAM地址。根据m序列的性质,在一个周期内除了全零以外,其它状态只出现一次,由于它的状态是唯一的,那么用n序列来当做
19
RAM的读写地址,就保证了数据的唯一性。交织存储器为一块双口RAM,分为上、下两部分,上半空间数据在输入,下半空间数据交织输出。由于采用了8级移位寄存器设计的m序列发生器,则交织深度为256bit。
交织器1和交织器2所对应的代码如下所示: 交织器1 library ieee;
use ieee.std_logic_11.all; use ieee.std_logic_arith.all; use work.turbopack.all;
entity trellis1 is -- first trellis port (
clk: in std_logic; // 计时 rst: in std_logic; // 负复位
selState: in std_logic_vector(2 downto 0); // 0时刻选中状态
selTrans: in ARRAY8b; // 8 selected transitions (1 per state) at time 0
selStateL2: out std_logic_vector(2 downto 0); // 在(l - 2)时刻选中状态 selStateL1: out std_logic_vector(2 downto 0); // 在(l - 1)时刻选中状态 stateL1: out ARRAY4d; // 在(l - 1)时刻的4种可能状态
selTransL2: out std_logic_vector(1 downto 0) // 在(l - 2)时刻选择过度 ); end trellis1;
architecture synth of trellis1 is signal pathIdReg : ARRAY8d; signal reg : ARRAY_TREL1_LENx8; begin
process (clk, rst)
20
variable free : std_logic_vector(7 downto 0); variable freeBeg : std_logic_vector(7 downto 0); variable pastState : ARRAY8d; variable pathId : ARRAY8d; variable current_state : INT3BIT; variable freePathId : INT3BIT; variable state_l3 : INT2BIT; variable state_l2 : INT2BIT; variable state_l1 : INT2BIT;
variable outState_l2 : std_logic_vector(2 downto 0); variable outState_l1 : std_logic_vector(2 downto 0); begin
if rst = '0' then for i in 0 to 3 loop
stateL1(i) <= (others => '0'); end loop;
selStateL1 <= (others => '0'); selStateL2 <= (others => '0'); selTransL2 <= (others => '0'); for i in 0 to 7 loop pathIdReg(i) <= 0;
for j in 0 to TREL1_LEN - 1 loop reg(j * 8 + i) <= 0; end loop; end loop;
elsif clk = '1' and clk'event then free := \"11111111\"; for i in 0 to 7 loop
pastState(i):=TRANS2STATE(i*4+conv_integer(unsigned(selTrans(i)))); pathId(i) := pathIdReg(pastState(i));
21
free(pathId(i)) := '0'; end loop;
freeBeg:= \"11111111\"; for i in 0 to 7 loop current_state:= i; if
freeBeg(pathId(current_state))='1' then
reg(pathId(current_state))<=conv_integer(unsigned(std_logic_vector(c
onv_unsigned(current_state, 3))));
freeBeg(pathId(i)) := '0';
pathIdReg(current_state) <= pathId(current_state); for j in 0 to TREL1_LEN - 2 loop end loop; else
if free(0) = '1' then freePathId := 0; end if;
if free(1 downto 0) = \"10\" then freePathId := 1; end if;
if free(2 downto 0) = \"100\" then freePathId := 2; end if;
if free(3 downto 0) = \"1000\" then freePathId := 3; end if;
if free(4 downto 0) = \"10000\" then freePathId := 4; end if;
22
if free(5 downto 0) = \"100000\" then freePathId := 5; end if;
if free(6 downto 0) = \"1000000\" then freePathId := 6; end if;
if free(7 downto 0) = \"10000000\" then freePathId := 7; end if;
free(freePathId) := '0';
pathIdReg(current_state) <= freePathId; for j in 0 to TREL1_LEN - 2 loop
reg((j+1) * 8 + freePathId) <= reg(j * 8 + pathId(current_state)); end loop; end if; end loop;
state_l3:=reg((TREL1_LEN-3)*8+pathId(conv_integer(unsigned(selState)))); state_l2:=reg((TREL1_LEN-2)*8+pathId(conv_integer(unsigned(selState)))); state_l1:=reg((TREL1_LEN-1)*8+pathId(conv_integer(unsigned(selState))));
outState_l1(1 downto 0) := std_logic_vector(conv_unsigned(state_l1, 2));
selStateL1 <= outState_l1; selStateL2 <= outState_l2;
selTransL2<=std_logic_vector(conv_unsigned(STATE2TRANS(conv_integer(
unsigned(outState_l2)) * 4 + state_l1), 2)); end loop; end if; end process; end; 交织器2 library ieee;
23
use ieee.std_logic_11.all; use ieee.std_logic_arith.all; use work.turbopack.all;
entity trellis2 is port (
clk: in std_logic; // 计时 rst: in std_logic; // 负复位
selState: in std_logic_vector(2 downto 0); // 在(l - 1)时刻选中状态 state: in ARRAY4d; // 在(l - 1)时刻的4种可能状态 selTrans: in ARRAY8b; // 8 selected transitions (1 per state) at time (l - 1)
weight: in ARRAY4a; // 在(l - 1)时刻4个单位按过渡代码排序
llr0:out std_logic_vector(ACC_DIST_WIDTH - 1 downto 0); // 在(l+m-1)时刻对数似然比为(a, b) = (0, 0)
llr1:out std_logic_vector(ACC_DIST_WIDTH - 1 downto 0); // 在(l+m-1)时刻对数似然比为(a, b) = (0, 1)
llr2:out std_logic_vector(ACC_DIST_WIDTH - 1 downto 0); // 在(l+m-1)时刻对数似然比为(a, b) = (1, 0)
llr3:out std_logic_vector(ACC_DIST_WIDTH - 1 downto 0); // 在(l+m-1)时刻对数似然比为(a, b) = (1, 1)
a: out std_logic; // 在(l + m - 1)时刻的解码值a b: out std_logic // 在(l + m - 1)时刻的解码值b ); end trellis2;
architecture synth of trellis2 is
signal revWeight: ARRAY_4xTREL2_LEN; signal pathIdReg: ARRAY8d;
24
signal reg: ARRAY_TREL2_LENx8; begin
process (clk, rst)
variable free : std_logic_vector(7 downto 0); variable freeBeg : std_logic_vector(7 downto 0); variable pastState: ARRAY8d; variable pathId: ARRAY8d; variable freePathId: INT3BIT; variable op: ARRAY4a; variable tmp : ARRAY4a;
variable revWeightTmp: ARRAY_4xTREL2_LEN; variable revWeightFilt: ARRAY3a; variable notZero: ARRAY6b;
variable minTmp: std_logic_vector(0 to 2); variable ind: ARRAY6b;
variable tmp4: std_logic_vector(ACC_DIST_WIDTH downto 0); begin
if rst = '0' then for i in 0 to 3 loop
for j in 0 to TREL2_LEN - 1 loop
revWeight(i * TREL2_LEN + j) <= (others => '0'); end loop; end loop; a <= '0'; b <= '0';
llr0 <= (others => '0'); llr1 <= (others => '0'); llr2 <= (others => '0'); llr3<= (others => '0'); for i in 0 to 7 loop
25
pathIdReg(i) <= i;
for j in 0 to TREL2_LEN - 1 loop reg(j * 8 + i) <= \"00\"; end loop; end loop;
elsif clk = '1' and clk'event then free := \"11111111\"; for i in 0 to 7 loop
pastState(i):=TRANS2STATE(i*4+conv_integer(unsigned(selTrans(i)))); pathId(i) := pathIdReg(pastState(i)); free(pathId(i)) := '0'; end loop;
freeBeg := \"11111111\"; for i in 0 to 7 loop
if freeBeg(pathId(i)) = '1' then
reg(0 * 8 + pathId(i)) <= selTrans(i); freeBeg(pathId(i)) := '0'; pathIdReg(i) <= pathId(i); for j in 0 to TREL2_LEN - 2 loop
reg((j + 1) * 8 + pathId(i)) <= reg(j * 8 + pathId(i)); end loop; else
if free(0) = '1' then freePathId := 0; end if;
if free(1 downto 0) = \"10\" then freePathId := 1; end if;
if free(2 downto 0) = \"100\" then freePathId := 2;
26
end if;
if free(3 downto 0) = \"1000\" then freePathId := 3; end if;
if free(4 downto 0) = \"10000\" then freePathId := 4; end if;
if free(5 downto 0) = \"100000\" then freePathId := 5; end if;
if free(6 downto 0) = \"1000000\" then freePathId := 6; end if;
if free(7 downto 0) = \"10000000\" then freePathId := 7; end if;
reg(0 * 8 + freePathId) <= selTrans(i); free(freePathId) := '0'; pathIdReg(i) <= freePathId; for j in 0 to TREL2_LEN - 2 loop
reg((j + 1) * 8 + freePathId) <= reg(j * 8 + pathId(i)); end loop; end if; end loop;
a<= reg((TREL2_LEN - 1) * 8 + pathId(conv_integer(unsigned(selState))))(1); b<= reg((TREL2_LEN - 1) * 8 + pathId(conv_integer(unsigned(selState))))(0); for i in 0 to 3 loop
for j in 0 to TREL2_LEN - 2 loop for k in 0 to 3 loop if
27
reg(j*8+pathId(conv_integer(unsigned(state(k)))))=std_logic
_vector(conv_unsigned(i, 2)) and state(k) /= selState then
op(k) := weight(k); else
op(k):=std_logic_vector(conv_unsigned((2**ACC_DIST_WIDTH) - 1, ACC_DIST_WIDTH)); end if; end loop;
if conv_integer(unsigned(op(0))) < conv_integer(unsigned(op(1))) then
tmp(0) := op(0); else
tmp(0) := op(1); end if;
if conv_integer(unsigned(op(2))) < conv_integer(unsigned(op(3))) then
tmp(1) := op(2); else
tmp(1) := op(3); end if;
if conv_integer(unsigned(tmp(0))) < conv_integer(unsigned(tmp(1))) then
tmp(2) := tmp(0); else
tmp(2) := tmp(1); end if;
if
conv_integer(unsigned(tmp(2))) 28 then revWeightTmp(i * TREL2_LEN + j + 1) := tmp(2); else revWeightTmp(i * TREL2_LEN + j + 1) := revWeight(i * TREL2_LEN + j); end if; end loop; revWeightTmp(i * TREL2_LEN + 0) := weight(i); end loop; for j in 0 to 1 loop revWeightTmp(0*TREL2_LEN+j)=std_logic_vector(conv_unsigned(0, ACC_DIST_WIDTH)) then notZero(j * 3 + 0) := 1; notZero(j * 3 + 1) := 2; notZero(j * 3 + 2) := 3; elsif revWeightTmp(1*TREL2_LEN+j)=std_logic_vector(conv_unsigned(0, ACC_DIST_WIDTH)) then notZero(j * 3 + 0) := 0; notZero(j * 3 + 1) := 2; notZero(j * 3 + 2) := 3; elsif revWeightTmp(2*TREL2_LEN+j)=std_logic_vector(conv_unsigned (0, ACC_DIST_WIDTH)) then notZero(j * 3 + 0) := 0; notZero(j * 3 + 1) := 1; notZero(j * 3 + 2) := 3; elsif revWeightTmp(3*TREL2_LEN+j)=std_logic_vector(conv_unsigned 29 (0, ACC_DIST_WIDTH)) then notZero(j * 3 + 0) := 0; notZero(j * 3 + 1) := 1; notZero(j * 3 + 2) := 2; end if; if conv_integer(unsigned(revWeightTmp(notZero(j*3+0)*TREL2_LEN + j))) <= conv_integer(unsigned(revWeightTmp(notZero(j*3 + 1)*TREL2_LEN + j))) then minTmp(0) := '0'; else minTmp(0) := '1'; end if; if conv_integer(unsigned(revWeightTmp(notZero(j*3+0) * TREL2_LEN + j))) <= conv_integer(unsigned(revWeightTmp(notZero(j*3+2)*TREL2_LEN + j))) then minTmp(1):= '0'; else minTmp(1):= '1'; end if; if conv_integer(unsigned(revWeightTmp(notZero(j*3+1)*TREL2_LEN + j))) <= conv_integer(unsigned(revWeightTmp(notZero(j * 3 + 2) * TREL2_LEN + j))) then minTmp(2):= '0'; else minTmp(2):= '1'; end if; if minTmp = \"000\" then ind(j*3+0):= 0; ind(j*3+1):= 1; ind(j*3+2):= 2; elsif minTmp = \"001\" then ind(j*3+0):= 0; ind(j*3+1):= 2; 30 ind(j*3+2):= 1; elsif minTmp = \"100\" then ind(j*3+0):= 1; ind(j*3+1):= 0; ind(j*3+2):= 2; elsif minTmp = \"011\" then ind(j*3+0):= 1; ind(j*3+1):= 2; ind(j*3+2):= 0; elsif minTmp = \"110\" then ind(j*3+0):= 2; ind(j*3+1):= 0; ind(j*3+2):= 1; else if minTmp = \"111\" then ind(j*3+0):= 2; ind(j*3+1):= 1; ind(j*3+2):= 0; end if; end loop; for i in 0 to 2 loop tmp(3):= revWeightTmp(notZero(0*3+ind(0*3+i))*TREL2_LEN + 0); if conv_integer(unsigned(tmp(3))) < conv_integer(unsigned(tmp4)) then revWeightFilt(ind(0*3 i)) := tmp(3); else revWeightFilt(ind(0*3+i)) := tmp4(ACC_DIST_WIDTH - 1 downto 0); end if; end loop; for i in 0 to 2 loop 31 revWeightTmp(notZero(0*3+i) * TREL2_LEN + 0) := revWeightFilt(i); end loop; for i in 0 to 3 loop for j in 0 to TREL2_LEN - 1 loop revWeight(TREL2_LEN * i + j) <= revWeightTmp(TREL2_LEN * i + j); end loop; end loop; llr0 <= revWeight(1*TREL2_LEN-1); llr1 <= revWeight(2*TREL2_LEN-1); llr2 <= revWeight(3*TREL2_LEN-1); llr3 <= revWeight(4*TREL2_LEN-1); end if; end process; end; 3.3 分量编码器模块 通过对Turbo码最大似然译码算法性能的研究表明,在高信噪比的情况下Turbo码的性能的好坏取决于它的自由距离,而它的自由距离又取决于输入信息序列中重量为2的信息所产生的码字间最小距离,当用本原多项式作为反馈连接时,此时多项式的分量编码器产生的码字的最小重量最大。分量码的状态数越多,则Turbo码的纠错能力越强,即误比特率会随之下降,但译码的复杂度也会增加。研究表明,约束长度为4的8状态本原Turbo码与约束长度为J的16状态Turbo码在性能上差异不大,所以在移动通信中采用状态数为8的分量码作为Turbo码编码方案[7]。 若码率为1/2,约束长度为k的系统卷积码,它的寄存器个数为m=k-1,则其生成多项式G(D)可为: 𝐺(D)=[1𝑔1(𝐷)] (3.8) 0 𝑔(𝐷) 32 式(3.8)中,g1(D)为前向多项式,g0(D)为反馈多项式。本文的分量码编码方一案采用(2,1,3)反馈系统卷积码,码率为1/2的8状态RSC码,其约束长度k=4寄存器个数为J个。如图3.3所示为RSC编码结构框图。 InforInformation++RSC_out+DDD+图3.3 RSC编码结构图 分量编码器模块框图如图3.4: 图3.4 分量编码器模块框图 在分量码编码模块中,输入为原始信息,输出为原始信息位及其校验信息位,将校 33 验位提取出来与分量编码器2输出的校验位相结合作为原始信息的校验信息,其中加法器用异或器实现。首先将数据放入缓存中,这样可以使两个分量编码器在时钟上更好控制,当写使能信号wren置高,同时读使能信号rden置低时,将数据输入到RAM中,再将写使能信号wren置低,读使能信号rden置高,将RAM中的数据输出到RSC模块中,在 RSC模块中完成编码并输出[8,9]。 编码器模块代码如下所示: library ieee; use ieee.std_logic_11.all; entity coder is port ( clk : in std_logic; // 计时 rst : in std_logic; // 负复位 a : in std_logic; //原始数据信号(系统数据) b : in std_logic; // 原始数据信号(系统数据) y : out std_logic; // 编码器冗余数据信号 w : out std_logic // 编码器冗余数据信号 ); end coder; architecture synth of coder is signal q1 : std_logic; signal q2 : std_logic; signal q3 : std_logic; begin process(clk, rst) begin if rst = '0' then q1<= '0'; q2<= '0'; q3<= '0'; 34 elsif clk = '1' and clk'event then q1<= a xor b xor q1 xor q3; q2<= q1 xor b; q3<= q2 xor b; end if; end process; y <= a xor b xor q1 xor q3 xor q2 xor q3; w <= a xor b xor q1 xor q3 xor q3; end; 3.4 截余模块 当码率取1/2时,需要在产生编码的三条数据线上进行截余操作,规则是对于系统码,每个时刻都要读取;而对于校验码,先取outla的值,下一次输出则取outlb的值,以此类推,因此总体的码率是1/2。而对于其它码率如1/3,1/4和1/6则按照标准选取分量码,不需要进行截余操作。针对于1/2的编码效率的实现方案是引入一个选择器,它的控制信号由编码器工作时钟产生,它控制着每个时刻间隔性的轮流选取两条线路的信号。 3.5 帧同步机 由于在发射端在每一帧的编码前都附上了一个固定内容的同步码字,称作帧标示,在接收端要通过帧同步机完成对这个帧标示的搜索,检测到了帧标示,也就指明了数据帧开始的位置。一般来说,好的同步码字具有这样的特性:相关旁瓣的绝对值很小,这里相关旁瓣是指码字跟自身时移后的码字的相关值。表3.2显示了不同码率所对应的整标示图案[10]。 35 表3.2 不同码率所对应的表示图案 码率(包括不进行Turbo编码) 不进行Turbo编码 1/2Turbo编码 1/3Turbo编码 1/4Turbo编码 1/6Turbo编码 帧标示图案 1ACFFC1D 034776C72725B0 25DSCOCE90F6C9461 BF79C 034776C72725B0 FCB838D8D76A4F 25DSCOCE90F6C9461 BF79C DA2A3F31766F0936B9E40863 我们针对CCSDS标准给出的对应1/2和1/3码率的帧标示,设计出一个数字相关器,如图3.3。考虑到噪声的干扰,相关器的判决峰值比无噪声时的理想峰值要低一些,我们结合在有效纠错的范围,适当的选取对应1/2码率的判决峰值为52,对应1/3码率的判决峰值为72,经电路仿真,误检测的概率很小。 图3.3 数字相关机 36 3.6 信道模型 在本文设计的信道模型中采用离散无记忆高斯信道,编码器的发射端采用双极调制,通过信道时叠加上高斯噪声,进入接收机。这个接收的序列由公式(3.9)和(3.10)可知: 𝑠𝑠 𝑦𝑘=(2𝑥𝑘−1)+𝑖𝑘 (3.9) 𝑞𝑝 𝑦𝑘=(2𝑥𝑘−1)+𝑞𝑘 (3.10) 其中𝑖𝑘和𝑞𝑘为两个的噪声变量,它们的均值为0,方差都是σ,与信噪比的关系由公式(3.11)得: σ=2∗𝑅∗en (3.11) 其中R为码率,en为信道参数[11]。 1 3.7 接收机的分接插入模块 当编码效率为1/3时,不需要插入操作,直接按发送顺序依次将接收到的软数据存入系统码缓存器,校验码1(未交织)缓存器,校验码2(交织)缓存器。而当编码效率为1/2时,由于发送端对校验码进行过截余,并未全部传输,分接后校验序列的部分比特位置没有数据,这样就必须根据截余的规律,在被截余的数据位上补入中间量0,以保证序列的完整性[11]。 37 4 译码器的设计与实现 4.1 定点量化 Turbo译码算法包括了不同数据的大量数值运算,这些数据包括携带噪声的接收编码,先验概率,状态量度等等。对于数字硬件设计,数据分为浮点和定点两种类型,然而浮点数据在VLSI设计中是不可行的,因此,我们的设计选择了定点类型的数据。 定点数据的表示为一个比特矢量,其中,𝑁𝐼表示整数部分,𝑁𝐹表示小数部分,它的格式记作FP(𝑁𝐼,𝑁𝐹),我们希望位数尽可能的小,因为越小的位数需要的计算单元越少,需要的运算空间也越小,但另一方面,有限的位数会从两个方面降低性能,一是有限动态范围的数据溢出,二是有限数据精度产生的量化噪声。因此,我们要为设计寻求一个可以接受的位数的最小值。 4.2 译码器的实现 在设计中要权衡硬件实现复杂度与处理时延这两个因素,硬件元件尽可能多的重复使用能够降低硬件复杂度,但是,同一时间,一个元件只能执行一个模块功能,而不同的模块需要一个接一个的依次使用该元件,这导致了更多的时延,相同元件模块的复制能够进行并行处理从而大大降低时间延迟,但是这会造成更大的复杂性。 首先要考虑的是实现复杂度,其次再考虑时延,因此,在设计中尽可能多地重复使用元件。可重用的模块可以是简单的加法器或是复杂的SISO译码器[12]。 4.2.1 单译码器的设计 在译码器的框图中,包含两个软输入软输出(SISO)译码器,这两个子译码器内部结构完全一样,一个对未交织编码进行译码,另一个对交织编码进行译码,为了减少电路资源和降低功耗,最大可能的重复使用硬件,本文将两个子译码器集成为一个译码器,如图4.1。 38 图4.1 单译码器基本结构 这个译码器先对未交织编码进行译码,然后对交织编码进行译码,从而完成一次迭代译码。译码时,首先按正常顺序译码,得到译码软数据后,再按照交织顺序进行译码,并且按照解交织地址存入软数据存储器中,这样,迭代一次后的软数据依然是以正常顺序排列,很方便的进行下一次译码计算[13,14]。 4.2.2 译码器总体框图 图4.2显示了译码器的模块框图。主要元件包括SOVA译码器,交织器,解交织器,解复用模块。 解交织交织器SOVA1SOVA2Yt解复用39 交织器解交织 图4.2 译码器模块框图 4.2.3 SOVA译码器的设计 根据SOVA译码算法原理,SOVA子译码器首先计算所有可能路径的累计度量值,然后进行比较选择,找到幸存路径并更新、保存幸存路径状态及累计度量值,再根据累计度量值回溯计算得到译码判决结果及其对应的可靠性软信息[15]。 在Turbo译码器的硬件设计中,减少数据的存储既可以减少硬件资源占用,达到降低功耗的目的,而且还可以减少对片外存储器数据的访问,进一步提高译码速率和降低功耗。为此本文提出一种基于反相计算的SOVA子译码器设计方案,在正向计算过程中只需保存各状态节点的译码判决信息、软信息和累计度量值,不必保存幸存路径信息,而是在回溯模块中通过反向计算确定对称节点的软信息,然后再进行比较,确定幸存路径,从而叫以极大地减少数据存储量,节省硬件存储资源,达到降低功耗的目的。 根据该方案设计的SOVA子译码器模块结构如图4.3所示,主要有输入储存、正向计算、反相计算、存储器、时序控制、状态选取及回溯共7个模块[16]。 输入储存模块存储输入的信息位和校验位,在迭代运算期问提供给核心计算模块。时序控制模块输出使能信号控制外部交织器的启动和存储器的读写,在读取输入信息时读取外部储存器的地址总线信息。核心计算模块包括分支度量值的计算、累加及加-比-选运算。存储器模块存储核心计算、回溯等模块的计算结果。路径状态选取模块为回溯模块,提供回溯路径信息。回溯模块根据已存储的部分节点的判决信息和软信息推算另 图4.3 SOVA子译码器模块 40 一部分状态节点的软信息,从而得到幸存路径,并回溯得到最佳的判决信息和可靠性信息,完成可靠性软信息以及译码的输出[17-20]。 SOVA译码模块的对应的代码如下所示: library ieee; use ieee.std_logic_11.all; use work.turbopack.all; entity sova is Soft Output Viterbi Algorithm top level port ( clk: in std_logic; // 计时 rst: in std_logic; // 负复位 aNoisy: in std_logic_vector(SIG_WIDTH-1 downto 0); // 收到译码器信号 bNoisy: in std_logic_vector(SIG_WIDTH-1 downto 0); // 收到译码器信号 yNoisy: in std_logic_vector(SIG_WIDTH-1 downto 0); // 收到译码器信号 wNoisy: in std_logic_vector(SIG_WIDTH-1 downto 0); // 收到译码器信号 zin: in ARRAY4c; // 外部信息输入 zout: out ARRAY4c; // 外部信息输入 aClean: out std_logic; // 解码系统数据 bClean: out std_logic // 解码系统数据 ); end sova; architecture synth of sova is signal selStateL2 : std_logic_vector(2 downto 0); signal selStateL1 : std_logic_vector(2 downto 0); signal selState : std_logic_vector(2 downto 0); 41 signal selTransL2 : std_logic_vector(1 downto 0); signal selTrans: ARRAY8b; signal selTransL1: ARRAY8b; signal weight: ARRAY4a; signal stateL1: ARRAY4d; signal llr0: std_logic_vector(ACC_DIST_WIDTH - 1 downto 0); signal llr1: std_logic_vector(ACC_DIST_WIDTH - 1 downto 0); signal llr2: std_logic_vector(ACC_DIST_WIDTH - 1 downto 0); signal llr3: std_logic_vector(ACC_DIST_WIDTH - 1 downto 0); signal zinDel: ARRAY4c; signal aNoisyDel: std_logic_vector(SIG_WIDTH - 1 downto 0); signal bNoisyDel: std_logic_vector(SIG_WIDTH - 1 downto 0); begin acs_i0 : acs port map ( clk => clk, rst => rst, a => aNoisy, b => bNoisy, y => yNoisy, w => wNoisy, z => zin, selStateL => selStateL2, selTransL => selTransL2, selState => selState, stateDist => selTrans, weight => weight ); trellis1_i0 : trellis1 port map ( 42 clk=> clk, rst => rst, selState => selState, selTrans => selTrans, selStateL2 => selStateL2, selStateL1 => selStateL1, stateL1 => stateL1, selTransL2 => selTransL2 ); trellis2_i0 : trellis2 port map ( clk => clk, rst => rst, selState => selStateL1, state => stateL1, selTrans => selTransL1, weight => weight, llr0 => llr0, llr1 => llr1, llr2 => llr2, llr => llr3, a => aClean, b => bClean ); delayer_g0 : for i in 0 to 7 generate delayer_i : delayer generic map ( delay => TREL1_LEN - 1 ) port map 43 ( clk => clk, rst => rst, d => selTrans(i), q => selTransL1(i) ); end generate; delayer_g1 : for i in 0 to 3 generate delayer_i : delayer generic map ( delay => TREL1_LEN + TREL2_LEN ) port map ( clk =>clk, rst => rst, d => zin(i), q => zinDel(i) ); end generate; delayer_i0 : delayer generic map ( delay => TREL1_LEN + TREL2_LEN ) port map ( clk => clk, rst => rst, d => aNoisy, q => aNoisyDel 44 ); delayer_i1 : delayer generic map ( delay => TREL1_LEN + TREL2_LEN ) port map ( clk => clk, rst => rst, d => bNoisy, q => bNoisyDel ); extInf_i0 : extInf port map ( llr0 => llr0, llr1=> llr1, llr2 => llr2, llr3 => llr3, zin => zinDel, a => aNoisyDel, b => bNoisyDel, zout => zout ); end; 4.2.4 反相计算模块工作原理 正向计算模块和反相计算模块是SOVA子译码器的核心计算模块,它们完成分支度量的计算、累加以及比较与选择运算,即所谓的“加,比,选”,运算结果在时序控制模块的控制下送入存储器保存。 在以往的设计中,核心计算模块完成所有可能路径的分支度量值的计算及累计操作,并存储所有状态的累计度量值、译码判决信息、软信息及幸存路径。 45 本文根据卷积码状态转移图所呈现的对称特性,只保存正向计算过程中计算所得到的状态节点的译码判决信息,软信息和累计度量值,没有保存相应的幸存路径信息,而是在回溯模块通过反向计算模块计算对称于正向状态节点的软信息后,再进行比较来确定幸存路径,从而减少约一半存储开销[21-24]。 4.2.5 交织与解交织 Turbo译码器使用的交织器与编码器使用的是一致的,本文设计的译码器使用QPP交织器。如译码器的硬件实现原理框图4.2中所示,整个译码器只需一个交织器即可。交织和解交织操作通过对RAM的写入和读取地址来实现,如图4.4所示。 图4.4 交织与解交织过程 DEC1与DEC2在硬件上由一个DEC电路时分复用实现,alpha及delta的RAM属于DEC内部,llrex和硬判决结果source bit的RAM于DEC而存在。DEC进行交织运算时,使用交织器产生的交织地址去写或读数据;DEC进行解交织运算时,则使用交织器产生的解交织地址去写或读数据[25,26]。 考虑到QPP交织器的运算是递归形式的,而SOVA算法在整个码块译码期间需多次使用交织和解交织地址,为满足这一需求,本文设计将交织器首次产生的交织地址写入一个专门的RAM,以本身即是顺序的解交织地址作为该RAM的写入地址。译码器系统调度方面,需等QPP交织器将地址生成完毕后才能开始译码,这样从系统延迟上看,最坏的情况是每次译码增加了码块长度个时钟延迟;最好的情况是本次输入的码块长度与上次一样,QPP交织器使用上次生成的地址即可,增加的延迟为零[27-29]。 同时,当码块使用一个Turbo子译码器,其吞吐量不能满足系统需求时(如LTE 46 系统),需使用多个Turbo子译码器并行(并行后的译码器在此仍称为Turbo译码器)译码,即将输入的K长度码块分成M个子块,同时由M个Turbo子译码器译码。这种情况下,已存入RAM中的交织地址可随时查找出来,可简化多Turbo子译码器的译码系统之设计。而如果使用M个QPP交织器并行运算,可将交织地址存入RAM的时延最大减少M倍,当然多个QPP交织器并行运算,其递归初值需要用到一个乘法器方能求得[30]。 47 5 Turbo码编译码器的系统仿真 5.1 仿真工具 目前,在FPGA的设计越来越复杂,设计的仿真验证比以前显得更为重要。提高数字电路设计的仿真验证效率主要有两个途径:一是提高仿真验证工具的速度和精度,二是改进仿真验证的设计方法。 为了保证FPGA仿真验证的精确性,从ISE4.1系列开发软件推出之后,Xilinx公司就不再为其FPGA设计工具提供单独的仿真支持,而是采用第三方的专用EDA仿真工具。其中,ModelSim是较常用的第三方仿真工具。 ModelSim是业界公认的专用EDA仿真工具,它可以对Xilinx公司全部的FPGA产品进行高精度的仿真验证。因此也被纳入了本设计中作为编译码器设计的仿真验证工具。 本题目使用Modelsim 10.1a进行结果的仿真,Modelsim是一款优秀的仿真软件,它能提供友好的仿真环境,是业界唯一的单内核支持VHDL和Verilog混合仿真的仿真器。它采用直接优化的编译技术,Tcl/Tk技术和单一内核仿真技术,编译仿真速度快,编译的代码与平台无关,便于保护IP核,个性化的图形界面和用户接口,为用户加快调错提供强有力的手段,是FPGA/ASIC设计的首选仿真软件。 主要特点: RTL和门级优化,本地编译结构,编译仿真速度快,跨平台跨版本仿真; 单内核VHDL和Verilog混合仿真; 源代码模版和助手,项目管理; 集成了性能分析,波形比较,代码覆盖,数据流ChaseX,Signal Spy,虚拟对象Virtual Object,Memory窗口,Assertion窗口,源码窗口显示信号值,信号条件断点等众多调试功能; C和Tcl/Tk接口,C调试; 对SystemC的直接支持,和HDL任意混合; 支持SystemVerilog的设计功能; 对系统级描述语言的最全面支持,SystemVerilog,SystemC,PSL; ASIC Sign off; 48 可以单独或同时进行行为,RTL级和门级的代码。 5.2 仿真语言 5.2.1 集成开发环境的选择 我们选择了Xilinx的FPGA作为目标器件,那么由Xilinx公司推出的集成EDA开发工具ISE系列软件白然成为首选,它支持Xilinx公司的所有CPLD/FPGA产品。从设计输入、仿真、编译、综合、布局布线和下载都可以使用这个集成环境来完成。此外,ISE还可以配合第三方如Synplify Pro, ModeISim等进行EDA设计,加快进度。 5.2.2 设计语言的选择 VHDL 的英文全名是 Very-High-Speed Integrated Circuit Hardware Description Language,诞生于1982年。1987年底,VHDL被 IEEE 和美国国防部确认为标准硬件描述语言。 VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言,VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。 VHDL 语言能够成为标准化的硬件描述语言并获得广泛应用,它自身必然具有很多其他硬件描述语言所不具备的优点。归纳起来,VHDL 语言主要具有以下优点: (1) VHDL 语言具有强大的语言结构,只需采用简单明确的VHDL语言程序就可以描述十分复杂的硬件电路。同时,它还具有多层次的电路设计描述功能。此外,VHDL 语言能够同时支持同步电路、异步电路和随机电路的设计实现,这是其他硬件描述语言所不能比拟的。VHDL 语言设计方法灵活多样,既支持自顶向下的设计方式,也支持自底向上的设计方法; 既支持模块化设计方法,也支持层次化设计方法。 (2) VHDL 语言具有多层次的电路设计描述功能,既可描述系统级电路,也可以描述门级电路;描述方式既可以采用行为描述、寄存器传输描述或者结构描述,也可以采 49 用三者的混合描述方式。同时,VHDL 语言也支持惯性延迟和传输延迟,这样可以准确地建立硬件电路的模型。VHDL 语言的强大描述能力还体现在它具有丰富的数据类型。VHDL语言既支持标准定义的数据类型,也支持用户定义的数据类型,这样便会给硬件描述带来较大的自由度。 (3) VHDL 语言很强的移植能力主要体现在: 对于同一个硬件电路的 VHDL 语言描述,它可以从一个模拟器移植到另一个模拟器上、从一个综合器移植到另一个综合器上或者从一个工作平台移植到另一个工作平台上去执行。 (4) 采用 VHDL 语言描述硬件电路时,设计人员并不需要首先考虑选择进行设计的器件。这样做的好处是可以使设计人员集中精力进行电路设计的优化,而不需要考虑其他的问题。当硬件电路的设计描述完成以后,VHDL 语言允许采用多种不同的器件结构来实现。 (5) VHDL 语言采用基于库 ( library) 的设计方法。在设计过程中,设计人员可以建立各种可再次利用的模块,一个大规模的硬件电路的设计不可能从门级电路开始一步步地进行设计,而是一些模块的累加。这些模块可以预先设计或者使用以前设计中的存档模块,将这些模块存放在库中,就可以在以后的设计中进行复用。 由于 VHDL 语言是一种描述、模拟、综合、优化和布线的标准硬件描述语言,因此它可以使设计成果在设计人员之间方便地进行交流和共享,从而减小硬件电路设计的工作量,缩短开发周期。 使用VHDL语言在Modelsim10.1中对Turbo码解码进行仿真,如下列图5.1~5.5所示。 5.3 仿真流程 如图5.1所示,首先对程序进行编译,编译成功后,结果如图所示: 50 图5.1 编译成功后的对话窗口 在编译过程中,如果出现警告,可以忽视警告。如果出现错误,双击底部对话框中显示为红色的语句,这时弹出一个窗口,提示在程序中的哪一个部分出现错误以及类型,修改后重新编译,使结果如图5.1中所示,每一个程序的后面出现一个绿色的对号为止,有时,多进行几次编译,不需修改也可以使错误消失。 全部编译正确后,点击左下角的librity选项卡,在work选项中寻找激励文件,在本题目中,激励文件的名称为turbodec_vhd_tst,右击此文件,在菜单中点击simulate进行仿真,如图5.2所示。 51 图5.2 仿真流程 点击simulate后,出现的界面如图5.3所示。 图5.3 仿真流程 52 在新弹出的sim选项卡界面中右击弹出菜单,点击Add Wave,界面变化如图5.4所示。 图5.4 仿真流程 在Objects窗口中新添加进了各项参数见表5.1。最后,点击工具栏中的simulate,一次选择run,all,进行最终仿真,结果如图5.5所示。 表5.1 输入参数 参数 aNoisy aDec bNoisy bDec wIntNoisy wNoisy 在0时刻 1101 11111 1101 11111 1101 1101 在1时刻 1000 10000 1000 10000 1000 1000 53 图5.5 仿真波形 噪声信号波形如图5.6所示,其中噪声比为5.1dB。 图5.6 输入信号波形 时钟信号和复位波形如图5.7所示,当时钟信号分别为1和0时,输入的数据有所变化, 图5.7 时钟信号和复位信号波形 具体数据见表5.1。 54 解码信号如图5.8所示,交织帧大小为 bit couples。代码率为1/2。当码率为1/2时,信噪比达到了5.1dB,误码率小于10-5,这样便验证了所设计的译码器。 图5.8 解码信号波形 交织器是决定Turbo码在误比特率区域内性能的关键因素之一,在交织帧长度为 比特的情况下,通过修改信息序列长度,可以看出,迭代译码的误比特率都随着信息序列的长度增加而降低,当信噪比较小时,增加信息序列长度对误比特率性能的改进不大,但在误比特率性能区域内Turbo码的误比特率性能曲线与信息序列长度近似成线性关系,在信噪比较大时,误比特率曲线随着信息序列长度的增加的变化趋缓,从而也验证了错误平层的存在。 55 结论 Turbo码是近十年来编码理论的一个重大成就,在最近十年里,围绕Turbo码技术己出现了大量的文章和成果,目前,己从理论研究逐步走向实用,它已经被空间数据咨询委员会(CCSDS)推荐为遥测标准。在新的CCSDS标准中,把Turbo码作为一种推荐的信道纠错码。 本文基于CCSDS标准,对Turbo码编译码器进行研究与实现,现将本文工作总结如下: (1) 本文通过对编码器各个模块的分析,探讨、设计并实现了整个编码器系统,由于采用改进的交织算法,流水线结构等方法,编码器变得方便,灵活。结合CCSDS131. 0-B1标准,交织器的简化使其更适合实现。帧同步机和伪随机序列发生器也根据标准分别得以实现。 (2) 根据选定的SOVA译码算法,权衡硬件实现复杂度与处理时延等因素,优先考虑面积因素提高元件的重复利用率和降低复杂度,设计出Turbo码译码器。讨论了定点量化的数字范围和精度考虑,采用“自上而下”的设计思路,将译码器的各个功能模块逐一进行分析与实现。并且设计编译码系统仿真模型,得到了译码性能上的验证。 (3) 研究与应用Turbo码译码器几项最新技术,如滑动窗译码技术,停止迭代技术,归一化操作结合流水线电路设计,阐述了各项技术的原理和实现方案,探讨了这些技术对译码性能的影响和实际应用上的考虑。 (4) 仿真结果: 解码器的输入信号宽度:4 bits 外信息信号宽度:5 bits 第一格的长度:24 第二格的长度:12 累计距离信号宽度:9 bits 交织帧大小: bit couples 信号噪声比:5.1 dB 代码率:1/2 56 致谢 大学学习生活即将结束,在完成之际,我向在学习和生活中帮助过我的老师、同学,亲人和朋友表示诚挚的感谢! 首先,非常感谢我的导师老师。感谢刘老师对本人的悉心指导与帮助,在刘老师的辛勤培养和教育下,我树立了正确的学术理念,形成了严肃认真的科研态度,这些都将是我今后人生道路上的宝贵财富。刘老师态度严谨,为人平和谦逊,给我留下了深刻的印象,是我永远学习的楷模。再次,我要感谢王洪源老师,张武老师,喻红婕老师,梁英老师,赵运弢老师,孟宪江老师,石振刚老师,田野老师,任世卿老师,是你们在我大学四年的谆谆教诲,让我学到了很多知识,为我的大学学习提供了很多的帮助。再次衷心感谢通信工程的老师们四年来对我的辛勤培养,使我得以顺利完成学业!本论文的完成离不开国内外的技术资料,在此对参考文献的作者、译者以及出版单位一并感谢! 最后,我要感谢我的父母和家人对我的支持和鼓励,无论在我人生的任何阶段,他们都给予了我无私的关怀和理解,使我顺利完成学业! 57 参考文献 [1] C.E.Shannon, \"A Mathematical Theory of Communication\"[J], The BellSystem Technical Journal, Vo1.27, 1948: 79-423, 623-656. [2] 王育民,李晖,梁传甲编著.信息论与编码理论[M].高等教育出版社,2005: 263-265. [3] 刘东华.Turbo码在无线移动通信系统中的应用[M].广东通信技术,2001: 38-42. [4] 仇佩亮.信息论与编码[M].高等教育出版社,2003: 42-43. [5] 刘宁芳,金文毅.Turbo码译码算法及其对数域中的改进算法[J].电讯技术,1999: 13-17. [6] 刘东华,梁光明.Turbo码设计与应用[M].电子工业出版社,2004: 25-42. [7] 刘树军,郑建宏.Turbo译码及算法的研究[J].无线电通信技术杂志,2002: 25-29. [8] 谢一宁,宋文涛,罗汉文.关于前向最大后验概率(SOVA)算法的研究[N].上海交通大 学学报,2001年6月,第35卷第6期: 820-825. [9] 许成谦,林雪红,陈嘉兴.Turbo码LOG-MAP译码算法的一种改进算法[N].燕山大学 学报,2002年10月,第26卷第4期: 286-300. [10] 王海青,陈文武.Turbo码研究的最新进展[J].江苏通信技术,2004年4月,第20卷第 2期: 28-30. [11] J.Hsu,C.Wang, A parallel decoding scheme for turbo codes[J]. IEEE Int.Conf.on Circuitsand Systems (ISCAS'98),Monterey, Vol.4, June.1998: 445-448. [12] Dasgupta Narayanan.K.R, Parallel Decoding of Turbo Codes UsingSoft Output T algorithms[M]. Communications Letters,IEEE volume S,Issue8, Aug.2001: 355-354. [13] 张路,万蕾,匡镜明.Turbo码的一种全新的SOVA译码算法[N].通信学报,2002年8月, 第23卷第8期: 24-32. [14] 刘陈,吴成林.Turbo码译码的改进SOVA算法[N].南京邮电学院学报,2002年9月, 第22卷第3期: 83-85. [15] 赵旦峰,李文意,杨建华.分块并行Turbo码译码算法的研究[N].哈尔滨工程大学学 报,2004: 209-212. [16] 李廷军,金慧琴,方建能.Turbo码硬件实现探讨[J].现代电子技术,2001年第9期: 12-15. [17] 刘东华.Turbo码原理与应用技术[M].北京:电子工业出版社,2004: 68-69. 58 [18] 雷李云.Turbo码译码算法研究及其FPGA实现[D].哈尔滨工程大学硕士学位论 文,2006 1月: 1-5. [19] D.E.Muller. Application of Boolean Algebra to Switching Circuit Design[D].IEEE Trans.On Computers, 1954: 6-12. [20] 刘东华.Turbo码原理与应用技术[M].电子工业出版社,2004: 236. [21] 姜军,王丽芳,胡健东.Turbo码译码器的定点DSP实现[N].北京邮电大学学报,2001: 12-16. [22] 张瀚峰.Turbo码Log-MAP算法性能仿真及FPGA实现[D].北京邮电大学硕士学位 论文,2003: 25-27. [23] 王荣.TD-SCDMA终端中的Turbo译码研究[D].信息产业部电信科学技术研究院硕 士学位论文,2003: 20-21. [24] 樊昌信,张甫诩,徐炳祥.通信原理(第5版)[M].国防工业出版社,2004: 195-197. [25] K.K.Loo,T.Alukaidey,and S.A.Jimaa. \"High performance Parallelised 3GPP Turbo Decoder\"[J]. in Personal Mobile Commuciations Conf, 2003: 337-342. [26] L.S.Reed.\"A class of multiple-error-correcting codes and a decoding structure\"[J]. IEEE Trans. Inform. Vo1.4, Sept.1954: 38-49. [27] G Ungerboeck, \"Channel coding with multilevel/phase signals\"[J]. IEEE TransInform. Theory, Vo1.28, Jan.1982: 55-67. [28] T. M. Duman and M. Salehi. Performance bounds for turbo-coded modulation systems[J]. IEEE Trans. Commun. Vo1.47, April.1999: 511-521. [29] P.Hoeher and J.Lodge. Turbo DPSK: Iterative differential PSK demodulation andchannel decoding[J]. IEEE Trans. Commun.Vo1.47, June.1999: 837-843. [30] S. Benedetto, D. Divsalar, G. Montorsi. \"Soft-Output Decoding Algorithms In Iterative Decoding Of Turbo Codes\" [N]. in TDA Progress Report, 1999: 42-124. 59 附录A 英文原文 Abstact In 1993 years C.berrou and Alain Glavieux put forward a kind of parallel concatenated convolutional code in the form of coding method and the corresponding iterative decoding algorithm, after 18 iteration only differ with shannon limit of 0.7 dB of Turbo codes appear to channel coding into a new era. Actually gallagher as early as 1962 in his PhD thesis puts forward a new kind of low density parity check code (LDPC), but its complexity is not the level of software and hardware can afford, until 1996, was Near and others once again find its excellent performance, thus aroused people's wide attention, LDPC code has been written to at present such as Wimax, DVB etc. Multiple communications standards. Key Words:Convolution code;Iterative decoding algorithm;Parity check code 1 The development of Turbo codes Turbo code, since found himself industry research from theory to hardware implementation of it never stop, and constantly have new discoveries. Before has some non recursive convolution code system (NSC), on the basis of proposed new system recursive convolution code (RSC) structure as well as the corresponding use of RSC Turbo code, and points out that under the high s/n ratio and low bit rate performance are similar, both in the low signal-to-noise ratio and high bit rate cases, the performance of the RSC are superior to the NSC S.B enedetto and g. ontorsi specifically discusses the recursive convolution code in the important role of Turbo is pointed out that using the RSC can improve the coding gain, specific how many more associated with weaving length. Hagenauer et al 1995 Turbo code can cascading multiple component code, rather than just two, about the component code level connected can be found in recent literature review, a kind of using three component code of Turbo code cascade structure was put forward and the decoding algorithm of LDPC code 60 complexity is very high, the Turbo code at the beginning of the design is entitled a feasible decoding algorithm, that is, for each received symbols can calculate the maximum a posteriori probability Map algorithm. Map algorithm by Berrou et al. Improvement specially used for Turbo codes decoding based on BCJR algorithm and Map algorithm's main drawback is that there are a large number of multiplication, hardware implementation cost is too high, which in the logarithmic domain calculation Log - Map and Max - Log - Map algorithm, the Log will Map - the Map algorithm, method of operation is converted to addition and subtraction, and Max Log Map out the Log of the jacobian calibration in the Map, but cost a gain of 0.3 dB. After the Log map, appear a series of optimization methods, including soft output d bits (SOVA), a lookup table Log map (look up the Log map), Linear Log map (Linear Log map) and adaptive Turbo decoding, etc. SOVA algorithm and MAP algorithm based on Viterbi difference is that the former try to choose two information to the maximum likelihood path calculation, while the latter to all the information the path calculation. Therefore the complexity of the SOVA small but has a larger performance loss, while the MAP class high complexity and better performance. Commonly used at present is mainly the Log map and Maxes logwe map algorithm, the Turbo code efficient hardware implementation has been one of Turbo code research priorities. There are two forms of very large scale integrated circuit (VLSI) is used to implement the Turbo code, including the ASIC and FPGA. These two types each have characteristics, the former has low power consumption, small size and high speed, but change the design cost is large, suitable for some mature design standard system. FPGA to achieve lower cost and can modify the design, online can calmly deal with changes in the system design standard, but its performance in speed, power dissipation and area are inferior to ASIC. About the Turbo code of digital integrated circuit (IC) dates back to 1995 Berrou and Combelles design, they are using CMOS technology has realized the Turbo decoder chip, based on SOVA algorithm within 2 db SNR 1/2 rate three times iteration, bit error rate can be up to 10-5, around 156 KBPS throughput, the average power consumption 1.6 W. In 1998 at the university of Michigan Sangji Hong and Wayne and VLSI implementation of Turbo code complexity is analyzed under 0.6 umCMOS technology implements the throughput 1 Mbps power consumption of about 34 mw Turbo decoding chip. System using MAP algorithm for Turbo decoding VLSI structure, comprehensively analyzed the hardware implementation of 61 MAP algorithm, including the component state metric in the decoder and the number of branch metric calculation module configuration, and than choose the key circuit optimization, quantitative precision and measurement of normalization, etc. 2006 a for VLSI implementation of Turbo decoder to do literature survey shows that the MAP decoding based on BCJR algorithm and Viterbi based SOVA is given priority to, use Log MAP decoder throughput power consumption dropped to 1 SmW method 60 megabits per second. 2 Turbo code application in communication In recent years the rise of software radio (SDR) and 3 GPP LTE (long-term evolution) the third generation communication system of the commercial, Turbo code on the hardware implementation is met bigger challenge, SDR stressed for a variety of communication systems or the applicability of the standard, can be adjusted for different system parameters accordingly, which requires the channel encoding decoding apparatus have the reconfiguration. Purlsley 2009 and Skinner, an adaptive coding method is proposed, by changing the relevant parameters can support a variety of common channel coding methods, including convolution code, such as Turbo code and LDPC code. Jonathan Roth et al. introduced parallel Turbo decoding to realize the double binary Turbo decoder is suitable for the SDR, the linear Log - map with ordinary Max - loges rnap decoder bit error rate of the same circumstances, provides the double throughput and reduce by half the number of iterations. The LTE system puts forward higher requirements on data throughput, over 100 MBPS. In order to achieve high data throughput, LTE in the Turbo code using the parallel structure, and in parallel decoding Turbo code when ordinary intertwined appear a called \"memory competition\" phenomenon, namely multiple component decoder attempts to same address access to outside information storage and conflict. LTE standard based on the theory of the integer ring USES the new type of secondary displacement polynomial (QPP) intertwined, the intertwined successfully solved the problems of \"memory competition\". On the hardware implementation, is currently the latest Turbo code and Xilinx Altera commercial LTE IP core, according to data from eight Turbo processor parallel decoding throughput of more than 100 MBPS, and latest technology based on 0.13 umCMOS LTE Turbo decoder 62 ASIC chips, more than 390 MBPS throughput. Due to the LTE Turbo decoder design difficult, foreign businessmen launched LTE Turbo code IP core prices tend to be higher, in the increasingly competitive international situation, to reduce the cost we need to develop their own is suitable for the new system of Turbo codes decoder. 3 Decoding algorithm of Turbo codes In the aspect of decoding algorithm, this paper USES are Soft Soft Input/Output decoding algorithm (Soft - Input/Soft - Output; SISO). Since the Turbo code in this aspect of the research is to cause the attention of many scholars. Hagenauer, such as using the logarithmic likelihood ratio is soft soft input/output of the algorithm is analyzed. These methods include symbols by Maximum A Posteriori probability decoding; Maximum A Posteriori (MAP) algorithm or the BCJR algorithm; Soft Viterbi Output (Soft Output Viterbi Algorithm; SOVA) Algorithm and corresponding optimal Algorithm, etc. MAP algorithm is a kind of maximum a posteriori probability decoding algorithm based on element, for linear block codes convolutional code, it can make the minimum bit error rate. Is also used in decoding algorithm of Turbo decoding at the earliest. But the large amount of calculation, this algorithm decoding complexity is high, in the actual application is difficult. This is mainly because: (1) in the middle of the algorithm in the logarithmic likelihood ratio and iterative process there are a lot of variable index, multiplication and addition operations; (2) as the growth of the condition number and packet sequence length and the memory required for the intermediate variables are exponentially; (3) needs to receive the complete sequence to achieve the soft output of bits of information. Aiming at the complexity of decoding algorithm, the people on the correction and improvement. In actual application, regardless of adopts digital signal processing (DSP) or programmable gate array (FPGA) chip implementation, such as a great deal of the index in the algorithm and the existence of the multiplication will be restricted processing speed, certainly will will increase as the iterative decoding delay, and not conducive to information transfer rate increase. Therefore, how to eliminate index and multiplication in the MAP algorithm is simplified algorithm's top priority. The most effective way is to take advantage of 63 the logarithmic function monotonicity, the algorithm of the variable unified log, will be one of the multiplication to add and remove part of the index operation. In addition, because of the state variables backward recursive iteration, the MAP algorithm, it receives the complete sequence to get soft output bits of information, lack of continuity, decoding process and the encoder must be terminated in a certain state, such as zero state, which means that each send a frame (coding group) data must be at the end add some extra \"forced zero bits\". If the information sequence coding group (frame) is shorter, will seriously reduce the actual coding efficiency; On the contrary, if in order to ensure the coding efficiency and blindly expand the frame length, and using the algorithm of MAP will bring unbearable because of undue intermediate variable and memory requirements. In fact, for the sake of simplicity, using iterative decoding of Turbo codes bits of information frame length is generally consistent with mixed depth of intertwined, and the selected most of mixed depth according to the nature of the communication required to support the business and its requirements to factors such as bit error rate. Therefore, inspired by decoding constraint length limited victor than algorithm, the proposed quasi optimum activity window BCJR algorithm; Or the long frame of information into W segments with W a and muck decoding algorithm for decoding at the same time. Turbo code decoding algorithm complexity but also in the forward and backward iteration operation, due to reduce the number of iterations can effectively reduce the forward and backward iteration operation, also can reduce the decoding complexity. So how to reduce the number of iterations or early decision of information symbols become the research hot spot, for this kind of situation, all kinds of improved algorithms are put forward. Because Turbo code is error correction coding for the third generation mobile communication, so need to high rate data transmission of information and power consumption is less, in view of the high rate of Turbo codes, have corresponding decoding method, at the same time people on how to reduce the decoding of the power consumption is also put forward the corresponding decoding algorithm. As a result of the Turbo codes decoding process, each system for SISO algorithm. Soft decision value (usually a logarithmic likelihood ratio) is sent to the next level. The last level of the soft output feedback to the first level, as the initial value of the second iteration. Is research to further promote the ideas of Turbo decoding to more extensive detection and decoding structure, such as serial concatenated decoding, balanced, coding, modulation, multi-user detection, joint source and channel coding, etc. by contrast, Turbo code decoding, the soft output victor than decoding (SOVA) algorithm is simple, small storage capacity, the advantages of easy hardware implementation, widespread attention by people. But since its output is not an approximation, the result of the MAP algorithm is thus time optimal algorithm, which differ with the MAP algorithm in performance about 1 db. To sum up, the decoding algorithm of Turbo code mainly adopts the MAP algorithm and SOVA algorithm, the algorithm is simplified, the complexity is reduced, less memory only at the cost of signal-to-noise ratio for commonly. Therefore, how to find a decoding algorithm and MAP algorithm performance is consistent and simpler algorithm has been research hot spot. References [1] C.E.Shannon, \"A Mathematical Theory of Communication\"[J], The BellSystem Technical Journal, Vo1.27, 1948: 79-423, 623-656. [2] J.Hsu,C.Wang, A parallel decoding scheme for turbo codes[J]. IEEE Int.Conf.on Circuitsand Systems (ISCAS'98),Monterey,vol.4, June.1998: 445-448. [3] Dasgupta Narayanan.K.R, Parallel Decoding of Turbo Codes UsingSoft Output T algorithms[M]. Communications Letters,IEEE volume S,Issue8, Aug.2001: 355-354. [4] D.E.Muller. Application of Boolean Algebra to Switching Circuit Design[D].IEEE Trans.On Computers, 1954: 6-12. [5] K.K.Loo,T.Alukaidey,and S.A.Jimaa. \"High performance Parallelised 3GPP Turbo Decoder\"[J]. in Personal Mobile Commuciations Conf, 2003: 337-342. 65 附录B 汉语翻译 摘 要 1993年C.Berrou和Alain Glavieux等人提出了一种并行级联卷积码形式的编码方法及相应的迭代译码算法,在经过18次迭代之后仅与香农极限相差0.7dB的Turbo码的出现将信道编码推向一个全新的时代。其实早在1962年Gallager在其博士论文中提出了一种新的低密度奇偶校验码(LDPC),只是其复杂度不是当时的软硬件水平所能承受的,直到1996年被Near等人再次发现其优异性能,从而引起人们的广泛重视,目前LDPC码已被写入如Wimax,DVB等多种通信标准。 关键词:卷积码;迭代译码算法;奇偶校验码 1 Turbo码的发展 Turbo码自发现己来,业界对它的研究从理论到硬件实现从来没停过,并不断有新的发现。在之前己有的非递归系统卷积码(NSC)的基础上,提出了新的递归系统卷积码(RSC)结构以及对应使用RSC的Turbo码,并指出在高噪比和低码率下两者性能相似,而在低信噪比和高码率情况下,RSC的性能要比NSC好,S.Benedetto和G.Montorsi专门讨论了递归卷积码在Turbo中的重要作用指出使用RSC可提高编码增益,具体提高多少与交织长度相关。1995年Hagenauer等人提出Turbo码可以级联多个分量码而不只两个,关于分量码的级联在最近的文献查阅中可以发现,一种使用三个分量码的Turbo码级联结构被提出与LDPC码复杂度很高的译码算法不同,Turbo码在设计之初便被赋予了一种可行的译码算法,那就是对每个接收符号都能计算其最大后验概率Map算法。Map算法由Berrou等人根据BCJR算法改进专门用于Turbo码的译码,Map算法最大的缺点在于存在大量的乘法运算,硬件实现成本太高,进而有了在对数域计算的Log- map和Max-log-map算法,Log-map算法将Map中的乘除法运算转化为加减法,而Max log map去掉了Log map中的雅可比校验式,但为此损失了0.3dB左右的增益。在Log map之后,陆续出现了一系列优化方法,包括软输出维比特(SOVA)、查找表Log map ( look-up 66 Log map )、线性Log map ( Linear Log map )及自适应Turbo译码等。基于Viterbi的SOVA算法与MAP类算法的区别在于,前者试图选择两条最大似然路径计算外信息,而后者则对所有路径计算外信息。因此SOVA的复杂度小但有较大的性能损失,而MAP类则复杂度高而性能更好。目前常用的主要是Log map和Maxes logwe map算法,Turbo码的高效硬件实现一直以来都是Turbo码的研究重点之一。有两种形式的超大规模集成电路(VLSI)用以实现Turbo码,包括ASIC和FPGA。这两种形式各有特点,前者具有低功耗、小面积和高速度,但改变设计时的成本很大,适合于某些设计标准已经成熟的系统。FPGA实现成本较低并且可在线修改设计,可从容应对系统设计标准的变动,但其在速度、功耗和面积上的表现都不如ASIC。关于Turbo码的数字集成电路(IC)可追溯到1995年Berrou和Combelles等人的设计,他们使用的CMOS技术实现了基于SOVA算法的Turbo编译码器芯片,在2dB信噪比1/2码率迭代三次的情况下,误码率可达10-5,吞吐量156kbps左右,平均功耗1.6W。1998年密西根大学的Sangji Hong和Wayne分析了VLSI实现Turbo码的复杂度并在0.6umCMOS技术下实现了吞吐量1 Mbps功耗34mW左右的Turbo译码芯片。系统的给出使用MAP算法实现Turbo译码的VLSI结构,全面分析了MAP算法的硬件实现,包括分量译码器中状态度量和分支度量计算模块的数量配置、加比选关键电路的优化、量化精度及度量值的归一化等。2006年一个对VLSI实现Turbo译码器做的文献调查显示,译码算法以基于BCJR的MAP类和基于Viterbi的SOVA为主,使用Log- map的译码器吞吐量60Mbps时功耗已降到1 SmW。 2 Turbo码在通信中的应用 近年来软件无线电(SDR)的兴起和3GPP LTE(第三代通信系统长期演进)的商用,使得Turbo码在硬件实现上遇到了更大的挑战,SDR强调对多种通信系统或标准的适用性,可针对不同的系统做出相应的参数调整,这就要求信道编译码器具有可重配置性。2009年Purlsley和Skinner提出了一种自适应编码方法,通过修改相关参数可支持多种常用信道编码方式,包括卷积码,Turbo码和LDPC码等。Jonathan Roth等人引入并行Turbo译码实现了适用于SDR的双二进制Turbo译码器,采用线性Log-map在与普通Max-loges-rnap译码器相同误码率的情况下,提供了双倍的吞吐量并减少了一半的迭代次数。而LTE系统对数据吞吐量提出了更高的要求,超过了100Mbps。为了达到很高的数据吞吐量,LTE中的Turbo码使用并行结构,而在Turbo码并行译码时普通交织器 67 会出现一种称为“存储器竞争”现象,即多个分量译码器试图以同一地址接入外信息存储器从而产生冲突。LTE标准使用了基于整数环理论的新型二次置换多项式(QPP)交织器,该交织器成功解决了“存储器竞争”问题。在硬件实现上,目前最新的Altera和Xilinx商用LTE Turbo码IP核数据显示,8个Turbo处理机并行译码吞吐量可超过100Mbps,而最新的基于0.13umCMOS技术的LTE Turbo译码器ASIC芯片,吞吐量超过390Mbps。由于LTE Turbo编译码器设计难度较高,国外商家推出的LTE Turbo码IP核的价格往往较高,在竞争日益激烈的国际形势下,为缩减成本我们有必要开发自己的适用于最新系统的Turbo码编译码器。 3 Turbo码的译码算法 在译码算法方面,主要采用的都是软输入/软输出译码算法(Soft-Input/Soft-Output; SISO )。自Turbo码出现以来这方面的研究也引起了许多学者的关注。Hagenauer等利用对数似然比对存在的软输入/软输出算法进行分析。这些方法包括逐符号最大后验概率译码(Maximum A Posteriori;MAP)算法或称BCJR算法;软输出Viterbi(Soft Output Viterbi Algorithm;SOVA)算法以及相应的次最优算法等。 MAP算法是一种基于码元的最大后验概率译码算法,对于线性块编码的卷积码,它能使比特错误率最小。也是最早应用于Turbo译码中的译码算法。但是采用此算法计算量大,译码复杂度高,在实际中应用起来比较困难。这主要是因为: (1) 在算法中求对数似然比和中间变量的迭代过程中存在着大量的指数,乘法和加法运算;(2) 随着状态数与分组序列长度的增长,中间变量所需的内存呈指数性增长;(3) 需要接收完整的序列才能获得信息位的软输出。针对这些译码算法的复杂性,人们对其进行了修正和改进。 在实际应用中,无论采用数字信号处理(DSP)还是可编程门阵列(FPGA )等其它芯片实现,算法中大量的指数和乘法运算的存在都将会严重制约处理速度,势必会为迭代译码增加延时,且不利于信息传输速率的提高。因此,如何消除MAP算法中的指数和乘法运算成为简化算法的首要任务。而最为有效的方法就是利用对数函数的单调性,对算法中的变量统一取对数,将其中的乘法运算化为加法运算并消除部分指数运算。 另外,由于状态变量向后递归迭代的需要,MAP算法要接收到完整的序列才能得到信息位软输出,译码过程缺乏连续性,且编码器必须终止于某一确定状态(如零状态),这意味着每传送一帧(编码分组)数据就必须在末尾添加一些额外的“迫零比特”。如 68 果信息序列的编码分组(帧)比较短,则将会严重的降低实际编码效率;相反,如果为保证编码效率而一味扩大帧长,则采用MAP算法又会因中间变量过度膨胀而带来难以忍受的内存需求。实际上,为简单起见,采用迭代译码的Turbo码信息位帧长度一般与交织器的交织深度一致,而交织深度的选取多半根据所需支持的通信业务的性质及其要求达到的误码率等因素决定。为此,受有限译码约束长度维特比算法的启发,人们提出了准最佳的活动窗BCJR算法;或把长帧的信息分成W段用W个并行子译码算法同时进行译码。 Turbo码译码算法的复杂度还表现在向前和向后迭代运算中,由于减少迭代次数可以有效地减少向前和向后迭代运算,也就会降低译码复杂度。因此如何减少迭代次数或对信息符号及早判决成为人们研究的热点,针对这种情况,人们提出了各种改进的算法。 由于Turbo码是面向第三代移动通信的纠错编码,因此需要高速率的传输数据信息并且功率消耗要小,针对高码率的Turbo码,有相应的译码方法,同时人们对如何减小译码的功率损耗也提出了相应的译码算法。由于Turbo码的译码过程中,每一个系统都为SISO算法。软判决值(通常为对数似然比)送入下一级。最后一级软输出反馈至第一级,作为第二次迭代的初始值。目前正研究将Turbo译码思想进一步推广到更为广泛的检测和译码结构中,如串行级联译码、均衡、编码调制、多用户检测、联合信源与信道译码等。 相比之下,Turbo码译码中,软输出维特比译码(SOVA)算法计算简单,存储量小,易于硬件实现的优点,受到人们广泛的关注。但由于它的输出不是对MAP算法结果的一个近似,因此是次最优算法,它在性能上与MAP算法相差1dB左右。 综上所述,Turbo码的译码算法主要采用MAP算法和SOVA算法,而算法的简化,复杂度的降低,内存的减少一般是以信噪比为代价换取的。因此,如何寻找一种译码算法与MAP算法性能一致而又比较简单的算法一直是人们研究的热点。 69
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- 7swz.com 版权所有 赣ICP备2024042798号-8
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务