用CPLD和外部SRAM構成大容量FIFO的設計
關(guān)鍵詞:視頻服務(wù)器、碼流平滑、FPGA/CPLD、FIFO
The design of FIFO consisted of CPLD and SRAM
Ren Sanjun Hu Wenjie
DSP Center of Institute of Acoustics, Chinese Academy of Science, Beijing 100080
Abstract: According to the signal of general FIFO and the special need of video server, implement a cheap, high -volume and high-speed FIFO with CPLD and external SRAM. Besides meeting the buffer need of video stream in video server, it can be a general high-volume FIFO.
Keywords:video server, stream buffering, FPGA/CPLD, FIFO
隨著(zhù)數字電視技術(shù)的進(jìn)一步成熟,在視頻服務(wù)器方面,利用支持軟件豐富、運算速度不斷提高、具有較高性能價(jià)格比的微機來(lái)代替昂貴的專(zhuān)用設備實(shí)現數字視頻碼流的復用具有一定的實(shí)際意義,但是一般的桌面操作系統定時(shí)不夠精確、處理大量并發(fā)任務(wù)效率不高以及突發(fā)傳送等問(wèn)題影響了復用后碼流的質(zhì)量,為了保證復用后的碼流可以均勻平滑地傳送到調制器,還考慮到微機的工作效率,就需要用FIFO來(lái)進(jìn)行碼流的緩沖。如果FIFO的容量足夠大,微機就可以通過(guò)DMA方式一次發(fā)送大量的數據,最后再經(jīng)過(guò)FIFO的緩沖,按照預設頻率均勻送出。
在其它許多實(shí)際應用中,也會(huì )利用到FIFO來(lái)完成數據流的緩沖,消除突發(fā)傳送帶來(lái)的數據抖動(dòng),達到平滑輸出的效果。FIFO的容量和速度直接影響到緩沖的效果,但是目前大容量FIFO價(jià)格昂貴,這就影響到了FIFO的進(jìn)一步實(shí)際應用。本文介紹了一種利用外部SRAM和CPLD構成的廉價(jià)、高速、大容量先進(jìn)先出緩沖器FIFO的設計方法。
一、系統的設計思路
為了用外部SRAM來(lái)實(shí)現FIFO,要解決以下問(wèn)題:
§ 區分同時(shí)到達的讀寫(xiě)信號,并且產(chǎn)生間隔的對外部SRAM的讀寫(xiě)信號
§ 在SRAM順序尋址的基礎上實(shí)現數據的先進(jìn)先出
§ 全空、全滿(mǎn)、半空、半滿(mǎn)狀態(tài)的判定
§ 盡量降低對器件速度的要求
二、設計方法
同步設計
在系統中地址產(chǎn)生、比較器結果輸出、FIFO各種狀態(tài)的輸出都采用同步觸發(fā)方式,全部按照系統時(shí)鐘統一進(jìn)行,這能在很大程度上消除異步方式引起的邏輯狀態(tài)變化時(shí)間的不確定和毛刺的產(chǎn)生,但也沒(méi)必要在所有的地方都強求按同步設計,只要能符合時(shí)序要求,異步方式也可以,目的是盡量減少設計的復雜度和占用的資源。
原理圖輸入
設計在A(yíng)ltera公司的MAX+plus II V9.6軟件下編譯仿真。在系統的整體設計中采用原理圖的方式,可以方便地進(jìn)行時(shí)序控制和仿真。
三、具體信號的產(chǎn)生及時(shí)序分析
信號分析的具體條件
以下的設計都是在CPLD為EPM7128SQC100-6,SRAM為IDT71128-12的條件下進(jìn)行,對FIFO的最高要求為雙向同時(shí)讀寫(xiě),時(shí)鐘RCLK和WCLK為10MHz,脈沖寬度為50ns,系統時(shí)鐘CLK為50MHz,脈沖寬度為10ns。對于較低速度的讀寫(xiě),50MHz的系統時(shí)鐘也可以適應,如果外部要求降低,也可按照與RCLK、WCLK的等比例換用較低的系統時(shí)鐘。外部數據是在上升沿有效,FIFO的輸出也是上升沿有效。
基本信號的產(chǎn)生以及時(shí)序圖
系統采用獨立的系統時(shí)鐘CLK。為區分同時(shí)到達的外部讀寫(xiě)信號,內部產(chǎn)生的讀寫(xiě)信號分別用系統時(shí)鐘的上升沿和下降沿觸發(fā),同時(shí)讓產(chǎn)生的內部讀寫(xiě)信號互斥,以得到間隔的對外部SRAM的讀寫(xiě)信號;考慮到實(shí)際的需要以及器件和內部時(shí)鐘的速度,按照四個(gè)脈沖寬度的方式產(chǎn)生讀寫(xiě)信號,以保證在最小10個(gè)脈沖時(shí)間內各有一次有效讀寫(xiě)。
外部讀寫(xiě)時(shí)鐘RCLK、WCLK先經(jīng)過(guò)各自的使能控制信號REN、WEN進(jìn)入CPLD;為保證讀寫(xiě)互斥,外部讀寫(xiě)異步鎖存之后,讀信號鎖存后面的第一個(gè)上升沿,寫(xiě)信號鎖存后面的第一個(gè)下降沿,并且用各自的前三個(gè)脈沖控制對方鎖存第一個(gè)脈沖。
通過(guò)對各種情況的分析,基本讀寫(xiě)脈沖OE和MW之間的最小間隔是一個(gè)脈沖,在有連續兩個(gè)外部讀或寫(xiě)的情況下所產(chǎn)生的兩個(gè)OE或MW之間的最小間隔是兩個(gè)脈沖。
基本信號產(chǎn)生的原理圖和時(shí)序圖如下:
圖1 基本信號的產(chǎn)生
圖2 基本信號的時(shí)序
讀寫(xiě)地址信號
讀寫(xiě)各有一個(gè)地址指針,每讀出一個(gè)數讀地址加一,讀指針就指向下一個(gè)最早寫(xiě)入的數,經(jīng)過(guò)SRAM陣列的最高地址后,又從起始地址開(kāi)始,這樣就可以達到先進(jìn)先出的效果;只有有效的讀寫(xiě)脈沖才能觸發(fā)地址計數器;為使整個(gè)系統的動(dòng)作時(shí)間一致,采用同步設計,讀寫(xiě)都統一選擇上升沿觸發(fā)計數器變化;地址改變先于后面的/WE、/OE脈沖的產(chǎn)生。
地址發(fā)生器采用計數器宏單元。FIFO容量的大小由計數器決定,簡(jiǎn)單地增加計數器的位數和SRAM的數量,就可以擴大FIFO的容量。讀寫(xiě)地址產(chǎn)生之后,經(jīng)過(guò)一個(gè)總線(xiàn)復用器后輸出作為對外部SRAM讀寫(xiě)的地址線(xiàn);總線(xiàn)復用器的選擇由MW信號控制,只有在MW有效的時(shí)候才輸出為寫(xiě)地址,其它時(shí)間都是讀地址。
讀寫(xiě)地址在由計數器產(chǎn)生經(jīng)過(guò)總線(xiàn)復用時(shí),會(huì )產(chǎn)生靜態(tài)冒險;對于讀寫(xiě)地址比較器,因為它鎖存的時(shí)刻距離地址變化后兩個(gè)脈沖,而且比較器輸入的地址不經(jīng)過(guò)總線(xiàn)復用,這就可以保證在比較器鎖存的時(shí)刻地址比較結果已經(jīng)穩定而且不受靜態(tài)冒險的影響;對于到SRAM的讀寫(xiě)地址,在讀寫(xiě)控制脈沖/OE、/WE有效前還有兩個(gè)脈沖的時(shí)間穩定,不會(huì )因為地址不穩定產(chǎn)生錯誤操作。
讀寫(xiě)地址相等時(shí)比較器輸出相等標志EF,FIFO半滿(mǎn),即除去最高位以外的地址都相等的情況輸出半滿(mǎn)標志EHF。
圖3 讀寫(xiě)地址信號的產(chǎn)生
FIFO狀態(tài)信號
1、小于半滿(mǎn)LHFULL
在上電或復位之后,LHFULL立刻有效。利用另一個(gè)觸發(fā)器上電或者復位的清零,置位LHFULL觸發(fā)器,使其有效,但在第一個(gè)寫(xiě)之后這個(gè)觸發(fā)器就不再對LHFULL的變化有影響。在讀寫(xiě)地址比較器輸出半滿(mǎn)的時(shí)候再來(lái)一個(gè)讀,就判定為小于半滿(mǎn)LHFULL。從大于半滿(mǎn)到小于半滿(mǎn),需要經(jīng)過(guò)兩個(gè)連續的讀,第一個(gè)讀使比較器得到半滿(mǎn)結果,第二個(gè)讀使LHFULL有效。當經(jīng)過(guò)一個(gè)寫(xiě)從小于半滿(mǎn)到半滿(mǎn)時(shí),在讀寫(xiě)地址比較器輸出半滿(mǎn)使LHFULL觸發(fā)器狀態(tài)可以變化后的下一個(gè)上升沿清除LHFULL觸發(fā)器。觸發(fā)器的使能端選為EHF,保證狀態(tài)信號只在半滿(mǎn)的時(shí)候才發(fā)生變化。
2、大于半滿(mǎn)GHFULL
半滿(mǎn)的時(shí)候再來(lái)一個(gè)寫(xiě),GHFULL置位為高有效。GHFULL的設計原理同LHFULL,且不需要上電復位置位的處理。
圖4 LHFULL和GHFULL的產(chǎn)生
3、全滿(mǎn)FULL
當比較器輸出結果為讀寫(xiě)地址相等時(shí),如果此時(shí)執行的操作是寫(xiě),即在一個(gè)寫(xiě)之后讀寫(xiě)地址才相等,就判定為全滿(mǎn),置FULL為有效。在全滿(mǎn)狀態(tài)下,如果有一個(gè)讀,FULL就被清零。
1、 全空EMPTY
在上電或復位之后,EMPTY立刻有效。利用另一個(gè)觸發(fā)器上電或者復位的清零,置位EMPTY觸發(fā)器,使其有效,但在第一個(gè)寫(xiě)之后這個(gè)觸發(fā)器就不再對EMPTY的變化有影響。當比較器輸出結果為讀寫(xiě)地址相等時(shí),如果此時(shí)執行的操作是讀,即在一個(gè)讀之后讀寫(xiě)地址相等,就判定為全空,置EMPTY有效。全空狀態(tài)下,如果有一個(gè)寫(xiě),EMPTY就被清零。
圖5 FULL和EMPTY的產(chǎn)生
復位信號
只要RST信號為低就會(huì )產(chǎn)生有效的復位,讀寫(xiě)的地址計數器都被清零,全滿(mǎn)、大于半滿(mǎn)狀態(tài)清除,全空和小于半滿(mǎn)置位,FIFO鎖存輸出為零。
與外部SRAM的連接及對SRAM的讀寫(xiě)定時(shí)分析
CPLD與SRAM之間除去讀寫(xiě)復用的地址和數據線(xiàn)以外,還需要有輸出使能信號/OE,讀寫(xiě)信號/WE,片選信號/CS。地址線(xiàn)、數據線(xiàn)、/OE和/WE如前所述;片選信號由地址高位譯碼產(chǎn)生,在這里是把最高位取反,得到兩個(gè)片選信號。
讀寫(xiě)信號的時(shí)序符合設計采用的IDT71128-12 SRAM的定時(shí)要求。
寫(xiě)操作:
寫(xiě)周期最小12ns,地址有效到結束寫(xiě)最小10ns,片選到寫(xiě)結束最小10ns,寫(xiě)脈沖最小10ns,數據有效到寫(xiě)結束最小7ns。地址在/WE之前建立,在/WE結束之后變化;數據保持到/WE無(wú)效再變化;在地址變化時(shí),/WE、/CS不能都有效;在有效的寫(xiě)時(shí),/CS、/WE為低;
讀操作:
地址尋址時(shí)間最大12ns,讀周期最小12ns,片選尋址時(shí)間最大12ns,輸出使能到數據輸出有效最大6ns。在讀周期/WE為高,/OE為低,讀周期結束時(shí)地址和數據應該保持不變。
寫(xiě)地址與MW脈沖的上升沿同時(shí)變化,在兩個(gè)脈沖之后,寫(xiě)地址能夠穩定,這時(shí)/WE才有效,并且由于連續兩個(gè)讀寫(xiě)脈沖之間最少有一個(gè)脈沖的間隔,而且MW比EW4要有延遲,同時(shí)總線(xiàn)選擇也是由MW決定,就保證了寫(xiě)地址在/WE前有效并能保持到/WE結束;寫(xiě)數據的三態(tài)緩沖由EW4打開(kāi),可以保持到/WE結束。
讀地址在上一個(gè)寫(xiě)結束之后有效,由于讀地址變化比OE脈沖晚一個(gè)脈沖,/OE在OE結束時(shí)開(kāi)始,保證了/OE開(kāi)始的時(shí)候讀地址已穩定和讀周期時(shí)間符合要求;寫(xiě)數據已由EW4關(guān)閉,由于讀寫(xiě)之間的最小間隔,且控制SRAM數據輸出的/OE是ER5的反向,從SRAM中讀出的數據在鎖存入CPLD之后,滿(mǎn)足保持時(shí)間的要求。
對外部SRAM數據的讀寫(xiě),見(jiàn)后圖7、8。
四、為提高可靠性和滿(mǎn)足些特殊需要做的處理
讀寫(xiě)特殊時(shí)刻地址的產(chǎn)生
FIFO狀態(tài)為全空的時(shí)候,再有一個(gè)讀脈沖讀地址會(huì )繼續增加,由于此時(shí)內部已經(jīng)沒(méi)有有效數據,以后讀出的數據就不正確,因此必須在全空以后禁止讀地址的增加,同時(shí)置位VALID信號為無(wú)效。讀地址計數器的使能端由EMPTY和ER1共同控制,在EMPTY的時(shí)候,讀地址觸發(fā)無(wú)效。
FIFO狀態(tài)為全滿(mǎn)時(shí),再有一個(gè)寫(xiě)脈沖,由于已經(jīng)達到全滿(mǎn)的狀態(tài),此時(shí)的寫(xiě)操作就會(huì )把下一個(gè)地址的未讀出的數據修改,以后再按照此讀地址讀出的就是錯誤的數據;因此在出現全滿(mǎn)的情況下,一方面通過(guò)外部FULL標志指示,另外如果有寫(xiě)操作,則讀地址也同樣增加,這樣可以保證,以后的讀操作讀出的數據是沒(méi)經(jīng)過(guò)修改的有效數據。在EW1和FULL同時(shí)有效的時(shí)候,讓讀地址計數器的使能端有效,也同時(shí)計數。
圖6 特殊時(shí)刻對讀地址的控制
數據寫(xiě)入SRAM
外部數據經(jīng)過(guò)異步鎖存,先寫(xiě)入CPLD內的寄存器,然后再由/WE寫(xiě)入SRAM;可能會(huì )遇到最大的延遲使上一個(gè)外部寫(xiě)所產(chǎn)生的/WE的最后鎖存時(shí)刻上升沿位于下一個(gè)外部寫(xiě)脈沖之內,對SRAM來(lái)講,在/WE上升沿鎖存時(shí)刻數據就不能保持不變。因此,在每次從外部寫(xiě)入CPLD內寄存器時(shí),先在有效的MW脈沖之內鎖存一次,具體設計中選在EW2脈沖對應的下降沿。同時(shí),因為對SRAM寫(xiě)入和讀出的兩個(gè)數據總線(xiàn)都要連接到相同的SRAM的I/O數據線(xiàn)上,為了區分,在寫(xiě)入數據的輸出端加上三態(tài)緩沖,使能端由EW4控制,即/WE的反向。
圖7 外部數據寫(xiě)入SRAM
從SRAM中讀出數據的鎖存輸出
按照/OE產(chǎn)生之后,從外部SRAM讀出數據直接鎖存輸出的結果來(lái)看,由于時(shí)序的變化,鎖存輸出數據的時(shí)間長(cháng)度不一致,必須把鎖存的數據再鎖存一次以與外部讀時(shí)鐘RCLK的上升沿配合。
通過(guò)分析得到:即使是在最滯后的情況下,由上一個(gè)讀RCLK從SRAM中讀出的數據D[7..0]的鎖存也會(huì )發(fā)生在下一個(gè)RCLK所包含的系統時(shí)鐘的第三個(gè)脈沖之前;最快也在當前RCLK所包含的第六個(gè)CLK脈沖之后。因此最后輸出的鎖存時(shí)刻選在這兩個(gè)時(shí)間之內,以保證最后鎖存輸出的一定是上一個(gè)RCLK讀出的數據。
圖8 讀出數據的鎖存輸出
有效VALID信號的產(chǎn)生及作用
VALID信號是為緩沖碼流的目的專(zhuān)門(mén)設計的。一般的MPEG2接口信號由D[7..0]、CLK、SYNC、VAL、ERR組成。ERR、SYNC可以不用,CLK采用讀時(shí)鐘RCKL,數據有效VALID需要合成出來(lái),標志FIFO當前不處于全空狀態(tài),按照RCLK時(shí)鐘讀出的是有效數據。
設計要做到:在全空的情況下,最后一個(gè)有效數據鎖存輸出的時(shí)候VALID仍有效;全空信號無(wú)效情況下,有效數據出現之后才能有VALID信號。VALID信號的設計與讀出數據的鎖存輸出密切相關(guān);根據現在的設計,鎖存輸出的數據一定是前一個(gè)外部讀時(shí)鐘讀出的數據,所以選在EMPTY置位以后,再經(jīng)過(guò)一個(gè)RCLK的上升沿VALID才能被清除;在EMPTY被清除之后,再經(jīng)過(guò)一個(gè)有效的/OE和一次讀輸出數據鎖存后VALID才能置位。
圖9 VALID信號的產(chǎn)生
五、設計結果及進(jìn)一步的改進(jìn)
根據本設計的所做的實(shí)際硬件電路,在實(shí)驗室測試時(shí),一端用碼流發(fā)生器送入數據,另一端用與輸入相同的時(shí)鐘讀出數據送到解碼器解碼,在現有的CPLD和SRAM的條件下(EPM7128SQC100-6,IDT71128-12),可以達到雙向10MBps的讀寫(xiě)。
所設計的FIFO可作為同步或者異步FIFO;通過(guò)增加系統資源、改變讀寫(xiě)地址比較器的設計可以按照需要設計出將近FULL、EMPTY,HFULL等標志,偏差可以由外部置入,能夠進(jìn)一步增加FIFO狀態(tài)控制的靈活性。
參考文獻:
[1] MAX7000 Programmable Logic Device Family Data Sheet, July 1999, ALTERA
[2] IDT71128 CMOS Static SRAM Data Sheet, IDT
[3] IDT72201 CMOS SyncFIFO Data Sheet, IDT
[4] CPLD技術(shù)及其應用, 宋萬(wàn)杰、羅豐、吳順君,1999年9月,西安電子科技大學(xué)出版社
[5] FPGA原理及應用設計,朱明程,1994年5月,電子工業(yè)出版社
作者簡(jiǎn)介:
任三軍,1972年生,博士,主要研究方向為信號處理、數字視頻
呼文杰,1972年生,博士,主要研究方向為信號處理、數字視頻
評論