《电子技术应用》
您所在的位置:首页 > 可编程逻辑 > 业界动态 > 高速Viterbi译码器的优化和实现

高速Viterbi译码器的优化和实现

2008-09-22
作者:鄂 炜 苏广川

  摘  要: 大约束度卷积码作为信道纠错编码在通信中得到了广泛的应用,而其相应的Viterbi译码器" title="译码器">译码器硬件复杂度大,限制了译码速度。分析了Viterbi译码器的结构,优化了各模块,合理地组织了存储器结构,简化了接口电路" title="接口电路">接口电路。用FPGA实现Viterbi译码器,提高了译码器速度。

  关键词: 卷积码  Viterbi译码  ACS 路径度量存储   FPGA实现

 

  Viterbi算法是一种基于最大后验概率的卷积译码算法,应用广泛。CDMA的IS-95标准和WCDMA 3 GPP标准将卷积码作为高速实时数据传输的信道纠错编码,使Viterbi译码器成为移动通信系统的重要组成部分。

  为保证纠错性能,卷积码约束度一般选择比较大的,在3 GPP中规定约束度K=9。出于实时性的考虑,移动通信系统中对译码时延的要求比较高,需要高速译码器的支持。可是Viterbi译码算法的复杂度、所需存储器容量与约束长度成指数增长关系,成为限制译码器速度的瓶颈。Viterbi译码器每解码一位信息位就需对2K-1个寄存器的状态进行路径度量,并对相应的存储单元" title="存储单元">存储单元进行读写。这种情况下,可以采用状态路径存储单元分块的方法,以提高其译码性能,缺点是ACS单元与存储器之间的接口电路十分复杂,不易实现。

  本文分析和优化了Viterbi译码器的结构,提出了一种FPGA实现方案,简化了接口电路,提高了速度。用这种结构实现的单片集成译码器译码速率达350kbps、时钟频率30MHz。以下先分析译码器总体结构,然后对各模块设计和实现做详细说明。

1 算法简述及译码器结构

  本文采用3 GPP标准规定的K=9,码率r=1/2的(7538,5618)卷积码,卷积编码器送出的码序列C,经过信道传输后送入译码器的序列为R。译码器根据接受序列R,按最大似然准则力图找出正确的原始码序列。

  Viterbi译码过程可用状态图表示,图1表示2个状态的状态转移图。Sj,t和Sj+N/2,t表示t时刻的两个状态。在t+1时刻,这两个状态值" title="状态值">状态值根据路径为0或者1,转移到状态S2j,t+1和S2j+1,t+1。每一种可能的状态转移都根据接收到的有噪声的序列R计算路径度量,然后选择出各个状态的最小度量路径(幸存路径)。Viterbi算法就是通过在状态图中寻找最小度量路径向前回溯L步,最后得到的即为译码输出。

 

  本设计采用Xilinx Virtex600E FPGA芯片,在ALDEC公司的Active-HDL仿真环境下,用Verilog语言完成,并用Xilinx的ISE4综合实现。Viterbi译码器系统框图如图2所示,主要由BMG(路径计算模块)、ACS(加比选模块)、TB(路径回溯模块)、MMU(路径存储模块)等部分组成。采用并行流水线结构,各个模块在控制信号统一监控下工作,减少了读取数据所需时间,充分发挥了FPGA高速计算的特性,提高了整个系统的效率。

 

2 子模块的优化和实现

