一种串行结构的2_1_7卷积码维特比译码器的FPGA实现
无线通信系统维特比译码的FPGA仿真验证

无线通信系统维特比译码的FPGA仿真验证高志斌;黄联芬【摘要】在设计宽带无线通信系统的基带平台中,采用一种基于FPGA仿真工具Active HDL和目前广泛用于数字信号处理、数值分析等的实用软件Matlab相结合的方法,通过实现(2,1,7)卷积编码的全并行维特比软判决译码的FPGA设计仿真和算法验证,提出一种利用Matlab进行测试向量的生成和验证,以简化仿真测试序列的手工输入,提高FPGA设计进程和保证代码质量的方法.【期刊名称】《现代电子技术》【年(卷),期】2006(029)013【总页数】3页(P20-22)【关键词】FPGA;Active HDL;Matlab;维特比译码【作者】高志斌;黄联芬【作者单位】厦门大学,福建,厦门,361005;厦门大学,福建,厦门,361005【正文语种】中文【中图分类】TN402现代宽带无线通信系统设计,基于软件无线电思想,采用各种高速信号处理器件,比如数字信号处理器(DSP),或现场可编程逻辑门阵列(FPGA),把中频信号下变频,进行基带信号处理,可以给通信系统带来很大的灵活性、兼容性和可重构性。
基带信号处理采用FPGA实现时,有必要对各个算法模块,比如CRC编码校验、卷积编码、维特比译码、交织、解交织等,进行功能仿真,通常也称为前仿真,本文提出一种利用Active HDL和Matlab结合的快速设计仿真的方法,实现对宽带无线通信系统中一个(2,1,7)卷积编码的维特比软判决译码的前仿真,以验证该模块的正确性。
1 Active HDL与Matlab简介Aldec公司的Active HDL软件,属于FPGA前端设计工具。
他可以结合其他公司的各种EDA工具,从而提供从程序代码编辑输入、网表综合、布局布线、甚至程序编程下载到CPLD或FPGA芯片上的整个设计平台。
他简单方便的Design Flow Manager设计,可以引导设计者完成完整的FPGA设计项目。
高性能维特比在卫星导航接收机中FPGA实现

高性能维特比在卫星导航接收机中PPGA实现IO:卫星定位接收机中卷枳码译码即维特比译码器,在处理器中面临占有资源较多、处理时间过长等间题,为了减少业理器资漏的占用和提高处理速度,采用并fiUDtt选噪形单元的的方法,在fPW 平台上用硬件描述语言设廿一种髙性能维特比译码器,作为gps 12 频点和galileoe1顺点接收机的通用译码器,在gps和galileo接收机上运用,大大械少资源使用,提髙接收机的处理速度。
关鍵词:viterbi译码器;gps /galileo接收机;卷枳码;fpga引言在现代通信系统中,要使信号能舉更可靠地在信道中传输,往往需要在信道编码中采用纠錯码来降低信号受噪声的影响,以降低传输的俣码率。
卷枳码及其viterbi译码是常用的信道编码方案[1 3L卷枳码在gnss接收机中得到应用,其中约束长度k=7,码率为1/2的卷枳码已经成为商业卫星通信系貌中的标准编码方法。
在卫星定位系统中,gpsl2频点fl] galileoe1的电文均采用卷枳码编码,目前在定位接收机中用软件进行viterbi译码较多,为了提髙处理速度通用性,本文设廿一种基于fpga的通用高速viterbi澤码器,能作为gps I2 fD galileo e1的电文的译码器,大大减少资源使用,提髙接收机的处理速度和城少软件复杂度,从而节约处理器的资源。
1卷枳编码K viterbi算法基本原理卷枳码包含由k个寄存器组(毎组包括k个比特,k通常取1)构成的移位寄存器fUnf模2加法器,其中k是约束长度,编码器的输出由当前输入数据和寄存器组中的数据共同决定。
对T gps 12和galileoe1 为(2, 1, 7)卷枳码,其生成多项式为g=(171, 133),电路图如图1所示。
(2, 1, 7)卷枳码编码器由6个延时器(图1中的卜1模块,可用寄存器实现)和两个模20II法器组成,它的编码约束度为7,码率为1/2, fid输人端输人1b信息,聯出端输出2 b 编码信息,并分为上、下两路并行輪出[4]。
基于FPGA的卷积编译码器的设计与实现

