前言:
最近加的群里面有些萌新在進行討論FIFO的深度的時候,覺得 FIFO的深度計算比較難以理解 。所以特出漫談FIFO系列,會涉及到FIFO的深度計算、同步/異步FIFO的設計等。
引言:
考慮如下的場景,是我們小學或者初中的時候學過的一個問題:
場景一:
如上圖所示,假設入水口的 進水量 2m3/h ,出水口的 出水量1m3/h ,假設水池容量10m3,開始的時候水池沒有水,水池多久會滿?
答:水池容量 / (進水量 - 出水量) = 10 /(2 - 1) = 10 h
上面我們可以得出,對于進水量比出水量多的情況下,無論水池容量大小是多少, 水池在一些時間之后會溢出 。
所以這也反映了,我們在IC設計中,對于 FIFO這個蓄水池 ,輸入數據的個數一直大于輸出數據的個數, FIFO總會溢出產生問題 。
場景二:
如上圖所示,假設入水口的 進水量 2m3/h ,出水口的 出水量1m3/h ,但是本場景和場景二不同的地方是:入水口的進水時間是一天24h中的任意8小時進水。出水口是半天12h中的任意2小時出水。
問水池會溢出嗎?可以設計水池的深度讓水池不要溢出嗎?
(1)對于一天的進水量來說,2 *8 = 16m3 ,對于一天的出水量來說,2 *2 = 4m3 , 進水量 - 出水量 = 12 m3,所以水池會溢出。
(2)因為 輸入數據的個數一直大于輸出數據的個數 (在當前的時間)。所以無論設計多深的深度,水池都會溢出。
場景三 :
如上圖所示,假設入水口的時鐘是按照 分鐘來進行間隔 ,對于入水口,每10分鐘流入8m3的水,對于出水口來說,每1.2分鐘流出1m3的水。
問水池會溢出嗎?可以設計水池的深度讓水池不要溢出嗎?
(1)對于入水口來說,10分鐘8立方米 所以12分鐘9.6m3,對于出水口12分鐘10m3。所以通過 設定水池的深度可以讓水池不會溢出 。因為總體而言流出的水流是大于流入的水流。
概念1:back to back
對于入水口來說有一種情況是需要注意的。這種情況如下圖:
在一次 完整的20分鐘之內 ,前面兩分鐘沒有進水,最后的兩分鐘沒有進水,進水的時間集中在20分鐘內的 連續16分鐘內 ,所以這段時間對于水池來說壓力最大,因為水池設計的深度如果不考慮這個可能就會溢出,(這也就是所謂的流(水)量密集)
(2)考慮到概念1再回答場景三的第二個問題:水池的深度應該設計為:
**[1] **16m3 / 16 min = 進水量的效率
[2] 1m3 / 1.2min = 出水量的效率
**[3] ** 水池的深度 = (進水量效率 - 出水量效率) * **16 min ** = (16 /6 )m3
在計算水池深度我們可以得出 結論 :
所謂水池的深度在計算的時候,就是進水量在背靠背這段時間內,進水的所有量,減去背靠背這段時間內出水口的出水量,在這背靠背的時間內,入水的量減去出水的量,就是內部的水池應該承受的水量。
正文:
FIFO計算問題:
(1)假設FIFO的寫時鐘為100MHZ,讀時鐘為80Mhz,在FIFO輸入側,每100個寫時鐘,寫入80個數據,在讀數據側,每個時鐘讀出一個數據,問FIFO設置為多少FIFO不會溢出??
[1] 在輸入數據背靠背的情況下,進入( input**)FIFO的數據量:**
進入FIFO的數據量:160個 消耗的時間:160 個 寫時鐘
[2] 在輸入數據背靠背的時間內,輸出( output )端口輸出的數據量 :
(1)因為輸入輸出端口的時鐘頻率不同,所以先把輸入數據背靠背的時間換算到輸出數據端口的時鐘個數:(160 *(1/100MHZ) * / * (1/80MHZ)=128讀時鐘周期
(2)則輸出端口在背靠背輸入的時間**內輸出的數據:128 *1 = 128個讀數據
[3] 則FIFO的深度為:
160 (輸入) - 128 (這段時間內的輸出) = 32 (內部水池FIFO應該存的)
(2)假設FIFO的寫時鐘為wclk,讀時鐘為rclk,在FIFO輸入側,每B個寫時鐘,寫入A個數據,在讀數據側,每Y個時鐘讀出X個數據,問FIFO設置為多少FIFO不會溢出??
[1] 在輸入數據背靠背的情況下,進入( input**)FIFO的數據量:**
進入FIFO的數據量:2A , 消耗的時間:2A * (1 / wclk)
**[2] 在輸入數據背靠背的時間內,輸出( output )端口輸出的數據量:
** (1)因為輸入輸出端口的時鐘頻率不同,所以先把輸入數據背靠背的時間換算到輸出數據端口的時鐘個數:**
讀時鐘周期個數 :(2A * (1 / wclk))* / (1 / rclk)
(2)則輸出端口在背靠背輸入的時間內輸出的數據:
讀的數據個數: (2A* (1 / wclk) / (1 / rclk) ** * (X / Y)
[3] 則FIFO的深度為:
輸入數據背靠背時間內的輸入數據 減去輸入數據背靠背時間內的輸出數據
2A - [(2A * (1 / wclk)) ** / (1 / rclk)] ** * (X / Y)
-
IC設計
+關注
關注
38文章
1295瀏覽量
103918 -
fifo
+關注
關注
3文章
387瀏覽量
43648 -
時鐘源
+關注
關注
0文章
93瀏覽量
15956
發布評論請先 登錄
相關推薦
評論