天天看点

平时积累的FPGA知识点(2)

作者:徐丹的写作空间
平时积累的FPGA知识点(2)

1 input delay

input delay会影响布局布线,除非你把进出的触发器都放到iob里,那就没法影响了。

你把外部信号进入FPGA后的第一级触发器看成是目的触发器,把产生外部信号的芯片看成源触发器,套用setup和hold计算的那套理论,就理解了

我查的资料

在xilinx FPGA中,IOB是位于IO附近的寄存器,是FPGA上距离IO最近的寄存器,同时位置固定。当你输入或者输出采用了IOB约束,那么就可以保证从IO到达寄存器或者从寄存器到达IO之间的走线延迟最短,同时由于IO的位置是固定的,即存在于IO附近,所以每一次编译都不会造成输入或者输出的时序发生改变

为什么要使用IOB约束

考虑一个场景,当你用FPGA写了一个spi模块,将时钟、片选和数据线绑定到FPGA的IO管脚,如果没有加IOB约束的话,综合工具在布局布线的时候直接将FPGA内部寄存器输出连到IO上,但是这样存在一定的问题,每次修改逻辑重新编译的时候,输出寄存器的位置有可能发生改变,那么从寄存器输出到IO之间的布线长度就会发生变化,造成寄存器输出到达IO之间的走线延迟发生改变,每一次编译都会使得spi的输出时序不确定。

为了解决这个问题,需要加入IOB约束,将模块输出端口的最后一级寄存器放在IOB上,这样最后一级输出的寄存器位置就固定下来了,每次编译都不会造成输出时序发生改变。

IOB约束使用方法如下:

1、在约束文件中加入下面约束:

set_property IOB true [get_ports {port_name}]

set_property IOB true [get_cells {cell_name}]

2、直接在代码中加约束,在寄存器前加入下面约束,需要注意的是,对于输入IOB约束,这里的寄存器是第一级寄存器,对于输出IOB约束,这里的寄存器是最后一级寄存器,且寄存器输出不能再作为组合逻辑输入。

( * IOB =“true” * ) reg O_data;

对于输出IOB约束,在使用的时候有一些限制:

1)约束的端口必需是寄存器输出,这点比较好理解,因为IOB约束本质上是约束最后一级寄存器的位置,将最后一级寄存器的位置放在IOB上,而不是增加一级寄存器。所以你必须要是寄存器输出,才能进行IOB约束,这是前提。

2)最后一级寄存器的输出不能再作为输入反馈到内部逻辑中,必须是开路的

平时积累的FPGA知识点(2)

2 所有信号都需要寄存两拍吗

如果这个输入信号来自异步时钟域(比如FPGA芯片外部的输入),必须寄存两拍。第一拍将输入信号同步化,同步化后的输出可能带来建立/保持时间的冲突,产生亚稳态。需要再寄存一拍,减少(注意是减少)亚稳态带来的影响。

如果这个输入信号来自于同一时钟域且需要用到跳变沿,需要寄存一拍。否则时序报告多半会报clock skew > data delay,造成建立/保持时间的冲突。

总而言之,五条原则:

1.全局时钟的跳变沿最可靠。

2.来自异步时钟域的输入需要寄存一次以同步化,再寄存一次以减少亚稳态带来的影响。

3.不需要用到跳变沿的来自同一时钟域的输入,没有必要对信号进行寄存。

4.需要用到跳变沿的来自同一时钟域的输入,寄存一次即可。

5.需要用到跳变沿的来自不同时钟域的输入,需要用到3个触发器,前两个用以同步,第3个触发器的输出和第2个的输出经过逻辑门来判断跳变沿。

一个fpga主要是由可编程输入输出单元(图中的IOB模块),可编程逻辑单元(CLB模块),块RAM(图中的BRAM,也属于内嵌硬件),数字时钟管理(DCM,也属于内嵌硬件),还有一些内嵌的专用的硬件模块(DSP),IOB寄存器就在图中的IOB模块中

平时积累的FPGA知识点(2)