OFDM802.11a的FPGA实现(五)卷积编码器的FPGA实现与验证(含verilog代码和matlab代码)

目录

  • 1.前言
  • 2.卷积编码
    • 2.1卷积编码基本概念
    • 2.2 802.11a卷积编码器
    • 2.3 卷积编码模块设计
    • 2.4 Matlab设计与ModelSim仿真验证

1.前言

  前面一节完成了扰码器的FPGA设计与Matlab验证,这节继续对卷积编码器进行实现和验证。

2.卷积编码

2.1卷积编码基本概念

  卷积码编码器实质上是一个有限状态的线性移位寄存器。这个移位寄存器由若干个寄存器单元组成,且寄存器单元按一定的规则连接到代数运算单元,将运算结果作为编码比特输出。
一个简单的卷积编码器的结构如下图所示:

卷积编码器

  R1, R2, R3, 是三个寄存器,输入数据进行过这个卷积编码器将在下方输出结果。
卷积编码的输出有如下关系:

  假设输入的数据是0110,那么经过卷积编码器之后的结果可以由如下表格给出:

InputR1R2R3Output
INIT000000
0000000
1100111
1110110
0011010

  如果将卷积编码的这个过程在一个图来表示可以按照如下的方式来标注:

卷积编码状态

  网格图中,具有相同状态的节点合并在一起;当输入比特为零时用实线表示,当输入比特为 1 时用虚线;支路上标注的码元为输出比特;最左侧为卷积编器的低两个寄存器的值。

  n:编码器每次输出的码元个数;

  k:编码器每次输入的信息码元个数,一般 k=1;

  N:约束长度,在 k=1 的情况下,表示编码器的输出与本次及之前输入的 N个码元相关;

  那么上图所示的卷积编码结构可以描述为(3,1,3);其编码效率为 k/N,则该卷机编码的效率为 1/3。

2.2 802.11a卷积编码器

  卷积编码使用的生成多项式是 g 0 = ( 133 ) 8 , g 1 = ( 171 ) 8 g0 = (133)_{8}, g1= (171)_{8} g0=(133)8g1=(171)8,码率为 1/2,其生成多项式用二进制表示为 g0 = 1011011,g1 = 1111001,该卷积码可以表示为(2,1,7),即每时钟周期输出两个比特数据,输入 1 个比特数据,约束长度为7。

802.11a中的卷积编码器

  每输入一bit的数据,将会依次输出A,B两bit的数据。

  输出数据A的生成多项式为:
S A ( x ) = x 6 + x 5 + x 3 + x 2 + 1 S_A(x)=x^6+x^5+x^3+x^2+1 SA(x)=x6+x5+x3+x2+1
  输出数据B的生成多项式为:
S B ( x ) = x 6 + x 3 + x 2 + x 1 + 1 S_B(x)=x^6+x^3+x^2+x^1+1 SB(x)=x6+x3+x2+x1+1
  因此,可以使用6个移位寄存器实现卷积编码。每输入1比特数据,将会依次输出数据A和B,输出的数据变为2比特,实现了1/2码率的卷积编码。

2.3 卷积编码模块设计

  在了解了802.11a的卷积编码的原理之后,就可以着手来进行卷积编码器模块的设计了。

tx_conv_module

  将输入输出以总线的方式聚合在一起,方便在Block Design里面连接。此处具体怎么操作,等实现完发射机部分再来讲解,先挖个坑。
axi_tx_conv_module

  该模块的输入是由上一级模块经过加扰之后的输出bit。在这个模块当中经过卷积编码,最终输出2bit的卷积编码数据。数据传输仍然使用前面提到的vaild-ready握手机制。首先将输入的bit移入到移位寄存器当中,根据生成多项式计算输出,之后对移位寄存器进行移位,不断重复上述操作。

assign	conv_dout_rdy = conv_din_rdy			;	
assign	conv_en =  conv_dout_rdy & conv_din_vld	;always@(posedge clk or negedge rst_n ) beginif(!rst_n) beginshift_reg <= 0;conv_dout <= 0;conv_dout_vld  <= 0; end  else if( conv_en ) beginconv_dout[0] <= shift_reg[5] + shift_reg[4] + shift_reg[2] + shift_reg[1] + conv_din; conv_dout[1] <= shift_reg[5] + shift_reg[2] + shift_reg[1] + shift_reg[0] + conv_din; conv_dout_vld  <= 1;shift_reg <= {shift_reg[4:0],conv_din}; //移位寄存器  endelse begin  conv_dout_vld  <= 0; endend

2.4 Matlab设计与ModelSim仿真验证

  Matlab有现成的函数可以实现卷积编码,代码如下:

