轉自:https://blog.csdn.net/a874176979/article/details/108484101
xilinx FPGA IOB限制使用以及注意事項
一、什麼是IOB限制
在xilinx FPGA中,IOB是位于IO附近的寄存器,是FPGA上距離IO最近的寄存器,同時位置固定。當你輸入或者輸出采用了IOB限制,那麼就可以保證從IO到達寄存器或者從寄存器到達IO之間的走線延遲最短,同時由于IO的位置是固定的,即存在于IO附近,是以每一次編譯都不會造成輸入或者輸出的時序發生改變。
二、為什麼要使用IOB限制
考慮一個場景,當你用FPGA寫了一個spi子產品,将時鐘、片選和資料線綁定到FPGA的IO管腳,如果沒有加IOB限制的話,綜合工具在布局布線的時候直接将FPGA内部寄存器輸出連到IO上,但是這樣存在一定的問題,每次修改邏輯重新編譯的時候,輸出寄存器的位置有可能發生改變,那麼從寄存器輸出到IO之間的布線長度就會發生變化,造成寄存器輸出到達IO之間的走線延遲發生改變,每一次編譯都會使得spi的輸出時序不确定。
為了解決這個問題,需要加入IOB限制,将子產品輸出端口的最後一級寄存器放在IOB上,這樣最後一級輸出的寄存器位置就固定下來了,每次編譯都不會造成輸出時序發生改變。
IOB限制使用方法如下:
1、在限制檔案中加入下面限制:
set_property IOB true [get_ports {port_name}]
set_property IOB true [get_cells {cell_name}]
2、直接在代碼中加限制,在寄存器前加入下面限制,需要注意的是,對于輸入IOB限制,這裡的寄存器是第一級寄存器,對于輸出IOB限制,這裡的寄存器是最後一級寄存器,且寄存器輸出不能再作為組合邏輯輸入。
(* IOB = "true" *) reg O_data;
三、IOB限制使用注意事項
對于輸出IOB限制,在使用的時候有一些限制:
1、限制的端口必需是寄存器輸出,這點比較好了解,因為IOB限制本質上是限制最後一級寄存器的位置,将最後一級寄存器的位置放在IOB上,而不是增加一級寄存器。是以你必須要是寄存器輸出,才能進行IOB限制,這是前提。
2、最後一級寄存器的輸出不能再作為輸入回報到内部邏輯中,必需是開路的。舉個例子,比如如下代碼:
always @ (posedge clk)
begin
if(cnt == 2'b1 || cnt == 2'b3)
spi_clk <= ~spi_clk;
else
spi_clk <= spi_clk;
end
上面描述了一個分頻器,當計數器cnt為1和3的時候spi_clk翻轉,那這個時候spi_clk就是一個輸出又作為輸入回報到内部的寄存器,得到的綜合結果如下圖:

由于需要将寄存器的輸出作為輸入其他邏輯的輸入,這種情況下是無法将spi_clk寄存器放到IOB上的,因為IOB的輸出直接對接IO,無法再作為輸入回報到内部邏輯。
是以可以将spi_clk輸出再加一級寄存器,将加入的寄存器放到IOB上,相應的需要對時序做出一定的調整,和sip_clk有時序關系的都需要打一拍以保持同步。