soa e a d d c d n h u p tw r e n p r l l a d t e so e ah v c o n tt e t r y c r n z d T e d sg t rg n e o i g t e o tu o k d i a a e , n h t r d p t e t ra d sae v c o s n h o ie . h e in l smu ain i p o e y I E .i T e d c d n e u t w r o r c .t e d c d r c u d g tt e s u c o e e e n ,t e i l t s rv d b S 9 2 . h e o i g r s l e e c re t h e o e o l e h o r e c d lme t h o s
De in a d i lm e t t n o o v l t n l o e a e n F sg n mp e n a i fc n o u i a d cb s d o PGA o o c
LI ra U ng,ZHANG n Mi
( ul n esyo l t ncT cnl y G in5 10 C ia G inU i ri e r i ehoo , ul 4 04, hn ) i v t fE c o g i
Ab t a t n o d r t o v h r dt n l v tr i d c d r S p o lm u h a o lx s u tr s s w d c dn , bg sr c :I r e o s l e t e ta i o a i b e o e ’ rb e s c s c mp e t cu e , l e o i g i e r o i c n u t n r s u c s h s p p r p e e t d a n v ld c d r d sg p r a h, i h i p l d F GA f au e ,t e p t o s mp i e o r e .t i a e r s n e o e e o e e in a p o c whc s a p i P e t rs h ah o e
卷积码的维特比译码原理及仿真

卷积码的维特比译码原理及仿真摘 要 本课程设计主要解决对一个卷积码序列进行维特比(Viterbi)译码输出,并通过Matlab 软件进行设计与仿真,并进行误码率分析。
实验原理QPSK :QPSK 是英文QuadraturePhaseShiftKeying 的缩略语简称,意为正交相移键控,是一种数字调制方式。
四相相移键控信号简称“QPSK ”。
它分为绝对相移和相对相移两种。
卷积码:又称连环码,是由伊莱亚斯(P.elias)于1955年提出来的一种非分组码。
积码将k 个信息比特编成n 个比特,但k 和n 通常很小,特别适合以串行形式进行传输,时延小。
卷积码是在一个滑动的数据比特序列上进行模2和操作,从而生成一个比特码流。
卷积码和分组码的根本区别在于,它不是把信息序列分组后再进行单独编码,而是由连续输入的信息序列得到连续输出的已编码序列。
卷积码具有误码纠错的能力,首先被引入卫星和太空的通信中。
NASA 标准(2,1,6)卷积码生成多项式为: 346134562()1()1g D D D D D g D D D D D=++++=++++其卷积编码器为:图1.1 K=7,码率为1/2的卷积码编码器维特比译码:采用概率译码的基本思想是:把已接收序列与所有可能的发送序列做比较,选择其中码距最小的一个序列作为发送序列。
如果接收到L 组信息比特,每个符号包括v 个比特。
接收到的Lv 比特序列与2L 条路径进行比较,汉明距离最近的那一条路径被选择为最有可能被传输的路劲。
当L 较大时,使得译码器难以实现。
维特比算法则对上述概率译码做了简化,以至成为了一种实用化的概率算法。
它并不是在网格图上一次比较所有可能的2kL 条路径(序列),而是接收一段,计算和比较一段,选择一段最大似然可能的码段,从而达到整个码序列是一个最大似然值得序列。
下面以图2.1的(2,1,3)卷积码编码器所编出的码为例,来说明维特比解码的方法和运作过程。
基于FPGA的串行RS+Viterbi级联译码器的设计与实现