%% 卷积编码
conv_in = scram_out0;    
L = 7;          %卷积编码约束长度
trellis = poly2trellis(L,[133,171]);
conv_out0 = convenc(conv_in,trellis);

  测试数据按照前面文章的方法生成,如下:

test_data =列 1 至 251     1     0     1     1     1     1     1     0     0     1     1     1     1     1     1     1     1     0     0     0     1     1     1     1列 26 至 500     0     0     0     0     0     0     1     0     0     0     0     1     1     0     0     0     1     0     1     1     0     0     1     0列 51 至 751     1     0     1     1     0     1     1     1     0     0     0     1     0     0     0     0     0     0     1     0     0     1     0     1列 76 至 1001     0     0     1     1     0     1     1     0     1     1     1     1     0     1     1     1     1     0     1     1     1     0     0     1列 101 至 1250     1     0     1     0     0     0     0     0     1     1     1     0     1     1     1     0     0     0     0     0     0     1     1     1列 126 至 1441     1     1     1     1     0     0     0     1     0     0     1     1     1     0     1     1     1     1

  卷积编码后的输出如下:
conv_out0 =

  列 1 至 251     1     0     1     0     0     0     1     1     0     1     0     1     1     0     0     1     1     1     1     0     0     1     1     1列 26 至 500     1     1     1     0     0     0     1     1     0     0     0     0     1     1     0     0     0     1     1     1     0     0     1     1列 51 至 751     0     0     0     1     0     1     1     1     0     1     1     0     1     1     0     0     0     1     1     0     0     1     0     0列 76 至 1000     0     0     0     0     1     1     1     0     1     1     0     0     0     1     0     1     1     0     0     1     0     0     0     1列 101 至 1250     1     1     1     0     1     1     1     0     1     1     0     1     1     0     0     0     1     0     1     0     0     0     0     1列 126 至 1500     0     0     0     1     0     0     0     1     0     1     1     1     0     0     0     0     0     1     1     1     1     1     0     0列 151 至 1750     0     1     0     0     1     1     1     0     1     0     1     0     1     1     1     0     1     1     1     1     1     0     0     0列 176 至 2000     1     0     1     0     1     0     1     0     1     0     1     0     0     0     1     0     1     0     1     0     0     0     0     1列 201 至 2251     0     1     0     0     0     0     1     0     0     0     0     1     1     0     0     0     1     0     1     0     1     1     0     1列 226 至 2500     0     0     1     1     0     0     1     0     1     1     1     0     1     0     0     0     1     1     0     0     1     1     0     0列 251 至 2750     1     1     0     0     0     1     0     1     1     0     1     0     0     0     0     1     0     0     1     0     0     1     0     1列 276 至 2881     1     1     0     0     0     1     1     1     0     0     1     1

  按照如下连接进行仿真:
仿真截图如下:


  FPGA仿真时卷积编码的输出如下:

FPGA_conv_dout =列 1 至 251     1     0     1     0     0     0     1     1     0     1     0     1     1     0     0     1     1     1     1     0     0     1     1     1列 26 至 500     1     1     1     0     0     0     1     1     0     0     0     0     1     1     0     0     0     1     1     1     0     0     1     1列 51 至 751     0     0     0     1     0     1     1     1     0     1     1     0     1     1     0     0     0     1     1     0     0     1     0     0列 76 至 1000     0     0     0     0     1     1     1     0     1     1     0     0     0     1     0     1     1     0     0     1     0     0     0     1列 101 至 1250     1     1     1     0     1     1     1     0     1     1     0     1     1     0     0     0     1     0     1     0     0     0     0     1列 126 至 1500     0     0     0     1     0     0     0     1     0     1     1     1     0     0     0     0     0     1     1     1     1     1     0     0列 151 至 1750     0     1     0     0     1     1     1     0     1     0     1     0     1     1     1     0     1     1     1     1     1     0     0     0列 176 至 2000     1     0     1     0     1     0     1     0     1     0     1     0     0     0     1     0     1     0     1     0     0     0     0     1列 201 至 2251     0     1     0     0     0     0     1     0     0     0     0     1     1     0     0     0     1     0     1     0     1     1     0     1列 226 至 2500     0     0     1     1     0     0     1     0     1     1     1     0     1     0     0     0     1     1     0     0     1     1     0     0列 251 至 2750     1     1     0     0     0     1     0     1     1     0     1     0     0     0     0     1     0     0     1     0     0     1     0     1列 276 至 2881     1     1     0     0     0     1     1     1     0     0     1     1

  为了验证是否和Matlab结果一致,直接写代码进行比较:

