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.mzph.cn/pingmian/12817.shtml

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

相关文章

Linux初学1

Unix unix和LInux的关系 LInux的吉祥物tux Nginx Directoryhttps://mirror.iscas.ac.cn/centos/7/isos/x86_64/redhat7 网络连接 桥接模式&#xff1a;虚拟系统可以和外部系统通讯&#xff0c; 你自家里折腾当然桥接没问题&#xff0c;如果一个教室里全都用桥接&#xff1…

2024年CSPM考试时间线梳理!

最近后台有朋友在问今年CSPM的考试安排&#xff0c;给大家整理一下&#xff0c;需要的朋友认真查看&#xff0c;不要错过考试。2024年5月12日举行了本年度第二次CSPM3级考试~接下来的考试安排如下&#xff1a; 1&#xff09;2024年CSPM考试安排 本次考试出成绩时间——2024年6…

【大数据】计算引擎MapReduce

目录 1.概述 1.1.前言 1.2.大数据要怎么计算&#xff1f; 1.3.什么是MapReduce&#xff1f; 2.架构 3.工作流程 4.shuffle 4.1.map过程 4.2.reduce过程 1.概述 1.1.前言 本文是作者大数据系列专栏的其中一篇&#xff0c;专栏地址&#xff1a; https://blog.csdn.ne…

特征提取与深度神经网络DNN

OpenCV中的深度神经网络&#xff08;DNN&#xff09;模块&#xff0c;现在已经支持图像风格迁移、图像分类、对象检测、语义分割、实例分割、图像变换等。 只支持推理&#xff0c;不支持训练 支持主流的深度学习框架生成模型 推荐使用pytorch/onnx/tensorflow ResNet18的图像…

无代码无国界:我们正在走向软件安全的狂野西部吗?

我们使用的几乎所有东西都是基于代码构建的&#xff0c;从汽车到智能冰箱再到门铃。在企业中&#xff0c;无数的应用程序保持设备、工作流程和操作的运行。因此&#xff0c;当早期的无代码开发平台于 2010 年推出时&#xff0c;承诺为公民开发人员提供更易于访问的应用程序开发…

Redis加入系统服务,开机自启

vi /etc/systemd/system/redis.service i [Unit] Descriptionredis-server Afternetwork.target [Service] Typeforking #使用&#xff08;/usr/local/bin/redis-server&#xff09;运行&#xff08;/usr/local/src/redis-6.2.6/redis.conf&#xff09; ExecStart/usr/local/…

解决GitHub提交后不显示自己的头像 显示另一个没见过的账号?

问题说明 最近换了几台电脑开发项目&#xff0c;提交到github&#xff0c;看了下提交记录&#xff0c;怎么冒出来不是我的账号头像&#xff1f; 什么鬼i 原因分析 github是按照你注册时候填的邮箱来查找账号&#xff0c;并显示在提交记录上面的。如果账号找不到头像就出不来…

【Day3:JAVA运算符、方法的介绍】

目录 1、运算符1.1 赋值运算符1.2 比较运算符1.3 逻辑运算符1.3.1 逻辑运算符概述1.3.2 逻辑运算符分类1.3.3 短路的逻辑运算符 1.4 三元运算符1.5 运算符优先级 2、方法2.1 方法介绍2.2 方法的定义和调用格式2.2.1 方法的调用2.2.2 带参数方法的调用2.2.3 带返回值方法的调用2…

具身智能论文(四)

目录 1. Alexa Arena: A User-Centric Interactive Platform for Embodied AI2. EDGI: Equivariant Diffusion for Planning with Embodied Agents3. Efficient Policy Adaptation with Contrastive Prompt Ensemble for Embodied Agents4. Egocentric Planning for Scalable E…

OceanBase集群如何进行OCP的替换

有OceanBase社区版的用户提出替换 OCP 管控平台的需求。举例来说&#xff0c;之前的OCP平台采用单节点&#xff0c;然而随着OceanBase集群的陆续上线和数量的不断增多&#xff0c;担心单节点的OCP可能面临故障风险&#xff0c;而丧失对OceanBase集群的管控能力。另此外&#xf…

