通过状态机方法实现基于FPGA的维特比译码器,包含testbench测试文件

简介: 通过状态机方法实现基于FPGA的维特比译码器,包含testbench测试文件

1.算法仿真效果
vivado2019.2仿真结果如下:
1.png

2.算法涉及理论知识概要
viterbi译码算法是一种卷积码的解码算法。优点不说了。缺点就是随着约束长度的增加算法的复杂度增加很快。约束长度N为7时要比较的路径就有64条,为8时路径变为128条。 (2<<(N-1))。所以viterbi译码一般应用在约束长度小于10的场合中。
先说编码(举例约束长度为7):编码器7个延迟器的状态(0,1)组成了整个编码器的64个状态。每个状态在编码器输入0或1时,会跳转到另一个之中。比如110100输入1时,变成101001(其实就是移位寄存器)。并且输出也是随之而改变的。
这样解码的过程就是逆过程。算法规定t时刻收到的数据都要进行64次比较,就是64个状态每条路有两条分支(因为输入0或1),同时,跳传到不同的两个状态中去,将两条相应的输出和实际接收到的输出比较,量度值大的抛弃(也就是比较结果相差大的),留下来的就叫做幸存路径,将幸存路径加上上一时刻幸存路径的量度然后保存,这样64条幸存路径就增加了一步。在译码结束的时候,从64条幸存路径中选出一条量度最小的,反推出这条幸存路径(叫做回溯),得出相应的译码输出。

   卷积码是把k个信息比特的序列编成n个比特的码组,每个码组的n-k个校验位与本码组的k个信息位有关,而与其他码组无关。为了达到一定的纠错能力和编码效率,分组码的长度一般都比较大。编译码时必须把整个信息码组存储起来,由此产生的译码延时随n的增加而增加。

  卷积码是一个有限记忆系统,它也将信息序列分割成长度k的一个个分组,然后将k个信息比特编成n个比特,但k和n通常很小,特别适合以串行形式进行传输,时延小。与分组码不同的是在某一分组编码时,不仅参看本时刻的分组而且参看以前的N-1个分组,编码过程中互相关联的码元个数为nN。N称为约束长度。常把卷积码写成(n,k,N-1)卷积码。正因为卷积码在编码过程中,充分利用了各级之间的相关性,无论是从理论上还是实际上均已证明其性能要优于分组码。

    本次设计以(2,1,2)卷积码为例。图2-1为这种卷积编码器的结构,它的编码方法是:序列依次移入一个两级移位寄存器,编码器每输入一位信息b,输出端的开关就在c和c之间来回切换一次,输出为c和c,其中

c=b+b+b

c=b+b
4ab183b1d43e341b0028846b850733a2_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

设寄存器m、m的起始状态为全零,则编码器的输入输出时序关系可用图2-2表示。
69e02b8ec885f0514c01ed47db9c9ee5_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

要使最后1 位输入同样影响3对输出,并且使编码器回到全零状态,还需使编码器多输出2对信息,为了做到这一点,需要增加2个时钟循环,并且在此期间保持输入为0,这一过程叫做“点亮”编码器。如果不执行“点亮”操作,最后2位输入信息的纠错能力就会下降。

    因为卷积码的编码器的记忆性是有限的,所以可以使用状态转移图来表示其转移过程。在状态转移图中,卷积编码器的每一个状态对应于一个椭圆,状态的转移用两个椭圆间的有向线段表示,在线上标出状态转移的输入和对应的输出。

3.Verilog核心程序
````timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2023/04/16 22:37:19
// Design Name:
// Module Name: TEST
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
module TEST();

reg i_clk;
reg i_dat;
wire o_dat_encode;
wire o_dat_decode;

tops tops_U(
.i_clk (i_clk),
.i_dat (i_dat),
.o_dat_encode (o_dat_encode),
.o_dat_decode (o_dat_decode)
);

initial
begin
i_clk=1'b1;
end
always #5 i_clk=~i_clk;
initial
begin
i_dat=1'b0;

1020

{i_dat} =1'b0;

20

{i_dat} =1'b1;

20

{i_dat} =1'b0;

20

{i_dat} =1'b1;

20

{i_dat} =1'b1;

20

{i_dat} =1'b1;

20

{i_dat} =1'b0;

20

{i_dat} =1'b0;

20

{i_dat} =1'b1;

20

{i_dat} =1'b0;

