基于FPGA的光纤数据传输

项目简述

在这次的实验中我们主要学习SFP接口的使用,该接口是高速接口主要是使用GTP接口来完成的。本次项目的简述为,一块FPGA开发板通过光纤发送递增数据,另一块FPGA开发板通过光纤接收数据并且验证数据的正确性。本次实验所用到的软硬件环境如下:
1、VIVIADO 2019.1软件开发环境
2、米联客MA7035FA开发板
3、米联客MZ7015开发板

Aurora 8B10B的调用

我们接下来将对Aurora 8B10B IP进行讲解
在这里插入图片描述
1、传输数据的位宽,这里选择4Byte,也就是说IP的用户接口数据为32位宽
2、GTP接口的串行传输速率,GTP几口最大传输6.25Gbps,这里我们直接选择最大速率传输
3、Aurora 8B10B IP的GTP底层接口时钟,这个与FPGA开发板的GTP时钟有关,我使用的这两款开发板都是125MHz,所以我们这里选择125MHz
4、Aurora 8B10B IP的初始化时钟,我们选择50MHz
5、DRP时钟,我们在程序中没有用到DRP有关的操作,这里也给成50MHz
6、选择该Aurora 8B10B IP的通信模式,这里选择双工通信
7、数据传输的用户接口,我们这里使用简单的AXI4-stream数据接口
8、这里我们的数据使用小端模式。
大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。
小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。
在这里插入图片描述
1、这个按照GTP口的顺序进行选择,该款FPGA一共4对GTP接口,从左下角逆时针循环时0,1,2,3。具体选择哪一个看FPGA开发板上面的GTP接口使用的第几对。
在这里插入图片描述
1、这里我们只使用1个IP核,不使用示例工程,所以我们选择第一个
2、我们这个IP核的初始化时钟是单端信号,参考时钟是双端时钟,进行相应的选择。

Aurora 8B10B接口的描述

接下来我们对我们使用的Aurora 8B10B接口进行简单的描述。

aurora_8b10b_0 your_instance_name (
  .s_axi_tx_tdata               (s_axi_tx_tdata                 ),        // input wire [31 : 0] s_axi_tx_tdata
  .s_axi_tx_tvalid              (s_axi_tx_tvalid                ),      // input wire s_axi_tx_tvalid
  .s_axi_tx_tready              (s_axi_tx_tready                ),      // output wire s_axi_tx_tready
  .m_axi_rx_tdata               (m_axi_rx_tdata                 ),        // output wire [31 : 0] m_axi_rx_tdata
  .m_axi_rx_tvalid              (m_axi_rx_tvalid                ),      // output wire m_axi_rx_tvalid
  .hard_err                     (hard_err                       ),     // output wire hard_err
  .soft_err                     (soft_err                       ),     // output wire soft_err
  .channel_up                   (channel_up                     ),       // output wire channel_up
  .lane_up                      (lane_up                        ),  // output wire [0 : 0] lane_up
  .txp                          (txp                            ),     // output wire [0 : 0] txp
  .txn                          (txn                            ),     // output wire [0 : 0] txn
  .reset                        (reset                          ),     // input wire reset
  .gt_reset                     (gt_reset                       ),     // input wire gt_reset
  .loopback                     (loopback                       ),     // input wire [2 : 0] loopback
  .rxp                          (rxp                            ),      // input wire [0 : 0] rxp
  .rxn                          (rxn                            ),      // input wire [0 : 0] rxn
  .drpclk_in                    (drpclk_in                      ),  // input wire drpclk_in
  .drpaddr_in                   (drpaddr_in                     ),// input wire [8 : 0] drpaddr_in
  .drpen_in                     (drpen_in                       ),    // input wire drpen_in
  .drpdi_in                     (drpdi_in                       ),    // input wire [15 : 0] drpdi_in
  .drprdy_out                   (drprdy_out                     ),// output wire drprdy_out
  .drpdo_out                    (drpdo_out                      ),  // output wire [15 : 0] drpdo_out
  .drpwe_in                     (drpwe_in                       ),    // input wire drpwe_in
  .power_down                   (power_down                     ),// input wire power_down
  .tx_lock                      (tx_lock                        ),    // output wire tx_lock
  .tx_resetdone_out             (tx_resetdone_out               ),       // output wire tx_resetdone_out
  .rx_resetdone_out             (rx_resetdone_out               ), // output wire rx_resetdone_out
  .link_reset_out               (link_reset_out                 ),     // output wire link_reset_out
  .init_clk_in                  (init_clk_in                    ),       // input wire init_clk_in
  .user_clk_out                 (user_clk_out                   ),     // output wire user_clk_out
  .pll_not_locked_out           (pll_not_locked_out             ),    // output wire pll_not_locked_out
  .sys_reset_out                (sys_reset_out                  ),    // output wire sys_reset_out
  .gt_refclk1_p                 (gt_refclk1_p                   ),      // input wire gt_refclk1_p
  .gt_refclk1_n                 (gt_refclk1_n                   ),      // input wire gt_refclk1_n
  .sync_clk_out                 (sync_clk_out                   ),      // output wire sync_clk_out
  .gt_reset_out                 (gt_reset_out                   ),            // output wire gt_reset_out
  .gt_refclk1_out               (gt_refclk1_out                 ),        // output wire gt_refclk1_out
  .gt0_pll0refclklost_out       (gt0_pll0refclklost_out         ),  // output wire gt0_pll0refclklost_out
  .quad1_common_lock_out        (quad1_common_lock_out          ),    // output wire quad1_common_lock_out
  .gt0_pll0outclk_out           (gt0_pll0outclk_out             ),     // output wire gt0_pll0outclk_out
  .gt0_pll1outclk_out           (gt0_pll1outclk_out             ),     // output wire gt0_pll1outclk_out
  .gt0_pll0outrefclk_out        (gt0_pll0outrefclk_out          ),    // output wire gt0_pll0outrefclk_out
  .gt0_pll1outrefclk_out        (gt0_pll1outrefclk_out          )    // output wire gt0_pll1outrefclk_out
);

