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 ) begin
        if(!rst_n) begin
            shift_reg <= 0;
            conv_dout <= 0;
            conv_dout_vld  <= 0; 
        end  
        else if( conv_en ) begin
            conv_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}; //移位寄存器  
        end
        else begin  
            conv_dout_vld  <= 0; 
        end
    end

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 至 25

     1     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 至 50

     0     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 至 75

     1     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 至 100

     1     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 至 125

     0     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 至 144

     1     1     1     1     1     0     0     0     1     0     0     1     1     1     0     1     1     1     1

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

  列 1 至 25

     1     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 至 50

     0     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 至 75

     1     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 至 100

     0     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 至 125

     0     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 至 150

     0     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 至 175

     0     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 至 200

     0     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 至 225

     1     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 至 250

     0     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 至 275

     0     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 至 288

     1     1     1     0     0     0     1     1     1     0     0     1     1

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


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

FPGA_conv_dout =

  列 1 至 25

     1     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 至 50

     0     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 至 75

     1     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 至 100

     0     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 至 125

     0     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 至 150

     0     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 至 175

     0     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 至 200

     0     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 至 225

     1     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 至 250

     0     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 至 275

     0     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 至 288

     1     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 至 37

   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   1

  列 38 至 74

   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   1

  列 75 至 111

   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   1

  列 112 至 148

   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   1

  列 149 至 185

   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   1

  列 186 至 222

   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   1

  列 223 至 259

   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   1

  列 260 至 288

   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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Aiseesoft Data Recovery for Mac:专业数据恢复软件

Aiseesoft Data Recovery for Mac是一款高效且专业的数据恢复软件&#xff0c;专为Mac用户量身打造。 Aiseesoft Data Recovery for Mac v1.8.22激活版下载 无论是由于误删、格式化还是系统崩溃等原因导致的数据丢失&#xff0c;Aiseesoft都能帮助您快速找回。 它采用先进的扫描…

Windows下Git安装

目录 一、下载二、安装三、查看 Git 安装路径 一、下载 下载链接&#xff1a;https://git-scm.com/ 二、安装 双击安装包&#xff0c;按提示一步步进行操作&#xff1a; 三、查看 Git 安装路径 where git D:\Program Files\Git\cmd\git.exe

什么是DDoS攻击?怎么防御DDoS攻击?

在网络安全领域&#xff0c;DDoS攻击一直是热门话题&#xff0c;随着网络技术的不断发展和网络环境的复杂化演变&#xff0c;DDoS攻击变得愈加频繁、更具破坏性。根据2023年网络安全态势研判分析年度综合报告&#xff0c;全年全网网络层的DDoS攻击次数达2.51亿次&#xff01;本…

卷积通用模型的剪枝、蒸馏---蒸馏篇--KD蒸馏(以deeplabv3+为例)

上篇文章介绍了剪枝篇,本文以上篇的剪枝模型为学生模型,以剪枝之前的模型为教师模型,进行KD逻辑蒸馏,之后会尝试特征蒸馏和关系蒸馏等。 一、KD逻辑蒸馏 1.1 大致过程 逻辑蒸馏,是基于分类问题设计的,因此非常适用于语义分割。模型最后会有一个softmax层,其输出值对应了…

React正式更新!开始学习React 19!

本文为原创文章&#xff0c;原文链接&#xff1a;J实验室&#xff0c;未经授权请勿转载 今年2月份&#xff0c;React 发布消息确认今年发布 v19 版本&#xff0c;尘封两年的版本号终于要更新了&#xff08;详情点击&#xff1a;React 19 发布在即&#xff0c;抢先学习一下新特性…

x2600君正 ubi文件系统的编译和烧录

使用平台&#xff1a;君正x2600 ubi文件系统使用问题 1.ubi文件和ubifs文件 2 方法&#xff1a;mkfs.ubifs和ubinize两步打包ubi文件系统 mkfs.ubifs工具 mkfs.ubifs命令用于制作ubifs文件系统&#xff0c;命令示例如下&#xff1a; mkfs.ubifs -x lzo -m 2KiB -e 124KiB -c 3…

FSNotes for Mac v6.7.1中文激活版:强大的笔记管理工具

FSNotes for Mac是一款功能强大的文本处理与笔记管理工具&#xff0c;为Mac用户提供了一个直观、高效的笔记记录和整理平台。 FSNotes for Mac v6.7.1中文激活版下载 FSNotes支持Markdown语法&#xff0c;使用户能够轻松设置笔记格式并添加链接、图像等元素&#xff0c;实现笔记…

【软考高项】第十二章 项目质量管理

目录 12.1管理基础 12.1.1质量与项目质量 12.1.2质量管理 12.1.3质量管理标准体系 12.1.4管理新实践 12.2项目质量管理过程 12.2.1过程概述 12.2.2裁剪考虑因素 12.2.3敏捷与适应方法 12.3规划质量管理 12.3.1输入 12.3.2工具与技术 12.3.3输出 12.4管理质量 12…

