vivado xilinx IOB = true的使用

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

版权声明:本文为CSDN博主「同年纪_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/q774318039a/article/details/88778669

推荐阅读