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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM