最經(jīng)典的FIFO原理_第1頁
最經(jīng)典的FIFO原理_第2頁
最經(jīng)典的FIFO原理_第3頁
最經(jīng)典的FIFO原理_第4頁
最經(jīng)典的FIFO原理_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、僅供參考J/異步FIFO結(jié)構(gòu)(第一部分)作者:Vijay A.Nebh ani翻譯: Adam Luo2006年7月設計一個FIFO是ASIC設計者遇到的最普遍的問題之一。本文著重介紹怎 樣設計FIFO這是一個看似簡單卻很復雜的任務。一開始,要注意,F(xiàn)IFO通常用于時鐘域的過渡,是雙時鐘設計。換句話說, 設計工程要處理(work off)兩個時鐘,因此在大多數(shù)情況下,F(xiàn)IFO工作于獨立 的兩個時鐘之間。然而,我們不從這樣的結(jié)構(gòu)開始介紹一我們將從工作在單時鐘 的一個FIFO特例開始。雖然工作在同一時鐘的 FIFO在實際應用中很少用到, 但它為更多的復雜設計搭建一個平臺,這是非常有用的。然后再從特

2、例推廣到更為普通的FIFO,該系列文章包括以下內(nèi)容:1.單時鐘結(jié)構(gòu)2 .雙時鐘結(jié)構(gòu)一一雙鐘結(jié)構(gòu)13. 雙時鐘結(jié)構(gòu)一一雙鐘結(jié)構(gòu)24. 雙時鐘結(jié)構(gòu)一一雙鐘結(jié)構(gòu)35. 脈沖模式FIFO單時鐘FIFO特例FIFO有很多種結(jié)構(gòu),包括波浪型(ripple) FIFO,移位寄存器型以及其他一 些我們并不關(guān)心的結(jié)構(gòu)類型。我們將集中討論包含 RAM存儲器的結(jié)構(gòu)類型。其 結(jié)構(gòu)如圖1所示。Figure 1. A FIFO Arctiitectura通過分析,我們看到圖中有一個具有獨立的讀端口和獨立的寫端口的RAM存儲器。這樣選擇是為了分析方便。如果是一個單端口的存儲器,還應包含一個 仲裁器保證同一時刻只能進行一項操

3、作(讀或?qū)懀?,我們選擇雙口 RAM (無需真正的雙口 RAM,因為我們只是希望有一個簡單的相互獨立的讀寫端口)是因 為這些實例非常接近實際情況。讀、寫端口擁有又兩個計數(shù)器產(chǎn)生的寬度為Iog2(array_size)的互相獨立的讀、 寫地址。數(shù)據(jù)寬度是一個非常重要的參數(shù)將在在稍后的結(jié)構(gòu)選擇時予以介紹,而現(xiàn)在我們不必過分的關(guān)心它。為了一致,我們稱這些計數(shù)器為“讀指針”(readpointer)和“寫指針”(write pointer)。寫指針指向下一個將要寫入的位置,讀指 針指向下一個將要讀取的位置。每次寫操作使寫指針加1,讀操作使讀指針加1。我們看到最下面的模塊為“狀態(tài)” (stauts)模塊。

4、這個模塊的任務實給FIFO 提供“空”(empty)和“滿”(full)信號。這些信號告訴外部電路 FIFO已經(jīng)達 到了臨界條件:如果出現(xiàn)“滿”信號,那么 FIFO為寫操作的臨界狀態(tài),如果出 現(xiàn)“空”信號,則FIFO為讀操作的臨界狀態(tài)。寫操作的臨界狀態(tài)(“full is active”) 表示FIFO已經(jīng)沒有空間來存儲更多的數(shù)據(jù),讀操作的臨界表示FIFO沒有更多 的數(shù)據(jù)可以讀出。 status 模塊還可告訴 FIFO 中“滿”或“空”位置的數(shù)值。這 是由指針的算術(shù)運算來完成了。實際的“滿”或“空”位置計算并不是為 FIFO 自身提供的。它是作為一個 報告機構(gòu)給外部電路用的。但是, “滿”和“空

5、”信號在 FIFO 中卻扮演著非常 重要的角色,它為了能實現(xiàn)讀與寫操作各自的獨立運行而阻塞性的管理數(shù)據(jù)的存 取。這種阻塞性管理的重要性不是將數(shù)據(jù)復寫(或重讀) ,而是指針位置可以控 制整個FIFO,并且使讀、寫操作改變著指針數(shù)值。如果我們不阻止指針在臨界 狀態(tài)下改變狀態(tài), FIFO 還能都一邊“吃”著數(shù)據(jù)一邊“產(chǎn)生”數(shù)據(jù),這簡直是 不可能的。進一步分析: DPRAM 若能夠寄存讀出的信號,這意味著存儲器的輸出數(shù)據(jù) 已被寄存。如果這樣的話,讀指針將不得不設計成“ read 并加 1 ”,也就是說在 FIFO 輸出數(shù)據(jù)有效之前, 必須提供一個明確的讀信號。 另一方面, 如果 DPRAM 沒有寄存輸