始化 网络 、 支度 量 计 算 、 比选 、 分 加 累计度 量储 存 、 存路 径 储 存 和 回 溯等 主要 部 分 ; S译 码 采 用 欧 几 里 德 算 法 。 幸 R 给 出了伴 随 式 计 算 、 误 位 置 和错 误 值 多项 式计 算 ( 搜 索计 算 错 误 位 置 、 尼 算 法计 算 错 误 值 )模 二 和 计 算 解 码 输 错 钱 福 、
上
海 航
天
5 3
20 0 7年 第 4期 文章 编 号 :0 61 3 (0 7 0 —0 30 10 —60 2 0 )40 5 —5
AEROS ACE S P HANGHAI
基 于 F G 的 串行 R P A S+Vi ri tb e 级 联 译 码器 的设计 与实 现
d c ig emao at fte ag rtm ,sc ss n rm aclt n eo n .Th jrp rso h loi d h u h a y d o clua i ,mut o a cluain o ro o io n o l n mil ac lt fer rp st n a d i o i
出等 关键 部 分 。
关 键 词 : 联 码 ; S码 ;卷积 码 ;欧 几 里德 算 法 ;维 特 比 算 法 ;现 场 可 编程 逻 辑 阵 列 级 R
中图 分 类 号 : N 1 .2 T 9 1 2 文 献标 识码 : A
De i n a d I p e e t to fS ra sg n m lm n a i n o e i lRS+ Vie b n a e a e c d r Ba e n FPGA t r iCo c t n td De o e s d o
LTE中卷积码的译码器设计与FPGA实现

