OFDM802.11a的FPGA实现(八)二级交织(含verilog和matlab代码)

目录

  • 1.前言
  • 2.Verilog代码
  • 3.Matlab仿真
  • 4.ModelSim仿真

1.前言

  上一节实现了一级交织:分组交织器,这节接着进行第二级交织的实现。需要注意的是只有data域需要第二级交织,而signal域不需要。二级交织比较简单,作者直接调用了前面的模块来实现,这也体现了FPGA设计的模块化复用思想。当然重新写也是可以的,但是有现成的可以调用干嘛不用呢是不是?

  第二次交织是在第一次交织的基础上进行的,交织基本过程是每24个比特为一单元,前12个顺序保持不变,后12个每相邻两位交换位置,这样就保证了相邻的编码比特被分别映射到星座图中的重要和次要位置,因此LSB长时间的低可靠性将被避免。

2.Verilog代码

  二级交织模块的接口如下所示:

  设计上,直接调用前面的串并转换模块和并串转换模块,设置位宽为2(不清楚的看之前的文章:基于valid-ready双向握手机制的串并和并串转换)。具体实现方式如下:

  (1)首先数据进来使用串并转换,将串行变为2bit的并行。

  (2)然后再例化两个并串转换模块一个设置为LSB优先,一个设置为MSB优先。

  (3)例化一个模24的计数器(FPGA搭积木之计数器)

  (4)当计数值小于12时,使用LSB优先的并串转换输出,否则使用MSB优先的并串转换输出。

代码如下:

assign	intv2_dout_rdy 	= S2P_dout_rdy									;
assign	intv2_dout 		= cnt < 12 ? u1_P2S_dout 	 : u2_P2S_dout		;
assign	intv2_dout_vld  = cnt < 12 ? u1_P2S_dout_vld : u2_P2S_dout_vld	;assign	En_cnt = (u2_P2S_dout_vld & u2_P2S_din_rdy) | u1_P2S_dout_vld & u1_P2S_din_rdy;counter #(.CNT_NUM('d24),.ADD(1'b1))
u_counter(.clk		(clk				),	.rst_n		(rst_n				),.En_cnt		(En_cnt				),      .cnt		(cnt				),	.cnt_last	(cnt_last			)
);assign	S2P_din		 	= intv2_din    		;
assign	S2P_din_vld  	= intv2_din_vld		;
assign  S2P_din_rdy		= u1_P2S_dout_rdy &	u2_P2S_dout_rdy;Ser2Par	#(	.WIDTH		(2),.LSB_FIRST	(1'b1))
u_Ser2Par(.clk		(clk			),.rst_n		(rst_n			),.din		(S2P_din		),.din_vld	(S2P_din_vld	),.din_rdy	(S2P_din_rdy	),.dout		(S2P_dout		),.dout_vld	(S2P_dout_vld	),.dout_rdy   (S2P_dout_rdy	)
);assign u1_P2S_din		= S2P_dout			;
assign u1_P2S_din_vld 	= S2P_dout_vld		;
assign u1_P2S_din_rdy	= intv2_din_rdy		;Par2Ser	#(	.WIDTH		(2),.LSB_FIRST	(1))
u1_Par2Ser(.clk		(clk			),.rst_n		(rst_n			),.din		(u1_P2S_din		),.din_vld	(u1_P2S_din_vld	),.din_rdy	(u1_P2S_din_rdy	),.dout		(u1_P2S_dout	),.dout_vld	(u1_P2S_dout_vld),.dout_rdy   (u1_P2S_dout_rdy)
);assign u2_P2S_din		= S2P_dout			;
assign u2_P2S_din_vld 	= S2P_dout_vld		;
assign u2_P2S_din_rdy	= intv2_din_rdy		;
Par2Ser	#(	.WIDTH		(2),.LSB_FIRST	(0))
u2_Par2Ser(.clk		(clk			),.rst_n		(rst_n			),.din		(u2_P2S_din		),.din_vld	(u2_P2S_din_vld	),.din_rdy	(u2_P2S_din_rdy	),.dout		(u2_P2S_dout	),.dout_vld	(u2_P2S_dout_vld),.dout_rdy   (u2_P2S_dout_rdy)
);//输出Map_Type,作为后面调制映射的输入,确定调制方式
always@(posedge clk or negedge rst_n ) beginif(!rst_n) begin Map_Type_o <= 0;        end    else if(u2_P2S_dout_vld | u1_P2S_dout_vld) begin Map_Type_o <= Map_Type_i ; end   
end 

3.Matlab仿真

%% 二级交织
int_lea_2_out = int_lea_1_out;
for index = 1:symbol_Len*k         %数据前12个不变,接下来12个两两交换位置if(mod((ceil(index/12)-1),2)==1)    %判断数据是不是在后12个位置if(mod(index,2) == 0)           %在偶数位置时,将前一个位置的数据给他int_lea_2_out(index) = int_lea_1_out(index-1);else                            %在奇数位置时,将后一个位置的数据给他int_lea_2_out(index) = int_lea_1_out(index+1);endelseint_lea_2_out(index) = int_lea_1_out(index);    end
end