6、出,一旦寫入有效數(shù)據(jù)就可以讀出;先讀數(shù)據(jù),然后使指針加 1。這 將影響到從 FIFO 讀出數(shù)據(jù)和實現(xiàn)空 /滿計算的邏輯。 由于簡化的緣故, 我們僅論 述 DPRAM 沒有提供索鎖存輸出的情況。 同理, 將其推廣到寄存輸出的 DPRAM 并不是很復雜。從功能上看, FIFO 工作原理如下所述:復位時,讀、寫指針均為0。這是FIFO 的空狀態(tài),空標志為高電平, (我們用高電平表示空標志)此時滿標志為低 電平。當 FIFO 出現(xiàn)空標志時,不允許讀操作,只能允許寫操作。寫操作寫入到 位置 0,并使寫指針加 1。此時,空標志變?yōu)榈碗娖?。假設沒有發(fā)生讀操作而且 隨后的一段時間 FIFO 中只有寫操作。 一

7、定時間后,寫指針的值等于 array_size-1。 這就意味著在存儲器中, 要寫入數(shù)據(jù)的最后一個位置就是下一個位置。 在這種情 況下,寫操作將寫指針變?yōu)?0,并將輸出滿標志。注意,在這種情況下,寫指針和讀指針是相等的,但是 FIFO 已滿,而不是 空。這意味著“滿”或“空”的決定并不是僅僅基于指針的值,而是基于引起指 針值相等的操作。如果指針值相等的原因是復位或者讀操作, FIFO 認為是空; 如果原因是寫操作,那么 FIFO 認為是滿?,F(xiàn)在,假設我們開始一系列的讀操作, 每次讀操作都將增加讀指針的值, 直 到讀指針的位置等于array_size-1。在該點,從這個位置讀出的FIFO輸出總線

8、上 的數(shù)據(jù)是有效的。隨后的邏輯讀取這些數(shù)據(jù)并提供一個讀信號 (在一個時鐘周 期內(nèi)有效)。這將導致讀指針再次等于寫指針(在兩個指針走完存儲器一圈后) 。 然而,由于這次相等是由于一個讀操作,將會輸出空標志。因此,我們將得到如下的空標志:寫操作無條件的清除空標志Read pointer=(array_size-1) , 讀操作置空標志。以及如下的滿標志:讀操作無條件的清除滿標志,Write pointer= (array_size-1), 寫操作置滿標志。然而,這是一個特殊的例子,由于一般情況下,讀操作在FIFO不是空的情 況下就開始了(讀操作邏輯不需要等待 FIFO 變滿),因此這些條件不得不修

9、改 來存儲讀指針和寫指針的每一個值。有這樣一個想法, 那就是我們可以將存儲器組織成一個環(huán)形列表。 因此,如 果寫指針與讀指針差值大于 1 或更多,就進行讀操作, FIFO 為空,這種工作方 式對于用無符號(n-bit)結(jié)構(gòu)來描述的臨界狀態(tài)非常適合。同樣的,如果讀指針 與寫指針的差值大于 1,就進行寫操作,直到 FIFO 為滿。這將帶來如下的條件: 寫操作無條件的清除空標志。write_po in ter=(read_po in ter+1),讀操作置空。 讀操作無條件的清除滿標志,read_pointer= (write_pointe葉1),寫操作置滿。注意,讀操作和寫操作同時都在使其指針增加

10、, 但不改變空標志和滿標志的 狀態(tài)。在空或滿的臨界狀態(tài)同時讀操作和寫操作都是不允許的。綜上所述,我們現(xiàn)在能夠定義 FIFO的status模塊,這里提供了用VHDL編 寫的代碼,由于是同步的,很容易轉(zhuǎn)換成 Verilog HDL 代碼。library IEEE, STD;use IEEE.std_logic_1164.all;use IEEE.std_logic_arith.all;use IEEE.std_logic_unsigned.all; entity status is port (reset : in std_logic; clk : in std_logic; fifo_wr :

11、in std_logic; fifo_rd : in std_logic; valid_rd : out std_logic;valid_wr : out std_logic;rd_ptr : out std_logic_vector(4 downto 0); wr_ptr : out std_logic_vector(4 downto 0);empty : out std_logic; full : out std_logic );end status; architecture status_A of status is signal rd_ptr_s : std_logic_vector

