xilinx FPGA的资源一般指IOB,CLB,BRAM,DCM,DSP五种资源。其中IOB就是input/output block,完成不同电气特性下对输入输出信号的的驱动和匹配要求。
IOB的作用就是完成信号的采集和输出,引脚可以配置支持不同电气特性,上拉下拉或三态,差分或单端。有ologic,ilogic,idelay,odelay,iserdes,oserdes功能。如下图所示。
为了保证FPGA输入输出接口的时序,一般会要求将输入管脚首先打一拍再使用,输出接口也要打一拍再输出FPGA。将信号打一拍的方法是将信号通过一次寄存器,而且必须在IOB里面的寄存器中打一拍。因为,从FPGA的PAD到IOB里面的寄存器是有专用布线资源的,而到内部其他寄存器没有专用的布线资源。使用IOB里面的寄存器可以保证每次实现的结果都一样,使用内部其他寄存器就无法保证每次用的都是同一个寄存器且采用同样的布线。同时,为了使用输入输出延迟功能(Input / Output delay),也必须要求信号使用IOB里面的寄存器。(https://blog.csdn.net/xuexiaokkk/article/details/50630717)
简单写一个寄存器输出,RTL如下图所示:
输出c和d两个信号,约束c的输出寄存器放到IOB里,d的不允许。约束方法有两种,选中cd port,注意不是OBUF,在I/O Port的属性中添加IOB属性,设置为TRUE(允许)或FALSE(不允许),可以看到默认的都为Auto。在xdc文件中会生成约束命令。
set_property IOB TRUE [get_ports c]
set_property IOB FALSE [get_ports d]
实际工程中也可以用下面的语句约束全部输入输出。
set_property IOB TRUE [all_inputs]
set_property IOB FALSE [all_outputs]
打开implement,从device版图可以明显看到c 的输出是从CLB里的一个ff,打了一拍后再连接到IOB中的FF,这样可以使输出FF的Q到PAD的路径是固定的,最短的,避免了PAD到内部FF的路径的未知性,对于分析时序是非常有利的。d的输出是在同一个siice中紧挨着的2个ff串联后再输出到PAD的OBUF。
前面提到输入输出都要打一拍,是为了避免在FF输出Q到OBUF中间还有连线输出,如选图所示。此时就无法实现IOB寄存器的布局,只能用CLB中的寄存器。因此要该信号再按时钟打一拍,如前面图3所示。
具体代码如下:
module test(
input [3:0]a,b,
output c,d,
input clk,
input rst
);
reg reg_c = 1'd0;
reg reg_d = 1'd0;
always@(posedge clk)
if(rst)
begin
reg_c <= 1'd0;
reg_d <= 1'd0;
end
else
begin
reg_c <= reg_c + 1'd1;
reg_d <= reg_d + 1'd1;
end
reg reg_c1 = 1'd0;
reg reg_d1 = 1'd0;
always@(posedge clk)
begin
reg_c1 <= reg_c;
reg_d1<= reg_d;
end
assign c = reg_c1;
assign d = reg_d1;
endmodule
在赛灵思系列FPGA 的IOB 中分别有输入和输出寄存器。如果将设计中的第一级寄存器或最后一级寄存器用IOB 内部寄存器实现,那么就可以缩短IO 引脚到寄存器之间的路径(理解这句话是关键,我的理解是:若输入输出不连IOB寄存器,则代码修改后(但逻辑功能相同)每次的布局布线后,输入输出信号会 被连在不同的内部寄存器上,这样输入信号进入第一级寄存器的布线延迟就会每次都不同,这样有可能在高速信号采集的时候不能正确采样,因为布线延迟会导致建 立或保持时间不满足;如果在UCF文件中使用IOB寄存器,则不管代码如何修改,输入信号进入fpga内部都是被第一级的IOB寄存器采样,更能满足采样 条件),这通常可以缩短大约1~2ns 的传输时延。
但是在使用UCF文件约束IOB寄存器时,首先,有一些限制。对于输入寄存器在从管脚到寄存器间不能有组合逻辑存在。对于输出寄存器,在寄存器和管脚之间也不能有组合逻辑存在(也就是信号在输入输出之前在代码设计中都要干干净净打一拍)。对 于三态输出,在IOB中的所有的寄存器必须使用同一个时钟信号和复位信号,而且IOB三态寄存器必须低电平有效才能放到IOB中(三态缓冲器低电平有效, 所以在寄存器和三态缓冲器之间不需要一个反相器)。必须使软件能够选用IOB寄存器,可以设置全局实现选项:为输入、输出或输入输出选择IOB寄存器。缺 省值为关 off。
一般方案中,寄存器是实现在FPGA内部,因此到PAD的延时相对比较长,尤其是设计较大较复杂的时候。使用IOB Packing则将寄存器实现在FPGA边缘的IOB中,大大缩短延迟时间,提高了时序性能
将寄存器放入IOB中的方法:
1.verilog代码中
(IOB = “TRUE”) output reg [3:0] LED;
2.XDC文件中
set_property IOB TRUE [get_ports {REMOTE_FIFO_din[15]}]
两种方法任意一种皆可