无线通信系统维特比译码的FPGA仿真验证
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
无线通信系统维特比译码的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设计项目。
MathWorks公司的Matlab软件,起源于矩阵计算,有“矩阵实验室”(Matrix Laboratory)之称,Matlab在科学计算、数据分析与可视化、系统建模与仿真、实时嵌入式系统开发与设计方面,得到了越来越广泛地应用。
2 维特比译码算法流程
2.1 (2,1,7)维特比译码
卷积编码是现代通信系统中最为常用的信道编码方式,他可以大大提高在加性高斯白噪声情况下的抗噪声能力,被广泛用于卫星通信和空间无线通信上。
维特比译码算法是一种根据最大似然译码原理在所有可能路径中求得与接收序列最为相似的一条路径,用大数判决进行卷积码译码的方法[1]。
本文实现的是一种全并行三级流水的radix-2蝶型加比选的维特比译码算法模块(针对约束长度K=7的1/2卷积码的软判决译码),他具有以下特点:
(1) 3 b量化软判决。
采用查表获得卷积编码值,根据文献[2]化简欧氏距离,来计算各个分支度量值(BM)。
(2) 全并行加比选(ACS)。
对于6个状态寄存器的64个状态的卷积编码,采用32组4分支蝶型ACS单元。
(3) 幸存路径(SM)截尾译码,译码深度60 b,该参数根据文献[1]设计。
(4) 大数判决器,判决门限为31。
图1 维特比译码框图
图1中的din0k[2:0],din1k[2:0]表示k时刻输入的两个3 b软量化的编码数据序列,分别表示由k-1时刻x0与x1状态转移到k时刻0x状态的两个分支度量值表示k时刻加比选单元获得的转移到0x状态的新路径度量值是k时刻0x状态幸存
路径值。
其他分支和状态类推。
2.2 维特比译码主要模块
将译码过程分为求分支度量、加比选、大数译码3种相对独立的操作,采用三级
流水线来实现。
分支度量模块,对每个状态的k时刻BM的计算,可以采用如下公式[2]:
其中not(x)表示对x按位取反。
每个ACS单元如图2所示。
图2 一个ACS单元
大数译码:幸存路径寄存器是一个60×64的移位寄存器。
由帧同步启动计数控制器,对输入时钟计数,一旦计数到60,启动大数判决器。
将移出的64 b各状态
译码值传递给大数判决器;大数判决器对数据进行判0或者判1输出,判据是:
输入的数大部分是0,输出0;输入的数大部分是1,输出1。
设计成一个计算“1”个数的累加器,以31为门限,累加结果大于31就输出1,否则输出0。
具体的
维特比译码算法参考文献[1,2]。
3 仿真流程
根据维特比译码算法设计的FPGA代码,编译生成顶层模块之后,提出一种便捷
的仿真设计方法,利用Matlab和Active HDL对(2,1,7)卷积编码的维特比软
判决译码模块进行仿真与验证。
其测试台(Testbench)仿真的激励信号,需要有两个3 b量化的输入码流,这两个码流必须符合卷积编码的规律才能送入维特比译码器进行仿真,任意随机输入序列是不能正确仿真的。
以下阐述如何得到所需的测试序列,以及如何判断维特比译码是否正确。
本文采用如下的方法:
(1) 编辑一个Matlab环境下的m文件生成满足要求的卷积编码测试序列,并且把原始的信息序列打印出来,作为FPGA代码运行结果的参考。
(2) 将Matlab生成的测试序列在Active HDL环境下,作为维特比译码模块仿真的输入测试序列的公式(formula),仿真一定时间后,将输出波形与Matlab打印出来的原始信息序列相比较,以验证仿真结果。
以下是本文需要的Matlab代码:
trel = poly2trellis(7,[171 133]);
%生成多项式
msg = randint(1,66);
% 随机序列作为原始信息
code = convenc(msg,trel);
%卷积编码
c0 = code(1:2:end);c1 = code(2:2:end);
len_d = length(c0);
c0_soft = zeros(1,len_d);c0_soft(find(c0 == 1)) = 7;
c1_soft = zeros(1,len_d);c1_soft(find(c1 == 1)) = 7;
in0 = dec2bin(c0_soft,3);
%3bit量化
din1 = dec2bin(c1_soft,3);
% 生成simulator语句
t0 = 200;clock = 100;
fprintf(′din0:′);
for m=1:len_d-1
fprintf(′%s %d ns,′,din0(m,:),t0 + clock*(m-1));
end
fprintf(′%s %d ns din1:′,din0(len_d),t0 + clock*(len_d-1));
for m=1:len_d-1
fprintf(′%s %d ns,′,din1(m,:),t0 + clock*(m-1));
end
fprintf(′%s %d ns′,din1(len_d),t0 + clock*(len_d-1));
disp(′正确译码序列:′)
disp(msg)
运行上述代码,在Matlab的命令窗口下,打印出两个3 b测试序列:
din0:
111 200 ns,000 300 ns,000 400 ns,000 500 ns,111 600 ns,……(后续序列省略) din1:
111 200 ns,111 300 ns,111 400 ns,000 500 ns,111 600 ns,……(后续序列省略) 同时打印出原始序列作为译码结果的参照:
Columns 1 through 24
1 1 0 0 0 1 0 0 1 1……(后续序列省略)
在Active HDL中建立一个含有维特比软判决译码器的design之后,对源代码进行编译,然后在Design Flow Manager的options中设置要进行仿真的top-
level unit(s),在Design Flow Manager中点击functional simulation,就可以生成一个waveform,在这个波形图上对每个输入信号配置“Stimulators”选项,设置时钟为100 ns,对于din0和din1,直接复制Matlab打印出来的测试序列
作为formula,如图3。
仿真一定时间,就可以得到仿真波形。
图3 配置输入信号Stimulators的formula
4 验证结果
图4是在Active HDL中得到的(2,1,7)卷积编码的维特比软判决译码仿真波形。
din0和din1是输入的3 b软量化的测试序列,dout0是输出的译码结果,和Matlab下卷积码的输入序列进行比较,从而判断FPGA算法仿真结果正确与否。
图4 维特比译码器仿真波形图
可以看出,在算法仿真下,维特比译码得到的译码序列和Matlab打印的原始信息序列一致。
多次运行上述matlab代码,生成随机的原始信息序列和两个输入测试序列,在Active HDL下多次进行仿真,可以进一步验证算法结果。
还可以在Matlab中进行编程,对测试序列引入一定干扰,使之在“000”,“111”的允
许范围内有一定的抖动,进行误码率测试仿真等。
完成了算法仿真之后,在此基础上进行代码的优化,再利用Active HDL与Matlab,或者其他工具,进行后仿真,编程下载,完成模块的最终实现。
5 结语
利用Active HDL在FPGA系统功能的设计和仿真上具有简单易用的特点,但是对于算法结构比较复杂的,需要严格的Testbench仿真序列的情况,仅仅使用手工
规定测试序列或者定义宏,都显得比较麻烦,本文提出利用Matlab进行测试向量的生成和验证,简化了仿真测试序列的手工输入,而且对验证结果正确性方面也有一定的借鉴。
同时Matlab在通信系统模块和滤波器设计等等方面具有丰富的工具箱,对于FPGA算法设计人员而言,如果能充分利用这些资源,对于提高代码质
量,加速设计进程,具有重要意义。
参考文献
[1] 刘鹏,陈咏恩.高速率维特比译码器FPGA设计中参数确定[J].半导体技
术,2003,28(2):44-46.
[2] 孙猛.VB高速译码算法及其FPGA实现[J].中国有线电视,2004(3):13-18.
[3] 刘虹.Active HDL 6.2使用技巧小谈[J].鹭江职业大学学报,2005,13(3):63-66.
[4] 程耀林.FPGA的系统设计方法解析[J].现代电子技术,2005,28(19):90-93.
[5] 张志涌.精通Matlab 6.5版[M].北京:北京航空航天大学出版社,2003.
[6] 张俊.卷积码维特比译码算法最佳反馈深度研究[J].现代电子技
术,2006,29(3):45-46,50.。