一个fpga主要是由可编程输入输出单元(图中的IOB模块),可编程逻辑单元(CLB模块),块RAM(图中的BRAM,也属于内嵌硬件),数字时钟管理(DCM,也属于内嵌硬件),还有一些内嵌的专用的硬件模块(DSP)。
在赛灵思系列FPGA 的IOB 中分别有输入和输出寄存器。如果将设计中的第一级寄存器或最后一级寄存器用IOB 内部寄存器实现,那么就可以缩短IO 引脚到寄存器之间的路径(理解这句话是关键,我的理解是:若输入输出不连IOB寄存器,则代码修改后(但逻辑功能相同)每次的布局布线后,输入输出信号会被连在不同的内部寄存器上,这样输入信号进入第一级寄存器的布线延迟就会每次都不同,这样有可能在高速信号采集的时候不能正确采样,因为布线延迟会导致建立或保持时间不满足;如果在UCF文件中使用IOB寄存器,则不管代码如何修改,输入信号进入fpga内部都是被第一级的IOB寄存器采样,更能满足采样条件),这通常可以缩短大约1~2ns 的传输时延。 但是在使用UCF文件约束IOB寄存器时,首先,有一些限制。对于输入寄存器在从管脚到寄存器间不能有组合逻辑存在。对于输出寄存器,在寄存器和管脚之间也不能有组合逻辑存在(也就是信号在输入输出之前在代码设计中都要干干净净打一拍)。对于三态输出,在IOB中的所有的寄存器必须使用同一个时钟信号和复位信号,而且IOB三态寄存器必须低电平有效才能放到IOB中(三态缓冲器低电平有效,所以在寄存器和三态缓冲器之间不需要一个反相器)。必须使软件能够选用IOB寄存器,可以设置全局实现选项:为输入、输出或输入输出选择IOB寄存器。缺省值为关 off。
你也可在综合工具或在用户约束文件UCF中设定,使得能够使用IOB寄存器。句法为: INST IOB = TRUE;设置IOB的方法太多了,我列举几个: 1. 在UCF上为相应的管脚制定 IOB = TRUE 属性。
2. 在Synplify 中指定 define_global_attribute {syn_useioff} {1} 属性,你可以通过SCOPE界面操作,类似。
3. 在XST中打开属性,设置xilinx specific options 的 -iob (Pack I/O registers into IOB) 属性为yes
4. 在ISE的implementation的MAP属性中设置 -pr (Pack I/O registers into IOB) 属性为“for inputs and outputs”
一般方案中,寄存器是实现在FPGA内部,因此到PAD的延时相对比较长,尤其是设计较大较复杂的时候。使用IOB Packing则将寄存器实现在FPGA边缘的IOB中,大大缩短延迟时间,提高了时序性能。
|