so-vits-svc:AI翻唱,语音克隆

前言 这个项目是为了让开发者最喜欢的动画角色唱歌而开发的&#xff0c;任何涉及真人的东西都与开发者的意图背道而驰。 项目地址&#xff1a;https://github.com/svc-develop-team/so-vits-svc/blob/4.1-Stable/README_zh_CN.md 安装 可以自行配置&#xff0c;应该也不难 …

Java05基础 数组

Java05数组 一、数组 数组指的是一种容器&#xff0c;可以用来存储同种数据类型的多个值。 1、数组的静态初始化 初始化&#xff1a;就是在内存中&#xff0c;为数组容器开辟空间&#xff0c;并将数据存入容器中的过程 1.1 数组定义格式 //格式一 数据类型[] 数组名 …

git 拉取指定目录

指令方式 打开 git 自带的Git Bash 工具 以拉取github中 fastjson 的 /src/test/java/oracle/sql/ 目录为例 1.创建文件夹和git 初始化 cd D:/Program\ Files mkdir fastjson cd fastjson git init 2.设置允许克隆子目录 git config core.sparsecheckout true 3.添加远程…

企业大模型如何成为自己数据的“百科全书”?

作者 | 郭炜 编辑 | Debra Chen 在当今的商业环境中&#xff0c;大数据的管理和应用已经成为企业决策和运营的核心组成部分。然而&#xff0c;随着数据量的爆炸性增长&#xff0c;如何有效利用这些数据成为了一个普遍的挑战。 本文将探讨大数据架构、大模型的集成&#xff0…

Google I/O 2024:探索未来AI技术的无限可能

近日&#xff0c;Google I/O 2024大会圆满落幕&#xff0c;带给我们一场关于人工智能的盛宴。在这场大会上&#xff0c;Google推出了一系列令人激动的AI新功能和工具&#xff0c;让我们得以一窥未来的科技发展。今天&#xff0c;就让我来为大家总结一下这些亮点吧&#xff01; …

你是学会了还是学废了:Elasticsearch 7 集群拷贝到其它环境如何重置密码

欢迎您关注我的公众号【尚雷的驿站】 公众号&#xff1a;尚雷的驿站 CSDN &#xff1a;https://blog.csdn.net/shlei5580 墨天轮&#xff1a;https://www.modb.pro/u/2436 PGFans&#xff1a;https://www.pgfans.cn/user/home?userId4159 前言 本文描述了将生产ES集群打包拷贝…

知识图谱 | 语义网络写入图形数据库(含jdk和neo4j的安装过程)

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本文主要介绍如何使用 Neo4j 图数据库呈现语义网络&#xff0c;并通过 Python 将语义网络的数据写入数据库。具体步骤包括识别知识中的节点和关系&#xff0c;将其转化为图数据库的节点和边&#xff0c;最后通过代码实现数据的写…

css案例 tab上下滚动,左右滚动

效果图&#xff1a; 完整代码&#xff1a; <template><view class"content"><view class"content-item"><view class"content-title"><h4>美食热搜</h4><ul><li>火鸡面</li><li>糖…

听劝!普通人千万别随意入门网络安全

一、什么是网络安全 网络安全是一种综合性的概念&#xff0c;涵盖了保护计算机系统、网络基础设施和数据免受未经授权的访问、攻击、损害或盗窃的一系列措施和技术。经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”…

图文教程 | 2024年IDEA安装使用、破解教程,JDK简易下载方法

前言 &#x1f4e2;博客主页&#xff1a;程序源⠀-CSDN博客 &#x1f4e2;欢迎点赞&#x1f44d;收藏⭐留言&#x1f4dd;如有错误敬请指正&#xff01; 目录 一、IDEA安装 二、激活 三、JDK安装 四、JDK环境配置 五、验证 一、IDEA安装 进入官网下载&#xff1a; Other…