FPGA各种时序问题的解决办法

 

FPGA时序问题的解决办法

问题1:快时钟域到慢时钟域出的错,

 Requirement:          0.250ns 

   Data Path Delay:      1.215ns (Levels of Logic = 1)(Component delays alone exceeds constraint) 

   Clock Path Skew:      -0.214ns (3.878 - 4.092) 

   Source Clock:         clk_160MHzPLL1 rising at 143.750ns 

   Destination Clock:    clk_125_0000MHzPLL0 rising at 144.000ns 

   Clock Uncertainty:    0.300ns 

  Slack (setup path):     -1.479ns (requirement - (data path - clock path skew + uncertainty)) 

可以对clk_125_0000MHzPLL0 rising at 144.000ns 时钟延迟1.38ns编译一次看看

Clock Path Skew:      -0.214ns (3.878 - 4.092)

编译不行的话,增加约束或是两个时钟用同一个锁相环

约束为:TIMESPEC TS_clkA_to_clkB=FORM CLK_A TO CLK_B 1.38ns

问题已经解决

问题2:同源时钟

Slack (setup path):     -1.618ns (requirement - (data path - clock path skew + uncertainty)) 

 Requirement:          6.250ns 

   Data Path Delay:      7.787ns (Levels of Logic = 2) 

   Clock Path Skew:      0.000ns 

   Source Clock:         clk_160MHzPLL1 rising at 0.000ns 

   Destination Clock:    clk_160MHzPLL1 rising at 6.250ns 

   Clock Uncertainty:    0.081ns 

路径:impro_all_hard_ram_plbw_0/impro_all_hard_ram_plbw_0/sysgen_dut/impro_all_hard_ram_x0/ram122_5ccb6b6655/x1024_buffer_deb56067cf/dual_port_ram/comp0.core_instance0/BU2/U0/blk_mem_generator/valid.cstr/ramloop[0].ram.r/v5_init.ram/TRUE_DP.SINGLE_PRIM18.TDP

impro_all_hard_ram_plbw_0/impro_all_hard_ram_plbw_0/

sysgen_dut/impro_all_hard_ram_x0/

subsystem2_10a9109033/serial_to_parallel_luoqiwu_80958df441/

serial_to_parallel/msb_is_first.fd_array1[0].comp/partial_one.last_srl17e/reg_array[2].fde_used.u2

解决办法:问题在于ram122这个bram,是否可采用Distributed memorey类型,由于bram资源用的太多,局域分配就不是那么理想。路径延迟太长由设计原因引起的?控制读信号来的太晚,可否用多周期路径来解决?查看控制信号的时钟频率是不是160M?

同源时钟,SLACK为负,线延时太多,使用Floorplanner工具解决,(组合逻辑不是太长,不然可以采取寄存器流水操作,)

问题3PCIE时序问题,6级路径延时 还有可以优化扇出,优化工具设置应该可以解决

找个合适的综合工具,做些优化综合设置,先把项目转换成VHDL,添加约束综合后,再回到EDK工具,极端方式 修改网表

一旦了解了最基本的概念和操作,就可以开始察看FPGA构造。通常我都从时钟逻辑开始。这包括数字时钟管理器(DCM)、锁相环(PLL)、全局时钟缓冲器(BUFG)、区域时钟缓冲器(BUFR)、I/O缓冲器(BUFIO)以及不同的时钟区域。(要想按字母列出项目表,可以到LIST窗口点击Type来排序。)点击一个DCM并按F11ARRAY窗口会定位到选择的DCM并放大显示它。继续点击DCM并观察GUI底部的Console窗口,其中会显示与下面类似的内容:

comp “DCM_BASE_inst_star”, site

“DCM_ADV_X0Y9”, type = DCM_ADV

(RPM grid X73Y202)

这是有用的数据。 拷贝并粘贴上述内容到UCF文件中,并作如下更改以锁定这一DCM逻辑:

INST “DCM_BASE_inst_star”

LOC=DCM_ADV_X0Y9;

利用这一方法,几乎可以锁定FPGA中的任何项目。 下面是BUFG锁定的另一个例子:

c o m p “ B U F G _ i n s t _ s t a r ” , s i t e

“BUFGCTRL_X0Y20”, type = BUFG

(RPM grid X73Y124)

INST “BUFG_inst_star”

LOC=BUFGCTRL_X0Y20;

再次回到 List 窗口并标注同一DCM。 双击之后将会在Block视图中显示该DCM以及所有设置和参数。这是一项非常强大的功能,可用于FPGA构造中的任何逻辑项目。如果选择一个逻辑片并双击它,就可以看到逻辑片是如何布线连接的,以及是否使用了进位链或本地触发器。

Block视图的按钮条包含许多其它选项。值得一提的是 F= button 按钮,其功能是显示逻辑片中使用的项目的完整配置。例如,如果使用了一个LUT6和一个触发器,按下 F= 按钮将会给出LUT的布尔议程以及触发器的配置模式。

阅读赛灵思用户指南是一回事,而从计算机屏幕上展开的视图上探察所有逻辑、开关和参数则是另一回事。一旦熟悉了FPGA构造及所有资源,那么在编写和验证设计时获得的帮助将会令人感到惊奇。

同源时钟数据路径过长的解决方法:

1、源时钟和目的时钟都用160M做时钟,都是不够的,核可以跑起来的最高频率只有125M,异步解决,增加约束,目的时钟频率降低一点,采取以慢采快策略;后患:怎么不丢数据?就是是每传一组数据过来必须进过两个时钟周期以上才能满足。

2、如果方法1不行,根据时序违背路径,可以知道图像处理核的频率计算后可在125M在内跑起来是没问题的,因此可在核尾部添加FIFO160M转换到125M频率,再传入BRAM里面去,目前发现一个问题是由于以前设计的频率接入确实有误导,本应该接40M而接了160M,已经改正,直接解决这个问题的一部分,这条数据路径的前半部还是存在时序错误。

3、问题出在FPGA资源BRAM的布局,由于耗用了93%,在系统分配的时候,跟附近的SLICE相距有点远,耗时较多,没法保证160M的频率。最多可以跑到125M。在BRAM资源耗用不减少的情况下,改设计也没用,不能解决。现在解决办法,试图用FPGA EDITOR去手动布局 BRAM看看或找综合工具自动处理。或是指定这个路径的延时长度试试,别无它法。

RAM输出通过一个或门(查看延时多少),不可取,必须修改。由于或门需要的资源分配离RAM很远,或直接去掉或换(这个门耗时3.632ns,设计空出2ns左右就能满足时序要求),类似总线结构挂载。或在这个增加一排寄存器分流

你可能感兴趣的:(FPGA各种时序问题的解决办法)