OFDM 802.11a的FPGA实现(十六)长训练序列:LTS(含Matlab和verilog代码)

目录

  • 1.前言
  • 2.原理
  • 3.Matlab生成长训练序列
  • 4.硬件实现
  • 5.ModelSim仿真
  • 6.和Matlab仿真结果对比

原文链接(相关文章合集): OFDM 802.11a的xilinx FPGA实现

1.前言

  在之前已经完成了data域数据的处理,在构建整个802.11a OFDM数据帧的时候,还剩下前导码和signal域的数据帧,这两部分的内容。 PLCP的前导部分由一组重复10次的短训练序列和一组加了一个长型保护间隔与重复2次的有效OFDM符号组成的长训练序列组成。上一节实现了短训练序列,这一节实现长训练序列。

PPDU帧结构

PPDU帧结构

2.原理

从时域的帧结构来看,在短训练序列之后是长训练序列,其长度为8us,其中包括两个有效()FDM符号的长度(每个3.2us)和一个长型保护间隔的长度(1.6us)。长训练序列主要用于精确的频率偏差估计和信道估计。从频域来看,长训练序列符号与正常的OFDM符号一样由53(包括直流处一个取“0”值的空符号)个子载波组成,分别占据从一26~26的子信道。长训练的作用之一是在频率进行信道均衡。为了简化接收端的信道估计运算,传输的数据是BPSK调制的,即

长训练序列

在实际使用过程当中,由与短训练序列和长训练序列是固定的,因此可以先使用matlab,python等工具先将短训练序列和长训练序列生成出来,然后将序列存储在ROM当中,在使用的时候,直接从ROM当中读取出来就可以了。

3.Matlab生成长训练序列

由于Data域数据在IFFT处理之前会扩大8倍,相应的长训练序列在进行IFFT处理之前也需要扩大8倍。同时长训练序列也是需要经过加窗处理的,即多输出一个样值,该值为第一个样值,同时将第一个样值与最后一个样值缩小一倍。

lts = [ 0,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,0,0,0,0,0,0,0,0,0,0,0,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 ];
lts_time = 8 * ifft(lts,64);        %长训练序列进行ifft
q = quantizer('fixed','round','saturate',[8,6]);%复数以8位定点数形式进行输出,格式为:1位符号位,一位整数位,6位小数位,负数以补码形式表示。
lts_time_q = num2bin(q,lts_time);%量化,存到FPGA的ROM
lts_rom = [0.5*lts_time(33),lts_time(34:end),lts_time,lts_time,0.5*lts_time(1)];    %长训练序列加窗     

长训练序列时域值(复数以8位定点数形式进行输出,格式为:1位符号位,一位整数位,6位小数位,负数以补码形式表示):

    '01010000 + 00000000i''11111101 + 11000010i''00010100 + 11000111i''00110010 + 00101010i''00001011 + 00001110i''00011111 + 11010011i''11000101 + 11100100i''11101100 + 11001010i''00110010 + 11110011i''00011011 + 00000010i''00000001 + 11000101i''10111010 + 11101000i''00001101 + 11100010i''00011110 + 11111000i''11110100 + 01010010i''00111101 + 11111110i''00100000 + 11100000i''00010011 + 00110010i''11100011 + 00010100i''10111101 + 00100001i''00101010 + 00101111i''00100100 + 00000111i''11100001 + 00101010i''11100011 + 11110101i''11101110 + 10110011i''11000010 + 11111000i''10111111 + 11110110i''00100110 + 11011010i''11111111 + 00011100i''11010001 + 00111011i''00101111 + 00110110i''00000110 + 00110010i''10110000 + 00000000i''00000110 + 11001110i''00101111 + 11001010i''11010001 + 11000101i''11111111 + 11100100i''00100110 + 00100110i''10111111 + 00001010i''11000010 + 00001000i''11101110 + 01001101i''11100011 + 00001011i''11100001 + 11010110i''00100100 + 11111001i''00101010 + 11010001i''10111101 + 11011111i''11100011 + 11101100i''00010011 + 11001110i''00100000 + 00100000i''00111101 + 00000010i''11110100 + 10101110i''00011110 + 00001000i''00001101 + 00011110i''10111010 + 00011000i''00000001 + 00111011i''00011011 + 11111110i''00110010 + 00001101i''11101100 + 00110110i''11000101 + 00011100i''00011111 + 00101101i''00001011 + 11110010i''00110010 + 11010110i''00010100 + 00111001i''11111101 + 00111110i'

