1. 程式人生 > 其它 >Xilinx FPGA “打一拍”“打兩拍”以及IOB含義

Xilinx FPGA “打一拍”“打兩拍”以及IOB含義

本次總結主要是參考網上的說法,最近在接觸到非同步時鐘同步的時候瞭解到利用“非阻塞賦值<=”進行時鐘同步,碰到有人說“打一拍”“打兩拍”可以降低亞穩態問題,聽起來有點糊,所以總結一下:

一、 “打一拍”“打兩拍”的含義

關於FPGA中“打一拍”的含義,我們可以理解為**把某個訊號延遲了一個時鐘週期,推而廣之:“打兩拍”就是延遲兩個時鐘週期,“打n拍”就是延遲n個時鐘週期。**通俗的講,打一拍就是系統時鐘對外部訊號取樣一次,把取樣的結果資料做為下一步的控制狀態!
“打一拍”的目的很簡單,就是為了FPGA中時序的正確性!!!!

二、輸入訊號為什麼要寄存

一般來說,在全同步設計中,如果訊號來自同一時鐘域,各模組的輸入不需要寄存。只要滿足建立時間,保持時間的約束,可以保證在時鐘上升沿到來時,輸入訊號已經穩定,可以取樣得到正確的值。但是如果模組需要使用輸入訊號的跳變沿(比如幀同步訊號),千萬不要直接這樣用哦。

三、所有訊號都需要寄存兩拍嗎

如果這個輸入訊號來自非同步時鐘域(比如FPGA晶片外部的輸入),必須寄存兩拍。第一拍將輸入訊號同步化,同步化後的輸出可能帶來建立/保持時間的衝突,產生亞穩態。需要再寄存一拍,減少(注意是減少)亞穩態帶來的影響。
如果這個輸入訊號來自於同一時鐘域且需要用到跳變沿,需要寄存一拍。否則時序報告多半會報clock skew > data delay,造成建立/保持時間的衝突。
總而言之,五條原則:
1.全域性時鐘的跳變沿最可靠。
2.來自非同步時鐘域的輸入需要寄存一次以同步化,再寄存一次以減少亞穩態帶來的影響。
3.不需要用到跳變沿的來自同一時鐘域的輸入,沒有必要對訊號進行寄存。
4.需要用到跳變沿的來自同一時鐘域的輸入,寄存一次即可。
5.需要用到跳變沿的來自不同時鐘域的輸入,需要用到3個觸發器,前兩個用以同步,第3個觸發器的輸出和第2個的輸出經過邏輯閘來判斷跳變沿。

訊號打拍的實現方法(包括Verilog程式碼)

將訊號打一拍的方法是將訊號通過一次暫存器,而且必須在IOB裡面的暫存器中打一拍。因為,從FPGA的PAD到IOB裡面的暫存器是有專用佈線資源的,而到內部其他暫存器沒有專用的佈線資源。使用IOB裡面的暫存器可以保證每次實現的結果都一樣,使用內部其他暫存器就無法保證每次用的都是同一個暫存器且採用同樣的佈線。同時,為了使用輸入輸出延遲功能(Input / Output delay),也必須要求訊號使用IOB裡面的暫存器。
給出一個verilog程式碼模板:

always @ (posedge Clk) //不對輸入訊號進行寄存
begin
if (inputs)
begin
...
end
...
end
always @ (posedge Clk) //對輸入訊號寄存一拍
begin
inputs_reg <= inputs;
if (inputs_reg == 1'b0 && inputs == 1'b1)
begin
...
end
...
end
always @ (posedge Clk) //對輸入訊號寄存三拍
begin
inputs_reg1 <= inputs;
inputs_reg2 <= inputs_reg1;
inputs_reg3 <= inputs_reg2;
if (inputs_reg2 == 1'b1 && inputs_reg3 == 1'b0)
begin
...
end
...
end

五、FPGA IOB的含義

如下圖所示,一個fpga主要是由可程式設計輸入輸出單元(圖中的IOB模組),可程式設計邏輯單元(CLB模組),塊RAM(圖中的BRAM,也屬於內嵌硬體),數字時鐘管理(DCM,也屬於內嵌硬體),還有一些內嵌的專用的硬體模組(DSP),IOB暫存器就在圖中的IOB模組中。

IOB(Input output block)是可程式設計輸入輸出單元,是fpga與外界電路的介面部分。用於完成不同電氣特性下對輸入/輸出訊號的驅動和匹配要求。 IOB單元簡稱IO單元,是晶片與外部器件的介面部分,用於完成不同電氣特性下對輸入輸出訊號的的驅動和匹配要求。目IO口的頻率越來越高,一些高階的fpga通過DDR技術可使資料率達到Gb/s.
為了讓I/O使用IOB裡面的暫存器,需要設定綜合與MAP(對應於Xilinx的ISE工具)的相關屬性。預設情況下,綜合過程和MAP過程都是根據軟體的分析自動判斷是否要將I/O 的暫存器放入 IOBs中。如果需要強制指定,必須將Pack I/O Registe Into IOBs的預設屬性修改成需要的值。對於XST,可以將I/O Pack Registers Into IOB屬性由預設的Auto 修改為Yes或No。對於Snyplify,可以在Verilog程式碼的模組宣告中新增屬性:/* synthesis syn_useioff = 1/。具體應用如下 module module_a(a,b,c) /synthesis syn_useioff = 1 */ ; 。MAP過程Pack I/O Registe Into IOBs屬性可以設定成:Off,For Inputs Only,For Output Only,For Input and Output。需要特別注意的是,如果只在MAP過程中要求將I/O放入IOBs中,而在綜合過程中沒有強制要求,最終實現時I/O不一樣會Pack Into IOBs。必須保證綜合和MAP同時對該屬性進行設定。
參考連結:https://blog.csdn.net/kebu12345678/article/details/80669549