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)begin
		LTS_dout_last <= 1'b0;
		LTS_dout_Index <= 'd0;
	end
	else begin
		LTS_dout_last <= cnt_last;
		LTS_dout_Index <= cnt;
	end
		
always @(posedge clk or negedge rst_n) begin
    if(~rst_n) begin  //时域样值Im       Re
        Long_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;
	end
	else if(LTS_din_rdy & LTS_dout_last)
		LTS_dout_vld <= 1'b0;
	else if(cnt == 'd0)begin
		LTS_dout <= {$signed(Long_Mem[32][15:8])>>>1,$signed(Long_Mem[32][7:0])>>>1}; 
		LTS_dout_vld <= 1'b1;
	end
	else if(cnt_last)begin
		LTS_dout <= {$signed(Long_Mem[0][15:8])>>>1,$signed(Long_Mem[0][7:0])>>>1};
		LTS_dout_vld <= 1'b1;
	end
	else if(cnt < 32)begin
		LTS_dout <= Long_Mem[{1'b1,cnt[4:0]}]; 
		LTS_dout_vld <= 1'b1;
	end
	else begin
		LTS_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 至 40

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

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

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

   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1

  列 161

   1

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

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

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

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

相关文章

基于死区补偿的永磁同步电动机矢量控制系统simulink仿真模型

整理了基于死区补偿的永磁同步电动机矢量控制系统simulink仿真&#xff0c;该模型使用线性死区补偿的PMSM矢量控制算法进行仿真&#xff0c;使用Foc电流双闭环 。 1.模块划分清晰&#xff0c;补偿前后仿真有对比&#xff0c;易于学习; 2.死区补偿算法的线性区区域可调; 3.自…

fyne更新GUI内容

fyne更新GUI内容 实现一个时钟界面&#xff0c;每秒钟更新一次。 package mainimport ("fyne.io/fyne/v2/app""fyne.io/fyne/v2/widget""time" )func updateTime(label *widget.Label) {formatted : time.Now().Format("2006-01-02 15:04…

Softing工业推出的edgeConnector将Allen-Bradley控制器集成到工业边缘应用中

2024年4月17日&#xff08;哈尔&#xff09;&#xff0c;Softing宣布扩展其基于Docker的edgeConnector产品系列&#xff0c;推出了新软件模块edgeConnector Allen Bradley PLC&#xff0c;可方便用户访问来自ControlLogix和CompactLogix控制器数据。 &#xff08;edgeConnector…

LSTM与GAN创新结合!模型性能起飞,准确率超98%

今天来聊一个深度学习领域非常具有创新性的研究方向&#xff1a;LSTM结合GAN。 LSTM擅长处理和记忆长期的时间依赖关系&#xff0c;而GAN可以学习复杂的数据分布并生成逼真的数据样本。通过充分结合两者的优势&#xff0c;我们可以增强模型对复杂数据的处理能力&#xff0c;提…

二叉树的常见操作

建立树 复制二叉树 计算深度 计算总结点数 计算叶子结点数

GPT-4o、GPT-4国内可用!新UI界面率先体验方法!

测试情况&#xff1a; 现根据测试结果&#xff0c;先对比一下普号4o和付费的区别&#xff1a; 注&#xff1a; plus限制情况&#xff1a;4的次数用完后可以用4o&#xff0c;但4o的80条用完后不能用4&#xff1b; team账户限制是100条/3h&#xff0c;4o和4共享额度 目前发现的…

2024最新洗地机推荐,洗地机怎么选?热门品牌哪个最好用?

在现代生活中&#xff0c;忙碌的日常让家庭清洁变得更加繁重和耗时。然而&#xff0c;洗地机的引入彻底改变了这一状况。凭借其强大的清洁效果和简便的使用方式&#xff0c;洗地机能够迅速清除地面上的各种污垢&#xff0c;使清洁工作变得轻松自如。正因为如此&#xff0c;洗地…

yolov8使用与训练步骤

第一&#xff1a;安装miniconda 网址&#xff1a;Index of /anaconda/miniconda/ 登录网址后 在网页按ctrF 输入&#xff1a;搜py38 Miniconda3-py38_22.11.1-1-Windows-x86_64.exe 52.5 MiB 2022-12-23 07:57 下载进行安装 安装过程中记得加环境变量这个项。 第二…

活字格如何复制指定单元格中的内容

1、安装插件“复制到剪贴板”后。 2、在需要执行复制的命令中&#xff0c;选择“复制到剪贴板” 3、选择源单元格。 4、执行看效果。

高效调度新篇章:详解DolphinScheduler 3.2.0生产级集群搭建

转载自tuoluzhe8521 导读&#xff1a;通过简化复杂的任务依赖关系&#xff0c; DolphinScheduler为数据工程师提供了强大的工作流程管理和调度能力。在3.2.0版本中&#xff0c;DolphinScheduler带来了一系列新功能和改进&#xff0c;使其在生产环境中的稳定性和可用性得到了显著…

企业研发必备网络:这些关键特性,你get了吗?

对于以研发为核心的企业&#xff0c;如软件开发、生物制药、智能汽车等&#xff0c;安全、稳定的研发网络可是他们业务发展不可或缺的。那么&#xff0c;这些研发网络究竟有哪些独特之处&#xff0c;又能为企业带来哪些价值呢&#xff1f; 首先&#xff0c;我们知道企业研发常常…

[笔试训练](二十三)067:打怪068:字符串分类069:城市群数量

目录 067:打怪 068:字符串分类 069:城市群数量 067:打怪 题目链接:打怪 (nowcoder.com) 题目&#xff1a; 题解&#xff1a; 直接计算结果&#xff1a; 1.一只怪物能抗几次攻击 int m(H/a)(H%a0?0:1); 2.杀死一只怪物&#xff0c;玩家要抗几次攻击 int nm-1; *3.杀死一只…

电路元件伏安特性的测量

实验目的&#xff1a; 1. 掌握线性电阻、非线性电阻元件伏安特性的测量方法&#xff1b; 2. 掌握伏安测量法中测量样点的选择和绘制曲线的方法&#xff1b; 3. 学习直读式仪表和直流稳压电源等设备的使用方法。 实验原理、内容及步骤&#xff1a; 电路元件的特性一般可用该元…

vue2 配置运行环境

vue2 配置运行环境 在 vue2 项目中配置运行环境 在项目中新建 .env.development 文件 和 .env.production 文件 .env.development NODE_ENV development //指定当前环境模式 VUE_APP_MODE development VUE_APP_BASE_URL "/dev-api".env.production NODE_ENV &q…

华为正式放弃高通芯片 | 百能云芯

5月15日&#xff0c;据外媒最新报道&#xff0c;高通公司正式确认&#xff0c;华为已无需依赖其处理器供应。 在出口许可被正式吊销前&#xff0c;高通的首席财务官已公开表示&#xff0c;预计明年与华为之间的芯片销售将为零&#xff0c;因为华为决定不再从高通购买4G芯片。 报…

基于Django的图书管理系统

文章目录 前言一、页面展示1.登录2.前端页面3.后端页面 总结 前言 本网站调用Django编写了图书管理网站&#xff0c;可以在后端控制书籍&#xff0c;前端进行书籍预览 一、页面展示 1.登录 2.前端页面 3.后端页面 — ![在这里插入图片描述](https://img-blog.csdnimg.cn/dir…

Day28 代码随想录打卡|栈与队列篇---逆波兰表达式求值

题目&#xff08;leecode T150&#xff09;&#xff1a; 给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意&#xff1a; 有效的算符为 、-、* 和 / 。每个操作数&#xff08;运算…

东方伟大思想家和哲学家颜廷利:有形的财富越与无形的财富

在世界的广阔舞台上&#xff0c;财富常被看作衡量国家与民族成就的重要尺度。然而&#xff0c;在物质和精神的天平上&#xff0c;真正具有深远意义的&#xff0c;往往是后者的累积与扩散。正如东方哲学的现代诠释者、当代中国教育界的杰出教授颜廷利所阐述&#xff0c;“有形的…

高级炫酷的个人主页or引导页

高级炫酷个人主页 效果图部分代码领取源码下期更新预报 效果图 部分代码 <!DOCTYPE html><html lang"zh-CN"><head><meta charset"utf-8"><meta content"yes" name"apple-mobile-web-app-capable"> &l…

动态路由实验新手入门:快速掌握核心知识点

大家好&#xff0c;这里是G-LAB IT实验室。今天带大家学习一下华为动态路由实验配置&#xff0c;新手入门&#xff0c;快速掌握核心知识点&#xff01; 01、实验拓扑 02、实验需求 1.根据拓扑运行对应的路由协议 2.每个路由器都有自己的环回口&#xff0c;宣告的区域不限制 …