FPGA IOB

IOB寄存器跟通信有关的设计中多会用到,今天查了相关资料,总结如下:

首先了解一下fpga的芯片内部结构:

 

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

IOB 的内部结构如下:

 

 

            IOB单元简称IO单元,是芯片与外部器件的接口部分,用于完成不同电气特性下对输入输出信号的的驱动和匹配要求。目IO口的频率越来越高,一些高端的fpga通过DDR技术可使数据率达到Gb/s.

     

 

在 这里多提一点:李老师提到,IOB多用在高速数据采样的时候,对一些很难采的信号要通过连接IOB寄存器(在UCF文件中约束)。在赛灵思系列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 packing的概念吧,就是把寄存器放置到IOB内,这样寄存器数据可以直接从PAD输出,和FPGA内部SLICE实现相比,减少了布线延迟,提高了性能。
设置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”
大概就是这些,欢迎补充。
今天我做的实验,非常简单。就是要亲眼目睹一下采用IOB packing后有什么区别。
代码(主要部分)
always @(posedge i_clk or negedge i_rst_n) begin
if (!i_rst_n) o1 <= 1'b0;
else o1 <= i1;
end
非常简单的代码,就是一个寄存器而已。
然后再ISE11.1中建立工程,默认方式跑一遍,然后再设置IOB packing跑一遍。每次跑完后都在p&r的下拉菜单里找到 View/Edit Routed Design (FPGA Editor),打开,观看最终的实现结果。发现了重大的差别。
- 默认方案
最终实现中用到一个Slice,点进去看到了寄存器的使用
- IOB Packing方案
最终实现中没有Slice,但是用到了一个ILOGIC,他是Input PAD中的一部分,在这个ILOGIC中点进去,就看到了我们的寄存器。
所以和我们预想的一样,一般方案中,寄存器是实现在FPGA内部,因此到PAD的延时相对比较长,尤其是设计较大较复杂的时候。使用IOB Packing则将寄存器实现在FPGA边缘的IOB中,大大缩短延迟时间,提高了时序性能。

你可能感兴趣的:(FPGA)