Verilog基礎知識11(異步FIFO為什麽使用格雷碼(gray-code) )

分類:IT技術 時間:2016-10-12

需求說明:Verilog設計

內容       :第一部分 異步FIFO為什麽使用格雷碼

                  第二部分 格雷碼在異步FIFO中的使用

來自       :時間的詩


第一部分 異步FIFO為什麽使用格雷碼

原文:http://www.cnblogs.com/kxk_kxk/p/3931591.html


異步FIFO通過比較讀寫地址進行滿空判斷,但是讀寫地址屬於不同的時鐘域,所以在比較之前需要先將讀寫地址進行同步處理,將寫地址同步到讀時鐘域再和讀地址比較進行FIFO空狀態判斷(同步後的寫地址一定是小於或者等於當前的寫地址,所以此時判斷FIFO為空不一定是真空,這樣更保守),將讀地址同步到寫時鐘域再和寫地址比較進行FIFO滿狀態判斷(同步後的讀地址一定是小於或者等於當前的讀地址,所以此時判斷FIFO為滿不一定是真空,這樣更保守),這樣可以保證FIFO的特性:FIFO空之後不能繼續讀取,FIFO滿之後不能繼續寫入。

大多數情形下,異步FIFO兩端的時鐘不是同頻的,或者讀快寫慢,或者讀慢寫快,這時候進行地址同步的時候,可能會有地址遺漏,以讀慢寫快為例,進行滿標誌判斷的時候需要將讀地址同步到寫時鐘域,因為讀慢寫快,所以不會有讀地址遺漏,同步後的讀地址滯後當前讀地址,所以可能滿標誌會提前產生。進行空標誌判斷的時候需要將寫地址同步到讀地址,因為讀慢寫快,所以當讀時鐘同步寫地址的時候,必然會漏掉一部分寫地址(寫時鐘快,寫地址隨寫時鐘翻轉,直到滿標誌出現為止),那到底讀時鐘會同步到哪個寫地址?不必在意是哪一個,我們關註的是漏掉的地址會不會對FIFO的空標誌產生影響。比如寫地址從0寫到10,期間讀時鐘域只同步到了2,5,7這三個寫地址,漏掉了其他地址。同步到7地址時,真實的寫地址可能已經寫到10地址,相當於“在讀時鐘域還沒來得及覺察的情況下,寫時鐘域可能偷偷寫了數據到FIFO去”,這樣在比較讀寫地址的時候不會產生FIFO“空”讀操作。漏掉的地址也沒有對FIFO的邏輯操作產生影響。

我們可以對異步FIFO的地址采用binary編碼,這樣並不影響異步FIFO的功能,前提是讀寫地址同步時能夠保持正確。這種情況在功能仿真時完全正確,問題只有到時序仿真時才會遇到。毛刺可以說是異步電路的殺手,一個毛刺被觸發器采樣後會被放大,然後傳播,導致電路功能出錯。binary編碼的地址總線在跳變時極易產生毛刺,因為binary編碼是多位跳變,在實現電路時不可能做到所有的地址總線等長,address bus skew必然存在,而且寫地址和讀地址分屬不同時鐘域,讀寫時鐘完全異步,這樣地址總線在進行同步過程中出錯不可避免,比如寫地址在從0111到1000轉換時4條地址線同時跳變,這樣讀時鐘在進行寫地址同步後得到的寫地址可能是0000-1111的某個值,這個完全不能確定,所以用這個同步後的寫地址進行FIFO空判斷的時候難免出錯。

這個時候gray碼體現了價值,一次只有一位數據發生變化,這樣在進行地址同步的時候,只有兩種情況:1.地址同步正確;2.地址同步出錯,但是只有1位出錯;第一種正確的情況不需要分析,我們關註第二種,假設寫地址從000->001,讀時鐘域同步出錯,寫地址為000->000,也就是地址沒有跳變,但是用這個錯誤的寫地址去做空判斷不會出錯,最多是讓空標誌在FIFO不是真正空的時候產生,而不會出現空讀的情形。所以gray碼保證的是同步後的讀寫地址即使在出錯的情形下依然能夠保證FIFO功能的正確性,當然同步後的讀寫地址出錯總是存在的(因為時鐘異步,采樣點不確定)。這裏需要註意gray碼只是在相鄰兩次跳變之間才會出現只有1位數據不一致的情形,超過兩個周期則不一定,所有地址總線bus skew一定不能超過一個周期,否則可能出現gray碼多位數據跳變的情況,這個時候gray碼就失去了作用,因為這時候同步後的地址已經不能保證只有1位跳變了。

另外需要將地址總線打兩拍,這是為了避免亞穩態傳播,理論上將打兩拍不能消除亞穩態現象,因為時鐘異步,亞穩態不可避免,但是可以極大降低亞穩態傳播的概率,低頻情況下甚至STA不需要分析這裏的異步時序,因為寄存器都可以在一拍內將亞穩態消除,恢復到正常0/1態。而在高頻情況下則不一定,尤其在28nm工藝以下,需要檢查兩級觸發器的延遲,保證延遲低,這樣可以提高Tr,提高系統MTBF。


第二部分 格雷碼在異步FIFO中的使用

原文:http://blog.163.com/fpga_ip/blog/static/20444302420123268413975/


