背景
在调试的FPGA板子的过程中,常碰着的BUG分为两类,功能性BUG和时序BUG。
第一种是功能性的,仿真一下就能查到缘故原由,并且这类问题每每是确定性的,也随意马虎重现和解决,比如本"大众年夜众号之前先容的搭建仿真环境的一些方法:Modelsim的安装与利用,用Modelsim独立仿真带Vivado IP核的仿真工程,如何用ModelSim 独立仿真ISE的仿真工程。这类问题中轻微有难度的便是仿真环境不随意马虎重现的,或者须要跑很永劫光仿真才能重现的,这一类问题本"大众年夜众号之前先容过一种办理方案,详见:Vivado进行FPGA调试“犯罪现场”,在仿真环境中重现方法;
另一种便是时序问题,时序问题是由于电路构造设计的不合理导致(比如用软件的思想去写电路,这就必须养成良好的硬件措辞代码规范习气,详见:干货!
Verilog HDL初设计把稳事变,Verilog HDL描述的组合逻辑环在FPGA实现时到底有什么问题?),这类BUG每次涌现的征象每每都不一样,比如跨时钟域引起的不稳定等问题(办理办法拜会:跨时钟域旗子暗记的处理方法)。
时序问题中每每以接口上的时序问题最为常见。而接口上的时序问题也常常分为两种,一种是驱动能力问题,另一种是时延问题。
驱动能力的问题也常常遇见,比如做AFDX或者TTE等双冗余可靠的网络是,常常须要一个对RGMII的网口进行冗余备份。这是如果直接采取连线的办法把一个网口的旗子暗记同时又连到其余一个网口上,这是常见的问题是一个网口可以稳定的收发数据,另一个网口则会涌现不稳定的状态,比如无法正常收发数据或者丢帧等。这个问题便是范例的驱动不敷的问题。Xilinx FPGA在办理驱动能力不敷导致的问题时采取的是添加BUFIO的方法,对输入管脚进来旗子暗记都让其经由一级IDDR后再进来,对要输出的旗子暗记则让其经由一级ODDR后再输出。如下面两图所示。
另一种时序问题则是最常见的问题,一样平常是通过TCL脚本的约束文件来处理,但有时候脚本的掌握能力有限,此时就须要通过添加Xilinx的IODELAY核来调度时序,本文以Xilinx开拓板上常见的FMC扩展接口为例进行解释时序问题的处理。
VC709本身并不具有以太网接口,须要通过FMC扩展板转接得到以太网接口,VC709如图1所示(图1中红框为FMC接口),MeshSR四端口以太网扩展板如图2所示。
MeshSR四端口以太网扩展板板载一片四端口博通以太网PHY芯片,型号为BCM5464SR,通过扩展板FMC接口与VC709连接,并供应4个RGMII接口。
图1 VC709评估板
图2 MeshSR四端口以太网扩展板
问题及剖析
搭建VC709+MeshSR扩展板硬件平台,并加载MAC核自回环程序,利用TestCenter打流(每个帧完备一样且速率恒定),TestCenter显示无精确数据帧吸收,不雅观察征象,创造如下结果:
(1) 不雅观察TestCenter结果界面,创造收到的缺点数据帧的数量与发送数据帧数量同等,解释没有丢包,但是数据包全都错了;
(2) 利用Wireshark加载TestCenter数据包缓存中的数据包(吸收到的数据包),创造吸收到的错包都是一样的(与发送的数据帧一样相对应),解释缺点产生是很规律的;
(3) 利用嵌入式逻辑剖析仪抓取FPGA内部吸收和发送的数据帧旗子暗记,创造FPGA吸收到的数据帧(实在也是FPGA发送的数据帧)与TestCenter吸收到的数据帧完备一样,解释RGMII接口发送没有问题;
(4) 比拟TestCenter发出的帧与收到的帧,创造存在旗子暗记错位征象。
综合上面四点,预测是扩展板供应给VC709的RGMII接口,吸收部分存在时序问题,导致被采样旗子暗记无法对齐,进而导致FPGA内部抓取的旗子暗记全都是错的。
以图3举例解释。Data是一条四位的数据总线,在时钟上升沿处(赤色箭头处),其值该当为4‘b1111,但是由于PCB走线的缘故原由,Data[1]延迟比其他三条内部连接线大,导致时钟上升沿处的采样结果为4’b1101,发生采样缺点。
但是须要把稳到,图3中蓝线位置四条连接线的值都是对的,如果给Data 总线人为地加入一些延迟,使时钟上升沿与蓝线位置对齐,那么采样得到的值便是对的。这便是下面的办理办法。
图3 采样错乱问题示例
办理思路
在上一节我们说道,可以人为地给Data总线添加一个固定且眇小的延迟,使得时钟采样时(之以是说眇小,是由于该延迟小于一个时钟,每每在几百皮秒到几纳秒之间),采到Data总线精确的位置,那么采样错乱的问题就可以办理。
加入延迟须要利用一个原语,即IODELAYE1,如图4所示,其各个端口的功能如图5所示。
图4 IODELAYE1原语
图5 IODELAYE1 接口旗子暗记
个中,旗子暗记C为该原语参考时钟,为延迟供应参考基准(一个标准延迟叫做一个tap),tap与参考时钟频率之间的关系是
,个中f为参考时钟频率从;CNTVALUEIN为5位旗子暗记,取值在0到31之间,该旗子暗记表示加入几个标准延迟。
举个例子,如果参考时钟频率为200MHz,则tap=78ps;300MHz,tap=52ps;400MHz,tap=39ps;125MHz,125ps;72.5MHz,216ps;如果CNTVALUEIN为0,则不加入延迟,如果该值为31,则加入31个tap大小的延迟。
上图中IODELAY的时延值采取VIO的方法可以在线调度,VIO的方法详见文章:利用VIVADO中VIO仿照CPU接口进行在线寄存器读写调试(附源代码),这样对付任何接口都可以用该方法很好的掌握输入时延值了。等在线调度好时延值往后,就可以固定下来了。
RGMII接口时序处理
再总结一遍RGMII接口的时延调试方法:
1、时钟处理
上图中PHY芯片给过来的时钟旗子暗记rgmii_rx分成两路,一起须要经由一级BUFIO,产生旗子暗记rgmii_rx_clk_bufio,该rgmii_rx_clk_bufio旗子暗记只是在接口处利用,用于后续添加IODELAY时利用;另一起旗子暗记经由一级BUFR,产生rx_clk_int时钟旗子暗记,该时钟旗子暗记就可以作为全局时钟利用,可以驱动2-3个BANK范围内的旗子暗记。
2、添加IODELAY
上一节中通过VIO的办法确定下来一个比较好的时延值往后,就可以把该值固定下来固化利用了。不同的板子上利用的PHY芯片不同,都须要调试该时延值。代码中该时延值添加的代码如下:
上图中IDELAY_TYPE已经由上一节中的“VAR_LOADABLE”变为固定的“FIXED”,该FIXED值可以在XDC约束文件中配置利用。
验证及结果
在将参考时钟设置为125Mhz(一个tap125ps),CNTVALUEIN设置为16时,采样到精确的波形,利用TestCenter测试,千兆线速无丢包。
对付Altera(现在叫Intel)的FPGA,也可以采取SignalTAP里面的探针来动态的配置接口时延,来实现动态的调度RGMII接口数据与时钟相差四分之一相位的目的。不过,根据本人的履历,Xilinx的FPGA实现RGMII接口时序调度要比Altera的FPGA随意马虎太多了。。。
以太网接口调试本"大众年夜众号已经总结过一系列的文章了。常见的以太网接口调试方法可以见本公众年夜众号之前的文章,在此罗列几篇如下:
SGMII接口调试;
10G 以太网接口的FPGA实现,你须要的都在这里了
高速串行接口与GTXE_COMMON / GTXE_CHANNEL 问题汇总;
教室演示实验二-基于FPGA的VGA掌握电路设计;
教室演示实验三-串口通信实验;
文章的结尾附上一个Xilinx 的K7 FPGA芯片做的背包挂坠,引领新时尚!
全文完。