4.ModelSim仿真

  按照如下图所示方式进行连接仿真:

  为了验证模块的正确性,仿真使用4个OFDM符号输入,调制方式位BPSK(其他调制方式数据太多,不方便展示),测试数据如下:

test_data =列 1 至 270     1     1     0     0     0     0     1     0     0     0     0     0     0     0     0     1     0     0     1     1     1     0     0     1     1     1列 28 至 541     0     1     1     0     1     1     1     1     1     0     0     1     1     1     0     1     1     1     0     0     0     0     1     0     1     0列 55 至 810     0     0     0     0     1     0     1     1     1     1     0     1     1     0     0     1     1     0     0     1     1     0     1     0     0     1列 82 至 1080     0     0     1     0     1     1     0     0     0     1     0     1     0     1     0     1     1     1     1     0     0     1     1     0     1     0列 109 至 1351     1     1     1     1     0     1     1     1     0     0     1     0     0     0     0     1     0     1     1     1     0     0     0     1     1     0列 136 至 1441     0     0     1     1     1     1     1     1

matlab仿真的二级交织结果如下:

int_lea_2_out =列 1 至 270     0     1     0     0     1     0     0     0     0     0     0     0     0     0     0     1     0     1     1     0     1     0     0     1     1     0列 28 至 540     1     0     1     1     1     0     0     1     0     0     1     1     1     0     1     1     0     1     0     0     1     1     1     1     0     0列 55 至 811     1     0     0     0     1     1     1     1     0     1     1     1     0     1     0     1     0     0     0     0     0     0     0     1     1     1列 82 至 1081     0     1     0     0     0     1     0     0     0     0     0     1     0     0     0     1     1     0     0     0     0     1     0     0     0     0列 109 至 1351     1     0     0     1     0     1     1     1     1     1     1     1     1     1     0     0     1     0     1     0     1     1     1     1     1     1列 136 至 1621     1     1     1     1     1     1     1     0     0     0     0     1     1     0     0     1     1     1     1     0     0     1     1     1     1     1列 163 至 1890     1     0     0     0     1     1     0     0     0     0     1     0     0     1     0     0     1     1     0     0     0     1     1     1     0     1列 190 至 1921     0     0

FPGA输出的二级交织结果如下:

FPGA_intv2_dout =列 1 至 270     0     1     0     0     1     0     0     0     0     0     0     0     0     0     0     1     0     1     1     0     1     0     0     1     1     0列 28 至 540     1     0     1     1     1     0     0     1     0     0     1     1     1     0     1     1     0     1     0     0     1     1     1     1     0     0列 55 至 811     1     0     0     0     1     1     1     1     0     1     1     1     0     1     0     1     0     0     0     0     0     0     0     1     1     1列 82 至 1081     0     1     0     0     0     1     0     0     0     0     0     1     0     0     0     1     1     0     0     0     0     1     0     0     0     0列 109 至 1351     1     0     0     1     0     1     1     1     1     1     1     1     1     1     0     0     1     0     1     0     1     1     1     1     1     1列 136 至 1621     1     1     1     1     1     1     1     0     0     0     0     1     1     0     0     1     1     1     1     0     0     1     1     1     1     1列 163 至 1890     1     0     0     0     1     1     0     0     0     0     1     0     0     1     0     0     1     1     0     0     0     1     1     1     0     1列 190 至 1921     0     0

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);
%% 删余
FPGA_punt_dout = load('D:/FPGA/OFDM_802.11a_my/TX/matlab/punt_data_out.txt')';
display(conv_out);
display(FPGA_punt_dout);
check_punt = FPGA_punt_dout == conv_out;
display(check_punt);
%% 一级交织
FPGA_intv1_dout = load('D:/FPGA/OFDM_802.11a_my/TX/matlab/intv1_data_out.txt')';
display(int_lea_1_out);
display(FPGA_intv1_dout);
check_intv1 = FPGA_intv1_dout == int_lea_1_out;
display(check_intv1);
%% 二级交织
FPGA_intv2_dout = load('D:/FPGA/OFDM_802.11a_my/TX/matlab/intv2_data_out.txt')';
display(int_lea_2_out);
display(FPGA_intv2_dout);
check_intv2 = FPGA_intv2_dout == int_lea_2_out;
display(check_intv2);

对比结果为:

check_intv2 =1×192 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列 161 至 1921   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1

对比逻辑值全为1,说明设计是正确的。

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

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

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

相关文章

mysql UNION 联合查询

