waljj

对边沿对齐源同步输入端口的约束

0
阅读(3438)

相对于FPGA来说,边沿对齐源同步输入端口,指的是FPGA同时接收外部器件传过来的数据和时钟信号,并且用接收到的时钟信号去锁存传过来的数据。模型如下图所示:

对此模型进行约束,分下面几个步骤:

1.对时钟的约束。

建立virtual,base和generated clocks。

  virtual clock为驱动外部器件产生传递数据到FPGA的时钟。这个时钟不存在于FPGA内部,由外部产生,所以定义为虚拟时钟,不需要定义时钟源。

  base clock 为输入到FPGA端口的时钟信号。如上图中的clk_in管脚。

  generated clock 对应边沿对齐的源同步输入口,需要用FPGA内部PLL进行相移。所以用generated clock约束PLL生成的时钟。

2.对输入延时的约束

  对于源同步时钟系统,数据和时钟信号时同步传输的,所以对于输入延时来说只需要考虑skew就可以了。最大的输入延时为skew,最小的输入延时为负的skew。

3.对false path的约束

  设系统的数据传输发生在rise-rise和fall-fall下,那么对rise-fall和fall-rise要进行false path 的约束。

 

实例如下:

#建立虚拟时钟,由于此时钟并不存在FPGA里,所以不需要指定源

create_clock -name virt_clk -period 10
 

#建立输入时钟

create_clock -name input_clock -period 10 [get_ports clk_in]
 

#PLL时钟,为保证建立时间和保持时间,相移90度

create_generated_clock -name data_clock -source [get_pins pll|inclk[0]] \
   -phase 90 [get_pins pll|clk[0]]
 

#假设skew为250ps,需要对时钟的上升沿和下降沿都进行约束。

#而且是相对于virt_clk进行约束。

set_input_delay -max -clock virt_clk 0.250 [get_ports data_in*]
set_input_delay -min -clock virt_clk -0.250 [get_ports data_in*]
set_input_delay -max -clock virt_clk -clock_fall \
   0.250 [get_ports data_in*] -add
set_input_delay -min -clock virt_clk -clock_fall \
   -0.250 [get_ports data_in*] -add
 

#对false path的约束。

#对于源同步接口,virt_clk为Launch Clock

#data_clock为Latch Clock

set_false_path -setup -end -rise_from [get_clocks virt_clk] \
   -fall_to [get_clocks data_clock]
set_false_path -setup -end -fall_from [get_clocks virt_clk] \
   -rise_to [get_clocks data_clock]
set_false_path -hold -end -rise_from [get_clocks virt_clk] \
   -rise_to [get_clocks data_clock]
set_false_path -hold -end -fall_from [get_clocks virt_clk] \
   -fall_to [get_clocks data_clock]