1、s_axi_tx_tdata、s_axi_tx_tvalid、s_axi_tx_tready、m_axi_rx_tdata、
m_axi_rx_tvalid信号:AXI4-stream协议的信号,具体的时序要求可以查找一下该协议特别容易理解,如果同学们对这个协议不熟悉,一定要学完这个协议继续学习。
2、hard_err 、soft_err信号:Aurora 8B10B IP硬件、软件出错的提示信号。
3、channel_up 、lane_up信号:两个Aurora 8B10B IP的初始化完成信号,只有将两个信号拉高之后,我们才可以进行进一步的操作。
4、txp、txn信号:GTP的写差分接口,也就是我们绑引脚的接口。
5、reset、gt_reset信号:分别是Aurora 8B10B IP与GTP接口的复位信号,高有效,通常先复位reset再复位gt_reset,高电平复位。这里需要注意的是Aurora 8B10B IP在正常使用前一定要复位一段时间。
6、loopback信号:环回[2:0]端口在收发机的正常工作和不同的环回模式之间进行选择,这里我们默认为 0。在这里插入图片描述
7、rxp、rxn信号: GTP的读差分接口,也是我们绑引脚的接口。
8、drpclk_in、drpaddr_in、drpen_in、drpdi_in、drprdy_out、drpdo_out、drpwe_in信号:DRP相关信号,与资源分配相关一般用不到,时钟连接定制IP时选择的50MHz时钟,其余的信号输入写0输出忽视即可。
9、power_down信号:掉电信号,1表示IP掉电,正常工作的情况下该位是0信号。
10、init_clk_in信号:Aurora 8B10B IP的初始化时钟信号。
11、user_clk_out信号:用户操作的时钟信号也就是前面AXI4-stream信号的时钟信号,所有的数据操作都是在这个时钟域里面完成的。
其余的输出我们这里用不到也就不进行详细的详解,感兴趣的同学可以查阅技术手册。

光纤项目的代码设计

MZ7015开发板工程

gtp_top模块:

`timescale 1ns / 1ps
// *********************************************************************************
// Project Name : OSXXXX
// Author       : zhangningning
// Email        : nnzhang1996@foxmail.com
// Website      : 
// Module Name  : gtp_top.v
// Create Time  : 2019-12-01 14:20:41
// Editor       : sublime text3, tab size (4)
// CopyRight(c) : All Rights Reserved
//
// *********************************************************************************
// Modification History:
// Date             By              Version                 Change Description
// -----------------------------------------------------------------------
// XXXX       zhangningning          1.0                        Original
//  
// *********************************************************************************

module gtp_top(
        input                   GTPQ0_P         ,
        input                   GTPQ0_N         ,
        output  wire            txp             ,
        output  wire            txn             ,
        input                   rxp             ,
        input                   rxn             ,
        input                   sclk            ,
        output  wire            sfp_tx_disable                 
);
 
//========================================================================================\
//**************Define Parameter and  Internal Signals**********************************
//========================================================================================/
reg         [31:0]          s_axi_tx_tdata      ;
reg                         s_axi_tx_tvalid     ;
wire                        s_axi_tx_tready     ;<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值