12、(4 downto 0); signal wr_ptr_s : std_logic_vector(4 downto 0); signal valid_rd_s : std_logic; signal valid_wr_s : std_logic;begin empty_P : process(clk, reset) beginif (reset = '1') then empty <= '1'elsif (clk'event and clk = '1') then if (fifo_wr = '1' and fifo

13、_rd = '1') then - do nothing null;elsif (fifo_wr = '1') then- write unconditionally clears empty empty <= '0'elsif (fifo_rd = '1' and (wr_ptr_s = rd_ptr_s + '1') then - set empty empty <= '1'end if;end if;end process;full_P : process(clk, reset)b

14、eginif (reset = '1') thenfull <= '0'elsif (clk'event and clk = '1') then if (fifo_rd = '1' and fifo_wr = '1') then - do nothing null;elsif (fifo_rd = '1') then- read unconditionally clears full full <= '0'elsif (fifo_wr = '1'

15、and (rd_ptr_s = wr_ptr_s + '1') then - set full full <= '1'end if;end if;end process;valid_rd_s <= '1' when (empty = '0' and fifo_rd = '1'); valid_wr_s <= '1' when (full = '0' and fifo_wr = '1'); wr_ptr_s_P : process(clk, reset

16、) beginif (reset = '1') then wr_ptr_s_P <= (others => '0');elsif (clk'event and clk = '1') then if (valid_wr_s = '1') then wr_ptr_s <= wr_ptr_s + '1' end if;end if;end process;rd_ptr_s_P : process(clk, reset) beginif (reset = '1') the nrd_

17、ptr_s_P <= (others => '0');elsif (clk'eve nt and clk = '1') then if (valid_rd_s = '1') then rd_ptr_s <= rd_ptr_s + '1'end if;end if;end process;rd_ptr <= rd_ptr_s;wr_ptr <= wr_ptr_s;end status_A;電路圖如圖2所示:Figure 2; Circuit Tor Status block and pointe

18、rs of FIFO of Figure 1.細心的讀者會注意到圖2中產(chǎn)生滿或空標志需要同時用到兩個指針。 在雙時鐘設計的情況下,希望用讀指針處理(work off)讀時鐘,寫指針處理(work off)寫時鐘。這會引起不希望發(fā)生的毛刺問題一一自己可以去試一試,看一看。這些問題以及一些解決方案將在后續(xù)的該系列文章中提及。PS:文章中三次提到 work off clock,分別在開頭和結(jié)尾處,work off字面意思是"去除, 消除,出售”的意思,可是在FIFO中,不應該是去除的意思,故根據(jù)前后文和常識,將其翻譯為“處理”,有不對的地方請批評指正!還有兩部分,會盡快翻譯出來,敬請期待&

19、lt;未完待續(xù)>Adam Luo BEJING異步 FIFO 結(jié)構(gòu)第二部分)作者:Vijay A. Nebhrajani翻譯:Adam Luo2006 年 7 月在先前的該系列文章中,我們看到了怎樣用雙端口、無寄存器輸出的 RAM 設計同步FIFO。這部分我們將探討同樣的概念,并將其推廣到怎樣產(chǎn)生具有相 互獨立、自由工作的讀、寫時鐘的 F I F O 。擁有自由工作時鐘簡化了很多問題, 但是這導致了一個特殊情況下的解決方法。 普通情況下不對時鐘進行假設, 甚至 不假設其自由工作。我將在本系列文章的最后一部份討論最普通的情況。如果你看過先前的文章,你會發(fā)現(xiàn)只有 status模塊工作在兩個時

20、鐘。存儲器 沒有寄存輸出, 所以它確實不需要用讀時鐘; 即使它是寄存輸出, 也可毫無問題 的運行于讀時鐘上。Status模塊本質(zhì)的功能是對兩個指針進行操作,而且這兩個 指針工作在不同的時鐘域。 這也是真正的困難所在。 如果打算用寫時鐘來取樣讀 指針或用讀時鐘來取樣寫指針, 將不可避免的遇到一個問題: 亞穩(wěn)態(tài)。它將導致 空/滿標志的計算錯誤,并導致設計的失敗。1 亞穩(wěn)態(tài)接下來我們將系統(tǒng)地開始探討亞穩(wěn)態(tài), 并解決由亞穩(wěn)態(tài)產(chǎn)生的問題。 首先我 們來了解一下什么是亞穩(wěn)態(tài)。 亞穩(wěn)態(tài)是一種物理現(xiàn)象的名稱, 它發(fā)生在一個事件 試圖取樣1( sample)另一事件的時候。亞穩(wěn)態(tài)可以描述如下:假設一個信號在 t

21、 = 0時刻瞬間從 0變?yōu)?1,那么信號在 t = 0時刻的值究竟是多少?是 0 還是 1, 或者在兩者之間?在亞穩(wěn)態(tài)中,這個問題被定義的兩個時刻回避了,分別是 0- 和 0+。在 t = 0-時刻,規(guī)定信號的取值為 0, t = 0+ 時刻規(guī)定信號的取值為 1。 顯然, 0- = 0 - 0, 0+ =0 + 0。注意,這僅僅是一個數(shù)學定義,如果你正在用實際 的電路做同樣的事,輸出將有可能是邏輯 0 (0伏)或者邏輯 1(5伏),或者是 介于 0 5 伏中間的某個值。正如在數(shù)學中描述的一樣,物理系統(tǒng)中一個事件取 樣另一個事件產(chǎn)生了不可預知的結(jié)果。 不可預知性也就意味著另一個跡象亞 穩(wěn)態(tài)很危險

22、。1.1 時間分辨率( Resolution Time 翻轉(zhuǎn)時間?)當一個事件取樣一個穩(wěn)定值時(或者一個能穩(wěn)定一段時間的值) ,取樣值就 隨這個穩(wěn)定值而變化。假設在 D 觸發(fā)器情況下,就是 Q 值隨 D 值變化。這段能 夠穩(wěn)定取樣的時間用相關(guān)的取樣事件來定義, 稱之為時間分辨率 (翻轉(zhuǎn)時間?)。 也就是我們所熟悉的“clock-to Q time”,或匕。如果遇到觸發(fā)器的setup time2和 hold time,這將是cell設計者保證輸入能夠正確變?yōu)檩敵龅臅r間。亞穩(wěn)態(tài)影響 物理系統(tǒng)的時間分辨率,同樣也影響輸出值。在“不穩(wěn)定平衡”情況下考慮這些 問題,就像“山上的球” (或者球面上的球體)

23、你不知道它會向哪個方向滾,這 個球就處于不穩(wěn)定平衡狀態(tài)。 如果球完全不受干擾, 它有可能一直呆在原地, 但 是微小的晃動會使球滾到山的一邊或另一邊。這將無法計算球從山上滾下的距 離,或者無法計算球從山的哪一邊滾下來。 這就是亞穩(wěn)態(tài)的一個準確的例子 你無法預知物理系統(tǒng)輸出的值將會變成什么樣, 多久會變化, 并且相當危險。 換 句話說, 輸出永遠保持一個有限非零概率的亞穩(wěn)態(tài)。 在現(xiàn)實中, 盡管很少有這種 情況發(fā)生, 但20倍的 clock-to Q 時間是一個合理的時間分辨率數(shù)值。 在理論上, 當取樣操作接近被取樣事件的時候,時間分辨率是無限的漸進曲線。1.2 MTBF (平均無故障時間)與可靠性

24、如果一個設計中包含同步組件,無論是否愿意它都會出現(xiàn)亞穩(wěn)態(tài)。亞穩(wěn)態(tài)無 法徹底消除,因此我們所做的就是計算錯誤概率以及在時間上來描述它。讓我們來看一下,假設這里有一個物理系統(tǒng)亞穩(wěn)態(tài)錯誤發(fā)生的概率為 1/1000。換句話說, 每一千次采樣就會因為亞穩(wěn)態(tài)發(fā)生一次錯誤。 這也意味著,每一千次,輸出就會 在下一個時鐘沿到來時,無法變化。如果時鐘頻率為1KHz,那么每秒都會有一次錯誤出現(xiàn),MTBF值就為1秒。當然,這個假設過于簡單;MTBF是一種故障 概率的統(tǒng)計度量,并且需要更為復雜、經(jīng)驗化、實驗化的數(shù)據(jù)來計算。對于觸發(fā) 器來說,這種關(guān)系依賴于電路自身的物理常數(shù)和時鐘頻率,記住亞穩(wěn)態(tài)本身與時鐘沒有任何關(guān)系,

25、但是它和MTBF相關(guān)3。自然的,我們會說一個可靠性好的電 路具有很高的MTBF值。1.3同步由于亞穩(wěn)態(tài)無法徹底避免,在設計電路時一定要一一很好的處理錯誤。將錯誤發(fā)生的概率降到最低。Figure 1 Dual Stage Synrhronizatinn首先要求,設計與設計之間要有很大的區(qū)別,它并不在本文介紹的范圍。第 二個要求,使用“同步”技術(shù)。這種技術(shù)由兩個觸發(fā)器簡單的組合在一起如圖1所示。僅當Q1的出現(xiàn)非常接近時鐘沿的時候,Q2才會進入亞穩(wěn)態(tài)。如果在亞 穩(wěn)態(tài)情況下我們將20倍的tcq作為時間分辨率,那么時鐘周期將為tclk = 20tcq +tsetup。這說明經(jīng)過20倍的clock-to

26、Q時間,輸出仍然隨輸入改變的概率大大減小。 因此,在時鐘沿到來時Q2沒有被改變的概率接近P2,這里P是第一級輸出沒有 在時鐘沿到來時隨輸入而改變的概率。這稱為兩級同步。當使用這個時鐘頻率下 概率來計算MTBF時,MTBF值會提高很多。如果愿意的話,可以通過三級同 步進一步增加MTBF值。但這在實際中很少需要。如圖2所示,可以在電路中增加冗余的同步來很好的抵御亞穩(wěn)態(tài)。在三冗余和等同于兩冗余的狀態(tài)下,最終的輸出大部分(三分之二)可以計算出來。在這 個實例中,小尺寸的布局布線與器件的差異說明了如果一個同步器產(chǎn)生亞穩(wěn)態(tài)錯 誤,其他的兩級也會產(chǎn)生亞穩(wěn)態(tài)錯誤,所有的概率將隨之改變。這種技術(shù)僅在要 求非???/p>

27、刻時候的用到。欲更多了解亞穩(wěn)態(tài)與同步的知識,請參閱Grosse, Debora 的“ Keep metastabiliy from killing your digital design ”http:/www.ed n. com/archives/1942/062394/13df2.htmAfiyyiciul ipirv 2 Dpublv and I riple rvdundant 2-tac synchronizatiun2采樣計數(shù)器2.1同步:解決可靠性問題現(xiàn)在我們回到有關(guān)FIFO的問題上來。如果要用時鐘取樣計數(shù)器的值,這相 對于計數(shù)器時鐘來說是異步的。因此,到最后不得不考慮計數(shù)器到底在哪

28、個范圍 變化,假定從FFFF到0000。每個單獨的位(bit)都處于亞穩(wěn)態(tài)。這種變化意 味著有可能讀數(shù)為0000到ffff之間(包含兩者)的任何可能的值。當然這也說 明該情況下FIFO將無法工作。同步可以保存處于亞穩(wěn)態(tài)時的計數(shù)器取樣,盡管 看似很離譜但仍然可以得到取樣值。換句話說,僅靠計數(shù)器同步是不夠的。重要的是我們必須確保不是所有的計數(shù)器位(bits )同時改變。實際上,不 得不保證每一次計數(shù)器的增加正好改變一位。 這說明計數(shù)器變化時出現(xiàn)錯誤的只 可能有一位。如果計數(shù)器準備開始工作,那么至少需要一位的變化,這就是我們 所能做的最好的辦法。我們所需要的是用格雷碼來表示的計數(shù)器。這是因為格雷碼是

29、最小距離碼,相鄰碼元之間的只有1位不同。讓我們來分析一下格雷碼(GRAY)對于FIFO的指針設計有什么作用。首 先,同步意味著計數(shù)器的取樣值很少處于亞穩(wěn)態(tài),其次,我們?nèi)拥闹底疃嘀粫幸晃话l(fā)生錯誤。這就是說計數(shù)器的真實值從 N-1變到N,那么無論是否發(fā)生錯 誤讀取的數(shù)不是N-1就是N ,而不會是其它的值。由于在變化的那一時刻,必須 確定輸出的值是多少,這對于讀出計數(shù)器值來說是完全正確的舉動。只要能夠確定讀出的值是舊還是新就可以了。 出現(xiàn)其它值則是不對的。如果進一步考慮,將 會發(fā)現(xiàn)如果在改變值的瞬間取樣計數(shù)器的值,兩個答案(N-1,N)對于計數(shù)器的值都是正確的。2.2保守的問報告一一很好的處理錯

