注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
dongdong100的个人空间 https://home.eeworld.com.cn/space-uid-522914.html [收藏] [复制] [分享] [RSS]
日志

【阿东之Xilinx FPGA 摄像头调试随记】

已有 1600 次阅读2017-11-28 23:07 |个人分类:FPGA| FPGA, 摄像头

 我们的Xilinx S6M开发板是SPARTAN 6 LX9的片子,因为我们的摄像头程序都是ALTERA的QUARTUS的工程,该工程里面需要用到两个和厂家相关的特性,PLL和FIFO,XILINX和ALTERA两家对于PLL和FIFO的管脚和复位等都不一致,器件的管脚约束和时序约束也不一样,因此移植的工作量还是比较大的。如果没有对两家特性有仔细的研究,还是会遇到很多坑的。
   像我阿东这样的大拿(不谦虚一下),在移植的时候,也遇到了很多坑,首先第一个就是PLL,PLL带有复位管脚,复位管脚PLL的手册上没有说是高复位还是低复位,虽然我之前经常使用XILINX的各种FPGA,不过还是没有记住,然后测试了下,发现复位管脚高是复位的,低是解复位。另外ALTERA的PLL和XILINX的PLL,可能倍频性能也不一致,当然这次没有遇到。
   其次遇到的是FIFO,FIFO差异就更大了,包括复位和各个管脚都不一样,但是基本功能都是差不多的,经过测试,也发现FIFO复位高表示复位。然后是生成FIFO,XILINX的生成需要使用ISE的CORGEN工具,这个生成需要保持和ALTERA一样的FIFO特性,比如都是异步FIFO,延迟都是一拍,都需要FIFO带有datacnt(表示当前FIFO里面存储的数据个数)计数。期间因为不确定这个FIFO的datacnt是否可以使用,一度自己生成了一个datacnt,不过还是没有好,最后改回去发现,Xilinx的异步FIFO的datacnt是可以用的。
   再次遇到的是各种编译问题,首先是时钟编译报错,好好的东西在QUARTUS里面也没有报错啊,经过各种分析发现,XILINX的时钟处理很麻烦,时钟不能直接输出到IO,需要加ODDR,然后才能接到IO中,这个ODDR我是添加了,但是一直没有清晰的图像,很是纳闷,最后发现居然是ODDR时钟接错了,ODDR需要方法如下:
ODDR2 #(
    .DDR_ALIGNMENT("NONE"),             // Sets output alignment to "NONE", "C0" or "C1" 
    .INIT(1'b0),                        // Sets initial state of the Q output to 1'b0 or 1'b1
    .SRTYPE("SYNC")                     // Specifies "SYNC" or "ASYNC" set/reset
    ) U_ODDR2_0
(
      .Q (sdram_clk),                   // 1-bit DDR output data
      .C0(sdram_clk_tmp),                   // 1-bit clock input
      .C1(~sdram_clk_tmp ),                   // 1-bit clock input
      .CE(1'b1),                        // 1-bit clock enable input
      .D0(1'b1),                        // 1-bit data input (associated with C0)
      .D1(1'b0),                        // 1-bit data input (associated with C1)
      .R(1'b0),                         // 1-bit reset input
      .S(1'b0)                          // 1-bit set input
);
但是我写错成如下方式:

ODDR2 #(
    .DDR_ALIGNMENT("NONE"),             // Sets output alignment to "NONE", "C0" or "C1" 
    .INIT(1'b0),                        // Sets initial state of the Q output to 1'b0 or 1'b1
    .SRTYPE("SYNC")                     // Specifies "SYNC" or "ASYNC" set/reset
    ) U_ODDR2_0
(
      .Q (sdram_clk),                   // 1-bit DDR output data
      .C0(sdram_clk_tmp2),                   // 1-bit clock input
      .C1(~sdram_clk_tmp ),                   // 1-bit clock input
      .CE(1'b1),                        // 1-bit clock enable input
      .D0(1'b1),                        // 1-bit data input (associated with C0)
      .D1(1'b0),                        // 1-bit data input (associated with C1)
      .R(1'b0),                         // 1-bit reset input
      .S(1'b0)                          // 1-bit set input
);
导致SDRAM时钟异常,所以图像异常不清楚。还好发现了。
最开始调试时候的波形一直如下所示:



后来改了ODDR时钟后,图像恢复正常,坑爹!


然后是时序约束了,别问我不加行不,不加不行,摄像头的频率还是很高的,不加会导致图像显示异常甚至不显示,时序约束和QUARTUS的也不一致,不过转换相对简单,看懂了就知道怎么改了。
系统时钟约束如下:
Net clk_50 LOC = T8 | TNM_NET = sys_clk_pin;

TIMESPEC TS_sys_clk_pin = PERIOD sys_clk_pin 50000 kHz;

经过上面的几个大坑,最终OV7670/7725的视频正常清晰显示了,唯一安慰的是发现XILINX的板子的图像比ALTERA的要清晰一点点,可能是和XILINX的时序优化相关。
评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章