clc;
%%串并转换
test_data = load('D:/FPGA/OFDM_802.11a_my/TX/matlab/test_data.txt')';
display(test_data);
FPGA_S2P2S = load('D:/FPGA/OFDM_802.11a_my/TX/matlab/u2_data_out.txt')';
display(FPGA_S2P2S);
check_S2P = test_data == FPGA_S2P2S; 
display(check_S2P);
%%扰码
FPGA_scram_dout = load('D:/FPGA/OFDM_802.11a_my/TX/matlab/scram_data_out.txt')';
display(scram_out0);
display(FPGA_scram_dout);
check_scram = FPGA_scram_dout == scram_out0;
display(check_scram);
%%卷积编码
FPGA_conv_dout = load('D:/FPGA/OFDM_802.11a_my/TX/matlab/conv_data_out.txt')';
display(conv_out0);
display(FPGA_conv_dout);
check_conv = FPGA_conv_dout == conv_out0;
display(check_conv);

  check_conv输出全为1,表示Matlab结果和ModelSim仿真结果一致。

check_conv =1×288 logical 数组列 1 至 371   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1列 38 至 741   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1列 75 至 1111   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1列 112 至 1481   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1列 149 至 1851   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1列 186 至 2221   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1列 223 至 2591   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1列 260 至 2881   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1

如果结果不对,可以先去检查前几步的输出是否正确,然后再去MoselSim中去抓信号DeBug。
原文连接(相关文章合集):OFDM 802.11a的xilinx FPGA实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/316606.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32学习和实践笔记(22):PWM的介绍以及在STM32中的实现原理

PWM是 Pulse Width Modulation 的缩写&#xff0c;中文意思就是脉冲宽度调制&#xff0c;简称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术&#xff0c;其控制简单、灵活和动态响应好等优点而成为电力电子技术最广泛应用的控制方式&#xff…

E-MapReduce极客挑战赛季军方案

前一段时间我参加了E-MapReduce极客挑战赛&#xff0c;很幸运的获得了季军。在这把我的比赛攻略给大家分享一下&#xff0c;希望可以抛砖引玉。 赛题分析与理解 赛题背景&#xff1a; 大数据时代&#xff0c;上云已成为越来越多终端客户大数据方案的落地选择&#xff0c;阿里…

Kimichat使用技巧:方便又实用的kimi+智能体

今天kimi智能助手推出了kimi的功能。简单的说&#xff0c;就是一系列kimi已经写好的提示词&#xff0c;用户可以直接调用、对话。 Kimi分为官方推荐、办公提效、辅助写作、社交娱乐、生活实用这几类。可以从左边侧边栏点击进入。 官方推荐的有&#xff1a; Kimi 001号小客服&…

第十五届蓝桥杯省赛第二场C/C++B组C题【传送阵】题解(AC)

解题思路 由于 a a a 数组是一个 1 1 1 到 n n n 的一个排列&#xff0c;那么形成的一定是如下形式&#xff1a; 一定会构成几个点的循环&#xff0c;或者是几个单独的点。 从任意点开始&#xff0c;如果能进入一个循环&#xff0c;一定可以将整个循环的宝藏都拿走&#x…

【C++】类和对象⑤(static成员 | 友元 | 内部类 | 匿名对象)

&#x1f525;个人主页&#xff1a;Forcible Bug Maker &#x1f525;专栏&#xff1a;C 目录 前言 static静态成员 友元 友元函数 友元类 内部类 匿名对象 结语 前言 本篇主要内容&#xff1a;类和对象的一些知识点补充&#xff0c;包括static静态成员&#xff0c;友…

ITMS-90426: Invalid Swift Support

原文 Please correct the following issues and upload a new binary to App Store Connect. ITMS-90426: Invalid Swift Support - The SwiftSupport folder is missing. Rebuild your app using the current public (GM) version of Xcode and resubmit it. 解决方式 ITMS-…

Linux系统安全及应用(1)

目录 一.账号安全控制 系统账号清理 二.密码安全控制 密码安全控制 三.命令历史限制 命令历史限制 四.限制su切换用户 1&#xff09;将信任的用户加入到wheel组中 2&#xff09;修改su的PAM认证配置文件 ​编辑五.PAM认证的构成 六.使用sudo机制提升权限…

WebSocket的原理、作用、API、常见注解和生命周期的简单介绍,附带SpringBoot示例

文章目录 原理作用客户端 API服务端 API生命周期常见注解SpringBoot示例 WebSocket是一种 通信协议 &#xff0c;它在 客户端和服务器之间建立了一个双向通信的网络连接 。WebSocket是一种基于TCP连接上进行 全双工通信 的 协议 。 WebSocket允许客户端和服务器在 单个TCP连接上…

开放式耳机哪个牌子好?五大爆款机型大盘点

