FIFO,,在FPGA中是一種非常基本,,使用非常廣泛的模塊,。FPGA高手可能覺得不值一提,但對于像我這樣的新手,,有時(shí)卻是個(gè)大問題,,弄了一個(gè)多月,總算有所進(jìn)展,,希望把自己的一些總結(jié)寫下來,,一方面希望對其他入門者有所幫助,另一方面希望看到的高手們批評指正,。另外得特別感謝特權(quán)同學(xué)的教程,。 在大學(xué)中編了兩年單片機(jī)(斷斷續(xù)續(xù)),C語言的串行思維深入人心,,一下子轉(zhuǎn)換到FPGA并行的工作方式和有些奇異的編程風(fēng)格,,一開始還真有點(diǎn)處理不好。另一方面,,對FPGA各種延遲非常困惑,,比如RAM模塊讀取延遲,F(xiàn)IFO讀取數(shù)據(jù)延遲等,,常常不知道如何處理,。下面說說我現(xiàn)在的理解和解決辦法。 FPGA寫入數(shù)據(jù) 寫入相對簡單,,只需要在時(shí)鐘上升沿來臨之時(shí)使能wrreq和寫入data,,當(dāng)然還需要判斷FIFO full信號。時(shí)序圖如下,,在第一個(gè)時(shí)鐘之前使能wrreq信號,,在第一個(gè)時(shí)鐘及以后的幾個(gè)時(shí)鐘上升沿FIFO判斷wrreq有效并且讀入數(shù)據(jù)。(圖片為轉(zhuǎn)載并 編輯) 一份參考的代碼如下
這里fifo_wfull值得注意,,在沒有延遲的時(shí)候這個(gè)信號可以直接為FIFO直接輸出的full信號,,但實(shí)際中通常都會(huì)有一個(gè)或者多個(gè)時(shí)鐘的延遲??梢越Y(jié)合使用wrusedw信號對FIFO保留一定的余量,,比如FIFO容量為1024,定義如下:
FIFO讀出數(shù)據(jù) 時(shí)序圖如下,,在第二個(gè)時(shí)鐘上升沿來臨后使能rdreq信號,,第三個(gè)時(shí)鐘FIFO判斷rdreq信號,然后第四個(gè)時(shí)鐘來臨時(shí)方可讀取數(shù)據(jù)(在empty信號表示FIFO飛空的時(shí)候有效),。因此需要注意這兩個(gè)時(shí)鐘的延遲,,但是我們的重點(diǎn)應(yīng)該放在獲取、處理數(shù)據(jù)上,,而不應(yīng)該是處理這些煩心的時(shí)序操作上,。 一份可用的代碼如下
解釋:empty為0后,ren隨之變?yōu)?,,使能FIFO讀出信號(不是上述時(shí)序圖內(nèi)容),。下一個(gè)時(shí)鐘來臨時(shí)FIFO判斷ren使能,同時(shí)這個(gè)時(shí)鐘之后canread方才讀入~empty信號為1使能,。再下一個(gè)時(shí)鐘來臨時(shí),,F(xiàn)IFO輸出信號,,而canread已經(jīng)有效,外設(shè)讀取數(shù)據(jù),。 比較奇怪的是ALTERA的文檔中并沒說empty有延遲,,對FIFO直接的操作中也并沒有發(fā)現(xiàn)這個(gè)延遲,也就是說本來FIFO已經(jīng)讀空了,,但是FIFO的empty信號并沒有有效,,如果完全按照empty信號讀取會(huì)導(dǎo)致多讀出一個(gè)或多個(gè)數(shù)據(jù)。在隨后的一個(gè)cy68013 USB2.0接口實(shí)現(xiàn)實(shí)際用FIFO時(shí)發(fā)現(xiàn)了empty具有一個(gè)時(shí)鐘的延遲,,發(fā)送256組數(shù)據(jù)卻顯示讀取了257組數(shù)據(jù),。但是這里如果像full一樣采取保留一定余量的方法會(huì)導(dǎo)致FIFO中始終會(huì)暫留有一些數(shù)據(jù),除非你知道你自己發(fā)送了多少個(gè)數(shù)據(jù),。 上面的代碼中使用這種流水線式寄存器轉(zhuǎn)移方法很好的處理了FIFO信號延遲的問題,,同樣使用它還可以輕易的解決empty延遲一個(gè)時(shí)鐘的問題,只需稍微改一下上面的代碼,。不過若是延遲多個(gè)時(shí)鐘???還的看看具體的場合,。
解釋:加了讀取保護(hù)功能的FIFO在empty使能之后rfifo_ren使能也不會(huì)有問題,關(guān)鍵是canread信號,。empty信號為1后,,rfifo_ren隨即為0,在下一個(gè)時(shí)鐘來臨時(shí)FIFO輸出一個(gè)數(shù)據(jù)(上一個(gè)時(shí)鐘rfifo_ren還是有效的)并判斷rfifo_ren失能,,停止輸出數(shù)據(jù),。但是由于empty多延遲了一個(gè)時(shí)鐘,因此這個(gè)數(shù)據(jù)是不需要的,,如果& 上~empty則可以使canread在這個(gè)時(shí)鐘來臨前失能,。 |
|