LTE中卷积码的译码器设计与FPGA实现李冬冬【摘要】Based on Tail-biting convolutional code of LTE, Viterbi Algorithm which is a optimal decoding algorithm of convolutional codes is introduced. The fixed-delay decoding scheme is adopted to reduce the decoding complexity according to the circular property of Tail-biting convolutional code. By using all parallel structure and simple trace back memory method, a fixed-delay decoder with higher speed and lower complexity is designed. The decoder was implemented and verified with FPGA. The results of verification show that the performance of the decoder meets the requirements of LTE syetem.%基于长期演进(LTE)的Tail-biting卷积码,介绍了维特比译码算法,它是一种最优的卷积码译码算法.由于Tail-biting卷积码的循环特性,采用固定延迟译码的方法,降低了译码复杂度.通过使用全并行的结构及简单的回溯存储方法,设计了一个具有高速和低复杂度的固定延迟译码器.在FPGA上实现并验证,验证结果表明译码器的性能满足了LTE系统的要求.【期刊名称】《现代电子技术》【年(卷),期】2011(034)013【总页数】4页(P46-48,52)【关键词】LTE;Tail-biting卷积码;维特比译码算法;固定延迟译码;FPGA 【作者】李冬冬【作者单位】北京工业大学北京市嵌入式系统重点实验室,北京 100124【正文语种】中文【中图分类】TN919.3-340 引言LTE(Long Term Evolution)[1]是“准4G”的技术,以OFDM/FDMA和MIMO为其核心技术。
电力线通信系统中卷积码和Viterbi译码的FPGA设计实现
电力线通信系统中卷积码和Viterbi译码的FPGA设计实现杨沛
【期刊名称】《电子元器件应用》
【年(卷),期】2009(11)7
【摘要】阐述了电力线通信系统中卷积码及其Viterbi译码的信道编码方法,给出了(2,1,6)卷积码编译码的设计以及采用Verilog HDL硬件描述语言完成卷积码编译码的FPGA实现方法.
【总页数】4页(P57-59,63)
【作者】杨沛
【作者单位】西安电子科技大学电子工程学院,陕西,西安,710071
【正文语种】中文
【中图分类】TM7
【相关文献】
1.80
2.11b中卷积码和Viterbi译码的FPGA设计实现 [J], 元锋刚;许海涛
2.基于FPGA的卷积码Viterbi译码器性能研究 [J], 陈新永;杨瑞娟;肖玉芬;曾浩
3.卷积码Viterbi译码的FPGA实现 [J], 陈健;李广华
4.基于FPGA的卷积码Viterbi编码/译码器的设计与实现 [J], 张成;杨健
5.基于FPGA的卷积码Viterbi译码器实现方法 [J], 李明阳;柏鹏;屈鹏;张毓桐因版权原因,仅展示原文概要,查看原文内容请购买。
基于FPGA的Viterbi译码器设计
/ 一 、
一 ,一
图2 ( , 1 )卷 积 码 状 态 图 2 ,3
结 合状 态 图可 得 出如 图3 示 的状 态 与 时 间 所
' 一/ 一 、
一\ ,一 一
关 系图 ,称为 网格 图。该 图设 输入 信 息数 目L 5 =, 所 以 画有 L N 8 时 间单 位 ( 点) + =个 节 ,图3 分别 中
并在Q atsI 进行 仿真 。首先 利用 编码 器对 已 ur 下 uI
知 的序列 进行 编码 ,产生 这个输 入序 列 的编码 码 字 ,并 对产 生 的编码码 字 进行人 为加 扰 ,用 以验 证 所 设 计 的V tri 码 器 对 错 误 信 息 的 纠错 能 i b译 e 力 。图5 示是该 译码 器 的仿真 图 ,对于 图5 所 ,通
t a 司的E 3 1 0 7 0 8 片的 (,1 )V tri e公 r P C 2F 8C 芯 2 ,7 i b译码 器 , 同时给 出 了时序 仿真 图。 e
关 键 词 :卷 积 码 ;V tri 码 ;F G i b译 e P A
0 引 言
在 现代 通信 系 统 中 ,要 使信 号 能够 更 可靠 地
法 。它 并不是 在 网格 图上一次 比较所 有可 能 的2
看 出 ,输入 的序 列 与译 码 输 出的序列 一致 ,故 可 证 明V t v 码器设 计 的正确性 。 i ri e 译
条 路径 ( 列) 序 ,而 是 接 收一 段 ,就 计算 、 比较 、
选 择一段 最可 能 的码 段 f 支) 分 ,从而使 整个 码序 列达到一个 有最 大似然 函数 的序列 。
第20 第5 1卷 年 月 2 期 0 5 1
卷积码的维特比译码
卷积码的维特比译码卷积编码器自身具有网格构造,基于此构造我们给出两种译码算法:Viterbi 译码算法和BCJR 译码算法。
基于某种准那么,这两种算法都是最优的。
1967 年,Viterbi 提出了卷积码的Viterbi 译码算法,后来Omura 证明Viterbi 译码算法等效于在加权图中寻找最优途径问题的一个动态规划〔Dynamic Programming〕解决方案,随后,Forney 证明它实际上是最大似然〔ML,Maximum Likelihood〕译码算法,即译码器选择输出的码字通常使接收序列的条件概率最大化。
BCJR 算法是1974 年提出的,它实际上是最大后验概率〔MAP,Maximum A Posteriori probability〕译码算法。
这两种算法的最优化目的略有不同:在MAP 译码算法中,信息比特错误概率是最小的,而在ML 译码算法中,码字错误概率是最小的,但两种译码算法的性能在本质上是一样的。
由于Viterbi 算法实现更简单,因此在实际应用比较广泛,但在迭代译码应用中,例如逼近Shannon 限的Turbo 码,常使用BCJR 算法。
另外,在迭代译码应用中,还有一种Viterbi 算法的变种:软输出Viterbi 算法〔SOV A,Soft-Output Viterbi Algorithm〕,它是Hagenauer 和Hoeher 在1989 年提出的。
为了理解Viterbi 译码算法,我们需要将编码器状态图按时间展开〔因为状态图不能反映出时间变化情况〕,即在每个时间单元用一个分隔开的状态图来表示。
例如〔3,1,2〕非系统前馈编码器,其生成矩阵为:G(D)=[1+D1+D21+D+D2]〔1〕图1 〔a〕〔3,1,2〕编码器〔b〕网格图〔h=5〕假定信息序列长度为h=5,那么网格图包含有h+m+1=8 个时间单元,用0 到h+m=7 来标识,如图1〔b〕所示。
假设编码器总是从全0 态S0 开始,又回到全0 态,前m=2 个时间单元对应于编码器开始从S0“启程〞,最后m=2 个时间单元对应于向S0“返航〞。
卷积码编码和维特比译码
卷积码编码维特比译码实验设计报告SUN一、实验目的掌握卷积码编码和维特比译码的基本原理,利用了卷积码的特性, 运用网格图和回溯以得到译码输出。
二、实验原理1.卷积码是由连续输入的信息序列得到连续输出的已编码序列。
其编码器将k个信息码元编为n个码元时,这n个码元不仅与当前段的k个信息有关,而且与前面的(m-1)段信息有关(m为编码的约束长度)。
2.一般地,最小距离d表明了卷积码在连续m段以内的距离特性,该码可以在m个连续码流内纠正(d-1)/2个错误。
卷积码的纠错能力不仅与约束长度有关,还与采用的译码方式有关。
3. 维特比译码算法基本原理是将接收到的信号序列和所有可能的发送信号序列比较,选择其中汉明距离最小的序列认为是当前发送序列。
卷积码的Viterbi 译码是根据接收码字序列寻找编码时通过网格图最佳路径的过程,找到最佳路径即完成了译码过程,并可以纠正接收码字中的错误比特。
4.所谓“最佳”, 是指最大后验条件概率:P( C/ R) = max [ P ( Cj/ R) ] , 一般来说, 信道模型并不使用后验条件概率,因此利用Beyes 公式、根据信道特性出结论:max[ P ( Cj/ R) ]与max[ P ( R/ Cj) ]等价。
考虑到在系统实现中往往采用对数形式的运算,以求降低运算量,并且为求运算值为整数加入了修正因子a1 、a2 。
令M ( R/ Cj) = log[ P ( R/ Cj) ] =Σa1 (log[ P( Rm/ Cmj ) ] + a2) 。
其中, M 是组成序列的码字的个数。
因此寻找最佳路径, 就变成寻找最大M( R/ Cj) , M( R/ Cj) 称为Cj 的分支路径量度,含义为发送Cj 而接收码元为R的似然度。
5.卷积码的viterbi译码是根据接收码字序列寻找编码时通过网格图最佳路径的过程,找到最佳路径即完成了译码过程并可以纠正接收码字中的错误比特。
三、实验代码#include<stdio.h>#include "Conio.h"#define N 7#include "math.h"#include <stdlib.h>#include<time.h>#define randomize() srand((unsigned)time(NULL))encode(unsigned int *symbols, /*编码输出*/unsigned int *data, /*编码输入*/unsigned int nbytes, /*nbytes=n/16,n为实际输入码字的数目*/unsigned int startstate /*定义初始化状态*/)////////////////////////////////////////////////////////////////////////////卷积码编码///////////////////////////////////////////////////////////////////////////////{unsigned int j;unsigned int input,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0;for(j=0;j<nbytes;j++){input=*data;data++;*symbols = input^a1^a2^a3^a6; //c1(171)symbols++;*symbols = input^a2^a3^a5^a6; //c2(133)symbols++;a2=a1;a1=input;}return 0;}int trandistance(int m, int state1, int state2)/*符号m与从state1到state2时输出符号的汉明距离,如果state1无法到state2则输出度量值为100*/{int c;int sym,sym1,sym2;sym1=((state2>>1)&1)^(state2&1)^(state1&1);sym2=((state2>>1)&1)^(state1&1);sym=(sym1<<1) | sym2;if ( ((state1&2)>>1)==(state2&1))c=((m&1)^(sym&1))+(((m>> 1)&1)^((sym >> 1)&1));elsec=10000;return(c);}int traninput(int a,int b) /*状态从a到b时输入卷积码的符号*/{int c;c=((b&2)>>1);return(c);}int tranoutput(int a,int b) /*状态从a到b时卷积码输出的符号*/{int c,s1,s2;s1=(a&1)^((a&2)>>1)^((b&2)>>1);s2=(a&1)^((b&2)>>1);c=(s1<<1)|s2;return(c);}////////////////////////////////////////////////////////////////////////////维特比译码///////////////////////////////////////////////////////////////////////////////void viterbi(int initialstate, /*定义解码器初始状态*/int *viterbiinput, /*解码器输入码字序列*/int *viterbioutput /*解码器输出码字序列*/){struct sta /*定义网格图中每一点为一个结构体,其元素包括*/ {int met; /*转移到此状态累计的度量值*/int value; /*输入符号*/struct sta *last; /*及指向前一个状态的指针*/};struct sta state[4][N];struct sta *g,*head;int i,j,p,q,t,r,u,l;for(i=0;i<4;i++) /* 初始化每个状态的度量值*/for(j=0;j<N;j++)state[i][j].met=0;for(l=0;l<4;l++){state[l][0].met=trandistance(*viterbiinput,initialstate,l);state[l][0].value=traninput(initialstate,l);state[l][0].last=NULL;}viterbiinput++; /*扩展第一步幸存路径*/for(t=1;t<N;t++){for(p=0;p<4;p++){state[p][t].met=state[0][t-1].met+trandistance(*viterbiinput,0,p);state[p][t].value=traninput(0,p);state[p][t].last=&state[0][t-1];for(q=0;q<4;q++){if(state[q][t-1].met+trandistance(*viterbiinput,q,p)<state[p][t].met){state[p][t].met=state[q][t-1].met+trandistance(*viterbiinput,q,p);state[p][t].value=traninput(q,p);state[p][t].last=&state[q][t-1];}}}viterbiinput++;} /*计算出剩余的幸存路径*/r=state[0][N-1].met; /*找出n步后度量值最小的状态准备回溯路由*/g=&state[0][N-1];for(u=N;u>0;u--) /*向前递归的找出最大似然路径*/{*(viterbioutput+(u-1))=g->value;g=g->last;}/* for(u=0;u<8;u++)*(viterbioutput+u)=state[u][2].met; */ /*此行程序可用于检测第n列的度量值*/}void decode(unsigned int *input, int *output,int n){int viterbiinput[100];int j;for(j=0;j<n+2;j++){viterbiinput[j]=(input[j*2]<<1)|input[j*2+1];}viterbi(0,viterbiinput,output);}void main(){unsigned intencodeinput[100],wrong[10]={0,0,0,0,0,0,0,0,0,0},encodeoutput[100];int n=5,i,m,j=0,decodeinput[100],decodeoutput[100];randomize();for(i=0; i<n; i++)encodeinput[i]=rand()%2;encodeinput[n]= encodeinput[n+1]=0;encode(encodeoutput,encodeinput,n+2,0);printf("the input of encoder is :\n"); //信息源输入的信息码(随机产生)for(i=0;i<n; i++)printf("%2d",encodeinput[i]);printf("\n");printf("the output of encoder is :\n"); //编码之后产生的卷积码for(i=0;i<(n+2)*2;i++){printf("%2d",encodeoutput[i]);if(i%20==19)printf("\n");}printf("\n");printf("please input the number of the wrong bit\n"); //信道传输收到干扰而产生的错误码scanf("%d",&m);printf("please input the positions of the wrong bit(0-9)\n");for(i=0;i<m;i++){scanf("%d",&wrong[m]);if(encodeoutput[wrong[m]]==0)encodeoutput[wrong[m]]=1;elseencodeoutput[wrong[m]]=0;}printf("the input of decoder is :\n");for(i=0;i<(n+2)*2;i++){printf("%2d",encodeoutput[i]);if(i%20==19)printf("\n");}printf("\n");decode(encodeoutput,decodeoutput,n+2);printf("the output of decoder is :\n");for(i=0;i<n;i++)printf("%2d",decodeoutput[i]);printf("\n");for(i=0;i<n;i++){if(encodeinput[i]!=decodeoutput[i])j++;}printf("the number of incorrect bit is:%d\n",j);}四、实验总结(1)了解实验原理,分析实验所占数组变量很重要,也是相对考虑较多的;(2)对于读写文件,通过本实验更加熟悉;(3)记录实验程序最佳路径是本实验的难点;。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
·54· 2009年5月遥 测 遥 控
一种串行结构的2,1,7卷积码维特比 译码器的FPGA实现
黄华柱, 刘荣科, 王闰昕 (北京航空航天大学电子信息工程学院 北京 100083)
摘 要:卷积码在通信系统中得到了极为广泛的应用,其中约束长度K=7,码率为1/2的卷积码己经成为商业卫星通信系统中的标准编码方法。但是,目前的维特比译码器消耗的资源过多,制约了它的应用,因此迫切需要实现资源消耗少的维特比译码器。文中提出一种(2,1,7)卷积码维特比译码器的实现方案,该译码器采用串行结构的加/比/选模块,将加/比/选模块、最小路径判决和度量存储作为一个整体来设计,并采用两个存储器存储路径度量值,进行乒乓操作。这样设计的好处是一方面提高了速度,另一方面节省了资源。该译码器还对传统的回溯模块进行改良,与已有的串行结构的译码器相比,在速度相同的前提下,消耗的资源节省了80%。 关键词:卷积码; 维特比译码器; FPGA; 串行 中图分类号:TN914.3 文献标识码:A 文章编号:CN11-1780(2009)03-0054-05
引 言 在现代通信系统中,前向纠错编码(FEC)得到了广泛的应用[1~6]。其中,卷积编码是应用最广泛的一种。卷积码在编码过程中充分利用了各码元之间的相关性,而且它的信息元和校验元的长度也比分组码小很多,在与分组码同样的码率R和设备复杂度下,卷积码可以获得与分组码相当、甚至更好的纠错性能[1,2,6]。与分组码相比,卷积码更易于实现最佳译码和准最佳译码[1]。
卷积码的译码方法一般有:序列译码和维特比译码。维特比译码与序列译码相比具有译码效率高、速度快等优点。它的纠错能力很强,具有一定的克服突发错误的能力,译码延时是可预测的,其复杂度也固定,比较适合硬件实现,特别适用于实时应用系统[1]。它是一种最大似然译码,也是一种最
佳的概率译码,所以无论在理论上还是在实践上都得到了极其迅速的发展,并广泛地应用于各种数字系统中。 维特比译码器的硬件实现有三种结构,分别是:串行结构、并行结构和部分并行结构。并行结构实现的维特比译码器具有速度快的优点,但是需要消耗大量的资源。而串行的硬件结构实现的译码器需要的资源比前者少,但是速度与前者相比比较慢。部分并行结构的译码器是在速度和资源之间进行折中。 在有的应用中,要求的速度不是很高,采用串行结构就能满足要求,例如CCSDS,因此关键就是减少资源消耗。本文所设计的维特比译码器针对满足CCSDS标准的国际上卫星通信和其它通信系统中常用的(2,1,7)卷积码,其生成多项式为G=(171,133)8。该译码器采用串行结构,将加/比/选
(ACS)模块和路径度量值存储模块综合考虑,并将累积度量值和分支值组合在一起,存储到RAM中。这样在计算的时候能同时取出需要的两个量,提高了速度。由于ACS模块需要计算累积度量值,所以把累积度量值的溢出处理放到这个模块中一起处理,使整个译码器结构更简单,效率更高。
收稿日期:2008-12-14 收修改稿日期:2009-02-23
第30卷第3期 2009年5月 Journal of Telemetry,Tracking and Command Vol.30,№.3May 2009·55· 黄华柱等,一种串行结构的2,1,7卷积码维特比译码器的FPGA实现 第30卷第3期
1 维特比算法的原理 假定编码器送出的码序列C,经过离散无记忆信道(DMC)传输后,送入译码器的序列是R=C+E,E是信道错误序列。译码器根据接收到的序列R
,按最大似然译码准则找出编码器在篱笆图上
所走过的路径,这个过程就是译码器寻找最大似然函数()jbjCRpMax/log=,KL
j2,.......,2,1=的过程,
或者说寻找有“最大”度量的路径过程,即寻找 ()
jjCRMMax/=,KLj2,.....,2,1= (1)
的过程。其中,K表示输入的bit位数,L表示时间单位数,)(⋅p表示概率,()()jbjCRpCRM/log/=是
jC的似然函数,也称为jC的路径度量,jC表示某一个可能的输入信息序列。对二进制同步信道
(BSC)来说,寻找具有最大路径度量的路径等价于寻找与R有最小汉明距离的路径,即寻找 ()jjCRdMin,=,KL
j2,.....,2,1= (2)
其中,)(⋅d是表示汉明距。 直接用上述方法译卷积码是难以实现的,当L=100,n=2,K=1时,有2100条路径。要比较如此多的路径,工作量太大,难以实现。维特比译码算法能解决这一困难,它不是比较篱笆图上所有可能的路径,而是接收一段比较一段,使得选择的每一段都是最大可能的分支,从而使得译出的序列是一个有最大似然函数的序列[1]。
维特比译码器的工作原理是:首先计算进入每一状态的分支度量,再把各分支度量与各自前一时刻的状态度量相加,得到路径度量。对于每个状态,通过比较选择模块选出并保留到达这一状态的路径度量最小者作为当前时刻的状态度量,同时保留与之对应的路径作为幸存路径。最后,从各状态的幸存路径中选出状态度量值最小的一条路径作为回溯路径,沿此路径回溯,得到译码输出。
2 改进的串行结构维特比译码器总体结构设计 出于节省资源的考虑,该译码器采用串行ACS结构,用两个路径度量存储器实现“乒乓操作”,以提高速度,并对回溯模块做了一些改进设计。维特比译码器分为四个主要功能模块:ACS模块,路径度量存储模
块,TB(路径回溯)模块,幸存路径存储模块。维特比译码器总体框图如图1所示。 图1中,ACS模块的主要功能是:输入的2bit数据进入加/比/选模块。首先,从存储模块取出存储的内容(包括累积度量值和分支值两部分),这样做的好处是一次性就能取出蝶形运算需要的两个量,从而提高了速度。而文献[2]中用RAM存储累积度量值,用ROM存储分支值,导致其速度慢。由
于FPGA综合的特点,采用两个存储器会占更多的存储资源。将输入与分支度量值进行异或,得到当前的分支度量值,再加上一同取出的累积度量值,得到一个新的累积度量值。由于有两个分支,从而得到两个新的累积度量值,将这两个累积度量值进行比较,选择较小者。同时,从另外一个状态的两条分支中通过比较也得到一个较小值,将这两个值进行一次比较,得到最小值。之后,将这个最小值与开始设定的一个比较大的值进行比较,从而可以得到此次运算处理的最小累积度量值。考虑到FPGA综合的特点,这样将加/比/选和最小路径度量判决整体设计,相比文献[2]中分别进行设计,很明显地提
图1 维特比译码器总体框图 ·56· 2009年5月遥 测 遥 控
高了速度,还节省了资源。在控制累积度量值溢出方面,由于每次得到了最小度量值,那么下次运算的时候,在第二次比较选择之后减去这个最小度量值,便能很好地控制累积度量值溢出,而不需要增加任何的多余逻辑控制,与文献[2]的溢出之后再做处理相比,更加简单。这也是本设计与文献[2]相比
能节省更多资源并且速度还有所提高的原因。
3 总体框图中关键模块的设计 3.1 加/比/选(ACS)模块与存储模块
图2 ACS模块原理框图 在本设计中路径存储器采用两个双口RAM,这样能够提高ACS模块读写路径存储器的速度。如果只采用一个双口RAM,则不能对其进行连续的读写,而采用两个RAM能进行“乒乓操作”,从而提高速度。与文献[2]中分支值和累积度量值分别存在ROM和RAM中不同,本设计将这两部分内容组合在一起,存在RAM中,所以读一次就把这两个必需的量读出来了,而不用读两次,从而加快了速度。 路径存储器的具体设计是:用64个不同状态作为路径存储器的地址,存储的内容分为两个部分,高4个比特用于存储可能编码输出值,分别是“00”,“01”,“10”,“11”,低8个bit用于存储路径度量值。该模块主要用于与ACS模块进行通信。本设计中采用两个64×16的双口RAM。这是因为通过Quartus5.1综合的时候,选择64×12的双口RAM和64×16的双口RAM占用的资源是相同的,所以选择64×16的双口RAM或64×12的双口RAM对结果没有影响。ACS模块在读一个路径度量值存储器的时候,写另外一个存储器,实现“乒乓操作”,提高了ACS模块的操作速度。 在全串行结构中,每个时钟仅处理一个 ACS 单元,它把度量路径的计算和选择、幸存路径的选择、度量溢出控制和最小状态选择的功能都集成在一个模块中。所以在整个维特比译码器的设计中,加/比/选模块的设计显得尤为重要。 ACS设计单元先从一个路径存储器中读出累积的度量值和卷积编码的可能输出值“00”,“01”
“10”,“11”中的某一个,将它与译码器的输入进行异或运算,得到此分支的度量值。由于每个状态都经过两个分支到达,从而能够得到两个结果。将他们存到路径度量值中。 路径度量存储单元是一个双口RAM,用状态表示地址。存储的内容分为两个部分,一部分是前一状态累积的路径度量值,另一部分是编码可能输出值,即要与当前接收到的码字进行异或得到分支度量值的4bit数据。 译码时的步骤如下: ①在接收到输入的码字之后,根据状态作为地址从路径度量存储器1中取出当前状态在其中对应的