开放式耳机采用挂耳设计&#xff0c;体积小巧&#xff0c;携带方便&#xff0c;并且更加通风透气&#xff0c;避免了耳朵过热和出汗导致的问题&#xff1b;更轻的重量能有效减少长期佩戴对耳朵带来的压力&#xff0c;佩戴时舒适度直接爆表&#xff0c;在跑步、爬山、打球等户外…

奇安信天擎 卸载

说明 之前按单位要求安装了奇安信软件&#xff0c;感觉和360一样流氓&#xff0c;最近由于一些原因&#xff0c;可以将之安装的安全软件卸载&#xff0c;今天抽时间研究了一下卸载奇安信的方法。 卸载步骤 1、使用everything搜索EntBase.dat配置文件&#xff0c;这个配置文件…

智慧能源数据监控平台

随着科技的飞速发展&#xff0c;能源管理已逐渐从传统的粗放型向精细化、智能化转变。在这个转型过程中&#xff0c;HiWoo Cloud平台的智慧能源数据监控平台以其独特的技术优势和创新理念&#xff0c;正引领着能源管理的新潮流。 一、智慧能源数据监控平台的概念 智慧能源数据…

【酱浦菌-模拟仿真】python模拟仿真PN结伏安特性

PN结的伏安特性 PN结的伏安特性描述了PN结在外部电压作用下的电流-电压行为。这种特性通常包括正向偏置和反向偏置两种情况。 正向偏置 当外部电压的正极接到PN结的P型材料&#xff0c;负极接到N型材料时&#xff0c;称为正向偏置。在这种情况下&#xff0c;外加的正向电压会…

在离线环境中将 CentOS 7.5 原地升级并迁移至 RHEL 7.9

《OpenShift / RHEL / DevSecOps 汇总目录》 说明 本文将说明如何在离线环境中将 CentOS 7.5 升级并迁移至 RHEL 7.9。为了简化准备过程&#xff0c;本文前面将在在线环境中安装用到的各种所需验证软件&#xff0c;而在后面升级迁移的时候再切换到由 ISO 构成的离线 Yum Repo…

Nacos 安全零信任实践

作者&#xff1a;柳遵飞 Nacos 作为配置中心经常存储一些敏感信息&#xff0c;但是由于误用导致安全风险&#xff0c;最常见的主要是以下两个问题&#xff1a; 1&#xff09;Nacos 暴露公网可以吗&#xff1f;不可以&#xff0c;因为 Nacos 定位是注册配置中心&#xff0c;是…

JVM垃圾收集器--分区收集器

G1收集器 属性 G1&#xff08;Garbage-First Garbage Collector&#xff09;在 JDK 1.7 时引入&#xff0c;在 JDK 9 时取代 CMS 成为了默认的垃圾收集器。G1 有五个属性&#xff1a;分代、增量、并行、标记整理、STW。 分代 G1收集器 将内部分为多个大小相等的区域&#x…

【Redis 开发】Redis分片集群

分片集群 分片集群搭建分片集群 散列插槽集群伸缩故障转移RedisTemplate访问分片集群 分片集群 在我们使用哨兵进行高并发读的问题&#xff0c;但是还有海量数据存储,高并发写的问题,使用分片集群可以解决&#xff1a; 特征&#xff1a; 集群中有多个master&#xff0c;每个m…

国内各种免费AI聊天机器人(ChatGPT)推荐(上)

作者主页&#xff1a;点击&#xff01; 国内免费AI推荐专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年4月27日11点25分 欢迎来到AI聊天机器人推荐系列的第一篇文章&#xff01; 在这个系列中&#xff0c;我将引领您探索国内各种AI聊天机器人的精彩世界。 从…

更易使用,OceanBase开发者工具 ODC 4.2.4 版本升级

亲爱的朋友们&#xff0c;大家好&#xff01;我们的ODC&#xff08;OceanBase Developer Center &#xff09;再次迎来了重要的升级V 4.2.4&#xff0c;这次我们诚意满满&#xff0c;从五个方面为大家精心打造了一个更加易用、贴心&#xff0c;且功能更强的新版本&#xff0c;相…

mySQL商城项目实战 (终)(全部表)(1-88张)

本章无sql语句&#xff0c;直接放转出的sql文件。 88张表结果如图! 资源在已经与文章绑定&#xff0c; 在navicat工具中&#xff0c;执行以下步骤 在新建的数据库中右键,点击【运行sql文件】&#xff0c;运行绑定的资源&#xff0c;之后您就可以在您的navicat中看到我建好的8…

2024 java easyexcel poi word模板填充数据,多个word合成一个word

先看效果 一、准备工作 1.word模版 2.文件路径 二、pom依赖 <!-- easyexcel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.7</version></dependency><depe…