30、誤了解了這么多,接下來分析一下怎樣將這些知識用于 FIFO的讀寫指針操作。 人們通常希望知道FIFO是否為滿。如果它滿了,必須阻止寫操作再次發(fā)生。這 很關(guān)鍵,因為當 FIFO 已滿時,必須停止寫指針加 1。將(格雷碼的)讀指針與 寫時鐘同步。因為每當同步讀指針的時候,實際的讀指針可能會變?yōu)椴煌闹怠?這意味著讀指針可能會是一個失效的值。 如果是這樣, 從寫操作的角度考慮會發(fā) 生少讀現(xiàn)象(相比實際情況) ,如果條件吻合, FIFO 為滿。實際上, FIFO 可能 未滿,因為有可能讀操作發(fā)生,而從寫操作的角度是“看不到”的。然而,我們 只要阻止額外的寫操作就 OK 了。如果當 FIFO 真的滿了時

31、我們不去阻止寫操作 將會出現(xiàn)錯誤。同樣的從讀操作的角度看實際上當 FIFO 中還有一些數(shù)據(jù)時, 讀操作一 方看到“被延遲的”寫操作,可能會認為 FIFO 為空。這種情況讀操作被阻止直 到寫操作“變得可被讀操作一方所看見” ,它將不允許進一步的讀操作。上述被稱為保守的報告。簡而言之,當 FIFO 未滿時,對于寫操作一方報告 稱 FIFO 已滿,當 FIFO 未空時,報告對讀操作一方稱 FIFO 已空。這種現(xiàn)象好比 FIFO 動態(tài)的縮小了一點,這毫無壞處。在字節(jié)計算的情況下,我們用同樣的技 術(shù),提供寫操作一方的字數(shù)計算和讀操作一方的字數(shù)計算。 寫操作一方計算的字 數(shù)可能大于 FIFO 中的真實字數(shù)

