首页 > 其他分享 >OFDM 802.11a的FPGA实现(二十二)DAC模块(含代码)

OFDM 802.11a的FPGA实现(二十二)DAC模块(含代码)

时间:2024-05-24 17:53:55浏览次数:31  
标签:din wire 802.11 OFDM FPGA dac train last axis

目录

1.前言

2.实现思路

3.verilog代码

4.MoselSim仿真


完整工程链接(含verilog和Matlab代码)OFDM 802.11a的xilinx FPGA实现

1.前言

上一节完成了MUC模块,实现了对MAC层进行数据交互,以及控制物理层各个模块的工作。现在还剩下最后一个DAC模块,作用是将时域的输出按照前导码、signal帧、data域的顺序进行排列,将数据速率从125M的突发形式,转换为20M的连续形式,然后送往硬件DAC输出模拟信号。

PPDU帧结构

PPDU帧结构

PPDU帧结构

PPDU帧结构

2.实现思路

在MCU模块当中,signal域和data域的数据在处理之前已经进行了排序,所以IFFT的输出顺序就是先signal域数据的时域,然后data域的时域。需要设计DAC模块,让前导码(长短训练序列)先输出,然后再输出IFFT输出的数据。

前面设计的训练序列模块,在输出结束后会产生一个last信号,我们可以将这个信号作为选通的条件,为低时,选择训练序列输出;为高时,选择ifft结果输出,来实现时域组帧。代码如下所示:

//dac_train_din_last为训练序列输出完毕标志,为低时,选择训练序列输出;为高时,选择ifft结果输出,来实现时域组帧       
assign s_axis_tvalid = dac_train_din_last ?  dac_ifft_din_vld : dac_train_din_vld   ;
assign s_axis_tlast = dac_train_din_last ?  dac_ifft_din_last : dac_train_din_last   ;
assign s_axis_tuser = dac_train_din_last ?  dac_ifft_din_Index : dac_train_din_Index  ;
assign dac_ifft_dout_rdy  = dac_train_din_last ? s_axis_tready : 1'b0;
assign dac_train_dout_rdy = dac_train_din_last ? 1'b0 : s_axis_tready;

另外,前导码设计时多输出了一个数据(长训练序列第一个数据,右移1位),这个数据需要与signal域(IFFT模块输出时,已经进行了右移1位)输出的第一个数据进行相加,实现加窗操作。代码如下:

//训练序列最后一个输出与signal域第一个输出相加(由于前面都进行了右移一位,此处只需相加),做加窗处理。
assign s_axis_tdata = dac_train_din_last ? dac_train_din_last_edge_pluse ? 
       {dac_ifft_din[15:8] + dac_train_din[15:8],
       dac_ifft_din[7:0] + dac_train_din[7:0]}: 
       dac_ifft_din : dac_train_din    ;

DAC模块的实现方式其实就是选通,先让训练序列输出,再让IFFT输出,最后将数据速率从125M的突发形式,转换为20M的连续形式,然后送往硬件DAC输出模拟信号。

DAC模块

DAC模块

3.verilog代码

