<p>作者:咸鱼FPGA,文章来源:<span id="profileBt"><a href="https://mp.weixin.qq.com/s?__biz=MzUyODUwMDExOQ==&mid=2247485911&am…开源工作室</a></span></p>
<strong>一、项目概况</strong>
1、项目流程图
<center><img src="http://xilinx.eetrend.com/files/2020-04/%E5%8D%9A%E5%AE%A2/100048959-96…; alt=""></center>
2、模块说明:
PC:个人电脑,有网线插槽的即可
RJ45接口:板卡上的网线插槽
PHY芯片:板卡上的以太网芯片,输入4对差分信号,转换为输出双沿4bit数据信号
FPGA:现场可编程逻辑门阵列,主控制器
DDR3芯片:第三代同步动态随机存取内存芯片,之前学过了
HDMI接口:高清多媒体接口,之前学过了
3、项目说明:
电脑上位机将一幅 1024*768 图片通过双绞线(网线),发送给板卡网口(RJ45接口),RJ45接口将数据传输给网卡(PHY芯片),PHY 芯片将差分信号转换成双沿数据,IDDR将双沿数据转换成单沿数据传输给 FPGA,FPGA 处理完成后将图像数据缓存到DDR3 中,DDR3 中的图像数据使用 UDP 协议传回 PC 机,同时将 DDR3 中数据使用 HDMI 传输到显示器上。
<strong>二、PHY芯片</strong>
详情参考 VSC8601-DS-r41-VMDS-10210 文档,该文档可以在 Xilinx 官网中下载。
1、以太网和 RJ45 接口
以太网是一种产生较早,使用相当广泛的局域网。分类标准有标准以太网(10Mbit/s),快速以太网(100Mbit/s)和千兆以太网(1000Mbit/s)。随着以太网技术的飞速发展,市场上也出现了万兆以太网其技术支持10Gbit/s的传输速率。以太网连接端口:常见的以太网接口类型有RJ45接口,RJ11接口。SC光纤接口等。其中RJ45接口是我们常见的网络设备接口。
<center><img src="http://xilinx.eetrend.com/files/2020-04/%E5%8D%9A%E5%AE%A2/100048959-96…; alt=""></center>
RJ45接口定义以及各引脚功能说明如下图所示,在以太网中只使用了1、2、3、6这四根线,其中1、2这组负责传输数据(TX+、TX-),而3、6这组负责接收数据(RX+、RX-),另外四根线是备用的。
<center><img src="http://xilinx.eetrend.com/files/2020-04/%E5%8D%9A%E5%AE%A2/100048959-96…; alt=""></center>
总的来说,这一块部分知道即刻,不需要我们自己设计代码。
2、PHY 芯片介绍:
本项目使用 VITESSE VSC8601 网卡芯片,该芯片支持 10/100/1000 BASE-T,常用的网卡芯片有 VITESSE、高通等公司产品,该芯片通称为 PHY 芯片。该芯片与我们电脑、FPGA、MCU 等微处理器通信必须遵循 RGMII 协议。
<center><img src="http://xilinx.eetrend.com/files/2020-04/%E5%8D%9A%E5%AE%A2/100048959-96…; alt=""></center>
3、PHY 芯片配置
①SMI串行管理接口
VSC8601 设备包含一个 IEEE 802.3 兼容的串行管理接口(SMI),其中 MDC 和 MDIO 可对该芯片进行控制。SMI 提供了访问权限设备控制和状态寄存器。控制 SMI 的寄存器集由 32 个 16 位寄存器组成,包括所有需要的 IEEE 指定寄存器。此外,通过设备寄存器 31 可以访问寄存器的附加寄存器。SMI 是一个同步串行接口,其配置方式和 IIC 类似,MDIO 引脚具有有双向数据,在 MDC 信号的上升边缘上采集。MDC 采集速度应在 0 MHz 到 25mhz。数据通过 SMI 使用具有可选和任意长度前导的 32 位帧传输,下图(文档26页)显示了用于读操作和写操作的SMI框架格式。
<center><img src="http://xilinx.eetrend.com/files/2020-04/%E5%8D%9A%E5%AE%A2/100048959-96…; alt=""></center>
由图可以看到 PHY Address 有 A0 - A4 共 5 bit,故一个处理器最多可以挂载这样的 PHY 芯片 2^5=32 个。用户可通过配置 PHY Address 或 Resgister Address 将该芯片按需配置。
②配置引脚和设备功能表(文档64页)
<center><img src="http://xilinx.eetrend.com/files/2020-04/%E5%8D%9A%E5%AE%A2/100048959-96…; alt=""></center>
③相关引脚的功能,用于解释上表(文档65页)
<center><img src="http://xilinx.eetrend.com/files/2020-04/%E5%8D%9A%E5%AE%A2/100048959-96…; alt=""></center>
④电阻对应 Pin 值表(文档66页)
<center><img src="http://xilinx.eetrend.com/files/2020-04/%E5%8D%9A%E5%AE%A2/100048959-96…; alt=""></center>
⑤PHY芯片配置
结合上面的表和 PHY 芯片的板卡原理图,即可确定出 CMODE Pin 的具体值了。
<center><img src="http://xilinx.eetrend.com/files/2020-04/%E5%8D%9A%E5%AE%A2/100048959-96…; alt=""></center>
<center><img src="http://xilinx.eetrend.com/files/2020-04/%E5%8D%9A%E5%AE%A2/100048959-96…; alt=""></center>
<strong>三、PHY芯片的初始化和RGMII协议</strong>
1、PHY 芯片初始化
VSC8601 芯片上电后需要进行复位配置,该芯片复位信号需要在上电保持一段时间后才能将复位信号置为高,否则 PHY 芯片不会工作,其配置过程如图(文档79页)所示。PHY 的复位信号引脚和 FPGA 相连,当上电后至少经过 4ms 以上才可以将 PHY 芯片复位引脚置高,这样就完成 PHY 芯片初始化了,还是蛮简单的。
<center><img src="http://xilinx.eetrend.com/files/2020-04/%E5%8D%9A%E5%AE%A2/100048959-96…; alt=""></center>
2、PHY芯片的RGMII协议
RGMII协议是PHY芯片和FPGA芯片之间的传输协议。RGMII 是 Reduced GMII(吉比特介质独立接口)。RGMII 均采用 4bit 数据接口,工作时钟 125MHz,并且在上升沿和下降沿同时传输数据,数据传输速率可以达到4*125*2=1000Mbps。同时兼容 MII 所规定的 10/100 Mbps 工作方式,支持传输速率:10M/100M/1000Mb/s ,其对应 clk 信号分别为:2.5MHz/25MHz/125MHz。RGMII 数据结构符合 IEEE 以太网标准,接口定义见 IEEE 802.3-2000。
PHY 芯片与 FPGA 数据交互的端口有:发射端、接收端及HPY 的复位端口。发射端和接收端分别有 6 个引脚与 FPGA 相连,分别有一个时钟引脚、一个数据控制使能引脚,四个数据引脚。而我们想要达到 1.0Gb/s 带宽,HPY 对应时钟为 125MHZ,若为单沿采样那么带宽为 125M/s*4=500Mb/s,及达不到 1.0Gb/s,在原有的硬件基础上想要使用 125M 时钟产生带宽为 1.0Gb/b,那么需要双沿控制采样数据,及时钟上升沿 4bit 下降沿 4bit,带宽为125M/s*4*2=1000Mb/s=1.0 Gb/b。该协议为 RGMII(Reduced Gigabit Media Independent Interface)。RGMII 均采用 4 位数据接口,工作时钟 125MHz,并且在上升沿和下降沿同时传输数据,因此传输速率可达 1000Mbps。RGMII 无补偿工作时序如图(文档81页)所示。
<center><img src="http://xilinx.eetrend.com/files/2020-04/%E5%8D%9A%E5%AE%A2/100048959-96…; alt=""></center>
观察图中 RX_CLK(at Transmitter) 和 RX_CLK(at Receiver),RX_CLK(at Transmitter)为 HPY 时钟,在上升沿时对应输出数据为 RXD[3:0] 和 RXDV,在下降沿时对应出数据为 RXD[7:4] 和 RXERR,及一个时钟周期对应 8bit 数、一个有效使能和一个错误信号。RX_CLK(at Receiver) 是在 RX_CLK(at Transmitter) 的基础上相移 90°左右而得,这样采集到的数据会更加稳定。
<strong>四、IDDR原语</strong>
PHY 传输的数据为双沿数据,通常 FPGA 处理的为单沿数据,所以FPGA 接收到图像信息包后首先需要使用 IDDR 原语将双沿数据转换为单沿数据。通常情况下 FPGA 处理数据使用的时钟为晶振产生的时钟(FPGA 时钟),而 PHY 传输来的数据以及经过IDDR 原语后转换为单沿的数据都是和 PHY 的时钟同步,所以我们如果想使用 FPGA 时钟作为后续的图像数据处理必须要进行跨时钟域,将 PHY 时钟同步的数据转换为 FPGA 时钟同步的数据。此处双沿转单沿数据采用 Input DDR 原语,简称 IDDR,将双沿 4bit 数据转换为单沿 8bit 数据。
IDDR原语参考 7 Series FPGAs SelectIO Resources 文档和 Xilinx 7 Series FPGA Libraries Guide for HDL Designs 。
1、IDDR原语获取途径
<center><img src="http://xilinx.eetrend.com/files/2020-04/%E5%8D%9A%E5%AE%A2/100048959-96…; alt=""></center>
2、IDDR原语接口和属性(文档111页)
D 为数据输入,CE 为 IDDR 工作使能,C 为时钟,S 和 R 分别为置位和复位。
<center><img src="http://xilinx.eetrend.com/files/2020-04/%E5%8D%9A%E5%AE%A2/100048959-96…; alt=""></center>
<center><img src="http://xilinx.eetrend.com/files/2020-04/%E5%8D%9A%E5%AE%A2/100048959-96…; alt=""></center>
<center><img src="http://xilinx.eetrend.com/files/2020-04/%E5%8D%9A%E5%AE%A2/100048959-96…; alt=""></center>
3、IDDR原语工作模式(文档110页)
IDDR 有三种工作模式,模式配置如下图所示,分别为:OPPOSITE_EDGE、SAME_EDGE 、SAME_EDGE_PIPELINED。
<center><img src="http://xilinx.eetrend.com/files/2020-04/%E5%8D%9A%E5%AE%A2/100048959-96…; alt=""></center>
<center><img src="http://xilinx.eetrend.com/files/2020-04/%E5%8D%9A%E5%AE%A2/100048959-96…; alt=""></center>
<center><img src="http://xilinx.eetrend.com/files/2020-04/%E5%8D%9A%E5%AE%A2/100048959-96…; alt=""></center>
通过对比三图差异,结合本项目平台选择模式:SAME_EDGE_PIPELINED。因为时钟上升沿和下降沿各对应一个数据,那么千兆以太网数据传输:0bit 和 4bit 为一组,1bit 和 5bit 为一组,2bit 和 6bit 为一组,3bit 和 7bit 为一组。
4、IDDR双沿数据转单沿数据使用方式
根据硬件电路图,PHY 传输给 FPGA 有一条时钟线、一条使能线和四条数据线,其中使能线和数据线都为双沿数据。一条使能线包含了 DV 和 ERR,其中上升沿传输的是 DV 信号(即数据有效信号),下降沿传输的为 ERR 信号(即数据出错信号,通常情况下不考虑 ERR,ERR 是由硬件引起,和软件无关);四条数据线包含了一个始终 8bit 数据,其中上升沿传输的是 8bit 数据中的[3:0],下降沿传输的是 8bit 数据中的[7:4]。 我们采用 IDDR 原语将双沿 4bit 数据转换为 8bit 数据,同时将 8bit 数据对应有效 DV 信号提取。那么可以建立实现双沿转单沿功能的模块:iddr_ctrl,其中输入与输出关系图如下所示。PHY 芯片传输来的 phy_rxd 和 phy_rx_ctl 都和 PHY 的时钟同步。图中 phy_rx_clk_90 为输入的时钟信号是 PHY 时钟相移90度后形成的,目的是采集 phy_rx_rxd 和 phy_rx_ctl 更稳定,rx_data 和 rx_en 即为该模块输出的单沿 8bit 数据和对应的数据有效使能。
<center><img src="http://xilinx.eetrend.com/files/2020-04/%E5%8D%9A%E5%AE%A2/100048959-96…; alt=""></center>
千兆以太网数据传输经过 IDDR 后 8bit 数据 rx_data 与使能 rx_en 对应关系如下图所示。
<center><img src="http://xilinx.eetrend.com/files/2020-04/%E5%8D%9A%E5%AE%A2/100048959-96…; alt=""></center>
通过图可以看出,IDDR 时钟上升沿采集的 phy_rx_crl 信号为 EN(DV),代表数据有效,下降沿采集的为 ERR,代表数据错误,本项目此处不考虑错误信号,最终从 IDDR 输出的 rx_en 信号正好和拼接完成后的 rx_data 数据对应,即可作为 8bit 数据有效使能。
<strong>五、上板验证</strong>
代码写好后注意一下,前面说过 PHY 芯片初始化必须满足当上电后至少经过 4ms 以上才可以将 PHY 芯片复位引脚置高,因此顶层必须设置一下 PHY 芯片的复位引脚,该信号通过延时 4ms 即可产生,有了这个信号,PHY 芯片才能工作起来。
//延时 4ms 后启动 phy_rst_n
always @(posedge sclk) begin
if(rst) begin
phy_rst_cnt <= 'd0;
end
else if(phy_rst_cnt[18]==1'b0) begin
phy_rst_cnt <= phy_rst_cnt + 1'b1;
end
end
assign phy_rst_n = phy_rst_cnt[18];
这次实验较简单,看不到任何现象,可以先生成一个 ila,将 rx_data 和 rx_en 放进去以待观察,最后不要忘记绑定引脚哦。生成bit文件后下载到板卡上,板卡上的网口和电脑网口连接,点击电脑中的 以太网设置 --- 更改适配器选项,即可看到网卡正常工作起来。
<center><img src="http://xilinx.eetrend.com/files/2020-04/%E5%8D%9A%E5%AE%A2/100048959-96…; alt=""></center>
查看 ila,将 rx_en 的上升沿作为触发信号,得到如下波形:
<center><img src="http://xilinx.eetrend.com/files/2020-04/%E5%8D%9A%E5%AE%A2/100048959-96…; alt=""></center>
<center><img src="http://xilinx.eetrend.com/files/2020-04/%E5%8D%9A%E5%AE%A2/100048959-96…; alt=""></center>
如图可以观察到,千兆以太网数据以包为单位发送,每次发送有一定的数据,并且在每次发送前都会先发送 7 个 0x55 和 1 个 0xd5 作为包的针头,如果是这样的波形,那么表明此次试验设计成功。
参考资料:威三学院FPGA教程