




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、僅供參考J/異步FIFO結(jié)構(gòu)(第一部分)作者:Vijay A.Nebh ani翻譯: Adam Luo2006年7月設(shè)計(jì)一個(gè)FIFO是ASIC設(shè)計(jì)者遇到的最普遍的問題之一。本文著重介紹怎 樣設(shè)計(jì)FIFO這是一個(gè)看似簡單卻很復(fù)雜的任務(wù)。一開始,要注意,F(xiàn)IFO通常用于時(shí)鐘域的過渡,是雙時(shí)鐘設(shè)計(jì)。換句話說, 設(shè)計(jì)工程要處理(work off)兩個(gè)時(shí)鐘,因此在大多數(shù)情況下,F(xiàn)IFO工作于獨(dú)立 的兩個(gè)時(shí)鐘之間。然而,我們不從這樣的結(jié)構(gòu)開始介紹一我們將從工作在單時(shí)鐘 的一個(gè)FIFO特例開始。雖然工作在同一時(shí)鐘的 FIFO在實(shí)際應(yīng)用中很少用到, 但它為更多的復(fù)雜設(shè)計(jì)搭建一個(gè)平臺(tái),這是非常有用的。然后再從特
2、例推廣到更為普通的FIFO,該系列文章包括以下內(nèi)容:1.單時(shí)鐘結(jié)構(gòu)2 .雙時(shí)鐘結(jié)構(gòu)一一雙鐘結(jié)構(gòu)13. 雙時(shí)鐘結(jié)構(gòu)一一雙鐘結(jié)構(gòu)24. 雙時(shí)鐘結(jié)構(gòu)一一雙鐘結(jié)構(gòu)35. 脈沖模式FIFO單時(shí)鐘FIFO特例FIFO有很多種結(jié)構(gòu),包括波浪型(ripple) FIFO,移位寄存器型以及其他一 些我們并不關(guān)心的結(jié)構(gòu)類型。我們將集中討論包含 RAM存儲(chǔ)器的結(jié)構(gòu)類型。其 結(jié)構(gòu)如圖1所示。Figure 1. A FIFO Arctiitectura通過分析,我們看到圖中有一個(gè)具有獨(dú)立的讀端口和獨(dú)立的寫端口的RAM存儲(chǔ)器。這樣選擇是為了分析方便。如果是一個(gè)單端口的存儲(chǔ)器,還應(yīng)包含一個(gè) 仲裁器保證同一時(shí)刻只能進(jìn)行一項(xiàng)操
3、作(讀或?qū)懀?,我們選擇雙口 RAM (無需真正的雙口 RAM,因?yàn)槲覀冎皇窍M幸粋€(gè)簡單的相互獨(dú)立的讀寫端口)是因 為這些實(shí)例非常接近實(shí)際情況。讀、寫端口擁有又兩個(gè)計(jì)數(shù)器產(chǎn)生的寬度為Iog2(array_size)的互相獨(dú)立的讀、 寫地址。數(shù)據(jù)寬度是一個(gè)非常重要的參數(shù)將在在稍后的結(jié)構(gòu)選擇時(shí)予以介紹,而現(xiàn)在我們不必過分的關(guān)心它。為了一致,我們稱這些計(jì)數(shù)器為“讀指針”(readpointer)和“寫指針”(write pointer)。寫指針指向下一個(gè)將要寫入的位置,讀指 針指向下一個(gè)將要讀取的位置。每次寫操作使寫指針加1,讀操作使讀指針加1。我們看到最下面的模塊為“狀態(tài)” (stauts)模塊。
4、這個(gè)模塊的任務(wù)實(shí)給FIFO 提供“空”(empty)和“滿”(full)信號(hào)。這些信號(hào)告訴外部電路 FIFO已經(jīng)達(dá) 到了臨界條件:如果出現(xiàn)“滿”信號(hào),那么 FIFO為寫操作的臨界狀態(tài),如果出 現(xiàn)“空”信號(hào),則FIFO為讀操作的臨界狀態(tài)。寫操作的臨界狀態(tài)(“full is active”) 表示FIFO已經(jīng)沒有空間來存儲(chǔ)更多的數(shù)據(jù),讀操作的臨界表示FIFO沒有更多 的數(shù)據(jù)可以讀出。 status 模塊還可告訴 FIFO 中“滿”或“空”位置的數(shù)值。這 是由指針的算術(shù)運(yùn)算來完成了。實(shí)際的“滿”或“空”位置計(jì)算并不是為 FIFO 自身提供的。它是作為一個(gè) 報(bào)告機(jī)構(gòu)給外部電路用的。但是, “滿”和“空
5、”信號(hào)在 FIFO 中卻扮演著非常 重要的角色,它為了能實(shí)現(xiàn)讀與寫操作各自的獨(dú)立運(yùn)行而阻塞性的管理數(shù)據(jù)的存 取。這種阻塞性管理的重要性不是將數(shù)據(jù)復(fù)寫(或重讀) ,而是指針位置可以控 制整個(gè)FIFO,并且使讀、寫操作改變著指針數(shù)值。如果我們不阻止指針在臨界 狀態(tài)下改變狀態(tài), FIFO 還能都一邊“吃”著數(shù)據(jù)一邊“產(chǎn)生”數(shù)據(jù),這簡直是 不可能的。進(jìn)一步分析: DPRAM 若能夠寄存讀出的信號(hào),這意味著存儲(chǔ)器的輸出數(shù)據(jù) 已被寄存。如果這樣的話,讀指針將不得不設(shè)計(jì)成“ read 并加 1 ”,也就是說在 FIFO 輸出數(shù)據(jù)有效之前, 必須提供一個(gè)明確的讀信號(hào)。 另一方面, 如果 DPRAM 沒有寄存輸
6、出,一旦寫入有效數(shù)據(jù)就可以讀出;先讀數(shù)據(jù),然后使指針加 1。這 將影響到從 FIFO 讀出數(shù)據(jù)和實(shí)現(xiàn)空 /滿計(jì)算的邏輯。 由于簡化的緣故, 我們僅論 述 DPRAM 沒有提供索鎖存輸出的情況。 同理, 將其推廣到寄存輸出的 DPRAM 并不是很復(fù)雜。從功能上看, FIFO 工作原理如下所述:復(fù)位時(shí),讀、寫指針均為0。這是FIFO 的空狀態(tài),空標(biāo)志為高電平, (我們用高電平表示空標(biāo)志)此時(shí)滿標(biāo)志為低 電平。當(dāng) FIFO 出現(xiàn)空標(biāo)志時(shí),不允許讀操作,只能允許寫操作。寫操作寫入到 位置 0,并使寫指針加 1。此時(shí),空標(biāo)志變?yōu)榈碗娖?。假設(shè)沒有發(fā)生讀操作而且 隨后的一段時(shí)間 FIFO 中只有寫操作。 一
7、定時(shí)間后,寫指針的值等于 array_size-1。 這就意味著在存儲(chǔ)器中, 要寫入數(shù)據(jù)的最后一個(gè)位置就是下一個(gè)位置。 在這種情 況下,寫操作將寫指針變?yōu)?0,并將輸出滿標(biāo)志。注意,在這種情況下,寫指針和讀指針是相等的,但是 FIFO 已滿,而不是 空。這意味著“滿”或“空”的決定并不是僅僅基于指針的值,而是基于引起指 針值相等的操作。如果指針值相等的原因是復(fù)位或者讀操作, FIFO 認(rèn)為是空; 如果原因是寫操作,那么 FIFO 認(rèn)為是滿。現(xiàn)在,假設(shè)我們開始一系列的讀操作, 每次讀操作都將增加讀指針的值, 直 到讀指針的位置等于array_size-1。在該點(diǎn),從這個(gè)位置讀出的FIFO輸出總線
8、上 的數(shù)據(jù)是有效的。隨后的邏輯讀取這些數(shù)據(jù)并提供一個(gè)讀信號(hào) (在一個(gè)時(shí)鐘周 期內(nèi)有效)。這將導(dǎo)致讀指針再次等于寫指針(在兩個(gè)指針走完存儲(chǔ)器一圈后) 。 然而,由于這次相等是由于一個(gè)讀操作,將會(huì)輸出空標(biāo)志。因此,我們將得到如下的空標(biāo)志:寫操作無條件的清除空標(biāo)志Read pointer=(array_size-1) , 讀操作置空標(biāo)志。以及如下的滿標(biāo)志:讀操作無條件的清除滿標(biāo)志,Write pointer= (array_size-1), 寫操作置滿標(biāo)志。然而,這是一個(gè)特殊的例子,由于一般情況下,讀操作在FIFO不是空的情 況下就開始了(讀操作邏輯不需要等待 FIFO 變滿),因此這些條件不得不修
9、改 來存儲(chǔ)讀指針和寫指針的每一個(gè)值。有這樣一個(gè)想法, 那就是我們可以將存儲(chǔ)器組織成一個(gè)環(huán)形列表。 因此,如 果寫指針與讀指針差值大于 1 或更多,就進(jìn)行讀操作, FIFO 為空,這種工作方 式對(duì)于用無符號(hào)(n-bit)結(jié)構(gòu)來描述的臨界狀態(tài)非常適合。同樣的,如果讀指針 與寫指針的差值大于 1,就進(jìn)行寫操作,直到 FIFO 為滿。這將帶來如下的條件: 寫操作無條件的清除空標(biāo)志。write_po in ter=(read_po in ter+1),讀操作置空。 讀操作無條件的清除滿標(biāo)志,read_pointer= (write_pointe葉1),寫操作置滿。注意,讀操作和寫操作同時(shí)都在使其指針增加
10、, 但不改變空標(biāo)志和滿標(biāo)志的 狀態(tài)。在空或滿的臨界狀態(tài)同時(shí)讀操作和寫操作都是不允許的。綜上所述,我們現(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.細(xì)心的讀者會(huì)注意到圖2中產(chǎn)生滿或空標(biāo)志需要同時(shí)用到兩個(gè)指針。 在雙時(shí)鐘設(shè)計(jì)的情況下,希望用讀指針處理(work off)讀時(shí)鐘,寫指針處理(work off)寫時(shí)鐘。這會(huì)引起不希望發(fā)生的毛刺問題一一自己可以去試一試,看一看。這些問題以及一些解決方案將在后續(xù)的該系列文章中提及。PS:文章中三次提到 work off clock,分別在開頭和結(jié)尾處,work off字面意思是"去除, 消除,出售”的意思,可是在FIFO中,不應(yīng)該是去除的意思,故根據(jù)前后文和常識(shí),將其翻譯為“處理”,有不對(duì)的地方請(qǐng)批評(píng)指正!還有兩部分,會(huì)盡快翻譯出來,敬請(qǐng)期待&
19、lt;未完待續(xù)>Adam Luo BEJING異步 FIFO 結(jié)構(gòu)第二部分)作者:Vijay A. Nebhrajani翻譯:Adam Luo2006 年 7 月在先前的該系列文章中,我們看到了怎樣用雙端口、無寄存器輸出的 RAM 設(shè)計(jì)同步FIFO。這部分我們將探討同樣的概念,并將其推廣到怎樣產(chǎn)生具有相 互獨(dú)立、自由工作的讀、寫時(shí)鐘的 F I F O 。擁有自由工作時(shí)鐘簡化了很多問題, 但是這導(dǎo)致了一個(gè)特殊情況下的解決方法。 普通情況下不對(duì)時(shí)鐘進(jìn)行假設(shè), 甚至 不假設(shè)其自由工作。我將在本系列文章的最后一部份討論最普通的情況。如果你看過先前的文章,你會(huì)發(fā)現(xiàn)只有 status模塊工作在兩個(gè)時(shí)
20、鐘。存儲(chǔ)器 沒有寄存輸出, 所以它確實(shí)不需要用讀時(shí)鐘; 即使它是寄存輸出, 也可毫無問題 的運(yùn)行于讀時(shí)鐘上。Status模塊本質(zhì)的功能是對(duì)兩個(gè)指針進(jìn)行操作,而且這兩個(gè) 指針工作在不同的時(shí)鐘域。 這也是真正的困難所在。 如果打算用寫時(shí)鐘來取樣讀 指針或用讀時(shí)鐘來取樣寫指針, 將不可避免的遇到一個(gè)問題: 亞穩(wěn)態(tài)。它將導(dǎo)致 空/滿標(biāo)志的計(jì)算錯(cuò)誤,并導(dǎo)致設(shè)計(jì)的失敗。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ā)生在一個(gè)事件 試圖取樣1( sample)另一事件的時(shí)候。亞穩(wěn)態(tài)可以描述如下:假設(shè)一個(gè)信號(hào)在 t
21、 = 0時(shí)刻瞬間從 0變?yōu)?1,那么信號(hào)在 t = 0時(shí)刻的值究竟是多少?是 0 還是 1, 或者在兩者之間?在亞穩(wěn)態(tài)中,這個(gè)問題被定義的兩個(gè)時(shí)刻回避了,分別是 0- 和 0+。在 t = 0-時(shí)刻,規(guī)定信號(hào)的取值為 0, t = 0+ 時(shí)刻規(guī)定信號(hào)的取值為 1。 顯然, 0- = 0 - 0, 0+ =0 + 0。注意,這僅僅是一個(gè)數(shù)學(xué)定義,如果你正在用實(shí)際 的電路做同樣的事,輸出將有可能是邏輯 0 (0伏)或者邏輯 1(5伏),或者是 介于 0 5 伏中間的某個(gè)值。正如在數(shù)學(xué)中描述的一樣,物理系統(tǒng)中一個(gè)事件取 樣另一個(gè)事件產(chǎn)生了不可預(yù)知的結(jié)果。 不可預(yù)知性也就意味著另一個(gè)跡象亞 穩(wěn)態(tài)很危險(xiǎn)
22、。1.1 時(shí)間分辨率( Resolution Time 翻轉(zhuǎn)時(shí)間?)當(dāng)一個(gè)事件取樣一個(gè)穩(wěn)定值時(shí)(或者一個(gè)能穩(wěn)定一段時(shí)間的值) ,取樣值就 隨這個(gè)穩(wěn)定值而變化。假設(shè)在 D 觸發(fā)器情況下,就是 Q 值隨 D 值變化。這段能 夠穩(wěn)定取樣的時(shí)間用相關(guān)的取樣事件來定義, 稱之為時(shí)間分辨率 (翻轉(zhuǎn)時(shí)間?)。 也就是我們所熟悉的“clock-to Q time”,或匕。如果遇到觸發(fā)器的setup time2和 hold time,這將是cell設(shè)計(jì)者保證輸入能夠正確變?yōu)檩敵龅臅r(shí)間。亞穩(wěn)態(tài)影響 物理系統(tǒng)的時(shí)間分辨率,同樣也影響輸出值。在“不穩(wěn)定平衡”情況下考慮這些 問題,就像“山上的球” (或者球面上的球體)
23、你不知道它會(huì)向哪個(gè)方向滾,這 個(gè)球就處于不穩(wěn)定平衡狀態(tài)。 如果球完全不受干擾, 它有可能一直呆在原地, 但 是微小的晃動(dòng)會(huì)使球滾到山的一邊或另一邊。這將無法計(jì)算球從山上滾下的距 離,或者無法計(jì)算球從山的哪一邊滾下來。 這就是亞穩(wěn)態(tài)的一個(gè)準(zhǔn)確的例子 你無法預(yù)知物理系統(tǒng)輸出的值將會(huì)變成什么樣, 多久會(huì)變化, 并且相當(dāng)危險(xiǎn)。 換 句話說, 輸出永遠(yuǎn)保持一個(gè)有限非零概率的亞穩(wěn)態(tài)。 在現(xiàn)實(shí)中, 盡管很少有這種 情況發(fā)生, 但20倍的 clock-to Q 時(shí)間是一個(gè)合理的時(shí)間分辨率數(shù)值。 在理論上, 當(dāng)取樣操作接近被取樣事件的時(shí)候,時(shí)間分辨率是無限的漸進(jìn)曲線。1.2 MTBF (平均無故障時(shí)間)與可靠性
24、如果一個(gè)設(shè)計(jì)中包含同步組件,無論是否愿意它都會(huì)出現(xiàn)亞穩(wěn)態(tài)。亞穩(wěn)態(tài)無 法徹底消除,因此我們所做的就是計(jì)算錯(cuò)誤概率以及在時(shí)間上來描述它。讓我們來看一下,假設(shè)這里有一個(gè)物理系統(tǒng)亞穩(wěn)態(tài)錯(cuò)誤發(fā)生的概率為 1/1000。換句話說, 每一千次采樣就會(huì)因?yàn)閬喎€(wěn)態(tài)發(fā)生一次錯(cuò)誤。 這也意味著,每一千次,輸出就會(huì) 在下一個(gè)時(shí)鐘沿到來時(shí),無法變化。如果時(shí)鐘頻率為1KHz,那么每秒都會(huì)有一次錯(cuò)誤出現(xiàn),MTBF值就為1秒。當(dāng)然,這個(gè)假設(shè)過于簡單;MTBF是一種故障 概率的統(tǒng)計(jì)度量,并且需要更為復(fù)雜、經(jīng)驗(yàn)化、實(shí)驗(yàn)化的數(shù)據(jù)來計(jì)算。對(duì)于觸發(fā) 器來說,這種關(guān)系依賴于電路自身的物理常數(shù)和時(shí)鐘頻率,記住亞穩(wěn)態(tài)本身與時(shí)鐘沒有任何關(guān)系,
25、但是它和MTBF相關(guān)3。自然的,我們會(huì)說一個(gè)可靠性好的電 路具有很高的MTBF值。1.3同步由于亞穩(wěn)態(tài)無法徹底避免,在設(shè)計(jì)電路時(shí)一定要一一很好的處理錯(cuò)誤。將錯(cuò)誤發(fā)生的概率降到最低。Figure 1 Dual Stage Synrhronizatinn首先要求,設(shè)計(jì)與設(shè)計(jì)之間要有很大的區(qū)別,它并不在本文介紹的范圍。第 二個(gè)要求,使用“同步”技術(shù)。這種技術(shù)由兩個(gè)觸發(fā)器簡單的組合在一起如圖1所示。僅當(dāng)Q1的出現(xiàn)非常接近時(shí)鐘沿的時(shí)候,Q2才會(huì)進(jìn)入亞穩(wěn)態(tài)。如果在亞 穩(wěn)態(tài)情況下我們將20倍的tcq作為時(shí)間分辨率,那么時(shí)鐘周期將為tclk = 20tcq +tsetup。這說明經(jīng)過20倍的clock-to
26、Q時(shí)間,輸出仍然隨輸入改變的概率大大減小。 因此,在時(shí)鐘沿到來時(shí)Q2沒有被改變的概率接近P2,這里P是第一級(jí)輸出沒有 在時(shí)鐘沿到來時(shí)隨輸入而改變的概率。這稱為兩級(jí)同步。當(dāng)使用這個(gè)時(shí)鐘頻率下 概率來計(jì)算MTBF時(shí),MTBF值會(huì)提高很多。如果愿意的話,可以通過三級(jí)同 步進(jìn)一步增加MTBF值。但這在實(shí)際中很少需要。如圖2所示,可以在電路中增加冗余的同步來很好的抵御亞穩(wěn)態(tài)。在三冗余和等同于兩冗余的狀態(tài)下,最終的輸出大部分(三分之二)可以計(jì)算出來。在這 個(gè)實(shí)例中,小尺寸的布局布線與器件的差異說明了如果一個(gè)同步器產(chǎn)生亞穩(wěn)態(tài)錯(cuò) 誤,其他的兩級(jí)也會(huì)產(chǎn)生亞穩(wěn)態(tài)錯(cuò)誤,所有的概率將隨之改變。這種技術(shù)僅在要 求非???/p>
27、刻時(shí)候的用到。欲更多了解亞穩(wěn)態(tài)與同步的知識(shí),請(qǐng)參閱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采樣計(jì)數(shù)器2.1同步:解決可靠性問題現(xiàn)在我們回到有關(guān)FIFO的問題上來。如果要用時(shí)鐘取樣計(jì)數(shù)器的值,這相 對(duì)于計(jì)數(shù)器時(shí)鐘來說是異步的。因此,到最后不得不考慮計(jì)數(shù)器到底在哪
28、個(gè)范圍 變化,假定從FFFF到0000。每個(gè)單獨(dú)的位(bit)都處于亞穩(wěn)態(tài)。這種變化意 味著有可能讀數(shù)為0000到ffff之間(包含兩者)的任何可能的值。當(dāng)然這也說 明該情況下FIFO將無法工作。同步可以保存處于亞穩(wěn)態(tài)時(shí)的計(jì)數(shù)器取樣,盡管 看似很離譜但仍然可以得到取樣值。換句話說,僅靠計(jì)數(shù)器同步是不夠的。重要的是我們必須確保不是所有的計(jì)數(shù)器位(bits )同時(shí)改變。實(shí)際上,不 得不保證每一次計(jì)數(shù)器的增加正好改變一位。 這說明計(jì)數(shù)器變化時(shí)出現(xiàn)錯(cuò)誤的只 可能有一位。如果計(jì)數(shù)器準(zhǔn)備開始工作,那么至少需要一位的變化,這就是我們 所能做的最好的辦法。我們所需要的是用格雷碼來表示的計(jì)數(shù)器。這是因?yàn)楦窭状a是
29、最小距離碼,相鄰碼元之間的只有1位不同。讓我們來分析一下格雷碼(GRAY)對(duì)于FIFO的指針設(shè)計(jì)有什么作用。首 先,同步意味著計(jì)數(shù)器的取樣值很少處于亞穩(wěn)態(tài),其次,我們?nèi)拥闹底疃嘀粫?huì)有一位發(fā)生錯(cuò)誤。這就是說計(jì)數(shù)器的真實(shí)值從 N-1變到N,那么無論是否發(fā)生錯(cuò) 誤讀取的數(shù)不是N-1就是N ,而不會(huì)是其它的值。由于在變化的那一時(shí)刻,必須 確定輸出的值是多少,這對(duì)于讀出計(jì)數(shù)器值來說是完全正確的舉動(dòng)。只要能夠確定讀出的值是舊還是新就可以了。 出現(xiàn)其它值則是不對(duì)的。如果進(jìn)一步考慮,將 會(huì)發(fā)現(xiàn)如果在改變值的瞬間取樣計(jì)數(shù)器的值,兩個(gè)答案(N-1,N)對(duì)于計(jì)數(shù)器的值都是正確的。2.2保守的問報(bào)告一一很好的處理錯(cuò)
30、誤了解了這么多,接下來分析一下怎樣將這些知識(shí)用于 FIFO的讀寫指針操作。 人們通常希望知道FIFO是否為滿。如果它滿了,必須阻止寫操作再次發(fā)生。這 很關(guān)鍵,因?yàn)楫?dāng) FIFO 已滿時(shí),必須停止寫指針加 1。將(格雷碼的)讀指針與 寫時(shí)鐘同步。因?yàn)槊慨?dāng)同步讀指針的時(shí)候,實(shí)際的讀指針可能會(huì)變?yōu)椴煌闹怠?這意味著讀指針可能會(huì)是一個(gè)失效的值。 如果是這樣, 從寫操作的角度考慮會(huì)發(fā) 生少讀現(xiàn)象(相比實(shí)際情況) ,如果條件吻合, FIFO 為滿。實(shí)際上, FIFO 可能 未滿,因?yàn)橛锌赡茏x操作發(fā)生,而從寫操作的角度是“看不到”的。然而,我們 只要阻止額外的寫操作就 OK 了。如果當(dāng) FIFO 真的滿了時(shí)
31、我們不去阻止寫操作 將會(huì)出現(xiàn)錯(cuò)誤。同樣的從讀操作的角度看實(shí)際上當(dāng) FIFO 中還有一些數(shù)據(jù)時(shí), 讀操作一 方看到“被延遲的”寫操作,可能會(huì)認(rèn)為 FIFO 為空。這種情況讀操作被阻止直 到寫操作“變得可被讀操作一方所看見” ,它將不允許進(jìn)一步的讀操作。上述被稱為保守的報(bào)告。簡而言之,當(dāng) FIFO 未滿時(shí),對(duì)于寫操作一方報(bào)告 稱 FIFO 已滿,當(dāng) FIFO 未空時(shí),報(bào)告對(duì)讀操作一方稱 FIFO 已空。這種現(xiàn)象好比 FIFO 動(dòng)態(tài)的縮小了一點(diǎn),這毫無壞處。在字節(jié)計(jì)算的情況下,我們用同樣的技 術(shù),提供寫操作一方的字?jǐn)?shù)計(jì)算和讀操作一方的字?jǐn)?shù)計(jì)算。 寫操作一方計(jì)算的字 數(shù)可能大于 FIFO 中的真實(shí)字?jǐn)?shù)
32、。這已令人相當(dāng)滿意了,因?yàn)橛绊懰膬H僅是允 許其阻止下一步的寫操作。 同理, 讀操作一方字?jǐn)?shù)計(jì)算會(huì)少于實(shí)際字?jǐn)?shù), 那也沒 關(guān)系,只要確認(rèn)不要將寫操作一方計(jì)算的字?jǐn)?shù)用于讀操作一方即可,反之亦然。這種保守的報(bào)告機(jī)構(gòu)在被同步的值中能很好的處理錯(cuò)誤。 事實(shí)上,即使取樣 的讀指針值將處于亞穩(wěn)態(tài)一段時(shí)間,其影響只是阻止寫操作,使 FIFO 暫停寫操 作,而不會(huì)引起數(shù)據(jù)錯(cuò)誤。同理適于讀操作。3 結(jié)構(gòu) 13.1 產(chǎn)生空 /滿標(biāo)志的條件記得上篇文章中,我們提到了指針不是影響空 /滿標(biāo)志唯一的條件。空標(biāo)志 的條件是由讀操作引起的讀寫指針相等, 滿標(biāo)志的條件是寫操作引起的讀寫指針 相等。換句話說,要正確地產(chǎn)生空 /
33、滿標(biāo)志信號(hào),需要用寫時(shí)鐘對(duì)讀信號(hào)進(jìn)行取 樣,同時(shí)用讀時(shí)鐘對(duì)寫信號(hào)進(jìn)行取樣。 這不同于球的游戲, 因?yàn)槲覀儾幌M麑?duì)時(shí) 鐘的頻率做出假設(shè)。設(shè)想一個(gè)10ns的寫信號(hào)(100MHz)被一個(gè)1KHz的讀時(shí)鐘 取樣,若無脈沖寬度延展的話就不能這樣做, 而且這也意味著已知 (或假設(shè)已知) 兩個(gè)時(shí)鐘之間具有某種關(guān)聯(lián)。當(dāng)然,我們也不希望假設(shè)時(shí)鐘之間有任何的關(guān)系。 這就引起了分別圍繞三種 方法的問題, 并且,它將引出我們即將討論的三種不同的結(jié)構(gòu)。 第一種結(jié)構(gòu)相當(dāng) 不錯(cuò),將在下面描述。第二種結(jié)構(gòu)也還行,但不是很好,第三種結(jié)構(gòu)性能超強(qiáng), 但在在面積占用方面沒有優(yōu)勢(shì)。選擇哪種結(jié)構(gòu)要根據(jù)自己的需求。3.2 第一個(gè)方案 由
34、于不可能設(shè)計(jì)出一個(gè)不考慮頻率的滿足脈沖采樣的電路,通過對(duì)讀 /寫指 針的編碼我們繞過了這個(gè)問題。構(gòu)造一個(gè)指針寬度為 N+1 ,深度為 2N 字節(jié)的FIF O。為便方比較還可以將格雷碼指針轉(zhuǎn)換為二進(jìn)制指針。 當(dāng)(正被討論的已被時(shí)鐘同步的) 指針的二進(jìn)制碼中最高位不一致而其它 N 位都相等時(shí), FIFO 為滿。當(dāng)(已經(jīng)過二進(jìn)制轉(zhuǎn)換的)指針完全相等時(shí), FIFO 為 空。這也許不容易看出,因此讓我們舉個(gè)例子來分析一下。 思考一下一個(gè)深度為 8 字節(jié)的 FIFO 怎樣工作(使用已轉(zhuǎn)換為二進(jìn)制的指針)(譯者注:FIF0_WIDTH=8 , FIFO_DEPTH= 2 N = 8 , N = 3,指針寬度
35、為 N+1=4 )。起初 rd_ptr_bin 和wr_ptr_bin均為“ 0000”。此時(shí)FIFO中寫入8個(gè)字節(jié)的數(shù)據(jù)。wr_ptr_bin =“ 1000”,rd_ptr_bin= “0000”。當(dāng)然,這就是滿條件。現(xiàn)在,假設(shè)執(zhí)行了 8次的 讀操作,使得rd_ptr_bin = “ 1000”,這就是空條件。另外的 8次寫操作將使 wr_ptr_bin等于“0000”,但rd_ptr_bin仍然等于“ 1000”,因此FIFO為滿條件。顯然起始指針無需為“ 0000”。假設(shè)它為“ 0100”,并且FIFO為空,那么8 個(gè)字節(jié)會(huì)使 wr_ptr_bin = “ 1100',, rd
36、_ptr_bin 仍然為“ 0100”。這又說明 FIFO 為滿。這個(gè)例子的意義就在它生動(dòng)地說明了讀/寫指針怎樣產(chǎn)生空/滿標(biāo)志的。我曾 說過第一個(gè)方案是最好的?你到不如將其這種技術(shù)與同步 FIFO 起使用。它可 以避免算數(shù)運(yùn)算,提高FIFO的速度。3.3實(shí)現(xiàn)我們知道在FIFO中要用到格雷碼計(jì)數(shù)器。而不是用由格雷碼換算的二進(jìn)制 碼計(jì)數(shù)器(它不能實(shí)現(xiàn)每個(gè)計(jì)數(shù)器換后只有 1位發(fā)生變化),必須使用真正的格 雷碼計(jì)數(shù)器。如果想實(shí)現(xiàn)格雷碼計(jì)數(shù),你會(huì)發(fā)現(xiàn)它并不像看起來那么容易。當(dāng)然, 你可以創(chuàng)建一個(gè)定制的機(jī)構(gòu)來完成這項(xiàng)工作,但還是讓我來提供一個(gè)更為普遍的 解決問題的方法。大家知道格雷碼于二進(jìn)制碼之間能夠相互
37、轉(zhuǎn)換用到一個(gè)簡單的 公式:二進(jìn)制碼轉(zhuǎn)格雷碼gn=bnGi=bi bi+1? i 工 n格雷碼轉(zhuǎn)二進(jìn)制碼bn=gnbi=gibi+1? i 工 nFigure 3 Gnetdizcd Gray counlet architecture在上面的公式中,下標(biāo)表示n+1位二進(jìn)制碼或格雷碼的位數(shù)。我們還知道計(jì)數(shù)器不過是一個(gè)觸發(fā)器組和一個(gè)累加器而已,我們可以按照下 面的方法來做一一將格雷碼碼元轉(zhuǎn)換為二進(jìn)制碼元,然后加1,再它轉(zhuǎn)換回格雷碼并存儲(chǔ)。這是解決產(chǎn)生n-bit格雷碼算法棘手冋題一個(gè)普遍的方法。由它生成 的計(jì)數(shù)器如圖3所示。當(dāng)用綜合工具優(yōu)化時(shí),相信綜合工具能夠?yàn)楦窭状a計(jì)數(shù)器提供一個(gè)相當(dāng)快速的電路。當(dāng)然
38、,如果希望擁有一個(gè)深度為32字節(jié)的FIFO時(shí),可在格雷碼編碼的狀態(tài)機(jī)中手工編寫計(jì)數(shù)器代碼。最終的FIFO設(shè)計(jì)如圖4所示。這次我不再提供代碼,因?yàn)槲蚁嘈艧o論用 VHDL或Verilog HDL編寫,那都是一件非常容易的事。在這里我要補(bǔ)充一點(diǎn):如果你觀察圖 4,會(huì)注意到有4個(gè)格雷碼二進(jìn)制碼 轉(zhuǎn)換器,這并不浪費(fèi)。但通過保留格雷碼指針的低 n-bit和二進(jìn)制最高位將有可 能避免使用這些轉(zhuǎn)換器。這是一種“混合”計(jì)數(shù)器,我將它作為練習(xí)留給讀者。Hfture 4 Smuis Blotk for Ar<hite<tiire I3.4時(shí)間考量 管理FIFO工作的首要時(shí)間條件是時(shí)鐘的最高頻率。在上述的
39、FIFO條件下,不得不面對(duì)幾個(gè)參量時(shí)鐘頻率不能大于存儲(chǔ)器所需頻率,必須滿足亞穩(wěn)態(tài)時(shí)間關(guān)系tclk=20tcq+tsetup。當(dāng)然,在公式中20這個(gè)因數(shù)完全憑借經(jīng)驗(yàn),倘若已經(jīng)完 成系統(tǒng)MTBF的計(jì)算,也可以選擇其它值。另外,還應(yīng)考慮格雷碼計(jì)數(shù)器能夠 運(yùn)行多快,因?yàn)樯鲜龉揭笫苤朴赬OR (異或)門的速度。由于本文沒有做任何設(shè)想(除了同步,而這并非真正意義上的設(shè)想),時(shí)間不會(huì)引起很多同樣的 問題。在這個(gè)設(shè)計(jì)中最應(yīng)考慮的是用格雷碼計(jì)數(shù)器和同步時(shí)避免與亞穩(wěn)態(tài)相關(guān)的錯(cuò)誤。要認(rèn)識(shí)到發(fā)生同步錯(cuò)誤,整個(gè) FIFO將無法工作(2bit錯(cuò)誤就將意味著在 DPRAM中一個(gè)完全不同的地址,因?yàn)榈刂芬灿酶窭状a表示)一
40、一也就是 FIFO 即可以吃入數(shù)據(jù)也可以吐出數(shù)據(jù)。 所以,我無法列出更多的要點(diǎn),而這些要點(diǎn)都 基于用戶設(shè)計(jì)中MTBF值,要做好你所能承擔(dān)的最壞的打算。未完待續(xù)譯者注釋:1 sample在這里翻譯為“取樣”,而不是“采樣”、“抽樣”,是想有別于奈奎斯特定理中抽樣的概念。漢語中在觸發(fā)器構(gòu)成的電路里很少聽到“取樣”這種說法,但文中用到了 sample一詞,姑且譯作“取樣”,其實(shí)它表示了時(shí)序電路中兩個(gè)信號(hào)相遇時(shí)的狀態(tài)、穩(wěn)定程度及先后關(guān)系。2 關(guān)于setup time和hold time借用北大的一個(gè) PPT來解釋其意義。存儲(chǔ)元件的宏時(shí)棋型禮立時(shí)間(Setup Time 1 :的世監(jiān)時(shí)神詛褓之人必鎖隱宦
41、MHtH (HoldTtaw):衣笈時(shí)伸姬 afl 覇入回細(xì)侃持locko-Q time 時(shí)飼訕沿.輸由樣奉能危妙變佛* 9逆軻門的延堰英也曲兩部分削就:-ciocto-a : r'nj-aock-to-Qi'J3 實(shí)際中,MTBF與時(shí)鐘頻率也有關(guān),若一個(gè)時(shí)鐘為1MHz的系統(tǒng)其MTBF為10年,當(dāng)時(shí)鐘變?yōu)?0 MHz 時(shí),其MTBF有可能變?yōu)?秒鐘。4 最小距離碼:碼的距離定義為相鄰兩個(gè)碼元之間互異元素的個(gè)數(shù)比如101010與110011,從左到右,互異的元素有,第2個(gè),第3個(gè),第6個(gè),所以碼距為3。這種定義又稱為碼的漢明距離。格雷碼相 鄰碼只有一位不同,因此格雷碼的距離為1。
42、5 原文為Pessimistic Reporting,字面翻譯為悲觀 的報(bào)告,但綜合上下文的意思來看,作者想表述得的意思是寧少不多,寧慢不快。應(yīng)該是一種出于保險(xiǎn)的,保守的考慮,寧可少讀一次FIFO,也不讓FIFO岀錯(cuò),顧翻譯為“保守的報(bào)告”限于水平,以上翻譯中的錯(cuò)誤在所難免,歡迎大家批評(píng)指正!Adam Luo7異步 FIFO 結(jié)構(gòu)(第三部分)作者:Vijay A.Nebhrajani翻譯:Adam Luo2006 年 7 月 30 日在本系列文章的第一部分我們了解了FIFO的一般結(jié)構(gòu),并分析了單時(shí)鐘FIFO的一個(gè)特例門。第二部分描述了雙時(shí)鐘設(shè)計(jì)的一種可能的結(jié)構(gòu)。在第三部分我們將探究一種具有新穎
43、結(jié)構(gòu)的雙時(shí)鐘 FIFO。這種結(jié)構(gòu)未必更好一一只是另 一種實(shí)現(xiàn)的方法而已。1 工作原理 至此我們已經(jīng)解決了用格雷碼表示的不同時(shí)鐘域的所有計(jì)算, 包括多位二進(jìn) 制計(jì)算。本篇所介紹的結(jié)構(gòu)與以往并沒有什么不同, 唯一的區(qū)別在判斷引起讀寫 指針相等條件的方法。如果還記得先前的文章,文中提到讀寫指針相等意味著無論是滿條件還是空 條件,依賴于讀操作還是寫操作導(dǎo)致了指針的相等。在同步FIFO的第一個(gè)例子中,這很容易判別,因?yàn)閮煞N操作均與一個(gè)時(shí)鐘有關(guān)。在第二種結(jié)構(gòu)中,這個(gè)條 件已被編碼于指針中。我們現(xiàn)在將探究雙時(shí)鐘設(shè)計(jì)的第二種方法。1.1方向標(biāo)志( Direction flags )在這種結(jié)構(gòu)中,我們讓指針軌跡
44、的標(biāo)志相等。我們稱其為“ Direction flags (方 向標(biāo)志)”這個(gè)標(biāo)志告訴狀態(tài)電路 FIFO “當(dāng)前朝向(headed”它假設(shè)寫操作 引起的FIFO朝越來越滿的方向與讀操作引起的 FIFO朝越來越空的方向?yàn)镕IFO 的朝向。不用說,每邊(讀操作或?qū)懖僮鳎┒急仨毐A舄?dú)立的方向標(biāo)志復(fù)本 (copies) 并且維持在保守狀態(tài)。因此對(duì)于寫操作一方將有其自己的方向標(biāo)志來維護(hù)保守 性。也就是,從讀操作一方可能會(huì)看到寫操作被延遲并且讀操作一邊也將維持方 向標(biāo)志,它可以根據(jù)延遲的寫操作來計(jì)算。就像先前的雙時(shí)鐘結(jié)構(gòu),這將確認(rèn) FIFO 沒有在吞或吐數(shù)據(jù),但這樣做是以 FIFO 尺寸動(dòng)態(tài)縮小為代價(jià)的。
45、FIFO 滿/空標(biāo)志的計(jì)算基于這些方向標(biāo)志,其思想是如果 FIFO 的朝向?yàn)橄?越來越滿的方向,并且指針相等,則 FIFO 真正為滿。如果 FIFO 朝向越來越空 的方向,并且指針相等,則FIFO確實(shí)為空。1.2 方向標(biāo)志的實(shí)現(xiàn)有很多不同的方法實(shí)現(xiàn)方向標(biāo)志:一般的想法是當(dāng) FIFO 的字節(jié)計(jì)算超過某 個(gè)預(yù)定上限,就認(rèn)為 FIFO“going towards full( 趨向滿) ”,當(dāng)字節(jié)計(jì)算低于預(yù)定 下限是,就認(rèn)為 FIFO “going towards empty (趨向空)”一些設(shè)計(jì)人員選擇“ going towards full”的門限為FIFO容量的75%,“going toward
46、s empty ”的門限為FIFO容量的25%。還有人選擇兩個(gè)門限都為 FIFO容 量的 50%。也有選擇 80% 和20%的。門限的選擇可由自己來決定,要根據(jù)設(shè)計(jì) 選擇最適合的門限。也可以根據(jù)時(shí)鐘的速度與門限值得關(guān)系來確定以便使標(biāo)志失 效的可能性最小,但我不確定門限的選擇會(huì)讓設(shè)計(jì)的系統(tǒng)變得更好。 我認(rèn)為上限 與下限之間有滯后或許更好(滯后的意思是上限與下限之間的差并且“going full ”門限要大大超于“ going empty”門限)。我們不妨選擇 FIFO 容量的 75%和 25%作為門限。這樣做比較有效,因?yàn)槟?只需比較指針的高兩位就能決定是否越過門限。 若用另一些值,你將不得不比較 指針的所有位,而這有可能影響你所設(shè)計(jì)的系統(tǒng)的速度。 像以前一樣,寫操作的 一方可以看到寫指針和一個(gè)被同步的讀指針, 兩個(gè)指針均為格雷碼。然后,將格 雷碼指針轉(zhuǎn)換為二進(jìn)制指針并計(jì)算出 FIFO 中有多少數(shù)據(jù)。如果 FIFO 中的數(shù)據(jù) 量大于“going full”門限,就置位方向標(biāo)志。當(dāng)FIFO中的數(shù)據(jù)小于“going empty” 門限,就清除方向標(biāo)志。同理,讀操作看到(格雷碼的)讀指針和一個(gè)被同步的(格雷碼的)寫指針。 在完成格雷碼到二
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國餐飲設(shè)備市場(chǎng)發(fā)展趨勢(shì)規(guī)劃研究報(bào)告
- 2025-2030年中國鋼制車輪行業(yè)發(fā)展現(xiàn)狀及前景趨勢(shì)分析報(bào)告
- 2025-2030年中國采暖散熱器行業(yè)十三五規(guī)劃及發(fā)展前景分析報(bào)告
- 2025-2030年中國通信繼電器市場(chǎng)供需狀況及投資戰(zhàn)略研究報(bào)告
- 2025-2030年中國船舶涂料產(chǎn)業(yè)運(yùn)營狀況與發(fā)展趨勢(shì)分析報(bào)告
- 2025-2030年中國臭氧治療儀市場(chǎng)需求狀況及發(fā)展?jié)摿Ψ治鰣?bào)告
- 2025-2030年中國聚酯多元醇行業(yè)市場(chǎng)現(xiàn)狀分析規(guī)劃研究報(bào)告
- 2025-2030年中國網(wǎng)絡(luò)借貸市場(chǎng)發(fā)展現(xiàn)狀及前景趨勢(shì)分析報(bào)告
- 2025-2030年中國精制棉市場(chǎng)運(yùn)營現(xiàn)狀及投資前景規(guī)劃研究報(bào)告
- 2025-2030年中國眼視光行業(yè)發(fā)展趨勢(shì)規(guī)劃研究報(bào)告
- “供應(yīng)商融資安排”會(huì)計(jì)列報(bào)、披露問題研究
- 顱內(nèi)動(dòng)脈動(dòng)脈瘤介入治療臨床路徑
- DB32∕T 2882-2016 城市軌道交通橋隧結(jié)構(gòu)養(yǎng)護(hù)技術(shù)規(guī)程
- 氮化硅結(jié)構(gòu)與性能
- 《現(xiàn)代漢語語法》PPT課件(完整版)
- 性病實(shí)驗(yàn)室檢測(cè)與質(zhì)量管理
- 高樁碼頭施工組織設(shè)計(jì)(福建)
- 這一封書信來得巧
- 監(jiān)獄服裝加工企業(yè)開展全面
- 標(biāo)書密封條格式模版(共19頁)
- 小學(xué)一年級(jí)硬筆書法入門(課堂PPT)
評(píng)論
0/150
提交評(píng)論