软件环境:vivado 2019.1 硬件平台:KCU105
我之前一直以为,SGMII只能走GT BANK使用SFP口,直到很偶然的情况下,我发现了居然在普通的BANK走LVDS也行,不信邪的我一直想要试一试,恰巧我的一个好哥们儿(无中生友…)手上就有一块KCU105,接下来就记录下整个调试过程。
在建立工程时候直接选择Board,然后搜索KCU105就行。
新建block design,因为是基于KCU105的模板工程,所以IP的设定有更简单的操作,在最上方选择board,将DDR4 SDRAM和UART依次拖到右侧block design中。
再加入microblaze核,添加好后,选择上方的run block automation进行参数设置。
接下来选择run connection automation进行连线,注意不要勾选microblaze下方相关接口。
电口 SGMII
接下来在左侧board选项卡中,将onboard PHY拖入右侧block design中,点击上方run block automation后,选择axi stream接口与DMA连接(官方推荐是接FIFO,但我是个传统的人,我就偏要接DMA)。
把生成好的axi_ethernet双击打开看了一眼,配置页确实有LVDS接口的选项,那难怪sgmii能走LVDS接口呢,属实是我自己没见过世面了。
之后继续点击上方run connection automation,勾选两个axi总线。
继续点击上方run connection automation,勾选DMA的3个接口和axi ethernet的axis_clk接口,注意,axis_clk时钟源选择ddr4出的100M的。
设置好后,这里有一个小问题如下图,sg_clk单独接到300M了,这里右键disconnect pin,将其与下方mm2s_aclk和s2mm_aclk接到一起。
再添加AXI_TIMER模块,一样run connection automation。
最后,将concat改为4口,将axi_ethernet、axi_dma、axi_timer中断与concat连接好后,整个block design为下方样子。
生成bitstream,导入sdk,建立lwip这个没什么特殊的,就不细说了,可以看到sgmii_lvds确实是没什么问题。
SFP SGMII
接下来说下我一直以为的SFP接口的SGMII怎么搞,这里先把刚才工程的axi_ethernet以及与此相连的接口删掉,然后在左侧board选项卡中,把PHY using SFP0拖到右侧block design中,选择sfp0 using mgt_si570_clk,GT时钟源由可编程时钟si570供。
这时候需要注意一下,双击打开axi_ethernet核,在physical interface选项卡中,将gt的参考时钟调整为125M,默认的是156.25M。
接下来点击最上方的run block automation,将axi_ethernet连接到axi_dma,由于刚才我只删了axi_ethernet,并没有动过axi_dma,所以这里不用再次添加,直接连就行了。
继续再点击run connection automation,勾选s_axi自动连接。
双击DDR4核,在advanced clocking页中,添加个50M时钟输出,并将这个50M的时钟,连接axi_ethernet的ref_clk。
添加constant核,输出1就行,连接到axi_ethernet的signal_detect。
最后,将axi_ethernet的interrupt接到concat上后,整个block design为下方样子。
接下来依旧是生成bitstream,导出到SDK,在板卡上电前,需要首先看下J6的这个SFP Enable的跳线帽插了没,插上SFP0才能用。
板子上电前把串口打开,一共能识别两个串口出来,选择增强串口用于参数板卡参数设定,波特率115200。
上电后,打印如下所示。
选择1,设置可编程时钟
选择7,看一下当前Si570可编程时钟输出频率,可以看到,默认的是156.25M
选择1,修改可编程时钟Si570输出频率
可以看到,可设定范围为10-810MHz,这里设置为125MHz
此时选7回读,看到125MHz,确定设置生效了
接下来可以将SDK程序进行加载了,可以将串口换到普通串口,波特率9600,能看到lwip加载时候的打印,加载起来后,可以看到ping也是没问题的,开个网口助手,192.168.1.10端口7,收发数据正常。