用TMS320C54X实现Vertibi译码器
C54X片内的比较、选择和存储单元(CSSU)就是专门为Viterbi算法设计的加法/比较/选择(ACS)运算的硬件单元。图3所示的运算包括加法、比较和选择三部分操作。其加法运算由DSP的ALU完成。只要将状态寄存器ST1中的C16位置成1,ALU就被配置成双16位工作方式,这样,就可以在一个机器周期内执行两次加法运算。其结果(Old_Met1+D1和Old_Met2+D2)都是16位数,分别存放在累加器的高16位和低16位中。然后,利用CMPS指令对累加器的高16位和低16位进行比较,并选择出较大的一个数放到指令所指定的存储单元中。在CMPS指令执行的过程中,状态转移寄存器TRN自动记录比较的结果,这一点非常有用。实现一个蝶式运算的程序如下:
LD *AR2,T ;T=本地距离
DADST *AR5,A ;A=Old_Met(2*j)+T//Old_Met(2*j+1)-T
CMPS A,*AR4+ ;New_Met(j)=(Max(Old_Met(2*j)+T,Old_Met(2*j+1)-T)
;TRN=RTN<<1
;若(Old_Met(2*j)+T=<Old_Met(2*j+1)-T则
TRN[0]=1
CMPS B,*AR3+ ;New_Met(j+2 K-2)=(Max(Old_Met(2*j)-T,Old_Met(2*j+1)+T)
TRN=TRN<<1
;若(Old_Met(2*j)-T=<Old_Met(2*j+1)+T)则TRN[0]=1
3.2 回溯
当接收完1帧数据后,添加尾比特,强迫网格图的最后一个状态(0状态)开始,反向追踪最大似然路径,完成原始数据的译码。回溯的计算过程如下:
①计算当前状态在转移数据块中的数据;
②利用BITT指令从T寄存器中读取当前状态相应的转称比特;
③用上面读取的转移比特更新状态。
溯的主要功能是,从每个符号间隔的转移数据中提取正确的位。为了完成该功能,需要保存每个状态相应的转移比特。该比特表示选定碟形网络的是上面分支还是下面分支,所有这些转移比特构成一块转移字。表1给出转移字块中状态数与相应转移比特之间的关系。
表1 一个符号间隔内数据转移的状态顺序
实现回溯的程序如下:
《用TMS320C54X实现Vertibi译码器(第3页)》