4.硬件实现

LTS Generator的设计原理与实现方式与STS Generator相似。标准规定,LTS 包括两个周期的 Symbol(每个有64个样值)和一个长度为32个采样点的长型CP(LTS64个样值中的后32个)。为此,存储LTS的片内ROM被设定为64字X16位,如上面所示,读取时通过对Read Address的控制先输出后32个地址空间中的样值形成CP,然后再将整个ROM中的样值按顺序重复读取两次。verilog代码如下:

assign	En_cnt = LTS_din_rdy & ~cnt_last;
assign	addr = cnt - 6'd32;counter #(.CNT_NUM('d161),.ADD(1'b1))
u_counter(
.clk		(clk				),	
.rst_n		(rst_n				),
.En_cnt		(En_cnt				),      
.cnt		(cnt				),	
.cnt_last	(cnt_last			)
);always @(posedge clk or negedge rst_n) if(!rst_n)beginLTS_dout_last <= 1'b0;LTS_dout_Index <= 'd0;endelse beginLTS_dout_last <= cnt_last;LTS_dout_Index <= cnt;endalways @(posedge clk or negedge rst_n) beginif(~rst_n) begin  //时域样值Im       ReLong_Mem[0]  <= {8'b00000000 , 8'b01010000};					Long_Mem[1]  <= {8'b11000010 , 8'b11111101};Long_Mem[2]  <= {8'b11000111 , 8'b00010100};Long_Mem[3]  <= {8'b00101010 , 8'b00110010};Long_Mem[4]  <= {8'b00001110 , 8'b00001011};Long_Mem[5]  <= {8'b11010011 , 8'b00011111};Long_Mem[6]  <= {8'b11100100 , 8'b11000101};Long_Mem[7]  <= {8'b11001010 , 8'b11101100};Long_Mem[8]  <= {8'b11110011 , 8'b00110010};Long_Mem[9]  <= {8'b00000010 , 8'b00011011};Long_Mem[10] <= {8'b11000101 , 8'b00000001};Long_Mem[11] <= {8'b11101000 , 8'b10111010};Long_Mem[12] <= {8'b11100010 , 8'b00001101};Long_Mem[13] <= {8'b11111000 , 8'b00011110};Long_Mem[14] <= {8'b01010010 , 8'b11110100};Long_Mem[15] <= {8'b11111110 , 8'b00111101};Long_Mem[16] <= {8'b11100000 , 8'b00100000};Long_Mem[17] <= {8'b00110010 , 8'b00010011};Long_Mem[18] <= {8'b00010100 , 8'b11100011};Long_Mem[19] <= {8'b00100001 , 8'b10111101};Long_Mem[20] <= {8'b00101111 , 8'b00101010};Long_Mem[21] <= {8'b00000111 , 8'b00100100};Long_Mem[22] <= {8'b00101010 , 8'b11100001};Long_Mem[23] <= {8'b11110101 , 8'b11100011};Long_Mem[24] <= {8'b10110011 , 8'b11101110};Long_Mem[25] <= {8'b11111000 , 8'b11000010};Long_Mem[26] <= {8'b11110110 , 8'b10111111};Long_Mem[27] <= {8'b11011010 , 8'b00100110};Long_Mem[28] <= {8'b00011100 , 8'b11111111};Long_Mem[29] <= {8'b00111011 , 8'b11010001};Long_Mem[30] <= {8'b00110110 , 8'b00101111};Long_Mem[31] <= {8'b00110010 , 8'b00000110};Long_Mem[32] <= {8'b00000000 , 8'b10110000};Long_Mem[33] <= {8'b11001110 , 8'b00000110};Long_Mem[34] <= {8'b11001010 , 8'b00101111};Long_Mem[35] <= {8'b11000101 , 8'b11010001};Long_Mem[36] <= {8'b11100100 , 8'b11111111};Long_Mem[37] <= {8'b00100110 , 8'b00100110};Long_Mem[38] <= {8'b00001010 , 8'b10111111};Long_Mem[39] <= {8'b00001000 , 8'b11000010};Long_Mem[40] <= {8'b01001101 , 8'b11101110};Long_Mem[41] <= {8'b00001011 , 8'b11100011};Long_Mem[42] <= {8'b11010110 , 8'b11100001};Long_Mem[43] <= {8'b11111001 , 8'b00100100};Long_Mem[44] <= {8'b11010001 , 8'b00101010};Long_Mem[45] <= {8'b11011111 , 8'b10111101};Long_Mem[46] <= {8'b11101100 , 8'b11100011};Long_Mem[47] <= {8'b11001110 , 8'b00010011};Long_Mem[48] <= {8'b00100000 , 8'b00100000};Long_Mem[49] <= {8'b00000010 , 8'b00111101};Long_Mem[50] <= {8'b10101110 , 8'b11110100};Long_Mem[51] <= {8'b00001000 , 8'b00011110};Long_Mem[52] <= {8'b00011110 , 8'b00001101};Long_Mem[53] <= {8'b00011000 , 8'b10111010};Long_Mem[54] <= {8'b00111011 , 8'b00000001};Long_Mem[55] <= {8'b11111110 , 8'b00011011};Long_Mem[56] <= {8'b00001101 , 8'b00110010};Long_Mem[57] <= {8'b00110110 , 8'b11101100};Long_Mem[58] <= {8'b00011100 , 8'b11000101};Long_Mem[59] <= {8'b00101101 , 8'b00011111};Long_Mem[60] <= {8'b11110010 , 8'b00001011};Long_Mem[61] <= {8'b11010110 , 8'b00110010};Long_Mem[62] <= {8'b00111001 , 8'b00010100};Long_Mem[63] <= {8'b00111110 , 8'b11111101};LTS_dout <= 'd0;LTS_dout_vld <= 1'b0;endelse if(LTS_din_rdy & LTS_dout_last)LTS_dout_vld <= 1'b0;else if(cnt == 'd0)beginLTS_dout <= {$signed(Long_Mem[32][15:8])>>>1,$signed(Long_Mem[32][7:0])>>>1}; LTS_dout_vld <= 1'b1;endelse if(cnt_last)beginLTS_dout <= {$signed(Long_Mem[0][15:8])>>>1,$signed(Long_Mem[0][7:0])>>>1};LTS_dout_vld <= 1'b1;endelse if(cnt < 32)beginLTS_dout <= Long_Mem[{1'b1,cnt[4:0]}]; LTS_dout_vld <= 1'b1;endelse beginLTS_dout <= Long_Mem[addr[5:0]]; LTS_dout_vld <= 1'b1;end
end

5.ModelSim仿真

仿真缩略图

仿真细节图

6.和Matlab仿真结果对比

%% LTS
FPGA_LTS_dout = readlines('D:/FPGA/OFDM_802.11a_my/TX/matlab/LTS_data_out.txt','EmptyLineRule','skip')';
display(FPGA_LTS_dout);
FPGA_Im_LTS_dout = extractBefore(FPGA_LTS_dout,9);
FPGA_Re_LTS_dout = extractAfter(FPGA_LTS_dout,8);
q = quantizer('fixed','round','saturate',[8,6]);
FPGA_Re_LTS_dout = bin2num(q,FPGA_Re_LTS_dout);
FPGA_Im_LTS_dout = bin2num(q,FPGA_Im_LTS_dout);
FPGA_Re_LTS_dout = cell2mat(FPGA_Re_LTS_dout);
FPGA_Im_LTS_dout = cell2mat(FPGA_Im_LTS_dout);
FPGA_LTS_dout = FPGA_Re_LTS_dout + 1j*FPGA_Im_LTS_dout;
lts_rom_q = num2bin(q,lts_rom);%量化
lts_rom = bin2num(q,lts_rom_q);%反量化
check_LTS = FPGA_LTS_dout == lts_rom.';
display(check_LTS);
check_LTS =1×161 logical 数组列 1 至 401   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   1   1列 41 至 801   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   1   1列 81 至 1201   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   1   1列 121 至 1601   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   1   1列 1611

今天在设计这部分时,发现前面OFDM 802.11a的FPGA实现中的文章在涉及到加窗操作的时候,使用到了移位操作,但是没有考虑到有符号数的问题。而恰好今天发现了这一问题,写了一篇文章详细对verilog中移位操作时,有符号数和无符号数的区别进行讲解,并且设计补码、反码、原码的知识。

感兴趣的可以前往查看https://mp.weixin.qq.com/s/5II3YzVeEXl9BoTe8MM5ZQ
原文链接(相关文章合集):OFDM 802.11a的xilinx FPGA实现

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

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

相关文章

【Redis】Redis面试和工作中十有八九会遇到的问题

1. 数据类型 常用的Redis数据类型有5种&#xff0c;分别是&#xff1a; String、List、Set、SortedSet、Hash 还有一些高级数据类型&#xff0c;比如Bitmap、HyperLogLog、GEO等&#xff0c;其底层都是基于上述5种基本数据类型。因此在Redis的源码中&#xff0c;其实只有5种数…

React: memo

React.memo 允许你的组件在 props 没有改变的情况下跳过重新渲染。 const MemoizedComponent memo(SomeComponent, arePropsEqual?)React 通常在其父组件重新渲染时重新渲染一个组件。你可以使用 memo 创建一个组件&#xff0c;当它的父组件重新渲染时&#xff0c;只要它的新…

Docker Compose常用命令与属性

大家好&#xff0c;今天给大家分享Docker Compose的常用命令&#xff0c;以及docker-compose文件的属性。Docker Compose 是一个用于定义和运行多容器 Docker 应用应用的重要工具。它通过一个配置文件&#xff08;docker-compose.yml&#xff09;来详细定义多个容器之间的关联、…

软考中级-软件设计师 (十一)标准化和软件知识产权基础知识

一、标准化基础知识 1.1标准的分类 根据适用的范围分类&#xff1a; 国际标准指国际化标准组织&#xff08;ISO&#xff09;、国际电工委员会&#xff08;IEC&#xff09;所制定的标准&#xff0c;以及ISO所收录的其他国际组织制定的标准。 国家标准&#xff1a;中华人民共和…

Redis20种使用场景

Redis20种使用场景 1缓存2抽奖3Set实现点赞/收藏功能4排行榜5PV统计&#xff08;incr自增计数&#xff09;6UV统计&#xff08;HeyperLogLog&#xff09;7去重&#xff08;BloomFiler&#xff09;8用户签到&#xff08;BitMap&#xff09;9GEO搜附近10简单限流11全局ID12简单分…

在大型项目上,Python 是个烂语言吗?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Python的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; python项目超过5万行&#x…

前端之电力系统SVG图低代码

其实所有的图形都是由点&#xff0c;线&#xff0c;面组成的。点线面可以组成一个设备。下面就简单讲讲点线面是怎么画的吧 对于线&#xff0c;可以用path <g><path:d"M ${beginX},${beginY} L ${endX},${endY}":stroke-width"lineWidth":strok…

【Pip】pip 安装第三方包异常:[SSL:CERTIFICATE_VERIFY_FAILED]解决方案

pip 安装第三方包异常:[SSL:CERTIFICATE_VERIFY_FAILED] 大家好 我是寸铁&#x1f44a; 总结了一篇pip 安装第三方包异常:[SSL:CERTIFICATE_VERIFY_FAILED]✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 报错 今天在安装第三方包时报错如下: 解决方案 本质上是需要指定信任的镜像…

C#【进阶】泛型

1、泛型 文章目录 1、泛型1、泛型是什么2、泛型分类3、泛型类和接口4、泛型方法5、泛型的作用思考 泛型方法判断类型 2、泛型约束1、什么是泛型2、各泛型约束3、约束的组合使用4、多个泛型有约束思考1 泛型实现单例模式思考2 ArrayList泛型实现增删查改 1、泛型是什么 泛型实现…

pytest教程-46-钩子函数-pytest_sessionstart

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了pytest_report_testitemFinished钩子函数的使用方法&#xff0c;本小节我们讲解一下pytest_sessionstart钩子函数的使用方法。 pytest_sessionstart 是 Pytest 提供的一个钩子函数&#xff0c…

python使用opencv实现手势识别并控制ppt

需要使用到的包 from collections import dequeimport cv2 import numpy as np import math import shutilimport sys import os import time#这个求出现频率最高的太慢了&#xff0c;所以把它放弃了 from collections import Counter准备好安装包后需要获取图片 def star():…

DockerFile介绍与使用

一、DockerFile介绍 大家好&#xff0c;今天给大家分享一下关于 DockerFile 的介绍与使用&#xff0c;DockerFile 是一个用于定义如何构建 Docker 镜像的文本文件&#xff0c;具体来说&#xff0c;具有以下重要作用&#xff1a; 标准化构建&#xff1a;提供了一种统一、可重复…

SQL注入漏洞常用绕过方法

SQL注入漏洞 漏洞描述 Web 程序代码中对于用户提交的参数未做过滤就直接放到 SQL 语句中执行&#xff0c;导致参数中的特殊字符打破了原有的SQL 语句逻辑&#xff0c;黑客可以利用该漏洞执行任意 SQL 语句&#xff0c;如查询数据、下载数据、写入webshell 、执行系统命令以及…

企业OA办公系统开发笔记:1、搭建后端环境

文章目录 企业办公系统&#xff1a;搭建环境一、项目介绍1、介绍2、技术栈3、项目模块4、数据库 二、搭建环境1、搭建后端1.1、搭建父工程clfwzx-oa-parent1.2、搭建工具类父模块common1.3、搭建工具类common的子模块1.4、搭建实体类模块model和项目模块service-oa 2、配置依赖…

【前端】CSS基础(3)

文章目录 前言1. CSS常用元素属性1.1 字体属性1.1.1 字体1.1.2 字体大小1.1.3 字体颜色1.1.4 字体粗细1.1.5 文字样式 前言 这篇博客仅仅是对CSS的基本结构进行了一些说明&#xff0c;关于CSS的更多讲解以及HTML、Javascript部分的讲解可以关注一下下面的专栏&#xff0c;会持续…

做软件测试如何突破月薪20K?

IT行业从事技术岗位&#xff0c;尤其对于测试来说&#xff0c;月薪20K&#xff0c;即便在北上广深这类一线城市薪水也不算低了&#xff0c;可以说对于大部分测试岗位从业者来说&#xff0c;20K都是一个坎儿。 那么&#xff0c;问题来了&#xff0c;做软件测试如何可以达到月薪…

连锁收银系统如何助力实体门店私域运营

作为实体门店&#xff0c;私域运营是提升客户黏性和增加复购率的重要策略之一。而连锁收银系统在私域运营中扮演了关键的角色&#xff0c;它不仅可以帮助门店管理客户信息和消费记录&#xff0c;还能够通过数据分析和营销功能提供个性化的服务和推广活动。下面看看连锁收银系统…

Qt 6.7 正式发布!

本文翻译自&#xff1a;Qt 6.7 Released! 原文作者&#xff1a;Qt Group研发总监Volker Hilsheimer 在最新发布的Qt 6.7版本中&#xff0c;我们大大小小作出了许多改善&#xff0c;以便您在构建现代应用程序和用户体验时能够享受更多乐趣。 部分新增功能已推出了技术预览版&a…

证照之星是什么软件 证照之星哪个版本好用?证照之星支持哪些相机 证照之星XE免费版

许多人都需要使用证件照&#xff0c;为了满足这一需求&#xff0c;人们会使用照相机、手机、电脑等工具进行拍摄。除此之外&#xff0c;市面上还存在专门的证件照拍摄软件&#xff0c;比如证照之星。那么&#xff0c;各位小伙伴是否了解证照之星哪个版本好用&#xff0c;证照之…

什么?你设计接口什么都不考虑?

如果让你设计一个接口&#xff0c;你会考虑哪些问题&#xff1f; 1.接口参数校验 接口的入参和返回值都需要进行校验。 入参是否不能为空&#xff0c;入参的长度限制是多少&#xff0c;入参的格式限制&#xff0c;如邮箱格式限制 返回值是否为空&#xff0c;如果为空的时候是…