2.1 ACS模块

  由于采用的卷积码约束度K=9,在译码过程中,每一时刻有2K-1=256个状态,512个度量路径值,为了获得高速率,需采用尽可能多的ACS单元。但由于实际应用中要求电路面积小、功耗低,决定了ACS单元的数目不能太多。经过实验证明,采用4个ACS单元并行处理,完全可以达到应用要求。

  ACS单元用来计算选择状态的路径度量。它需要不断地读出路径度量作为操作数,然后将更新的度量写回各个状态。由于采用4个ACS单元并行处理,为不造成流水线堵塞,如何对RAM中的度量数据进行读写是关键。如前述,本文采用状态路径存储单元分块的方法。将所有状态分成4组,分别对应于4个ACS。每次运算时,4个ACS同时从各组状态值中读取数据进行操作。

   由图1可知,状态Sj和Sj+2/N在状态转移中同时得到两个新状态S2j和S2j+1。因此为了ACS能够同时取出这两个状态值,Sj和Sj+2/N必须存储在不同的RAM组中。同样,两个计算出来的新状态S2j和S2j+1也应如此。遵循这种准则,同时为简化接口电路,采用如下的分组算法:假设待分配状态=Sj=SK-2SK-1…S1S0,所对应的RAM组为Rm,由于RAM共分成4组,则m=(SK-2S1)S0(两位二进制数表示)。状态分组图如图3所示,从中可以看出,从状态S128开始的后续状态都有规律地交错位置存储。由此,ACS单元和状态路径存储单元的接口电路只需采用两个2×2交换器" title="交换器">交换器,如图4所示。每一个交换器上连着两个ACS单元和两个RAM组。这两个交换器由输入状态Sj的最高位SK-2控制。当SK-2=1时,交换器交叉互联,如果SK-2为0时,各ACS和RAM直接相连。这种接口设计十分容易实现。

 

 

  在Viterbi译码算法中,译码状态的转移导致度量的读出和写入地址的不同,这样用FPGA实现时就需要两块RAM采用乒乓模式实现。本文更新路径存储采用原位运算方法,也就是找出状态转移的规律性,建立转移后的新状态和转移前的老状态地址映射关系,使度量的更新在原位上进行,使存储空间减小一半。

2.2 幸存路径管理模块

  幸存路径的存储和回溯是Viterbi算法关键的一步,最终的译码输出从对幸存路径的回溯中得到。由于采用基2的状态转移算法,当前时刻对应的前序时刻状态只有2个,所以在路径回溯中采用1bit指针算法。也就是说,在每个状态路径更新时,只需写1bit路径状态转移信息。幸存路径存储单元可看作一个存储器阵列,每列对应一个状态,一列中的每个单元都有一个1位的指针。在实际设计中,考虑到数据总线的带宽有限,对于8位的幸存路径数据总线,在幸存路径存储器中将256个状态分成32块。对应幸存路径时,先通过当前状态地址寻址的方式来选择所对应的幸存路径块。

  在实际应用中,为了保证译码的准确度,幸存路径的回溯长度通常取4~5倍约束长度,本文回溯长度定为64。如图5所示,当一个解码初始信号进来后,系统把当前所有状态中的最小状态,也就是最小状态值作为当前状态值,路径回溯模块把地址值送入MMU中,从32个分组块中选取相应的幸存路径存储单元得到幸存状态值(8位),然后根据当前状态的指针从这8位数据中得到1位幸存路径比特,而下一个状态值由当前状态的低7位和这个幸存路径比特决定。当回溯了64步后,控制信号给出一个输出指示时,当前状态值的最高位即是解码输出值。

 

 

  本文重点从ACS的并行处理、度量路径的存储管理和路径回溯上对Viterbi译码方法进行了讨论。从实际应用出发,考虑到硬件功耗的降低和面积的减小,采用了4个ACS并行,路径的存储和管理都采取了分组的模式,简化了接口电路,译码达到了较高的速度,完全可以满足3 GPP标准的要求。用Xilinx 的Virtex600E FPGA芯片实现了K=9、码率为1/2、编码速率为350kbps、时钟频率40MHz的Viterbi译码器。表1列出了Xilinx ISE对本设计综合布线报告中提供的参数。

 

 

参考文献

1 王新梅,肖国镇. 纠错码原理与方法. 西安:西安电子科技大学出版社,1991

2 S.Y. Kim, H. Kim I.C. Park. Path metric memory management for minimizing interconnections in Viterbi decoders.ELECTRONICS LETTERS 2001;37(7):14

3 Yun-Nan Chang, Hiroshi Suzuki and Keshab K.Parhi. A 2-Mb/s 256-State 10-Mw Rate-1/3 Viterbi decoder.

IEEE J Solid-State Circuit, 2000; 35(6)

4 Shieh Ming-Der, Sheu Ming-Hwa, Wu Chieh-Ming and Ju Wann-Shyang. Efficient management of in-place path

  metric update and its implementation for Viterbi decoders. IEEE Int. Symp.Circuits and Systems, 1998;4

5 Biver,M.,Kaeslin,H., and Tommasini,C. In-place updating of path metrics in Viterbi decoders. IEEE J. Solid-State Circuits, 1989; 24 (8)

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。