mysql UNION 联合查询 业务需要拉数据&#xff0c;这里需要对查询不同格式的数据进行组装&#xff0c;此处采用联合查询 注意1&#xff1a;null as 设备关爱 &#xff0c;结果为null&#xff0c;表头为设备关爱 注意2&#xff1a; UNION 或者 UNION ALL 联合查询自行选用 注意3…

Steam农场管理节现已正式开启,限时免费领取头像边框动画贴纸

Steam农场管理节现已正式开启&#xff01;限时免费领取头像边框/动画贴纸 大家好&#xff0c;最新消息&#xff01;Steam农场管理节已经正式开启啦&#xff01;这次游戏节将持续一周&#xff0c;从2024年4月30日凌晨1点开始&#xff0c;一直持续到2024年5月7日凌晨1点结束。 …

Qt QLineEdit详解

1.简介 QLineEdit是一个单行文本编辑器。 行编辑允许用户使用一组有用的编辑功能输入和编辑单行纯文本&#xff0c;包括撤消和重做、剪切和粘贴以及拖放。 通过更改行编辑的echoMode&#xff0c;它也可以用作“只写”字段&#xff0c;用于密码等输入。 文本的长度可以限制为ma…

物联网D1——建工程,配环境,注意事项

1.STLink、JLink、USB等驱动配置keil环境配置——下载芯片对应型号的包——导入库函数源文件、Core内核文件、对应芯片系统文件。 2.学会看芯片手册 3.在STM32微控制器中&#xff0c;CRH通常指的是控制寄存器高位&#xff08;Control Register High&#xff09;。 在这种情况下…

UDP!!!

UDP!!! 一 : 传输层的协议:二 : UDP2.1 UDP长度2.2 UDP校验和2.2.1 : 为什么会出现传输出错的情况??2.2.3: 对数据进行校验的方式CRCmd5 三 : UDP的适用场景 一 : 传输层的协议: 传输层的协议有UDP,TCP UDP:无连接,不可靠传输,面向数据报,全双工 TCP:有连接,可靠传输,面向字…

【MySQL】A01、性能优化-参数监控分析

1、参数监控 1.1、MySQL command 查看 mysql>SHOW STATUS; &#xff08;服务器状态变量&#xff0c;运行服务器的统计和状态指标&#xff09; mysql> SHOW VARIABLES;&#xff08;服务器系统变量&#xff0c;实际上使用的变量的值&#xff09; mysql> SHOW STATUS …

一曲《少年中国说》令人情怀激荡

今天&#xff0c;作为四川籍人的本“人民体验官”&#xff0c;将充满自豪感地推广人民日报官方微博文化产品《看我中国少年&#xff01;川传学子热血合唱少年中国说》。 图片&#xff1a;来源“人民体验官”推广平台 人民微博说&#xff1a;“百年前&#xff0c;梁启超先生一篇…

Mellanox网卡打流命令ib_write_bw执行遇到Couldn‘t listen to port 18515原因与解决办法?

要点 要点&#xff1a; ib默认使用18515命令 相关命令&#xff1a; netstat -tuln | grep 18515 ib_write_bw --help |grep port# server ib_write_bw --ib-devmlx5_1 --port 88990 # client ib_write_bw --ib-devmlx5_0 1.1.1.1 --port88990现象&#xff1a; 根因&#xf…

OpenFeign的超时控制

OpenFeign的超时控制 本文将从以下几个方面记录自己学习的OpenFeign超时控制笔记 何为超时控制有哪几类超时控制OpenFeign默认的超时控制规则如何自定义超时控制 1.何为超时控制 通过实操加上官网介绍个人理解为当一个微服务调用另一个微服务时&#xff0c;发送请求后超过设…

S参数定义

S11:端口2匹配时,端口1的反射系数; S22:端口1匹配时,端口2的反射系数; S12:端口1匹配时,端口2到端口1的反向传输系数; S21:端口2匹配时,端口1到端口2的正向传输系数; 对于互易网络,有:S12S21; 对于对称网络,有:S11S22 对于无耗网络,有:(S11)2(S12)21

基于ssm+vue开放式教学评价管理系统【ppt·代码·文档报告】

项目演示视频 项目名称&#xff1a;开放式教学评价管理系统 系统介绍&#xff1a;本系统是通过java的SSM框架来实现的&#xff0c;前端采用vue框架进行实现 管理员通过登录进入到系统操作界面&#xff0c;结合需求可以对个人信息进行在线修改维护&#xff0c;也可结合需求进行…

2024年这样做抖音小店,操作简单,起店稳定!

大家好&#xff0c;我是电商糖果 不少朋友说跟糖果抱怨过&#xff0c;说抖音小店越来越难做了。 平台的规则越来越多&#xff0c;商家运营店铺的时候&#xff0c;很容易出现违规预警。 糖果是2020年开始做的抖音小店&#xff0c;现在已经经营了多家小店。 实话实说确实比之…