一起來了解一下FIFO!
掃描二維碼
隨時隨地手機看文章
一:fifo是什么
FIFO的完整英文拼寫為FirstIn First Out,即先進先出。FPGA或者ASIC中使用到的FIFO一般指的是對數(shù)據(jù)的存儲具有先進先出特性的一個存儲器,常被用于數(shù)據(jù)的緩存或者高速異步數(shù)據(jù)的交互。
二:FIFO有幾種結(jié)構(gòu)
FIFO從大的情況來分,有兩類結(jié)構(gòu):單時鐘FIFO(SCFIFO)和雙時鐘FIFO(DCFIFO),其中雙時鐘FIFO又可以分為普通雙時鐘(DCFIFO)和混合寬度雙時鐘FIFO (DCFIFO_MIXED_WIDTHS)。三種FIFO結(jié)構(gòu)的英文含義如下所示:
? SCFIFO: 單時鐘FIFO
? DCFIFO:雙時鐘 FIFO
? DCFIFO_MIXED_WIDTHS: 混合寬度雙時鐘
在沒有特別指明的情況下,混合寬度雙時鐘FIFO和雙時鐘FIFO統(tǒng)稱為雙時鐘FIFO。
下圖為分別為單時鐘FIFO和雙時鐘FIFO的符號圖:
從圖中我們可以看到,單時鐘FIFO具有一個獨立的時鐘端口clock,當(dāng)Clock上升沿到達時,且wrreq有效時,將data[7..0]中的數(shù)據(jù)寫入FIFO;當(dāng)Clock上升沿到達時,且rdreq有效時,將q[7..0]中的數(shù)據(jù)輸出FIFO;full是滿標(biāo)志位,當(dāng)FIFO寫滿時有效,almost_full是將滿標(biāo)志,當(dāng)快寫滿時有效,almost_full數(shù)值可以配置;同理empty與almost_empty是空標(biāo)志和將要空標(biāo)志,自己也可以配置almost_empty。usedw[7..0]是當(dāng)前FIFO可以使用的數(shù)據(jù)。sclr是同步清零,當(dāng)有效時且Clocks上升沿到達時清楚FIFO的數(shù)據(jù);aclr是異步清零,當(dāng)有效時清除FIFO的數(shù)據(jù)。
雙時鐘FIFO和單時鐘FIFO基本一樣,就是讀寫分別采用不同的時鐘信號。wrfull為寫滿標(biāo)志,wrempty為寫空標(biāo)志,當(dāng)我們想在只有FIFO空的時候才能寫入時就用wrempty來判斷,wrusedw[8..0]寫入多少數(shù)據(jù),rdusedw[8..0]能讀出多少數(shù)據(jù)。這里將寫入的數(shù)據(jù)和刻度的數(shù)據(jù)分開計數(shù)的原因是,當(dāng)我們寫入數(shù)據(jù)長度和讀數(shù)據(jù)長度不同時,比如寫的數(shù)據(jù)長度是16位,讀的數(shù)據(jù)長度是8位,當(dāng)寫入一個數(shù)據(jù)wrusedw[8..0]=1,而rdusedw[8..0]=2。rdfull是讀滿標(biāo)志,當(dāng)我們要想要只有寫滿時才可讀可根據(jù)這個標(biāo)志判斷(讀數(shù)據(jù)包)。rdempty讀空標(biāo)志,當(dāng)FIFO沒有可讀數(shù)據(jù)時有效。aclr異步請零。雙時鐘FIFO只有異步清零。
三:不同結(jié)構(gòu)的FIFO各有什么作用
單時鐘FIFO:
單時鐘FIFO常用于片內(nèi)數(shù)據(jù)交互,例如,在FPGA的控制下從外部傳感器讀取到的一連串傳感器數(shù)據(jù),首先被寫入FIFO中,然后再以UART串口的數(shù)據(jù)發(fā)送速率將數(shù)據(jù)依次發(fā)送出去。由于傳感器的單次讀取數(shù)據(jù)可能很快,但并不是時刻都需要采集數(shù)據(jù),例如某傳感器使用SPI接口的協(xié)議,F(xiàn)PGA以2M的SPI數(shù)據(jù)速率從該傳感器中讀取20個數(shù)據(jù),然后以9600的波特率通過串口發(fā)送出去。此過程每秒鐘執(zhí)行一次。因為2M的數(shù)據(jù)速率遠高于串口9600的波特率,因此需要將從傳感器中采集到的數(shù)據(jù)首先用FIFO緩存起來,然后再以串口的數(shù)據(jù)速率緩慢發(fā)送出去。這里,由于傳感器數(shù)據(jù)的讀取和串口數(shù)據(jù)的發(fā)送都是可以同步于同一個時鐘的,因此可以使用單時鐘結(jié)構(gòu)的FIFO來實現(xiàn)此功能。
雙時鐘FIFO:
雙時鐘FIFO的一個典型應(yīng)用就是異步數(shù)據(jù)的收發(fā)。
所謂異步數(shù)據(jù)是指數(shù)據(jù)的發(fā)送端和接收端分別同步與不同的時鐘域,使用雙時鐘FIFO的獨立的讀寫時鐘結(jié)構(gòu),能夠?qū)⒉煌瑫r鐘域中的數(shù)據(jù)同步到所需的時鐘域系統(tǒng)中。例如,在一個視頻圖像采集系統(tǒng)中,實現(xiàn)將攝像頭采集的數(shù)據(jù)通過VGA在顯示器上顯示。攝像頭輸入的數(shù)據(jù)長度和速度與輸出到VGA顯示的數(shù)據(jù)長度和速度都不相同,這種情況下使用雙時鐘FIFO。
四:如何在Altera FPGA中使用FIFO實現(xiàn)功能設(shè)計
在Altera FPGA中使用FIFO實現(xiàn)用戶功能設(shè)計主要有三種實現(xiàn)方式,第一種為用戶根據(jù)需求自己編寫FIFO邏輯,當(dāng)用戶對于FIFO的功能有特殊需求時,可以使用此種方式實現(xiàn),但此種方式要求用戶有較高的RTL設(shè)計能力。第二種方式為使用第三方提供的開源IP核,此種IP核以源碼的形式提供,能夠快速的應(yīng)用到用戶系統(tǒng)中,當(dāng)用戶對FIFO功能有特殊需求時,可以在此源碼的基礎(chǔ)上進行修改,以適應(yīng)自己的系統(tǒng)需求。第三種方式為使用Quartus II軟件提供的免費FIFO IP核,此種方式下,Quartus II軟件為用戶提供了友好的圖形化界面方便用戶對FIFO的各種參數(shù)和結(jié)構(gòu)進行配置,生成的FIFO IP核針對Altera不同系列的器件,還可以實現(xiàn)結(jié)構(gòu)上的優(yōu)化。