最小K个数(力扣面试题17.14)

本文采用的是大堆排序求最小的K个值。需要有堆的数据结构基础哦。 代码展示&#xff1a; /*** Note: The returned array must be malloced, assume caller calls free().*/ void AdjustDown(int* parr,int n,int root)//向下调整 {int parentroot;int child parent*21;while…

opencv_23_高斯模糊

void ColorInvert::gaussian_blur(Mat& image) { Mat dst; GaussianBlur(image, dst, Size(0, 0), 15); // Size(2, 2), imshow("图像模糊2", dst); }

代码随想录算法训练营DAY42|C++动态规划Part4|0-1背包理论基础(一)、0-1背包理论基础之滚动数组(二)、416.分割等和子集

文章目录 0-1背包理论基础(一)前置知识01背包动态规划&#xff1a;01背包二维dp数组 CPP代码再论01背包的遍历顺序 0-1背包理论基础(二)一维dp数组如何初始化一维dp数组遍历顺序举例推导dp数组CPP代码 416.分割等和子集思路将题目抽象成0-1背包问题 CPP代码 0-1背包理论基础(一…

2013NOIP普及组真题 4. 车站分级

线上OJ&#xff1a; 一本通&#xff1a;http://ybt.ssoier.cn:8088/problem_show.php?pid1964 核心思想&#xff1a; 1、原文中提到 “如果这趟车次停靠了火车站 x&#xff0c;则始发站、终点站之间所有级别大于等于火车站 x 的都必须停靠”&#xff0c;如果设停靠站为A&…

ansible-playbook离线升级centos内核

目录 概述实践ansible目录结构关键代码执行效果 结束 概述 内核离线包官网下载地址如下&#xff1a; 地址 实践 ansible目录结构 如对 ansible 不熟悉&#xff0c;离线包下载有问题&#xff0c;请至此地址下载&#xff0c;按本文操作可直接使用。 相关文章链接如下 文章地…

如何在iPhone上恢复出厂设置后恢复数据

你不想让这种情况发生&#xff0c;但它确实发生了。您必须将iPhone恢复出厂设置。当您的 iPhone 上出现软件问题且无法修复时&#xff0c;可能会发生这种情况。相反&#xff0c;在更新期间&#xff0c;或者您的iPhone遇到问题时&#xff0c;iPhone上的数据不再存在。 不过不用…

goget配置多个golang 运行环境

一台主机安装多个golang 运行环境 本环境 windows10 为 基础 mac linux也可以按照此方法操作 背景 开发不同的运维工具会用到不同版本的golang&#xff0c;但是开发者不能一直进行重装来处理 &#xff0c;因此 需要一个工具进行golang版本的管理 go管理工具介绍 gvm (Go V…

android webview检测屏幕

1&#xff09;清单文件配置&#xff1a; 配置权限&#xff1a; <uses-permission android:name"android.permission.INTERNET" /> 注册activity&#xff1a; <activityandroid:name".TouchWebViewActivity"android:exported"true"&…

基于随机森林和Xgboost对肥胖风险的多类别预测

基于随机森林和Xgboost对肥胖风险的多类别预测 作者&#xff1a;i阿极 作者简介&#xff1a;数据分析领域优质创作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x1f44d;收藏…

学习【Mysql运维篇】这一篇就够了

运维篇 1. 日志1-1. 错误日志1-2. 二进制日志1-3. 查询日志1-4. 慢查询日志 2. 主从复制2-1. 概述2-2. 原理2-3. 搭建 3. 分库分表3-1. 介绍3-2. Mycat概述3-3. Mycat入门3-4. Mycat配置3-5. Mycat分片3-6. Mycat管理及监控 4. 读写分类 1. 日志 1-1. 错误日志 错误日志是MyS…

计算机服务器中了mkp勒索病毒怎么办,mkp勒索病毒解密数据恢复流程

网络技术的不断应用与发展&#xff0c;为企业的生产运营带来了极大便利&#xff0c;越来越多的企业依赖网络开展各项工作业务&#xff0c;网络也大大提升了企业的生产运营效率&#xff0c;但网络是一把双刃剑&#xff0c;在为企业提供便利的同时&#xff0c;也为企业的数据安全…

云里物里家电运输新模式:实时定位、智能监控、降本增效

随着电商行业的飞速发展&#xff0c;大家电作为大宗商品&#xff0c;其物流运输过程中面临的痛点日益凸显。如何确保大家电在运输过程中的安全、及时送达以及成本控制&#xff0c;成为了物流企业亟待解决的问题。云里物里自研的物流资产监控管理方案&#xff0c;有效解决了大家…