FPGA平台以太网学习:涉及1G/2.5G Ethernet 和Tri Mode Ethernet MAC两个IP核的学习记录(三)——接口与框架

文章目录

  • 一、 IP核接口介绍
  • 二、 框架搭建

学习不能稀里糊涂,要学会多思考,发散式学习以及总结:
  FPGA作为一种器件,只是实现目的的一种方法,过度追求实现的技术细节(用hdl还是hls,用啥芯片,用啥接口)容易只见树木不见森林。工具软件的用法也好,器件的架构也好,语言孰优孰劣的争论也罢。工程应用里大概更多应该去考虑适合的实现方式,现在software define network/flash/xxx,已然大势所趋,算法是纲,纲举目张。是因为在实现上需要有流水线,多路并行,快速部署的目的所以考虑使用FPGA,而不是为了使用而使用。
  不管实现目的的方法是FPGA还是DSP甚至是GPU,这些都是工具,工程师的核心竞争力除了在于熟练地掌握开发的技巧。更重要的在于信号与系统、数字信号处理、图像处理之类的让你了解算法、优化算法的基石;以及数字电路、微机原理、处理器体系结构这些让你了解为什么这些工具要这样设计,要这样发展的课程(系统学习一点体系结构,那么这些数据级并行、指令级并行、线程级并行的处理器就不再陌生了)工程师应该顶天(了解应用,了解算法)也应该立地(了解工具,掌握技巧)。
                   ——引用某个大佬的话,作为学习共勉
  简单来说就是:FPGA是工具用来搬砖,更多的知识在FPGA之外

一、 IP核接口介绍

  根据此系列的文章(一)以太网知识补给和文章(二)IP核配置,本次设计的逻辑框架如下,User Logic是需要我们编写代码,1G/2.5G Ethernet是我们配置的IP核,它们之间通过GMII接口通信;Transceiver也是IP核内部用来并转串的连接方式,最后GBIC or SFP为FPGA外部连接的PHY芯片,它们之间通过GT收发器接口通信(高速接口)。
FPGA平台以太网学习:涉及1G/2.5G Ethernet 和Tri Mode Ethernet MAC两个IP核的学习记录(三)——接口与框架_第1张图片
  FPGA程序是我们着重编写的是User Logic这一块,IP核会用接口就行,本章将先讲一下我们在(二)中配置的IP核后生成的接口。

