天天看點

平時積累的FPGA知識點(2)

作者:徐丹的寫作空間
平時積累的FPGA知識點(2)

1 input delay

input delay會影響布局布線,除非你把進出的觸發器都放到iob裡,那就沒法影響了。

你把外部信号進入FPGA後的第一級觸發器看成是目的觸發器,把産生外部信号的晶片看成源觸發器,套用setup和hold計算的那套理論,就了解了

我查的資料

在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限制,在使用的時候有一些限制:

1)限制的端口必需是寄存器輸出,這點比較好了解,因為IOB限制本質上是限制最後一級寄存器的位置,将最後一級寄存器的位置放在IOB上,而不是增加一級寄存器。是以你必須要是寄存器輸出,才能進行IOB限制,這是前提。

2)最後一級寄存器的輸出不能再作為輸入回報到内部邏輯中,必須是開路的

平時積累的FPGA知識點(2)

2 所有信号都需要寄存兩拍嗎

如果這個輸入信号來自異步時鐘域(比如FPGA晶片外部的輸入),必須寄存兩拍。第一拍将輸入信号同步化,同步化後的輸出可能帶來建立/保持時間的沖突,産生亞穩态。需要再寄存一拍,減少(注意是減少)亞穩态帶來的影響。

如果這個輸入信号來自于同一時鐘域且需要用到跳變沿,需要寄存一拍。否則時序報告多半會報clock skew > data delay,造成建立/保持時間的沖突。

總而言之,五條原則:

1.全局時鐘的跳變沿最可靠。

2.來自異步時鐘域的輸入需要寄存一次以同步化,再寄存一次以減少亞穩态帶來的影響。

3.不需要用到跳變沿的來自同一時鐘域的輸入,沒有必要對信号進行寄存。

4.需要用到跳變沿的來自同一時鐘域的輸入,寄存一次即可。

5.需要用到跳變沿的來自不同時鐘域的輸入,需要用到3個觸發器,前兩個用以同步,第3個觸發器的輸出和第2個的輸出經過邏輯門來判斷跳變沿。

一個fpga主要是由可程式設計輸入輸出單元(圖中的IOB子產品),可程式設計邏輯單元(CLB子產品),塊RAM(圖中的BRAM,也屬于内嵌硬體),數字時鐘管理(DCM,也屬于内嵌硬體),還有一些内嵌的專用的硬體子產品(DSP),IOB寄存器就在圖中的IOB子產品中

平時積累的FPGA知識點(2)