根据此系列的文章(一)以太网知识补给和文章(二)IP核配置,本次设计的逻辑框架如下,User Logic是需要我们编写代码,1G/2.5G Ethernet是我们配置的IP核,它们之间通过GMII接口通信;Transceiver也是IP核内部用来并转串的连接方式,最后GBIC or SFP为FPGA外部连接的PHY芯片,它们之间通过GT收发器接口通信(高速接口)。
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)接口选择性的使用,在使用接口的时候,多关注这几个信号:数据,使能,时钟,复位,以及配置(回环测试还是外接)和状态(链路状态)这些接口。
本次设计我们只做仿真,因此需要配置回环模式即将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博客
下一节,将会做实例仿真。
记录美好学习,从总结开始;