1.格雷碼的介紹


        在介紹格雷碼之前,我們先說說自然二進制碼,也就是我們經常說的二進制數。我們用二進制數表示一個變化的數值,例如,用一個8位的二進制數表示熱水壺的溫度,溫度是不斷連續變化的,36°C、37°C、38°C......,那麽溫度每升高一度,二進制數就加1。這時候,二進制數有可能是多個位同時變化的:當溫度由119°C變成120°C時,二進制數由01110111變化成01111000,有四個位發生變化;當二進制數由177°C變化成178°C時,二進制數由01111111變化成10000000,有8個位發生了變化。也就是說,自然二進制數在表示一個連續變化的數值時,可能會有多個位同時發生變化,每個位翻轉(變化)的頻率是比較高的,這在某些應用場合,如在FPGA內部跨時鐘域傳輸數據時,是十分不利的。

        而格雷碼,由於具有循環特性和單步特性,當用它表示一個連續變化的數值時,僅有一個位會翻轉,大大的降低了位翻轉的頻率,因而可以保證傳輸的穩定性,較少傳輸誤碼率。格雷碼的單步特性是指,當格雷碼表示的一個數值,連續變化時,格雷碼只有一個位會變化。例如,當十進制數由7變成8時,自然二進制數是由0111變成1000,格雷碼是由0100變成1100。自然二進制數有4位發生翻轉,格雷碼只有一位發生翻轉。格雷碼的循環特性是指,當一個格雷碼表示的數,由最大值變為最小值時,也只有一個位發生翻轉。例如,一個4位的格雷碼,能表示的最大十進制數是15,能表示的最小十進制數是0,當十進制數由15變成0時,自然二進制數由1111變成0000,格雷碼由1000變成0000。自然二進制數有4位翻轉,格雷碼只有1位翻轉。


2.格雷碼與自然二進制數的轉換


      二進制碼->格雷碼:
      從最右邊一位起,依次將每一位與左邊一位異或(XOR),作為對應格雷碼該位的值,最左邊一位不變(相當於左邊是0);


      格雷碼->二進制碼:
      從左邊第二位起,將每位與左邊一位解碼後的值異或,作為該位解碼後的值(最左邊一位依然不變)。


      以下給出四位格雷碼與二進制數、十進制數的對照表:

 十進制數  二進制數  格雷碼
 0  0000  0000
 1  0001  0001
 2  0010  0011
 3  0011  0010
 4  0100  0110
 5  0101  0111
 6  0110  0101
 7  0111  0100
 8  1000  1100
 9  1001  1101
 10  1010  1111
 11  1011  1110
 12  1100  1010
 13  1101  1011
 14  1110  1001
 15  1111  1000


3.格雷碼在異步FIFO中的應用

        在異步FIFO中,寫操作和讀操作工作在不同的時鐘域,需要跨時鐘域來傳遞FIFO的空滿狀態信息。一般是通過傳遞讀寫的地址來實現空滿狀態控制的。寫地址減去讀地址(如果寫地址小於讀地址,則寫地址先加上FIFO深度再減去讀地址),即為FIFO中存放的數據個數,由此產生FIFO的空滿判斷。不管是讀地址還是寫地址,每次變化都是加1,溢出後從0開始重新累加。當寫地址跨越時鐘域到達讀操作一側時,需要用讀時鐘去采樣由寫時鐘產生的數據(即寫地址)。由於是異步操作,有可能會出現競爭和冒險,采樣過程不滿足建立保持時間,導致亞穩態。寫地址變化的位越多,出現亞穩態的位就越多,用讀時鐘采樣時出錯的概率越高。同理,當讀地址跨越時鐘域到達寫操作側時,讀地址變化的位越多,寫時鐘采樣時出錯的概率越高。因為,必須采用有效的編碼,降低讀寫地址在連續變化時的位翻轉率。采用格雷碼就能有效的降低連續變化數值的位翻轉率。所以,可以在將地址跨越時鐘域之前,先轉換成格雷碼,然後跨越時鐘域。到達另一時鐘域後,通過兩級寄存器消除亞穩態,再將格雷碼轉換成二進制數。這樣,每次地址變化,跨越時鐘域時只有一位可能出錯,可以大幅降低出錯概率,提高FIFO運行的可靠性。


4.設計實例

       對於使用格雷碼實現異步FIFO的實例,可參閱:異步FIFO的實現 。


5.知識擴展

       格雷碼雖然也是用0和1表示,但它並不是二進制數,格雷碼是一種變權碼,每個位碼沒有固定的大小。在各種進制數的表示方法中,每一位有一個大小,稱之為權,一個數的大小不僅與它的數字(十進制為0~9,十六進制為0~f,二進制為0和1)有關,還有數字的位置有關,數值放在權比較大位置,數就比較大。如同樣是使用數字0和1,十進制數1000就比0001要大。十進制數的位權是以10為底的冪,二進制數的位權是以2為底的冪,十六進制數的位權是以16為底的冪。冪的指數從右到左依次增加。例如,在自然二進制數0100中,右邊開始數第一個位碼的大小(位權)是2的0次方,第二個位碼的大小是2的1次方,第三個位碼的大小是2的2次方。而格雷碼的每一個位不具有固定的權(大小)。

      另外,格雷碼編碼方式不是唯一的,本文介紹的是最常用的一種。


Tags:

文章來源:


ads
ads

相關文章
ads

相關文章

ad