Xilinx FPGA 將寄存器放入IOB中

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]}]
兩種方法任意一種皆可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章