你問我FIFO有多深?

我們通常需要異步FIFO用作兩個不同時鐘域的模塊之間的數據緩衝,確保不會丟失數據,只有在讀速率快,寫速率慢的時候,需要使用FIFO才能緩存來不及讀取的數據。反之??

通常因爲讀速率慢於寫速率,慢的模塊來不及讀取的數據要被緩存下來,所以說,FIFO的工作模式應該是,數據突發寫入的形式,Bursts。也就是隔一段時間突發的寫一組數據如果連續寫入的話,因爲讀速率慢於寫速率,FIFO肯定會寫滿,FIFO的深度就需要無窮大,才能確保數據不丟失

我們需要知道,讀寫頻率,突發速率,突發長度進而確定FIFO的最小深度

上文的意思,已經明確,我們需要的FIFO深度是因爲讀取速率慢於寫入速率而未能讀取的數據量。明確了這一點原理,就可以不需要記任何公式,而直接計算任何情況下的傳輸問題;看下圖:

Case-1:fA > fB 讀寫之間沒有空閒週期

寫速率fA = 80MHz

讀速率fB = 50MHz

突發長度Burst Length = 120

讀寫之間沒有空閒週期,是連續讀寫一個突發長度

Sol:

寫一個數據需要的時間 = 1 / 80MHz = 12.5ns

寫一個突發需要的時間 = 120 * 12.5ns = 1500ns

讀一個數據需要的時間 = 1 / 50MHz = 20ns

每1500ns,120個數據被寫入FIFO,但讀一個數據需要20ns的時間

可以計算出,1500ns內讀出多少個數據,1500 / 20 = 75

剩下的沒有讀出,就存在FIFO中,則需要120 - 75 = 45

所以這種情況下,需要的FIFO最小深度爲45

Case-2:fA > fB 在兩個連續讀寫之間有一個週期的延遲

Sol:

這個題目是製造了一些假象,這其實和Case-1的情況是一樣的,因爲兩個連續的讀寫之間通常都會有延遲。解決方法,如同Case-1

Case–3:fA > fB讀寫都有空閒週期(IDLE Cycles)

寫速率fA = 80MHz

讀速率fB = 50MHz

突發長度Burst Length = 120

兩個連續寫入之間的空閒週期爲 = 1

兩個連續讀取之間的空閒週期爲 = 3

Sol:

兩個連續寫入之間的空閒週期爲1的意思是,每寫入一個數據,要等待一個週期,再寫入下一個數據。這也可以理解爲每兩個週期,寫入一個數據。

兩個連續讀取之間的空閒週期爲3的意思是,每讀取一個數據,要等待三個週期,再讀取下一個數據。這也可以理解爲每四個週期,讀取一個數據。

寫一個數據需要的時間 = 2 * (1 / 80MHz) = 25ns

寫一個突發需要的時間 = 120 * 25ns = 3000ns

讀一個數據需要的時間 = 4 * (1 / 50MHz) = 80ns

每3000ns,120個數據被寫入FIFO,但讀一個數據需要80ns的時間

可以計算出,3000ns內讀出可以多少個數據,3000 / 80 = 37.5

剩下的沒有讀出,就存在FIFO中,則需要120 - 37.5 = 82.5 約等於 83

所以這種情況下,需要的FIFO最小深度爲83

Case-4:fA > fB並給出了讀寫使能的百分比

寫速率fA = 80MHz

讀速率fB = 50MHz

突發長度Burst Length = 120

寫使能佔得百分比爲 = 50% = 1 / 2

讀使能佔得百分比爲 = 25% = 1 / 4

Sol:

用你聰明的大腦想一想,這是不是和Case-3也是一模一樣呢,寫使能佔得百分比爲50%,即每兩個週期寫入一個數據。讀使能佔得百分比爲25%,即每四個週期讀取一個數據

Case-5:fA < fB 讀寫操作無空閒週期(每兩個連續讀寫之間有一個週期延遲)

Sol:

這類題目,因爲讀取速率大於寫入速率,FIFO永遠不會被寫滿,所以FIFO深度爲1就夠了

Case-6:fA < fB 讀寫操作有空閒週期(讀寫使能佔得百分比問題)

寫速率fA = 30MHz

讀速率fB = 50MHz

突發長度Burst Length = 120

兩個連續寫入之間的空閒週期爲 = 1

兩個連續讀取之間的空閒週期爲 = 3

Sol:

兩個連續寫入之間的空閒週期爲1的意思是,每寫入一個數據,要等待一個週期,再寫入下一個數據。這也可以理解爲每兩個週期,寫入一個數據。

