advantech 发表于 2019-2-15 14:42:12

求助,XILINX做的相机图象抖动。

本帖最后由 advantech 于 2019-2-15 14:49 编辑

这个图是网上找的,和自己做的相机类似 。显示器上的图象出现抖动,后来想到一个办法,写入静态图片测试,相当于不使用CMOS图象数据,自己写一帧数据进去。
问题就出在这里,使用主时钟经过PLL产生的一个时钟25M,50M,或者100M,作为FIFO_WRITE的写时钟时图象都正常,而使用CMOS的PCLK时钟(不论频率多少)
作为FIFO_WRITE的写时钟时,都会出现图象抖动,所有的源码都不变,只是改变写入模块的时钟,一个是数据产生模块的时钟,一个是FIFO_WRITE的写时钟;
现象奇怪就在于,只是写入时钟变化,读出时钟及其他时钟都没有变化,就写入一帧图象,自己觉得应该是稳定不抖动的,最坏的是写入的图象数据错误而已。
以前用的是ALTERA的,刚转XILINX不久,用的是SPARTAN6,挂DDR3,这个问题都快一个月了,还没有解决。期间也是试过各种办法,希望兄第们给点思路,
大家一起探讨一下。谢谢了。

advantech 发表于 2019-2-15 16:57:00

问题终于找到了,显示模块有问题,进位链太长,导致时序错误。

wye11083 发表于 2019-2-15 20:12:12

我靠,你这都不带时序约束的?还有,xilinx的时钟输出要用oddr,不支持直接时钟输出。

advantech 发表于 2019-2-15 21:23:13

wye11083 发表于 2019-2-15 20:12
我靠,你这都不带时序约束的?还有,xilinx的时钟输出要用oddr,不支持直接时钟输出。 ...

ALTERA的时序约束工具直观一些,XILINX的刚开始学,资料少,还不精通,时序的基础知识都差不多。

wye11083 发表于 2019-2-15 21:41:01

advantech 发表于 2019-2-15 21:23
ALTERA的时序约束工具直观一些,XILINX的刚开始学,资料少,还不精通,时序的基础知识都差不多。 ...

xilinx一样直观。直接用它的时序工具生成一个模板,然后有些信号要自己输。

xilinx的时序约束不能出现环路,即从a到b再从b到a。这是个大坑。这种情况主要出现在多个系统时钟之间的交互。一旦出现环路,所有相关时序就全丢了。tmd坑了我一个多月才发现。

advantech 发表于 2019-2-16 20:31:21

本帖最后由 advantech 于 2019-2-16 20:40 编辑

高兴的太早了。只是改了时钟而已。

PB_Debouncer    u90       (
                        .clk(ccd_clk1),
                               .rst(rst_n),
                        .PB(extern_in),
       
                        .PB_down(trig)
                        );


cam_test_static   u99    (
                        .clk(ccd_clk1),
                                                                  .rst_n(rst_n & ddr_init_done), //& ddr_init_done
                                                                       
                                                                  .trig(trig),
                                                                       
                                                                  .fifo_load(fifo1_load),
                                                                  .fifo_wr_clk(fifo1_wr_clk),
                                                                  .fifo_wr_en(fifo1_wr_en),
                                                                  .fifo_wr_data(fifo1_din)                 
                                );
改成

PB_Debouncer    u90       (
                        .clk(clk25),
                               .rst(rst_n),
                        .PB(extern_in),
       
                        .PB_down(trig)
                        );


cam_test_static   u99    (
                        .clk(clk25),
                                                                  .rst_n(rst_n & ddr_init_done), //& ddr_init_done
                                                                       
                                                                  .trig(trig),
                                                                       
                                                                  .fifo_load(fifo1_load),
                                                                  .fifo_wr_clk(fifo1_wr_clk),
                                                                  .fifo_wr_en(fifo1_wr_en),
                                                                  .fifo_wr_data(fifo1_din)                 
                                );

一切都正常,用ccd_clk1就不正常。

advantech 发表于 2019-2-16 20:35:43

本帖最后由 advantech 于 2019-2-16 20:37 编辑

advantech 发表于 2019-2-16 20:31
高兴的太早了。

PB_Debouncer    u90       (


其中CLK25 是晶振经过PLL生成,同时生成的有DDR3时钟和其他读写时钟。
而CCD_CLK1时钟是由CMOS时钟经过IBUF和BUG生成。代码如下。

IBUFG      #(
                           .IOSTANDARD("DEFAULT")// Specify the input I/O standard
                        )
          u_ibufg_sys_clk0               (
                        .I(ccd_clk),
                        .O(ccd_clk_m)
                        );



BUFG   u999               (
                        .I(ccd_clk_m),
                        .O(ccd_clk1)
                        );

advantech 发表于 2019-2-16 20:39:25

wye11083 发表于 2019-2-15 21:41
xilinx一样直观。直接用它的时序工具生成一个模板,然后有些信号要自己输。

xilinx的时序约束不能出现环 ...

我的CCD_CLK1和CLK25同样都是走的全局时钟网络,应该没有什么影响。
难道他们分时钟区域,过不去?

wye11083 发表于 2019-2-16 21:09:15

advantech 发表于 2019-2-16 20:39
我的CCD_CLK1和CLK25同样都是走的全局时钟网络,应该没有什么影响。
难道他们分时钟区域,过不去? ...

我看了一下你的框图,比起我的要简单得多。图像抖动似乎是你异步时钟域没处理好。FIFO我看你那个cam_test什么的用了两个异步时钟,这有可能带来一系列问题。

给你一点建议,把你的DDR读写等等全部整合到一个系统时钟里面,把你cam信号独立出来,单独搞个FIFO,另外每帧给FIFO复位一次,确保数据对齐。因此,你可以在cam_writter里面用一个ram而不是fifo,向后面ddr_writter以页为单位写入,每帧地址归0。cam_writter使用ccd_clk,而ddr_writter使用sys_clk,这也是我现在用的方案。我一个DDR端口经过arbiter复用到4路sensor上,带宽几乎跑了一大半,只在最开始信号写错的时候才有毛病。

注意xilinx的约束要比实际的做小点,留点芯片余量。你按照需求做的约束通常批量会出大问题,但是你给约束做小点(90%左右,比如40ns做到36ns的约束)通常不会出问题。Xilinx的片子一致性稍微比较差。

dr2001 发表于 2019-2-16 21:25:33

考虑:
# 源同步时钟信号输入做input delay约束。根据所用芯片选择适当的CLK BUF,CLK过DCM,信号加IDELAY,换采样边沿,etc,来满足约束。
时钟走IBUF+CLK-BUF上时钟网再到信号的IOB-REG采样可能需要相当长的Delay。需要加约束让工具确认布线结果正确,必要时进行各种调整以满足约束。

# 没有特殊需求的话,主要模块用一个大的时钟域;I/O的非中断流部分仅进行必要的处理;用浅FIFO做CDC。
主要是约束和下ILA调试比较方便,设计风格的选择而已,不是问题。

# 评估内存带宽/FIFO深度是不是足够。
挂ILA看看是不是有OF/UF。

advantech 发表于 2019-2-16 22:29:54

dr2001 发表于 2019-2-16 21:25
考虑:
# 源同步时钟信号输入做input delay约束。根据所用芯片选择适当的CLK BUF,CLK过DCM,信号加IDELAY ...

请教一下
FIFO_RW_IP      u3       (
                         .rst                  (fifo1_load),      // input rst
                                                               //.rst                  (~rst_n),
                                                                                                                              
                         .wr_clk               (fifo1_wr_clk),         // input wr_clk
                                                               //.wr_clk               (ccd_clk1),         // input wr_clk
                                                               .wr_en                  (fifo1_wr_en),// & frame_en1),   // input wr_en
                                                               .din                  (fifo1_din),   // input din               
                                                               .full                   (fifo1_full),    // output full
                                                               .wr_data_count          (fifo1_wr_used), // output wr_data_count
                                                               
                         //.rd_clk               (fifo1_rd_clk),         // input rd_clk
                         .rd_clk               (c3_clk0),         // input rd_clk                                                                
                         .rd_en                  (fifo1_rd_en),   // input rd_en
                         .dout                   (fifo1_dout),    // output dout
                         .empty                  (fifo1_empty),   // output empty
                         .rd_data_count          (fifo1_rd_used)// output rd_data_count

其中FIFO 的写时钟有两种方式,效果是否一样。
第一种 : .wr_clk       (clk25),//其中CLK25为全局时钟;
第二种: .wr_clk       (fifo_wr_clk);assign fifo_wr_clk = clk25//其中CLK25为全局时钟;

个人觉得应该是不一样的。

advantech 发表于 2019-2-16 22:34:21

dr2001 发表于 2019-2-16 21:25
考虑:
# 源同步时钟信号输入做input delay约束。根据所用芯片选择适当的CLK BUF,CLK过DCM,信号加IDELAY ...

都还没有用到外部的数据,只是用到外部的时钟,数据是由该时钟产生的。

我再用你的方法试试,谢谢拉。

dr2001 发表于 2019-2-17 09:07:56

advantech 发表于 2019-2-16 22:29
请教一下
FIFO_RW_IP      u3       (
                         .rst                  (fifo1_load), ...

没区别。

综合完了看看STA结果呗,以及你使用的时钟频率有什么区别
别说你没下时钟约束

advantech 发表于 2019-11-28 18:20:39

最近在用ZYNQ方案了,以前的方案没有这个 好 。
页: [1]
查看完整版本: 求助,XILINX做的相机图象抖动。