我們通常需要異步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始終保持半滿的狀態。可以保證數據的傳輸