发 帖  
原厂入驻New
[原创] 【阿东之Xilinx S6M开发板摄像头调试随记】
2017-8-17 23:37:42  1440 XILINX 摄像头
分享
本帖最后由 100dongdong 于 2017-8-18 12:58 编辑

  我们的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的时序优化相关。



下面就是这个板子的淘宝链接,性价比异常的高,还带100M网络接口

Xilinx S6开发板链接:
http://item.taobao.com/item.htm?id=540113890506
展示1.JPG

0
2017-8-17 23:37:42   评论 分享淘帖

相关讨论

只有小组成员才能发言,加入小组>>

126个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /10 下一条

快速回复 返回顶部 返回列表