介绍
卷积码是一种信道纠错码,广泛应用于通信中。在发送端,卷积码按照生成多项式进行编码,在接收端,按照维特比译码算法进行译码,可以有效抵抗信道噪声的影响,在误码率门限下,可以纠正传输过程中的突发错误。
:编码和解码算法的基本原理
卷积码编码
卷积码是一种纠错码,将输入的K个信息比特编码成N个比特输出。特别适用于延时小的串行传输。卷积编码器的一般形式如下图所示。
下图显示了k=1时的编码框图,这也是最常用的编码器情况:
译码算法
卷积码的译码方法有两种:一种是大数逻辑译码,也叫门限译码;另一种是概率译码,分为维特比译码和序列译码。维特比译码和序列译码都是概率译码。当卷积码的约束长度不太大时,维特比译码器比序列译码简单、快速。下一步解码算法采用概率解码中的维特比解码。概率解码的一个基本思想是将接收序列与所有可能的传输序列进行比较,选择汉明码距离最小的一个作为传输序列。
以及编解码算法的Matlab实现。
根据上面提到的编码和解码的基本原理,我们可以在Matlab中做一个非常方便的仿真,它提供了集成的函数来调用和仿真,如下所示:
2、编码算法的FPGA实现
根据卷积码编码的基本原理,我们可以根据对应的生成多项式进行Verilog编码,可以方便地实现卷积码编码的FPGA实现:
顶层代码
模块约定(
//系统信号
输入时钟,
inputrst_n,
输入数据_输入,
outputreg [1:0] data_out
);
conv _ reg;
always @(posedge clk或negedge rst_n)开始
如果(!rst_n)开始
conv _ reg=7 d0;
结束
否则开始
conv _注册={数据_输入,conv _注册[6:1]};
结束
结束
always @(posedge clk或negedge rst_n)开始
如果(!rst_n)开始
data _ out=2 d0;
结束
否则开始
data _ out[1]=conv_reg[6]^conv_reg[5]^conv_reg[4]^conv_reg[3]^conv_reg[0];//o171
data _ out[0]=conv_reg[6]^conv_reg[4]^conv_reg[3]^conv_reg[1]^conv_reg[0];//o133
结束
结束
末端模块
试验码
`时间刻度为1ns/1ps;
模块TB();
寄存器时钟;
reg rst _ n;
reg data _ in
wire[1:0]data _ out;
寄存器位[255:0];
整数out _ file
整数I;
常规演示(。时钟(clk)。rst_n(rst_n)。数据输入(data_in)。数据输出(数据输出)
);
最初的
开始
clk=1 B1;
rst _ n=1 B1;
# 5 rst _ n=1 B0;
# 5 rst _ n=1 B1;
$ read member(f:/FPGA _ DSP/Viterbi/bits . txt 位);
out _ file=$ fopen(f:/FPGA _ DSP/Viterbi/result . txt 'w );//获取文件句柄
for(I=0;i=255开始吧
data _ in=bits[I];
#10;
$fwrite(out_file,% b % b ,data_out[1],data _ out[0]);
结束
结束
总是# 5 clk=~ clk
末端模块
模拟结果
3、维特比译码算法的FPGA实现
维特比算法数学原理复杂,从理解算法到实现需要做大量的工作。然而,赛灵思Vivado工具为我们提供了维特比解码器IP核,我们可以很容易地调用它来实现FPGA上的算法。
维特比译码器IP核的I/o数据格式
维特比译码器IP核的接口是基于AXI流协议的,AXI流协议的握手过程在上一篇文章中已经提到。如果你不I don’我不懂,请参考上一篇文章。下面主要介绍该IP的基本格式组成和输入输出数据:
输入数据:
当IP核接收输入数据时,它扮演从机的角色。输入数据的格式如下图所示,对应的编码率为2。如果编码率是N,则数据的位宽相应地是N*8。
当互联网协议(互联网协议)核配置为硬判决时,输入数据位宽为1,其余位用0补齐,当互联网协议(互联网协议)核配置为软判决时,输入数据位宽为3-5,其余位用0补齐,数据输入一对应高位,DATA_IN0对应低位。
输出数据:
互联网协议(互联网协议)核的译码输出数据总是一位,格式如下图所示。
最低位为译码数据,其他数据可以不做深入了解。
另外除了待译码数据的输入端口和译码数据输出端口外,该互联网协议(互联网协议)核还可以进行误码率(误码率)的计算,其余端口位误码率计算配置端口和结果输出端口,具体详情请参考官方手册pg027。
互联网协议(互联网协议)核生成流程
Vivado软件为我们提供了维特比(译码器)译码互联网协议(互联网协议)核,可以进行图形化配置然后进行调用和使用,配置参数要与编码过程中的相关参数严格对应,具体过程如下所示:
在图形化配置互联网协议(互联网协议)核完成后,我们提取相应的网表文件在Modelsim环境下进行了仿真,如何在Modelsim环境下仿真Vivado IP核我们在前面也有提及,如有不懂的也可翻阅前面的文章进行学习,相关测试程序如下。
`时间刻度为一纳秒/1皮秒
模块dec _ TB();
glbl glbl();
注册aclk
reg aresetn
reg[15:0]s _ axis _ data _ tdata;
寄存器s _ axis _ data _ tvalid
电线s _轴_数据_ tready
wire[7:0]m _ axis _ data _ tdata;
电线m _轴_数据_ t有效
注册m _轴_数据_趋势
reg[15:0]s _ axis _ dstat _ tdata;
reg s _ axis _ dstat _有效
电线s _ axis _ dstat _ tready
wire[15:0]m _ axis _ dstat _ tdata;
导线m _ axis _ dstat _ tvalid
注册m _ axis _ dstat _ tready
reg codeData[511:0];
reg[9:0]I;
reg[9:0]j;
整数out _ file
初始开始
aclk=1 b1
aresetn=1 b1
# 5 aresetn=1 b0
# 5 aresetn=1 b1
$ read成员(F:/FPGA _ DSP/Viterbi/codeData。txt ,codeData);
out _ file=$ fopen(f:/FPGA _ DSP/维特比/解码数据。txt ,'w );//获取文件句柄
结束
总是# 5 aclk=~ aclk
//送数据
总是@(posedge aclk或negedge aresetn)开始
如果(!aresetn)开始
s _ axis _ data _ tvalid=1 b0
s _ axis _ data _ tdata=16 d0
i=9 d0
j=9 d1
结束
否则if (s_axis_data_tready)开始
如果(i=9 d510)开始
s _ axis _ data _ tvalid=1 b1
s _ axis _ data _ tdata={ 7 d0,codeData[j],7 d0,codeData[I]};
I=I ^ 2;
j=J2;
结束
其他
s _ axis _ data _ tvalid=1 b0
结束
结束
//取数据
总是@(posedge aclk或negedge aresetn)开始
如果(!aresetn)开始
m _ axis _ data _ tready=1 b1
结束
否则if (m轴数据有效)开始
$fwrite(out_file,% b ,m _ axis _ data _ tdata[0]);
结束
结束
//-在此开始实例化模板的剪切-//INST _标签
维特比_0您的实例名(。aclk(aclk),//输入线aclk。aresetn(aresetn),//输入线阿雷塞特
//接收数据时为从设备。s _ axis _ data _ tdata(s _ axis _ data _ tdata),//输入线[15 : 0] s_axis_data_tdata。s _ axis _ data _ t valid(s _ axis _ data _ t有效),//输入线s _轴_数据_ t有效。s _ axis _ data _ tready(s _ axis _ data _ tready),//输出线s轴数据趋势
//发送数据时为主设备。m _轴_数据_数据(m _轴_数据_数据),//输出wire [7 : 0] m_axis_data_tdata。m _ axis _ data _ t valid(m _ axis _ data _ t有效),//输出线m _轴_数据_ t有效。m _ axis _ data _ tready(m _ axis _ data _ tready),//输入线m轴数据趋势
//BER测量。s _ axis _ dstat _ tdata(s _ axis _ dstat _ tdata),//输入线[15 : 0] s_axis_dstat_tdata。s _ axis _ dstat _ t valid(s _ axis _ dstat _ t valid),//输入线s _ axis _ dstat _ t有效。s _ axis _ dstat _ tready(s _ axis _ dstat _ tready),//输出导线s _ axis _ dstat _ tready。m _ axis _ dstat _ tdata(m _ axis _ dstat _ tdata),//输出wire [15 : 0] m_axis_dstat_tdata。m _ axis _ dstat _ t valid(m _ axis _ dstat _ t valid),//输出线m _ axis _ dstat _ t有效。m _ axis _ dstat _ tready(m _ axis _ dstat _ tready)//输入导线m _ axis _ dstat _ tready
);
末端模块
仿真波形:
原文标题:卷积码编码及维特比译码(维特比)算法的原理及其现场可编程门阵列(现场可编程Gata阵列的缩写)实现
文章出处:【微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。
审核汤梓红
标签:数据译码编码