兩個連續讀取之間的空閒週期爲3的意思是,每讀取一個數據,要等待三個週期,再讀取下一個數據。這也可以理解爲每四個週期,讀取一個數據。

寫一個數據需要的時間 = 2 * (1 / 30MHz) = 66.667ns

寫一個突發需要的時間 = 120 * 66.667ns = 8000ns

讀一個數據需要的時間 = 4 * (1 / 50MHz) = 80ns

每8000ns,120個數據被寫入FIFO,但讀一個數據需要80ns的時間

可以計算出,8000ns內讀出可以多少個數據,8000 / 80 = 100

剩下的沒有讀出,就存在FIFO中,則需要120 - 100 = 20

所以這種情況下,需要的FIFO最小深度爲20

Case-7:fA = fB 讀寫操作無空閒週期(每兩個連續讀寫之間有一個週期延遲)

Sol:

很好理解

如果讀寫時鐘爲同一個時鐘,則可以不需要FIFO

如果讀寫時鐘存在相位差,FIFO深度爲1,也是夠了

Case-8:fA = fB 讀寫操作有空閒週期(讀寫使能佔得百分比問題)

寫速率fA = 50MHz

讀速率fB = 50MHz

突發長度Burst Length = 120

兩個連續寫入之間的空閒週期爲 = 1

兩個連續讀取之間的空閒週期爲 = 3

Sol:

同樣的解題思路。

兩個連續寫入之間的空閒週期爲1的意思是,每寫入一個數據,要等待一個週期,再寫入下一個數據。這也可以理解爲每兩個週期,寫入一個數據。

兩個連續讀取之間的空閒週期爲3的意思是,每讀取一個數據,要等待三個週期,再讀取下一個數據。這也可以理解爲每四個週期,讀取一個數據。

寫一個數據需要的時間 = 2 * (1 / 50MHz) = 40ns

寫一個突發需要的時間 = 120 * 40ns = 4800ns

讀一個數據需要的時間 = 4 * (1 / 50MHz) = 80ns

每4800ns,120個數據被寫入FIFO,但讀一個數據需要80ns的時間

可以計算出,4800ns內讀出可以多少個數據,4800 / 80 = 60

剩下的沒有讀出,就存在FIFO中,則需要120 - 60 = 60

所以這種情況下,需要的FIFO最小深度爲60

Case-9 如果數據速率如下所示

讀寫速率相等

每100個時鐘寫入80個數據

每10個時鐘讀取8個數據

突發長度爲160

Sol:

寫速率的其他20個週期的位置是隨機的,所以就有了下面幾種情況:

爲了保證數據的傳輸不丟失,我們考慮到最壞的情況。

考慮的最壞的情況,就是寫數據速率和讀數據速率之間的差別最大。即寫數據速率最大,讀數據速率最小。

寫操作最壞得情況是Case-4 ,即兩次連續的突發寫入,又稱“背靠背”的情況。

即爲在160個週期內寫入160個數據。

讀數據速率讀出每個數據的時間爲 = 8 / 10

所以160個週期讀出數據的個數爲 160 * (8 * 10) = 128

剩下的沒有讀出,就存在FIFO中,則需要160 - 128 = 32

所以這種情況下,需要的FIFO最小深度爲32

Case-10:如下所示

寫入時鐘20MHz

讀出時鐘40MHz

每1000個時鐘週期寫入500個數據

每4個時鐘週期讀出1個數據

讀寫數據位寬一致。

Sol:

考慮到“背靠背”的情況突發長度則爲500 * 2 = 1000

則爲每1000個時鐘週期寫入1000個數據

每4個週期,讀取一個數據。

寫一個數據需要的時間 = 1 / 20MHz = 50ns

寫一個突發需要的時間 = 1000 * 50ns = 50000ns

讀一個數據需要的時間 = 4 * (1 / 40MHz) = 100ns

每50000ns,120個數據被寫入FIFO,但讀一個數據需要100ns的時間

可以計算出,50000ns內讀出可以多少個數據,50000 /100 = 500

剩下的沒有讀出,就存在FIFO中,則需要1000- 500 = 500

所以這種情況下,需要的FIFO最小深度爲500

SDRAM中應用

在SDRAM的應用中,我們通常使用的讀寫FIFO是突發長度的2倍,比如突發長度爲256,那FIFO的深度設置爲512,使得FIFO始終保持半滿的狀態。可以保證數據的傳輸

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章