gig_ethernet_pcs_pma_0 your_instance_name (
  //GT高速收发器的差分时钟
  .gtrefclk_p(gt_clk_p),                          // input wire gtrefclk_p                125 MHz差分参考时钟。由外部直接接入,时钟质量高
  .gtrefclk_n(gt_clk_n),                          // input wire gtrefclk_n                125 MHz差分参考时钟。
  //以下两个IP输出的125Mhz参考时钟未用到
  .gtrefclk_out(),                                    // output wire gtrefclk_out                      
  .gtrefclk_bufg_out(),                               // output wire gtrefclk_bufg_out                       
  //GT高速收发器的接口,FPGA外接接口,与外部的光口SFP进行通信(IP核配置1000BASEX)
  .txn(o_txn),                                        // output wire txn                 差分串型高速GT收发器数据接口            
  .txp(o_txp),                                        // output wire txp                 从PMA到PMD的串行传输的差分               
  .rxn(i_rxn),                                        // input wire rxn                  从PMD到PMA的串行传输的差分               
  .rxp(i_rxp),                                        // input wire rxp                                  
  .independent_clock_bufg(i_independent_clock_bufg),  // input wire independent_clock_bufg 一个独立的时钟源,用作IDELAYCTRL(如果存在)和主GT收发器复位逻辑的参考时钟,200Mhz。
  //以下信号为IP核输出信号(选择性使用)
  .userclk_out(),                        // output wire userclk_out                        62.5Mhz                        
  .userclk2_out(o_userclk2_125),         // output wire userclk2_out                       用户时钟(125M),GMII接口的时钟源,IP配置的时候采用txoutclk,gmii的收发均采用此时钟,    
  .rxuserclk_out(),                    // output wire rxuserclk_out                        62.5Mhz
  .rxuserclk2_out(),                  // output wire rxuserclk2_out                        62.5Mhz。   IP配置的时候采用rxoutclk时,此接口输出125Mhz,例程的gmii收采用此时钟,发采用userclk2_out
  .resetdone(),                            // output wire resetdone                        最好使用同一个时钟源作为收发的时钟,所以IP的gmii时钟源采用txoutclk。
  .pma_reset_out(),                    // output wire pma_reset_out                    
  .mmcm_locked_out(),                // output wire mmcm_locked_out                         
  //用户端(客户端MAC层)接口,通过GMII接口与以太网IP核进行数据通信,从客户端(MAC层)发送给PMA
  .gmii_txd(i_gmii_txd),                              // input wire [7 : 0] gmii_txd        发送数据      
  .gmii_tx_en(i_gmii_tx_en),                          // input wire gmii_tx_en              发送数据使能 
  .gmii_tx_er(i_gmii_tx_er),                          // input wire gmii_tx_er              发送数据错误使能                       
  .gmii_rxd(o_gmii_rxd),                              // output wire [7 : 0] gmii_rxd       接收数据         
  .gmii_rx_dv(o_gmii_rx_dv),                          // output wire gmii_rx_dv             接收数据使能         
  .gmii_rx_er(o_gmii_rx_er),                          // output wire gmii_rx_er             接收数据错误使能                          
  .gmii_isolate(),                      // output wire gmii_isolate                         不需要                    
  .configuration_vector(5'b00010),      // input wire [4 : 0]                               用于配置IP核状态,00010为内循环(仿真使用),00000为正常外接(与其他设备通信使用)
  .status_vector(o_status_vector),                    // output wire [15 : 0] status_vector 最低位判断链路状态,0位为1表示以太网链路建立,为0则未建立建立链路
  .reset(i_sys_rst),                                    // input wire reset                 IP核的复位信号。高电平有效
  .signal_detect(1'b1),                    // input wire signal_detect                      逻辑1指示正确检测光学模块;直接拉高即可
  //一下两个为gt引出来PLL产生的时钟,不需要用
  .gt0_qplloutclk_out(),                              // output wire gt0_qplloutclk_out                                   
  .gt0_qplloutrefclk_out()                            // output wire gt0_qplloutrefclk_out                           
    );

以上是设置完IP后生成的接口以及注释。
简单总结下学习IP核时候的要点:
   1、 通过对应IP的文档进行接口学习,如何找到相应的文档,可以参考以下文章:
vivado的DocNav学习;FPGA芯片外挂DDR个数_FPGA_青年的博客-CSDN博客
   2、 还可以通过打开IP核的官方列子进行学习,例子中用到的接口讲解也有帮助:

   3、 输入(input)接口必须需要接入信号,输出(output)接口选择性的使用,在使用接口的时候,多关注这几个信号:数据,使能,时钟,复位,以及配置(回环测试还是外接)和状态(链路状态)这些接口。

二、 框架搭建

FPGA平台以太网学习:涉及1G/2.5G Ethernet 和Tri Mode Ethernet MAC两个IP核的学习记录(三)——接口与框架_第2张图片

   本次设计我们只做仿真,因此需要配置回环模式即将configuration_vector接口配置为(5’b00010),相当于将TXP与RXP相连,TXN和RXN相连。
   数据发送:将产生的数据,使能在同一时钟下发送出去;
   写FIFO:数据产生用的是一个时钟,将数据发送给以太网IP核,采用的是GMII接口,因此需要使用GMII的时钟,才能将数据送入IP核,再做并转串通过GT收发器送出数据给外部。FIFO的作用:异步时钟,不同位数间转换。
   以太网IP:将数据链路层(MAC层)组帧的数据,通过GMII接口发送给PMA层(属于PHY层中一层),再通过内部并转串的方式,将数据通过GT高速收发器进行数据收发。
   数据接收和读FIFO同理。
   我们之前看到的都是MAC->PHY->RJ45,采用的不是高速接口(例如Tri Mode Ethernet MAC IP核),它的MAC层就是FPGA。但是在这里使用的1G/2.5G Ethernet以太网IP核采用的是GT高速收发器是串型接口,它是将PHY层中的PMA层放在FPGA中,此时的FPGA相当于是MAC层+PMA层。关于这部分知识,大家可以参考以下文章:
添加链接描FPGA平台以太网学习:涉及1G/2.5G Ethernet 和Tri Mode Ethernet MAC两个IP核的学习记录(二)——IP学习使用_FPGA_青年的博客-CSDN博客述
FPGA平台以太网学习:MAC与PHY间通信_FPGA_青年的博客-CSDN博客

下一节,将会做实例仿真。

记录美好学习,从总结开始;

你可能感兴趣的:(学习记录,FPGA,fpga开发)