32、。這已令人相當滿意了,因為影響它的僅僅是允 許其阻止下一步的寫操作。 同理, 讀操作一方字數(shù)計算會少于實際字數(shù), 那也沒 關(guān)系,只要確認不要將寫操作一方計算的字數(shù)用于讀操作一方即可,反之亦然。這種保守的報告機構(gòu)在被同步的值中能很好的處理錯誤。 事實上,即使取樣 的讀指針值將處于亞穩(wěn)態(tài)一段時間,其影響只是阻止寫操作,使 FIFO 暫停寫操 作,而不會引起數(shù)據(jù)錯誤。同理適于讀操作。3 結(jié)構(gòu) 13.1 產(chǎn)生空 /滿標志的條件記得上篇文章中,我們提到了指針不是影響空 /滿標志唯一的條件??諛酥?的條件是由讀操作引起的讀寫指針相等, 滿標志的條件是寫操作引起的讀寫指針 相等。換句話說,要正確地產(chǎn)生空 /

33、滿標志信號,需要用寫時鐘對讀信號進行取 樣,同時用讀時鐘對寫信號進行取樣。 這不同于球的游戲, 因為我們不希望對時 鐘的頻率做出假設。設想一個10ns的寫信號(100MHz)被一個1KHz的讀時鐘 取樣,若無脈沖寬度延展的話就不能這樣做, 而且這也意味著已知 (或假設已知) 兩個時鐘之間具有某種關(guān)聯(lián)。當然,我們也不希望假設時鐘之間有任何的關(guān)系。 這就引起了分別圍繞三種 方法的問題, 并且,它將引出我們即將討論的三種不同的結(jié)構(gòu)。 第一種結(jié)構(gòu)相當 不錯,將在下面描述。第二種結(jié)構(gòu)也還行,但不是很好,第三種結(jié)構(gòu)性能超強, 但在在面積占用方面沒有優(yōu)勢。選擇哪種結(jié)構(gòu)要根據(jù)自己的需求。3.2 第一個方案 由

