天天看點

FPGA 37 專題 跨時鐘域問題及亞穩态問題的處理方式

FPGA 37 專題 跨時鐘域問題及亞穩态問題的處理方式

FPGA 37 專題 跨時鐘域問題及亞穩态問題的處理方式

原文學習連結 : https://zhuanlan.zhihu.com/p/368552207

注:首先聲明,這個是基于上述兩個連結一個整理學習筆記和一些自己的了解便于我個人解讀,以防後續找不到做個備份,如果原作者對此有争議,後面請部落客通過部落格聯系我處理,避免産生一些誤會。

1、什麼叫做始時鐘域

FPGA 37 專題 跨時鐘域問題及亞穩态問題的處理方式

​ 假如設計中所有的觸發器都使用一個全局網絡,比如FPGA的主時鐘輸入,那麼我們說這個設計隻有一個時鐘域。假如設計有兩個輸入時鐘,如圖1所示,一個時鐘給接口1使用,另一給接口2使用,那麼我們說這個設計中有兩個時鐘域。

2、什麼叫做亞穩态

​ 觸發器的建立時間和保持時間在時鐘上升沿左右定義了一個時間視窗,如果觸發器的資料輸入端口上資料在這個時間視窗内發生變化(或者資料更新),那麼就會産生時序違規,我了解的就是在虛線框中,針對clock2時鐘,資料剛剛好捕獲Din 的信号,而Din 在這個時鐘上升沿的時候剛好在由低電平導高電平的電平變化,這樣我們在采集的時候,就會出來Dout 的信号,也就是可能是‘ 0 ’ 或者 可能是 ‘ 1 ’的信号。這就是亞穩态。

​ (原文解釋) 如下圖所示,在這個時序clock2違規是因為建立時間要求和保持時間要求被違反了,此時觸發器内部的一個節點(或者要輸出到外部的節點)可能會在一個電壓範圍内浮動,無法穩定在邏輯0或者邏輯1狀态。換句話說,如果資料在上述視窗中被采集,觸發器中的半導體不能可靠地設定為邏輯0或者邏輯1對應的電平上。是以此時的半導體并未處于飽和區對應的高或者低電平,而是在穩定到一個确定電平之前,徘徊在一個中間電平狀态(這個中間電平或許是一個正确值,也許不是)。如圖2所示,這就是所謂的亞穩态。

FPGA 37 專題 跨時鐘域問題及亞穩态問題的處理方式

一般解決信号亞穩态有三種方法:

相位控制

相位控制技術可以在一個時鐘頻率是另外一個時鐘的【數倍】(注: 跨時鐘的兩個時鐘頻率必須呈現倍數關系才能用這種方式)并且其中一個時鐘可以由FPGA 内部PLL 或者DLL 控制時使用,初始相位必須是相同的。

多級寄存器

一般針對單bit控制信号跨越兩個異步時鐘域傳輸,可以采用多級寄存器,俗稱多打拍。同步電路中的第一拍後也許會産生亞穩态,但是信号有機會在其被第二級寄存以及被其它邏輯看到之前穩定下來。常用的就是對單bit信号打兩拍,這也是最簡單、最常見的處理方式。

單bit信号消除亞穩态的方法:多級觸發器法

假設A和B是兩個時鐘域,各自的頻率是clk_a和clk_b,clk_a的頻率高于clk_b(同頻相位差穩定的,不在讨論範圍内)

2.1信号從B到A(慢到快)

FPGA 37 專題 跨時鐘域問題及亞穩态問題的處理方式

​ 在時鐘域B下的脈沖信号pulse_b在時鐘域A看來,是一個很慢(寬)的“電平”信号會,保持多個clk_a的時鐘周期,是以一定能被clk_a采到。

​ 經驗設計采集過程必須寄存兩拍。第一拍将輸入信号同步化,同步化後的輸出可能帶來建立/保持時間的沖突,産生亞穩态。需要再寄存一拍,減少亞穩态帶來的影響。

​ 一般來說兩級是最基本要求,如果是高頻率設計,則需要增加寄存級數來大幅降低系統的不穩定性。也就是說采用多級觸發器來采樣來自異步時鐘域的信号,級數越多,同步過來的信号越穩定。

​ 特别需要強調的是,此時pulse_b必須是clk_b下的寄存器信号,如果pulse_b是clk_b下的組合邏輯信号(可以了解是一個按鍵的非異步信号),一定要先在clk_b先用D觸發器(DFF)抓一拍,再使用兩級DFF向clk_a傳遞。這是因為clk_b下的組合邏輯信号會有毛刺,在clk_b下使用時會由setup/hold時間保證毛刺不會被clk_b采到,但由于異步相位不确定,組合邏輯的毛刺卻極有可能被clk_a采到。一般代碼設計如下:

2.2信号從B到A(快到慢)

FPGA 37 專題 跨時鐘域問題及亞穩态問題的處理方式

​ 如果單bit信号從時鐘域A到時鐘域B,那麼存在兩種不同的情況,傳輸脈沖信号pulse_a或傳輸電平信号level_a。實際上,在一般情況下隻有電平信号level_a的寬度能被clk_b采集到才可以保證系統正常工作。那麼對于脈沖信号pulse_a采取怎樣的處理方法呢?可以用一個展寬信号來替代pulse_a實作垮時鐘域的握手。

​ 主要原理就是先把脈沖信号在clk_a下展寬,變成電平信号signal_a,再向clk_b傳遞,當确認clk_b已經“看見”信号同步過去之後,再清掉signal_a。代碼通用架構如下:

在頂層為設計分區是一個好的設計實踐行為,這樣任何功能子產品外面都包含一個獨立的同步器子產品(Sync_Pulse 子產品,就是上面的那個代碼子產品)。這樣有利于在劃分子產品的基礎上實作所謂的理想時鐘域情況(即整個設計子產品隻有一個時鐘),如下圖所示:

FPGA 37 專題 跨時鐘域問題及亞穩态問題的處理方式

對設計進行分區有很多優勢。首先,對每個獨立的功能子產品進行時序分析變得簡易,因為子產品都是完全的同步設計。其次,整個同步子產品中的時序例外也很容易得到定義。再次,底層子產品的同步器加時序例外在代入到設計頂層時,大大降低了由于人為失誤造成的疏漏。是以,同步寄存器應該在功能子產品外單獨分區。

異步FIFO緩存

一般用于跨時鐘域傳輸資料,寫端和讀端分别對應兩個時鐘域,由【空/滿信号控制着讀寫過程】,實作資料的跨域傳輸。