求助,XILINX做的相机图象抖动。
本帖最后由 advantech 于 2019-2-15 14:49 编辑这个图是网上找的,和自己做的相机类似 。显示器上的图象出现抖动,后来想到一个办法,写入静态图片测试,相当于不使用CMOS图象数据,自己写一帧数据进去。
问题就出在这里,使用主时钟经过PLL产生的一个时钟25M,50M,或者100M,作为FIFO_WRITE的写时钟时图象都正常,而使用CMOS的PCLK时钟(不论频率多少)
作为FIFO_WRITE的写时钟时,都会出现图象抖动,所有的源码都不变,只是改变写入模块的时钟,一个是数据产生模块的时钟,一个是FIFO_WRITE的写时钟;
现象奇怪就在于,只是写入时钟变化,读出时钟及其他时钟都没有变化,就写入一帧图象,自己觉得应该是稳定不抖动的,最坏的是写入的图象数据错误而已。
以前用的是ALTERA的,刚转XILINX不久,用的是SPARTAN6,挂DDR3,这个问题都快一个月了,还没有解决。期间也是试过各种办法,希望兄第们给点思路,
大家一起探讨一下。谢谢了。 问题终于找到了,显示模块有问题,进位链太长,导致时序错误。 我靠,你这都不带时序约束的?还有,xilinx的时钟输出要用oddr,不支持直接时钟输出。 wye11083 发表于 2019-2-15 20:12
我靠,你这都不带时序约束的?还有,xilinx的时钟输出要用oddr,不支持直接时钟输出。 ...
ALTERA的时序约束工具直观一些,XILINX的刚开始学,资料少,还不精通,时序的基础知识都差不多。 advantech 发表于 2019-2-15 21:23
ALTERA的时序约束工具直观一些,XILINX的刚开始学,资料少,还不精通,时序的基础知识都差不多。 ...
xilinx一样直观。直接用它的时序工具生成一个模板,然后有些信号要自己输。
xilinx的时序约束不能出现环路,即从a到b再从b到a。这是个大坑。这种情况主要出现在多个系统时钟之间的交互。一旦出现环路,所有相关时序就全丢了。tmd坑了我一个多月才发现。 本帖最后由 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: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)
);
wye11083 发表于 2019-2-15 21:41
xilinx一样直观。直接用它的时序工具生成一个模板,然后有些信号要自己输。
xilinx的时序约束不能出现环 ...
我的CCD_CLK1和CLK25同样都是走的全局时钟网络,应该没有什么影响。
难道他们分时钟区域,过不去? 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的片子一致性稍微比较差。 考虑:
# 源同步时钟信号输入做input delay约束。根据所用芯片选择适当的CLK BUF,CLK过DCM,信号加IDELAY,换采样边沿,etc,来满足约束。
时钟走IBUF+CLK-BUF上时钟网再到信号的IOB-REG采样可能需要相当长的Delay。需要加约束让工具确认布线结果正确,必要时进行各种调整以满足约束。
# 没有特殊需求的话,主要模块用一个大的时钟域;I/O的非中断流部分仅进行必要的处理;用浅FIFO做CDC。
主要是约束和下ILA调试比较方便,设计风格的选择而已,不是问题。
# 评估内存带宽/FIFO深度是不是足够。
挂ILA看看是不是有OF/UF。
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为全局时钟;
个人觉得应该是不一样的。 dr2001 发表于 2019-2-16 21:25
考虑:
# 源同步时钟信号输入做input delay约束。根据所用芯片选择适当的CLK BUF,CLK过DCM,信号加IDELAY ...
都还没有用到外部的数据,只是用到外部的时钟,数据是由该时钟产生的。
我再用你的方法试试,谢谢拉。 advantech 发表于 2019-2-16 22:29
请教一下
FIFO_RW_IP u3 (
.rst (fifo1_load), ...
没区别。
综合完了看看STA结果呗,以及你使用的时钟频率有什么区别
别说你没下时钟约束 最近在用ZYNQ方案了,以前的方案没有这个 好 。
页:
[1]