天天看點

異步FIFO(一)——FIFO的理論基礎

本文為學習筆記,主要參考《VerilogHDL進階數字設計》,Clifford的論文Simulation and Synthesis Techniques for Asynchronous FIFO Design以及張波的碩士論文:基于SOC異步FIFO的設計與形式驗證

FIFO簡介

FIFO為First in first out 的縮寫,是一種先進先出存儲器,通常用于接口電路的資料緩存,跨時鐘域的資料傳輸。與普通的存儲器的差別在于,沒有外部輸入的讀寫位址,使用讀寫的時鐘進行讀寫控制,FIFO隻能按順序讀寫資料。

異步FIFO的基本結構為

異步FIFO(一)——FIFO的理論基礎

整個FIFO主要分為4個結構:雙端口RAM存儲器,寫操作控制邏輯,讀操作控制邏輯,空/滿标志位産生邏輯。

FIFO深度的計算

在設計一個FIFO之前,我們首先要計算FIFO的深度。有關于FIFO深度的計算問題大家可以參考博文:https://blog.csdn.net/qq_26652069/article/details/90720568

寫讀位址

FIFO 本質屬性是緩存器,要求資料進出前後順序上保持一緻。為了實作先進先出,通常,FIFO 初始設計會定義内部存儲器以及一個時鐘周期FIFO 寫入和讀出資料的長度,并初始化相應的計數器。當堆棧為空時,寫指針指向記憶體初始位置,當寫操作開始驅動寫邏輯單元,一個寫時鐘後,記憶體完成了對寫資料的存儲,這時寫位址指針加1,指向下一個存儲位址,直到下一次寫操作,重複上述行為。同樣的,讀操作也是如此,讀位址指針會從一開指向初始位置,直到指向寫位址位置,表示讀空位置。是以,不同于一般記憶體的位址控制,異步FIFO中,無需位址線來查找特定的存儲單元取而代之的是讀寫位址指針的應用。

空滿标志

空滿标志的産生,是一個FIFO設計是否合理的核心。設計FIFO時我們需要避免,滿寫空讀的情況發生。

由上節的讀寫位址的産生我們可以知道,FIFO為空時意味着,讀位址追上了寫位址。FIFO為滿時意味着,寫位址繞過了一圈又追上了讀位址。

空滿标志的産生主要有兩種方法:

1、長度計數器法,寫一次計數器加一讀一次計數器減一;

2、位址為擴充法,用最高位來判斷空滿,當位址位相等時,擴充的最高位相等,則為空,不相等為滿。

這裡我們采用的是,位址位擴充法來産生空滿标志,是以需要在寫時鐘域産生滿标志,防止滿寫;在讀時鐘域産生空标志,防止空讀。

異步FIFO的時鐘同步

由于異步FIFO工作在兩個獨立的時鐘域下,讀寫可同時發生。當讀寫指針,指向不同的位址時,讀寫操作互不影響;當讀寫指針指向同一個單元時,容易導緻亞穩态的出現。

這時,我們就需要,将寫指針同步到讀時鐘域,将讀指針同步到寫時鐘域。

同步裝置的電路有兩種基本的類型:

第一種,異步輸入脈沖寬度,比時鐘周期更大一些。

異步FIFO(一)——FIFO的理論基礎

第二種,異步輸入脈沖寬度比時鐘周期小一些

異步FIFO(一)——FIFO的理論基礎

在同步時,可以選擇使用格雷碼計數器,因為格雷碼計數器在每個時鐘周期上隻變化一位,在同步時不容易出錯。但是格雷碼為無權碼,計數器不容易實作,且不易比較産生空滿标志。是以先将位址轉化為格雷碼,由同步器同步至另一個時鐘,再由格雷碼-二進制碼轉換器轉換成二進制碼進行比較。

虛空和虛滿

以滿标志的産生為例,讀位址通過同步器同步到寫時鐘域,在這會産生兩個或三個周期的延遲,是以滿标志的産生是通過比較現在的寫位址和兩三個周期以前的讀位址産生的。是以這裡顯示的滿并不是真的滿,但是這不影響FIFO正常功能。

異步FIFO的代碼将在下一篇給出。

繼續閱讀