Quartus II LPM使用指南
FIFO篇
BY WG
http://www.cnblogs.com/wg2011/目錄
說明
本文檔根據 ALTERA 《SCFIFO and DCFIFO Megafunctions》一問整理而來。
筆者使用Quartus II 的版本及PC機操作系統版本為11.1 sp2 WIN7 32位。
本文檔僅供學習、討論使用,請勿用於商業用途。在使用該文檔過程中有任何疑問請至筆者博客進行交流探討。
文檔版本 V1.0
筆者將隨時可能對本教程中的內容進行更改,恕不事先通知。
摘要
ALTERA在LPM庫中提供了參數可配置的單時鍾FIFO(SCFIFO)和雙時鍾FIFO(DCFIFO)。FIFO主要應用在需要數據緩沖且數據符合先進先出規律的同步或異步場合。LPM中的FIFO包含以下幾種:
1.SCFIFO:單時鍾FIFO;
2.DCFIFO:雙時鍾FIFO,數據輸入和輸出的寬度相同;
3.DCFIFO_MIXED_WIDTHS:雙時鍾FIFO,輸入輸出數據位寬可以不同。
在本文中,如無特殊說明,DCFIFO通指上述兩種雙時鍾FIFO。
第一章 FIFO配置全攻略
1.1如何配置自己需要的FIFO
配置FIFO的方法有兩種,一種是通過QUARTUS II 中TOOLS下的MegaWizard Plug-In Manager 中選擇FIFO參數編輯器來搭建自己需要的FIFO,這是自動生成FIFO的方法,另外如果你是大師級選手(對LPM-FIFO參數十分熟悉)還可以通過手動編寫HDL來實現需要的FIFO。在此筆者建議大家,尤其是初學者使用自動方式來配置需要的FIFO,配置界面簡潔明了十分容易上手。
1.2輸入輸出端口
下圖中是SCFIFO和DCFIFO的框圖,其中,SCFIFO中讀寫雙方信號與時鍾clock同步,DCFIFO讀寫雙方信號分別與讀寫時鍾同步。
表一中列出FIFO中各個IO的詳細描述:
表一 端口描述
端口
類型
是否必選
描述
Clock
輸入
是
上升沿觸發時鍾
Wrclk
輸入
是
上升沿觸發時鍾,下列信號與之同步:
data
wrreq
Wrfull
Wrempty
wrusedw
Rdclk
輸入
是
上升沿觸發時鍾,下列信號與之同步:
Q
Rdreq
Rdfull
Rdempty
Rdusedw
Data
輸入
是
當wrreq有效時數據線上的數據通過DATA端口被寫入FIFO中
Wrreq
輸入
是
寫請求信號,激發寫入操作。
1.當full(對於SCFIFO)或wrfull(對於DCFIFO)有效時,不能激活wrreq信號,參數overflow_checking設置為ON,即在full狀態下FIFO會自動無視寫請求;
2.不能再aclr有效期間激活wrreq信號;
3. 使用Stratix 和Cyclone 系列器件(除了Stratix, Stratix GX,和Cyclone 系列以外)需要將write_aclr_synch參數選擇位ON,確保符合限制條件。
Rdreq
輸入
是
讀請求信號,激發讀出操作。
1.該信號的作用在正常模式下和在預讀模式下的作用有很多不同(詳情見后文);
2.當empty(對於SCFIFO)或rdempty(對於DCFIFO)有效時,不能激活rdreq信號,參數underflow_checking設置為ON,即在full狀態下FIFO會自動無視讀請求;
Sclr
Aclr
輸入
非
清零端口,詳情見后文
Q
輸出
是
輸出由讀操作而從FIFO中讀出的數據。
1.SCFIFO和DCFIFO中,輸入輸出數據的位寬必須相同;
2.DCFIFO_MIXED_WIDTHS型FIFO輸入輸出位寬可以不同,但是根據使用RAM的類型不同,輸入輸出位寬比率有不同的限制;
Full
Wrfull
Rdfull
輸出
非
當該信號有效時,FIFO會被認為已經裝滿,此時不能再進行寫操作;
Empty
Wrempty
Rdempty
輸出
非
當該信號有效時,FIFO會被認為已經讀空,此時不能再進行讀操作;
Almost_full
輸出
非
准裝滿信號,當usedw大於參數almost_full_value或相同時,該信號被激活,即是full信號被激活的預示;
Almost_empty
輸出
否
准讀空信號,當usedw小於參數almost_empty_value或相同時,該信號被激活,即是empty信號被激活的預示;
Usedw
Wrusedw
Rdusedw
輸出
否
顯示當前FIFO中數據存量。
表二中列出配置FIFO的各個參數詳細說明:
表二 參數說明
參數
類型
是否必選
描述
Lpm_width
整數
是
對於SCFIFO和DCFIFO,該參數定義了data和q的位寬,對於DCFIFO_MIXED_WIDTHS該參數定義了data的寬度;
Lpm_width_r
整數
是
對於DCFIFO_MIXED_WIDTHS該參數定義了q的寬度;
Lpm_widthu
整數
是
對於SCFIFO,該參數定義了usedw端口的位寬,對於DCFIFO,定義了rdusedw和wrusedw的位寬,對於DCFIFO_MIXED_WIDTHS,定義了wrusedw端口的位寬;
Lpm_widthu_r
整數
是
對於DCFIFO_MIXED_WIDTHS,定義了rdusedw端口的位寬;
Lpm_numwords
整數
是
定義了FIFO深度,值至少為4,需要滿足如下關系2^(LPM_WIDTHU-1) < LPM_NUMWORDS£
< 2^(LPM_WIDTHU)
.
Lpm_showhead
是
模式開關,選擇正常模式或者是預讀模式。
在正常模式下,rdreq有效時才讀出數據;
在預讀模式下,自動讀出當前FIFO中第一個數據(FIFO不空時),當rdreq信號有效時,開始繼續往后讀取第二個數據;
Lpm_type
非
識別FIFO型號的參數,SCFIFO或者是DCFIFO
Maximize_speed
整數
非
空間或速度優化度參數,當值為0--5時為空間優化,6--10時為速度優化。
Overflow_checking
非
是否開啟溢出檢測,溢出時無視wrreq,值為NO或OFF,缺省值為ON;
Underflow_checking
非
是否開啟下溢檢測,下溢(讀空)時無視rdreq,值為NO或OFF,缺省值為ON;
Delay_rdusedw
Delay_wrusedw
非
Add_usedw_msb_bit
非
用於增加rdusedw和wrusedw的位寬(1bit)防止FIFO滿時翻轉為0,該參數值為ON或OFF,缺省值為OFF,該參數僅針對某些系列器件有效。
Rdsync_delaypipe
Wrsync_delaypipe
整數
非
Use_eab
非
是否使用塊RAM來構造FIFO,該參數值為ON或OFF,若設置為OFF則使用LE來構造FIFO;
Write_aclr_synch
非
是否將aclr設置為與wrclk同步,來避免wrreq和aclr之間的競爭,缺省值為OFF,僅在使用部分器件時有效;
Clocks_are_synchronized
非
Ram_block_type
非
Add_ram_output_register
非
選擇是否寄存q輸出數據;
Almost_full_value
整數
非
設置almost_full信號的閾值,當FIFO眾數據量大於或等於該值時,激活almost_full信號;
Almost_empty_value
整數
非
設置almost_empty信號的閾值,當FIFO眾數據量小於或等於該值時,激活almost_empty信號;
Allow_wrcycle_when_full
非
當SCFIFO已經滿時,允許用戶合並讀寫周期,缺省值為OFF,僅當overflow_checking參數設置ON時有效;
Intended_dvvice_family
非
設置使用器件型號,僅在功能仿真時使用。
1.3時序要求
1.如果設置了溢出保護電路或設置overflow_checking參數為ON,則在FIFO滿時會自動無視wrreq信號,FIFO空時同理;
2.如果沒有做上述兩種措施中的任意一種,則當FIFO在裝滿時的同一時鍾周期內不能對wrreq信號做出相應,即在此期間不能拉高wrreq,FIFO空時同理。
3.下面通過兩幅時序圖來具體說明:
1.4輸出狀態標記和潛伏期
對於DCFIFO,輸出潛伏期如下圖所示:
1.5避免亞穩態
1.6同步復位及異步復位的影響
在不同模式下,同步、異步復位的影響不同,SCFIFO支持同步或異步復位,DCFIFO支持異步復位,且該復位信號與寫時鍾同步。具體不同影響見表三(SCFIFO),表四(DCFIFO):
表三 同步或異步復位信號對SCFIFO 不同模式下的影響
模式
同步復位
異步復位
對狀態位的影響
清除full,almost_full標志
激活empty,almost_empty標志
重置usedw標志;
觸發點
時鍾上升沿
隨時
正常模式下對q輸出的影響
如果Q沒有寄存,則輸出SCFIFO的首個數據,否則保持輸出上一個數據;
保持輸出上一個數據;
預讀模式下對q輸出的影響
如果Q沒有寄存,則保持輸出上一個數據持續一個時鍾周期,隨后在下一個時鍾上升沿到來后輸出SCFIFO的首個數據,若沒有寄存則保持輸出上一個數據;
如果Q沒有寄存,則在下一個時鍾上升沿到來后輸出SCFIFO的首個數據,否則保持輸出上一個數據;
表四 復位信號對DCFIFO 不同模式下的影響
模式
異步復位信號
與寫時鍾同步的異步復位信號
對狀態位的影響
清除wrfull標志
在清除wrfull標志之前將之置1保持三個時鍾上升沿;
清除rdfull標志
激活wrempty和rdempty標志
重置wrusedw和rdusedw標志;
生效觸發點
隨時
正常模式下對q輸出的影響
如果q沒有寄存,則輸出保持不變,否則被清除;
預讀模式下對q輸出的影響
如果q沒有寄存,則輸出未知值,否則被清除。
1.7不同的輸入輸出位寬
DCFIFO_MIXED_WIDTHS這種類型的FIFO支持將輸如輸出數據設置為不同的位寬,在FIFO參數編輯器中可選擇輸入輸出位寬比,這個比率必須滿足一定要求,不同的輸入輸出時鍾頻率比和不同的所使用的RAM類型都限制了輸入輸出位寬比的選擇。當選擇不符合要求的位寬比時,是不能生成FIFO的。
下面舉例說明,例如輸入數據位寬16bit,輸出數據位寬8bit,則輸入輸出時鍾頻率比應該成1:2的關系。同時在輸入2個時鍾周期即輸入2個數據后,wrusedw標志值應該為2,此時rdusedw標志值應該為4,即在不再寫入的前提下經過4個輸出時鍾周期后,FIFO被讀空,激活empty標志。本例時序圖如下圖所示:
第二章 設計實例
2.1設計實例概要
在這個設計中,數據需要從ROM中轉移到RAM中。ROM和RAM由不相關的時鍾分別驅動,此時DCFIFO可以有效的處理異步時鍾域的數據交換問題。系統框圖如下:
2.2系統仿真分析
2.2.1寫操作
2.2.1.1初始化
在系統上電后10ns前,reset信號被拉高,各個模塊初始化,寫控制器處於IDLE狀態。在IDLE狀態下寫控制器把信號fifo_wrreq拉低,並從ROM地址00處請求數據。ROM被配置為輸出不寄存模式,所以ROM數據直接傳輸至FIFO寫輸入端而無視reset信號。這樣減少了數據潛伏時間,因為rom_out直接連接在fifo_in上,fifo_in是DCFIFO上的帶寄存的輸入口。
2.2.1.2寫操作
如果在reset信號拉低后fifo_wrfull無效(低電平),則寫控制器進入WRITE狀態,寫控制器將fifo_wrreq信號拉高,並進行寫入操作,在WRITE狀態下,rom_addr值保持不變,這樣使得ROM中讀出數據在被寫入FIFO(下一個寫時鍾上升沿)之前穩定的保持至少一個寫時鍾周期。
2.2.1.3地址切換
當ROM中數據未被讀完,即rom_addr小於ff時,WRITE狀態后寫控制器進入INCADR狀態。在INCADR狀態下,寫控制器將fifo_wrreq拉低,並將rom_addr增加1。直到ROM中數據被取完。
2.2.2讀操作
2.2.2.1初始化
在剛開始時,reset有效,此時fifo_rdempty信號被拉高。此時ram_addr=ff,這樣在下一個狀態時地址加一,這樣可以確保RAM中地址00處恰好可以寫入ROM地址00中的數據。
2.2.2.2寫操作
在下一個時鍾上升沿到來后,reset無效,fifo_rdempty被拉低,讀控制器從IDLE狀態進入INCADR狀態,在INCADR狀態下,讀控制器將信號fifo_rdreq拉高,將數據從FIFO中讀出並寫入RAM。
2.2.2.3寫入RAM
在INCADR狀態后,讀控制器進入WRITE狀態,在WRITE狀態下,ram_wren和ram_rden信號被拉高,使RAM從DCFIFO數據輸出Q上接受數據並存入RAM中。
2.2.3當DCFIFO被寫滿時
2.2.3.1等待狀態
當寫控制器在INCADR狀態下時,並且fifo_wrfull信號有效時,寫控制器將在下一個寫時鍾上升沿到來后進入WAIT狀態。在WAIT狀態下,寫控制器將保持rom_addr的值。如果fifo_wrfull信號持續有效,則寫控制器繼續保持WAIT狀態,當fifo_wrfull無效時,在下一個寫時鍾上升沿到來后,寫控制器將進入WRITE狀態。
2.2.3.2WRITE狀態
在WRITE狀態下且當ROM尚未被讀空時,寫控制器拉高fifo_wrreq信號后,在下一個寫時鍾上升沿到來后,寫控制器進入INCADR狀態。
2.2.4完成ROM至DCFIFO的數據傳遞
2.2.4.1DONE狀態
當寫控制器處於WRITE狀態下,且rom_addr=ff時,開始將ROM中最后一個數據寫入DCFIFO中,在下一個寫時鍾上升沿到來后,寫控制器進入DONE狀態。
2.2.4.2ROM讀取數據完畢后
在DONE狀態下,寫控制器將fifo_wrreq信號拉低,不在進入寫操作狀態。
2.2.5完成DCFIFO至RAM的數據傳遞
分析類似於2.2.4小結。