34、于不可能設計出一個不考慮頻率的滿足脈沖采樣的電路,通過對讀 /寫指 針的編碼我們繞過了這個問題。構(gòu)造一個指針寬度為 N+1 ,深度為 2N 字節(jié)的FIF O。為便方比較還可以將格雷碼指針轉(zhuǎn)換為二進制指針。 當(正被討論的已被時鐘同步的) 指針的二進制碼中最高位不一致而其它 N 位都相等時, FIFO 為滿。當(已經(jīng)過二進制轉(zhuǎn)換的)指針完全相等時, FIFO 為 空。這也許不容易看出,因此讓我們舉個例子來分析一下。 思考一下一個深度為 8 字節(jié)的 FIFO 怎樣工作(使用已轉(zhuǎn)換為二進制的指針)(譯者注:FIF0_WIDTH=8 , FIFO_DEPTH= 2 N = 8 , N = 3,指針寬度

35、為 N+1=4 )。起初 rd_ptr_bin 和wr_ptr_bin均為“ 0000”。此時FIFO中寫入8個字節(jié)的數(shù)據(jù)。wr_ptr_bin =“ 1000”,rd_ptr_bin= “0000”。當然,這就是滿條件?,F(xiàn)在,假設執(zhí)行了 8次的 讀操作,使得rd_ptr_bin = “ 1000”,這就是空條件。另外的 8次寫操作將使 wr_ptr_bin等于“0000”,但rd_ptr_bin仍然等于“ 1000”,因此FIFO為滿條件。顯然起始指針無需為“ 0000”。假設它為“ 0100”,并且FIFO為空,那么8 個字節(jié)會使 wr_ptr_bin = “ 1100',, rd

36、_ptr_bin 仍然為“ 0100”。這又說明 FIFO 為滿。這個例子的意義就在它生動地說明了讀/寫指針怎樣產(chǎn)生空/滿標志的。我曾 說過第一個方案是最好的?你到不如將其這種技術(shù)與同步 FIFO 起使用。它可 以避免算數(shù)運算,提高FIFO的速度。3.3實現(xiàn)我們知道在FIFO中要用到格雷碼計數(shù)器。而不是用由格雷碼換算的二進制 碼計數(shù)器(它不能實現(xiàn)每個計數(shù)器換后只有 1位發(fā)生變化),必須使用真正的格 雷碼計數(shù)器。如果想實現(xiàn)格雷碼計數(shù),你會發(fā)現(xiàn)它并不像看起來那么容易。當然, 你可以創(chuàng)建一個定制的機構(gòu)來完成這項工作,但還是讓我來提供一個更為普遍的 解決問題的方法。大家知道格雷碼于二進制碼之間能夠相互

