SF-CY3/SF-SENSOR/SF-LCD开发套件:http://myfpga.taobao.com/
FPGA工程的功能框图如图所示。上电初始,FPGA需要通过IIC接口协议对摄像头模块进行寄存器初始化配置。这个初始化的基本参数,如初始化地址和数据存储在一个预先配置好的FPGA内嵌ROM中。在初始化配置完成后,摄像头就能够持续输出RGB标准的视频数据流,FPGA通过对其相应的时钟、行频和场频进行检测,从而一帧一帧的实时采集图像数据。
采集到的视频数据先通过一个FIFO,将原本25MHz频率下同步的数据流转换到100MHz频率下。接着讲这个数据再送入写SDRAM缓存的FIFO中,最终这个FIFO每满160个数据就会将其写入SDRAM的相应地址中。在另一侧,使用另一个异步FIFO将SDRAM缓存的图像数据送个LCD驱动模块。LCD驱动模块不断的读出新的现实图像,并且驱动3.5寸液晶屏工作。
由于这个工程是移植过来的,SDRAM的时序约束已经添加好并且很好的收敛了。但是,新增加的CMOS sensor的接口也需要做相应的时序约束。下面我们就来探讨下它的时序该如何做约束。
先看看CMOS Sensor的datasheet中提供的时序波形和相应的建立、保持时间要求。波形如图所示。
波形中出现的时间参数定义如下表所示。
我们可以简单分析下这个datasheet中提供的时序波形和参数提供了一些什么样的有用信息。我们重点关注PCLK和D[7:0]的关系,HREF其实也可以归类到D[7:0]中一起分析,他们的时序关系基本是一致的(如果存在偏差,也可以忽略不计)。这个波形实际上表达的是从Sensor的芯片封装管脚上输出的PCLK和D[7:0]的关系。而在理想状况下,经过PCB走线将这组信号连接到其他的芯片上(如CPU或FPGA),若尽可能保持走线长度,在其他芯片的管脚上,PCLK和D[7:0]的关系基本还是不变的。那么,对于采集端来说,用PCLK的上升沿去锁存D[7:0]就变得理所当然了。而对于FPGA而言,从它的管脚到寄存器传输路径上总归是有延时存在的,那么PCLK和D[7:0]之间肯定不会是理想的对齐关系。而我们现在关心的是,相对于理想的对齐关系,PCLK和D[7:0]之间可以存在多大的相位偏差(最终可能会以一个延时时间范围来表示)。在时序图中,Tsu和Th虽然是PCLK和D[7:0]在Sensor内部必须保证的建立时间和保持时间关系,但它同样是Sensor的输出管脚上,必须得到保证的基本时序关系。因此,我们可以认为:理想相位关系情况下,PCLK上升沿之前的Tsu时间(即15ns)到上升沿后的Th时间(即8ns)内,D[7:0]是稳定不变的。同样的,理想情况下,PCLK的上升沿处于D[7:0]两次数据变化的中央。换句话说,在D[7:0]保持当前状态的情况下,PCLK上升沿实际上在理想位置的Tsu时间和Th时间内都是允许的。请大家记住这一点,下面我们需要利用这个信息对在FPGA内部的PCLK和D[7:0]信号进行时序约束。
OK,明确了PCLK和D[7:0]之间应该保持的关系后,我们再来看看他们从CMOS Sensor的管脚输出后,到最终在FPGA内部的寄存器进行采样锁存,这整个路径上的各种“艰难险阻”(延时)。
在这个路径分析中,我们不去考虑CMOS Sensor内部的时序关系,我们只关心它的输出管脚上的信号。先看时钟PCLK的路径延时,在PCB上的走线延时为Tcpcb,在FPGA内部,从进入FPGA的管脚到寄存器的时钟输入端口的延时为Tcl。再看数据D[7:0]的延时,在PCB上的走线延时为Tdpcb,在FPGA内部的管脚到寄存器输入端口延时为Tp2r。而FPGA的寄存器同样有建立时间Tsu和保持时间Th要求,也必须在整个路径的传输时序中予以考虑。
另外,从前面的分析,我们得到了PCLK和D[7:0]之间应该满足的关系。那么,为了保证PCLK和D[7:0]稳定考虑的得到传输,我们可以得到这样一个基本的关系必须满足:
对于建立时间,有:
Launch edge + Tdpcb + Tp2r + Tsu < latch edge + Tcpcb + Tcl
对于保持时间,有:
Launch edge + Tdpcb + Tr2p < latch edge + Tcpcb + Tcl – Th
关于launch edge和latch edge,对于我们当前的设计,如下图所示。
在对这个FPGA的input接口的时序进行分析和约束之前,我们先来看看Altera官方是如何分析此类管脚的时序。
具体问题具体分析,我们当前的工程,状况和理想模型略有区别。实际上在上面这个模型的源寄存器端的很多信息都不用详细分析,因为我们获得的波形是来自于Sensor芯片的管脚。同理,我们可以得到input delay的计算公式如下。
Input max delay = (0 – Tcpcb_min) + Tco_max + Tdpcb_max
Input min delay = (0 – Tcpcb_max) + Tco_min + Tdpcb_min
在这两个公式中,参数Tco是前面我们还未曾提到的,下面我们就要分析下如何得到这个参数。Tco指的是理想情况下数据在源寄存器被源时钟锁存后,经过多长时间输入到管脚上。前面我们已经得到了PCLK和D[7:0]之间的关系,其实从已知的关系中,我们不难推断出Tco_max和Tco_min,如图所示。若PCLK的时钟周期为Tpclk,则:
Tco_max = Tpclk – Tsu
Tco_min = Th
在我们采样的CMOS Sensor图像中,PCLK频率为12.5MHz,即80ns。因此,我们可以计算到:
Tco_max = 80ns – 15ns = 65ns
Tco_min = 8ns
我们再看看PCB的走线情况,算算余下和PCB走线有关的延时。
如图所示,这是PCLK和D[7:0]在SF-CY3核心板上的走线。
如图所示,这是PCLK和D[7:0]在SF-SENSOR子板上的走线,在这个板子上的走线由匹配电阻分两个部分。
根据前面的走线长度,我们可以换算一下相应的走线延时,如下表所示。因此,我们可以得到,Tcpcb_max = 0.35ns,Tcpcb_min = 0.35ns,Tdpcb_max = 0.36ns,Tdpcb_min = 0.31ns。
信号名 |
SF-CY3走线长度 |
SF-SENSOR走线长度1 |
SF-SENSOR走线长度2 |
总长度(mm) |
延时(ns) |
PCLK |
18 |
27.7 |
6 |
51.7 |
0.346023622 |
VD0 |
16.8 |
24.9 |
9.1 |
50.8 |
0.34 |
VD1 |
19.5 |
26.8 |
6 |
52.3 |
0.35003937 |
VD2 |
16.2 |
25 |
9.1 |
50.3 |
0.336653543 |
VD3 |
18.9 |
27.8 |
6 |
52.7 |
0.352716535 |
VD4 |
15.9 |
24.8 |
9.1 |
49.8 |
0.333307087 |
VD5 |
18.7 |
28.5 |
6 |
53.2 |
0.356062992 |
VD6 |
15.3 |
24.8 |
9.1 |
49.2 |
0.329291339 |
VD7 |
18.7 |
27.8 |
6 |
52.5 |
0.351377953 |
HREF |
14.6 |
23.8 |
9.1 |
47.5 |
0.317913386 |
将上面得到的具体数值都代入公式,得到:
Input max delay = (0 – 0.35ns) + 65ns + 0.36ns = 65.01ns
Input min delay = (0 – 0.35ns) + 8ns + 0.31ns = 7.96ns
加上一些余量,我们可以去input max delay = 66ns,input min delay = 7ns。
下面我们来添加时序约束,打开TimeQuest,点击菜单栏的ContraintsàCreat Clock,做如下设置。
点击ContraintsàSet Maximum Delay,对vdb[0] vdb[1] vdb[2] vdb[3] vdb[4] vdb[5] vdb[6] vdb[7] vhref的set_max_delay做如下设置。
点击ContraintsàSet Minimum Delay,对vdb[0] vdb[1] vdb[2] vdb[3] vdb[4] vdb[5] vdb[6] vdb[7] vhref的set_min_delay做如下设置。
约束完成后,参照前面章节Update Timing Netlist并且Write SDC File…,接着就可以重新编译整个工程,再来看看这个时序分析的报告。在报告中,数据的建立时间有9-13ns的余量,而保持时间也都有7-11ns的余量,可谓余量充足。
另外,我们也可以专门找一条路径出来,看看它的具体时序路径的分析。vd[0]这条数据线的建立时间报告中,66ns的input max delay出现在了Data Arrival Path中。
而在vd[0]的保持时间报告中,7ns的input min delay则出现在了Data Arrival Path中。