在xilinx fpga中,iob是位於io附近的暫存器,是fpga上距離io最近的暫存器,同時位置固定。當你輸入或者輸出採用了iob約束,那麼就可以保證從io到達暫存器或者從暫存器到達io之間的走線延遲最短,同時由於io的位置是固定的,即存在於io附近,所以每一次編譯都不會造成輸入或者輸出的時序發生改變。
考慮乙個場景,當你用fpga寫了乙個spi模組,將時鐘、片選和資料線繫結到fpga的io管腳,如果沒有加iob約束的話,綜合工具在布局佈線的時候直接將fpga內部暫存器輸出連到io上,但是這樣存在一定的問題,每次修改邏輯重新編譯的時候,輸出暫存器的位置有可能發生改變,那麼從暫存器輸出到io之間的佈線長度就會發生變化,造成暫存器輸出到達io之間的走線延遲發生改變,每一次編譯都會使得spi的輸出時序不確定。
為了解決這個問題,需要加入iob約束,將模組輸出埠的最後一級暫存器放在iob上,這樣最後一級輸出的暫存器位置就固定下來了,每次編譯都不會造成輸出時序發生改變。
iob約束使用方法如下:
1、在約束檔案中加入下面約束:
set_property iob true [get_ports ]
set_property iob true [get_cells ]
2、直接在**中加約束,在暫存器前加入下面約束,需要注意的是,對於輸入iob約束,這裡的暫存器是第一級暫存器,對於輸出iob約束,這裡的暫存器是最後一級暫存器,且暫存器輸出不能再作為組合邏輯輸入。
(* iob = "true" *) reg o_data;
對於輸出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有時序關係的都需要打一拍以保持同步。
MySQL 檢視約束,增添約束,刪除約束
mysql 檢視約束,新增約束,刪除約束 檢視表的字段資訊 desc 表名 檢視表的所有資訊 show create table 表名 新增主鍵約束 alter table 表名 add constraint 主鍵 形如 pk 表名 primary key 表名 主鍵字段 新增外來鍵約束 alter...
XML約束 DTD約束
xml語法 規範的 xml檔案的基本編寫規則。有 w3c組織制定的 xml約束 規範 xml檔案資料內容格式的編寫規則。由開發者自定義 dtd約束 語法相對簡單,功能相對簡單,學習成本相對低 schema約束 語法相對複雜,功能相對複雜,學習成本相對高 命名空間 1 匯入dtd方式 a 內部匯入 x...
XML約束 schema約束
1.什麼是schema約束?優勢在哪?xml的約束有兩種,分別是dtd約束和schema約束。因為dtd約束有很大的侷限性,所以我們通常都使用schema約束。優勢 2.xml schema約束開發 xml schema 檔案自身就是xml檔案,但他的副檔名通常為.xsd。和xml檔案一樣,xml ...