37、轉(zhuǎn)換用到一個簡單的 公式:二進制碼轉(zhuǎn)格雷碼gn=bnGi=bi bi+1? i 工 n格雷碼轉(zhuǎn)二進制碼bn=gnbi=gibi+1? i 工 nFigure 3 Gnetdizcd Gray counlet architecture在上面的公式中,下標表示n+1位二進制碼或格雷碼的位數(shù)。我們還知道計數(shù)器不過是一個觸發(fā)器組和一個累加器而已,我們可以按照下 面的方法來做一一將格雷碼碼元轉(zhuǎn)換為二進制碼元,然后加1,再它轉(zhuǎn)換回格雷碼并存儲。這是解決產(chǎn)生n-bit格雷碼算法棘手冋題一個普遍的方法。由它生成 的計數(shù)器如圖3所示。當用綜合工具優(yōu)化時,相信綜合工具能夠為格雷碼計數(shù)器提供一個相當快速的電路。當然

38、,如果希望擁有一個深度為32字節(jié)的FIFO時,可在格雷碼編碼的狀態(tài)機中手工編寫計數(shù)器代碼。最終的FIFO設計如圖4所示。這次我不再提供代碼,因為我相信無論用 VHDL或Verilog HDL編寫,那都是一件非常容易的事。在這里我要補充一點:如果你觀察圖 4,會注意到有4個格雷碼二進制碼 轉(zhuǎn)換器,這并不浪費。但通過保留格雷碼指針的低 n-bit和二進制最高位將有可 能避免使用這些轉(zhuǎn)換器。這是一種“混合”計數(shù)器,我將它作為練習留給讀者。Hfture 4 Smuis Blotk for Ar<hite<tiire I3.4時間考量 管理FIFO工作的首要時間條件是時鐘的最高頻率。在上述的

39、FIFO條件下,不得不面對幾個參量時鐘頻率不能大于存儲器所需頻率,必須滿足亞穩(wěn)態(tài)時間關(guān)系tclk=20tcq+tsetup。當然,在公式中20這個因數(shù)完全憑借經(jīng)驗,倘若已經(jīng)完 成系統(tǒng)MTBF的計算,也可以選擇其它值。另外,還應考慮格雷碼計數(shù)器能夠 運行多快,因為上述公式要求受制于XOR (異或)門的速度。由于本文沒有做任何設想(除了同步,而這并非真正意義上的設想),時間不會引起很多同樣的 問題。在這個設計中最應考慮的是用格雷碼計數(shù)器和同步時避免與亞穩(wěn)態(tài)相關(guān)的錯誤。要認識到發(fā)生同步錯誤,整個 FIFO將無法工作(2bit錯誤就將意味著在 DPRAM中一個完全不同的地址,因為地址也用格雷碼表示)一

40、一也就是 FIFO 即可以吃入數(shù)據(jù)也可以吐出數(shù)據(jù)。 所以,我無法列出更多的要點,而這些要點都 基于用戶設計中MTBF值,要做好你所能承擔的最壞的打算。未完待續(xù)譯者注釋:1 sample在這里翻譯為“取樣”,而不是“采樣”、“抽樣”,是想有別于奈奎斯特定理中抽樣的概念。漢語中在觸發(fā)器構(gòu)成的電路里很少聽到“取樣”這種說法,但文中用到了 sample一詞,姑且譯作“取樣”,其實它表示了時序電路中兩個信號相遇時的狀態(tài)、穩(wěn)定程度及先后關(guān)系。2 關(guān)于setup time和hold time借用北大的一個 PPT來解釋其意義。存儲元件的宏時棋型禮立時間(Setup Time 1 :的世監(jiān)時神詛褓之人必鎖隱宦

41、MHtH (HoldTtaw):衣笈時伸姬 afl 覇入回細侃持locko-Q time 時飼訕沿.輸由樣奉能危妙變佛* 9逆軻門的延堰英也曲兩部分削就:-ciocto-a : r'nj-aock-to-Qi'J3 實際中,MTBF與時鐘頻率也有關(guān),若一個時鐘為1MHz的系統(tǒng)其MTBF為10年,當時鐘變?yōu)?0 MHz 時,其MTBF有可能變?yōu)?秒鐘。4 最小距離碼:碼的距離定義為相鄰兩個碼元之間互異元素的個數(shù)比如101010與110011,從左到右,互異的元素有,第2個,第3個,第6個,所以碼距為3。這種定義又稱為碼的漢明距離。格雷碼相 鄰碼只有一位不同,因此格雷碼的距離為1。