20

{i_dat} =1'b1;

20

{i_dat} =1'b1;

20

{i_dat} =1'b0;

20

{i_dat} =1'b1;

20

{i_dat} =1'b1;

20

{i_dat} =1'b0;

20

{i_dat} =1'b1;

20

{i_dat} =1'b0;

20

{i_dat} =1'b0;

20

{i_dat} =1'b0;

20

{i_dat} =1'b1;

20

{i_dat} =1'b0;

20

{i_dat} =1'b1;

20

{i_dat} =1'b1;

20

{i_dat} =1'b1;

20

{i_dat} =1'b0;

20

{i_dat} =1'b0;

20

{i_dat} =1'b1;

20

{i_dat} =1'b1;

20

{i_dat} =1'b1;

20

{i_dat} =1'b1;

20

{i_dat} =1'b1;

20

{i_dat} =1'b1;

20

{i_dat} =1'b1;

20

{i_dat} =1'b0;

20

{i_dat} =1'b1;

20

{i_dat} =1'b0;

20

{i_dat} =1'b0;

20

{i_dat} =1'b0;

200

$stop();
end
endmodule
```

相关文章
|
12月前
|
测试技术 开发者 Python
Python单元测试入门:3个核心断言方法,帮你快速定位代码bug
本文介绍Python单元测试基础,详解`unittest`框架中的三大核心断言方法:`assertEqual`验证值相等,`assertTrue`和`assertFalse`判断条件真假。通过实例演示其用法,帮助开发者自动化检测代码逻辑,提升测试效率与可靠性。
667 1
|
12月前
|
机器学习/深度学习 人工智能 自然语言处理
如何让AI更“聪明”?VLM模型的优化策略与测试方法全解析​
本文系统解析视觉语言模型(VLM)的核心机制、推理优化、评测方法与挑战。涵盖多模态对齐、KV Cache优化、性能测试及主流基准,助你全面掌握VLM技术前沿。建议点赞收藏,深入学习。
3468 8
|
12月前
|
Java 测试技术 数据安全/隐私保护
通过yaml文件配置自动化测试程序
通过yaml文件可以将自动化测试环境,测试数据和测试行为分开,请看一下案例
445 4
|
算法 数据安全/隐私保护 计算机视觉
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。
|
编解码 缓存 Prometheus
「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
本期内容为「ximagine」频道《显示器测试流程》的规范及标准,我们主要使用Calman、DisplayCAL、i1Profiler等软件及CA410、Spyder X、i1Pro 2等设备,是我们目前制作内容数据的重要来源,我们深知所做的仍是比较表面的活儿,和工程师、科研人员相比有着不小的差距,测试并不复杂,但是相当繁琐,收集整理测试无不花费大量时间精力,内容不完善或者有错误的地方,希望大佬指出我们好改进!
1504 16
「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
|
人工智能 自然语言处理 测试技术
AxBench:斯坦福大学推出评估语言模型控制方法的基准测试框架
AxBench 是由斯坦福大学推出,用于评估语言模型可解释性方法的基准测试框架,支持概念检测和模型转向任务,帮助研究者系统地比较不同控制技术的有效性。
542 5
AxBench:斯坦福大学推出评估语言模型控制方法的基准测试框架
|
测试技术
软考软件评测师——可靠性测试测试方法
软件可靠性是指软件在规定条件和时间内完成预定功能的能力,受运行环境、软件规模、内部结构、开发方法及可靠性投入等因素影响。失效概率指软件运行中出现失效的可能性,可靠度为不发生失效的概率,平均无失效时间(MTTF)体现软件可靠程度。案例分析显示,嵌入式软件需满足高可靠性要求,如机载软件的可靠度需达99.99%以上,通过定量指标评估其是否达标。
|
消息中间件 缓存 监控
性能测试怎么做?方法、流程与核心要点解析
本文系统阐述了性能测试的核心方法论、实施流程、问题定位优化及报告编写规范。涵盖五大测试类型(负载验证、极限压力、基准比对、持续稳定性、弹性扩展)与七项关键指标,详解各阶段任务如需求分析、场景设计和环境搭建,并提供常见瓶颈识别与优化实战案例。最后规范测试报告内容框架与数据可视化建议,为企业级实践提出建立基线库、自动化回归和全链路压测体系等建议,助力高效开展性能测试工作。

热门文章

最新文章