`timescale 1ns / 1ps
module dac(
input    clk     ,
input    clk_dac    ,
input    rst_n         ,

input [15:0]  dac_ifft_din     ,
input    dac_ifft_din_vld , 
input    dac_ifft_din_last   ,
input [7:0]  dac_ifft_din_Index ,
output    dac_ifft_dout_rdy ,
 
input [15:0]  dac_train_din     ,
input    dac_train_din_vld ,
input    dac_train_din_last  ,  
input [8:0]  dac_train_din_Index ,
output    dac_train_dout_rdy ,
  
input    dac_din_rdy   ,
output [15:0]  dac_dout      , 
output    dac_dout_vld  , 
output    dac_dout_last    ,
output [8:0]  dac_dout_Index   

);

//fifo
wire    s_axis_tvalid       ;
wire    s_axis_tready       ;
wire  [15:0]  s_axis_tdata        ;
wire    s_axis_tlast        ;
wire  [8:0]  s_axis_tuser        ;
wire    m_axis_tvalid       ;
wire    m_axis_tready       ;
wire  [15:0]  m_axis_tdata        ;
wire    m_axis_tlast        ;
wire  [8:0]  m_axis_tuser        ;

wire   dac_train_din_last_edge_pluse;
//检测训练序列输出完毕标志的上升沿
edge_detection #(.POSEDGE(1'b1))
u_edge_detection (
.clk   (clk       ), 
.edge_din     (dac_train_din_last    ),
.edge_pluse     (dac_train_din_last_edge_pluse )
);

//训练序列最后一个输出与signal域第一个输出相加(由于前面都进行了右移一位,此处只需相加),做加窗处理。
assign s_axis_tdata = dac_train_din_last ? dac_train_din_last_edge_pluse ? 
       {dac_ifft_din[15:8] + dac_train_din[15:8],
       dac_ifft_din[7:0] + dac_train_din[7:0]}: 
       dac_ifft_din : dac_train_din    ;
//dac_train_din_last为训练序列输出完毕标志,为低时,选择训练序列输出;为高时,选择ifft结果输出,来实现时域组帧       
assign s_axis_tvalid = dac_train_din_last ?  dac_ifft_din_vld : dac_train_din_vld   ;
assign s_axis_tlast = dac_train_din_last ?  dac_ifft_din_last : dac_train_din_last   ;
assign s_axis_tuser = dac_train_din_last ?  dac_ifft_din_Index : dac_train_din_Index  ;
assign dac_ifft_dout_rdy  = dac_train_din_last ? s_axis_tready : 1'b0;
assign dac_train_dout_rdy = dac_train_din_last ? 1'b0 : s_axis_tready;


fifo_generator_0 u_fifo (
  .m_aclk    (clk_dac  ),  // input  wire m_aclk
  .s_aclk    (clk   ),  // input  wire s_aclk
  .s_aresetn   (rst_n   ),  // input  wire s_aresetn
  .s_axis_tvalid  (s_axis_tvalid ),  // input  wire s_axis_tvalid
  .s_axis_tready  (s_axis_tready ),  // output wire s_axis_tready
  .s_axis_tdata   (s_axis_tdata ),  // input  wire [15 : 0] s_axis_tdata
  .s_axis_tlast   (s_axis_tlast ),  // input  wire s_axis_tlast
  .s_axis_tuser   (s_axis_tuser ),  // input  wire [7 : 0] s_axis_tuser
  .m_axis_tvalid  (m_axis_tvalid ),  // output wire m_axis_tvalid
  .m_axis_tready  (m_axis_tready ),  // input  wire m_axis_tready
  .m_axis_tdata   (m_axis_tdata ),  // output wire [15 : 0] m_axis_tdata
  .m_axis_tlast   (m_axis_tlast ),  // output wire m_axis_tlast
  .m_axis_tuser   (m_axis_tuser )   // output wire [7 : 0] m_axis_tuser
);

assign m_axis_tready  = dac_din_rdy  ;
assign dac_dout      = m_axis_tdata ;
assign dac_dout_vld  = m_axis_tvalid   ;
assign dac_dout_last    = m_axis_tlast    ;
assign dac_dout_Index   = m_axis_tuser    ;


endmodule

4.MoselSim仿真

MoselSim仿真

MoselSim仿真

整个设计顶层硬件连接如下图所示:

顶层硬件连接

顶层硬件连接

目前,这个项目还有些许瑕疵,还需要进行测试,等完全调试通过之后,并且通过Matlab仿真进行闭环测试,确定逻辑没有问题,再分享出来,供有需要者学习。

标签:din,wire,802.11,OFDM,FPGA,dac,train,last,axis
From: https://blog.csdn.net/xxqlover/article/details/139180950

相关文章

  • 基于FPGA的4x4矩阵键盘驱动设计---第一版
    欢迎各位朋友关注“郝旭帅电子设计团队”,本篇为各位朋友介绍基于FPGA的4x4矩阵键盘驱动设计---第一版功能说明:1.驱动4x4矩阵键盘:按下任意一个按键,解析出对应按键信息,并给出标志 使用平台:纯代码形式使用语言:VerilogHDL 作者QQ:746833924说明:本篇设计中不涉及到IP和原语,......
  • (FPGA) XCKU15P-1FFVE1517E XCKU15P-3FFVE1517E XCKU15P-2FFVE1517E IC适用于智能IP集
    Kintex™UltraScale+™器件在FinFET节点中提供高性价比,为需要高端功能(包括33Gb/s收发器和100G连接内核)的应用提供了经济高效的解决方案。该中端产品系列同时支持数据包处理和DSP密集型功能,是无线MIMO技术、Nx100G有线网络、以及数据中心网络和存储加速等应用的理想选......
  • FPGA笔记[1]-在macOS烧录码流到开发板
    摘要在macOS使用oss-cad-suite工具烧录fs码流到Sipeed-Tang-Primer-20k开发板.关键信息系统macOS14.4.1,AppleSiliconM2开发板:Sipeed-Tang-Primer-20kFPGA芯片:GW2A-LV18PG256C8/I7(GW2A-18C-PBGA256)原理简介oss-cad-suite工具链简介[https://gitcode.com/YosysHQ/......
  • 在 20nm 提供高性能与集成的 (FPGA) XCVU095-H1FFVA2104E XCVU095-2FFVC2104E XCVU095
    产品优势Virtex™UltraScale™器件在20nm提供高性能与集成,包含串行I/O带宽和逻辑容量。作为在20nm工艺节点的业界仅有高端FPGA,此系列适合从400G网络到大型ASIC原型设计/仿真的应用。应用4x100G转发器400GMAC-InterlakenBridge2x100G复用转发器400GOTN交换......
  • 基于FPGA的电子琴设计(按键和蜂鸣器)----第一版
    欢迎各位朋友关注“郝旭帅电子设计团队”,本篇为各位朋友介绍基于FPGA的电子琴设计(按键和蜂鸣器)----第一版。功能说明:  外部输入七个按键,分别对应音符的“1、2、3、4、5、6、7”,唱作do、re、mi、fa、sol、la、si。当某个按键按下时,蜂鸣器发出对应的声音----1.默认发出0.2秒(可以调整)。......
  • 基于UltraScale架构的XCVU3P-3FFVC1517E XCVU3P-2FFVC1517I XCVU3P-1FFVC1517E高性能
    概述VirtexUltraScale+器件是基于14nm/16nmFinFET节点的高性能FPGA,支持3DIC技术和多种计算密集型应用。AMD第三代3DIC使用堆叠硅片互联(SSI)技术打破了摩尔定律的限制,并且实现了最高信号处理和串行I/O带宽,以满足最严格的设计要求。它还提供了一个虚拟的单片设......
  • 基于肤色模型的人脸识别FPGA实现,包含tb测试文件和MATLAB辅助验证
    1.算法运行效果图预览matlab2022a的测试结果如下:   vivado2019.2的仿真结果如下:   将数据导入到matlab中,   系统的RTL结构图如下图所示:   系统包括中值滤波,RGB转换为ycbcr,人脸检测三个模块 2.算法运行软件版本vivado2019.2 matlab2022a......
  • FPGA/EDA实验箱-竞赛普及版(ALTERA)
    型号:XQEP4CE-TEBV6.11、产品概述FPGA/EDA实验箱是一款FPGA教学实验系统,由FPGA开发板、显示屏、下载器、应用模块及相关实验配件组成;FPGA开发板采用底板+核心板的设计架构,核心板板采用是六层PCB设计,采用大容量管脚更多的BGA封装,F484封装,使整个核心板的性能和稳定性有了很大的提......
  • 基于FPGA的贪吃蛇游戏 之代码解析
    基于FPGA的贪吃蛇游戏之代码解析1. 代码结构代码结构包含7格.v文件。  下面依次解析。   2. 代码解析(1) seg_display.v数码管的译码模块是最熟悉,最简单的模块了。这里是共阳极的数码管,用case语句编码即可。从上图可以看到,这个模块被例化了3次,分别驱动3个数码......
  • m基于FPGA的MPPT最大功率跟踪算法verilog实现,包含testbench
    1.算法仿真效果其中Vivado2019.2仿真结果如下:   使用matlab进行显示如下:   2.算法涉及理论知识概要       在太阳能光伏系统中,最大功率点跟踪(MaximumPowerPointTracking,MPPT)是提高能量转换效率的关键技术之一。爬山法(HillClimbingAlgorithm,HCA)......