42、5 原文為Pessimistic Reporting,字面翻譯為悲觀 的報告,但綜合上下文的意思來看,作者想表述得的意思是寧少不多,寧慢不快。應該是一種出于保險的,保守的考慮,寧可少讀一次FIFO,也不讓FIFO岀錯,顧翻譯為“保守的報告”限于水平,以上翻譯中的錯誤在所難免,歡迎大家批評指正!Adam Luo7異步 FIFO 結(jié)構(gòu)(第三部分)作者:Vijay A.Nebhrajani翻譯:Adam Luo2006 年 7 月 30 日在本系列文章的第一部分我們了解了FIFO的一般結(jié)構(gòu),并分析了單時鐘FIFO的一個特例門。第二部分描述了雙時鐘設計的一種可能的結(jié)構(gòu)。在第三部分我們將探究一種具有新穎

43、結(jié)構(gòu)的雙時鐘 FIFO。這種結(jié)構(gòu)未必更好一一只是另 一種實現(xiàn)的方法而已。1 工作原理 至此我們已經(jīng)解決了用格雷碼表示的不同時鐘域的所有計算, 包括多位二進 制計算。本篇所介紹的結(jié)構(gòu)與以往并沒有什么不同, 唯一的區(qū)別在判斷引起讀寫 指針相等條件的方法。如果還記得先前的文章,文中提到讀寫指針相等意味著無論是滿條件還是空 條件,依賴于讀操作還是寫操作導致了指針的相等。在同步FIFO的第一個例子中,這很容易判別,因為兩種操作均與一個時鐘有關(guān)。在第二種結(jié)構(gòu)中,這個條 件已被編碼于指針中。我們現(xiàn)在將探究雙時鐘設計的第二種方法。1.1方向標志( Direction flags )在這種結(jié)構(gòu)中,我們讓指針軌跡

44、的標志相等。我們稱其為“ Direction flags (方 向標志)”這個標志告訴狀態(tài)電路 FIFO “當前朝向(headed”它假設寫操作 引起的FIFO朝越來越滿的方向與讀操作引起的 FIFO朝越來越空的方向為FIFO 的朝向。不用說,每邊(讀操作或?qū)懖僮鳎┒急仨毐A舄毩⒌姆较驑酥緩捅?(copies) 并且維持在保守狀態(tài)。因此對于寫操作一方將有其自己的方向標志來維護保守 性。也就是,從讀操作一方可能會看到寫操作被延遲并且讀操作一邊也將維持方 向標志,它可以根據(jù)延遲的寫操作來計算。就像先前的雙時鐘結(jié)構(gòu),這將確認 FIFO 沒有在吞或吐數(shù)據(jù),但這樣做是以 FIFO 尺寸動態(tài)縮小為代價的。

45、FIFO 滿/空標志的計算基于這些方向標志,其思想是如果 FIFO 的朝向為向 越來越滿的方向,并且指針相等,則 FIFO 真正為滿。如果 FIFO 朝向越來越空 的方向,并且指針相等,則FIFO確實為空。1.2 方向標志的實現(xiàn)有很多不同的方法實現(xiàn)方向標志:一般的想法是當 FIFO 的字節(jié)計算超過某 個預定上限,就認為 FIFO“going towards full( 趨向滿) ”,當字節(jié)計算低于預定 下限是,就認為 FIFO “going towards empty (趨向空)”一些設計人員選擇“ going towards full”的門限為FIFO容量的75%,“going toward

46、s empty ”的門限為FIFO容量的25%。還有人選擇兩個門限都為 FIFO容 量的 50%。也有選擇 80% 和20%的。門限的選擇可由自己來決定,要根據(jù)設計 選擇最適合的門限。也可以根據(jù)時鐘的速度與門限值得關(guān)系來確定以便使標志失 效的可能性最小,但我不確定門限的選擇會讓設計的系統(tǒng)變得更好。 我認為上限 與下限之間有滯后或許更好(滯后的意思是上限與下限之間的差并且“going full ”門限要大大超于“ going empty”門限)。我們不妨選擇 FIFO 容量的 75%和 25%作為門限。這樣做比較有效,因為你 只需比較指針的高兩位就能決定是否越過門限。 若用另一些值,你將不得不比較 指針的所有位,而這有可能影響你所設計的系統(tǒng)的速度。 像以前一樣,寫操作的 一方可以看到寫指針和一個被同步的讀指針, 兩個指針均為格雷碼。然后,將格 雷碼指針轉(zhuǎn)換為二進制指針并計算出 FIFO 中有多少數(shù)據(jù)。如果 FIFO 中的數(shù)據(jù) 量大于“going full”門限,就置位方向標志。當FIFO中的數(shù)據(jù)小于“going empty” 門限,就清除方向標志。同理,讀操作看到(格雷碼的)讀指針和一個被同步的(格雷碼的)寫指針。 在完成格雷碼到二

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論