劉百超
(信陽師范學(xué)院 物理電子工程學(xué)院,河南 信陽 464000)
隨著現(xiàn)代科技的發(fā)展,人們的要求也越來越高,如看視頻的清晰度、監(jiān)控的實(shí)施性等,這些都可以通過數(shù)字化來實(shí)現(xiàn),這些數(shù)字化信息產(chǎn)生了大量的數(shù)據(jù),如是對(duì)數(shù)據(jù)的存儲(chǔ)速度要求越來越高[1]。高速存儲(chǔ)成為了研究熱點(diǎn)[2,3]。目前,快速存儲(chǔ)方案可以分為兩個(gè)大類,分別是算法級(jí)方案和電路系統(tǒng)級(jí)方案,而后者無疑是最快速的方案。電路系統(tǒng)級(jí)方案又可以分為板級(jí)方案、ASIC(專用集成電路)方案和FPGA方案。其中,F(xiàn)PGA方案具有開發(fā)成本低、靈活性高、投放市場快的優(yōu)點(diǎn),因而受到更多研究者的青睞。
FPGA(Field-Programmable Gate Array)是現(xiàn)場可編程門陣列的英文簡稱,它內(nèi)部包含了大量的可編程資源,主要包括查找表LUT、寄存器、存儲(chǔ)器、硬件乘法器、PLL等。FPGA芯片內(nèi)部的可編程資源可以實(shí)現(xiàn)并行工作,因而具有極其強(qiáng)大的處理能力,其運(yùn)算能力可達(dá)傳統(tǒng)CPU的數(shù)百倍甚至更高[4]。也正因此,在許多信號(hào)處理平臺(tái)中,F(xiàn)PGA承擔(dān)著運(yùn)算與調(diào)度核心的功能,其主要開發(fā)手段則依賴于硬件描述語言(以下簡稱HDL)[5]。由于FPGA片內(nèi)存儲(chǔ)資源有限,必須為其配置大容量外存儲(chǔ)器[6]。在眾多類型的外部存儲(chǔ)器中,靜態(tài)存儲(chǔ)器SRAM具有功耗低、速度快、無需動(dòng)態(tài)刷新等優(yōu)點(diǎn),因而被經(jīng)常用于拓展FGPA存儲(chǔ)空間。近十年來,許多研發(fā)人員圍繞這個(gè)問題開展了大量的研發(fā)工作,取得了一些突破性進(jìn)展。其中,比較有影響的代表性工作有兩個(gè):第一個(gè)是在2018年, Rodríguez-Olivares等利用一種SRAM(NAND Flash Memory), 在RAID 6系統(tǒng)框架下將讀寫速度提高到58.24MHz[7];第二個(gè)是在2020年,Muhammad Irfan等利用三元內(nèi)容可編址SRAM,與FGPA芯片組合,實(shí)現(xiàn)一種可重構(gòu)低功耗FPGA存儲(chǔ)器擴(kuò)展系統(tǒng),將讀寫速度提高到128.76MHz[8]。
讀寫速度的瓶頸在于SRAM的總線架構(gòu)。為了進(jìn)一步提高FPGA讀寫SRAM的速度,一個(gè)最重要的手段就是采用高速SRAM,而ZBT(Zero-Bus-Turnaround) SRAM則是高速SRAM的高性能產(chǎn)品。它消除了傳統(tǒng)SRAM的總線等待周期,在讀寫狀態(tài)下總線利用率均可以達(dá)到100%。目前,ZBT SRAM的典型存儲(chǔ)容量可達(dá)72Mbit,訪問速度最高可達(dá)250MHz。如果能夠?qū)PGA與ZBT有效組織起來,無疑是實(shí)現(xiàn)高速存儲(chǔ)的有效途徑。但迄今為止,沒有發(fā)現(xiàn)研發(fā)人員開展這項(xiàng)研究的成果。
本文旨在開展這項(xiàng)研究,設(shè)計(jì)一款基于FPGA的高速ZBT控制器,實(shí)現(xiàn)大數(shù)據(jù)的高速存儲(chǔ)。該控制器從4個(gè)方面來確保ZBT讀寫的時(shí)序穩(wěn)定度并提高工作頻率:(1)采用動(dòng)態(tài)相位連續(xù)可調(diào)技術(shù)實(shí)時(shí)調(diào)整時(shí)鐘相位;(2)通過施加合理嚴(yán)密的時(shí)序約束確保充裕的建立保持時(shí)間;(3)通過FPGA的高級(jí)可編程輸入輸出延時(shí)器使各I/O端口延時(shí)基本一致;(4)插入多級(jí)流水線以改善最高工作頻率。通過4個(gè)方面的設(shè)計(jì),增大數(shù)據(jù)吞吐量,實(shí)現(xiàn)了數(shù)據(jù)的穩(wěn)定讀寫;FPGA的輸入輸出延時(shí)使得IOB輸入輸出一致;多級(jí)流水線策略提高了時(shí)序性能。從而實(shí)現(xiàn)了基于FPGA的高速存儲(chǔ),使得FPGA+ZBT SRAM存儲(chǔ)讀寫速度可以達(dá)到200MHz以上。該設(shè)計(jì)已在硬件電路中成功驗(yàn)證,并通過高低溫環(huán)境試驗(yàn)驗(yàn)證,證實(shí)了設(shè)計(jì)的正確性和有效性。
系統(tǒng)針對(duì)使用FPGA+ZBT SRAM或其它同類存儲(chǔ)器的信號(hào)處理系統(tǒng),通過多種策略的綜合應(yīng)用,解決了超高速頻率下FPGA讀寫訪問的時(shí)序不穩(wěn)定、HDL代碼修改帶來的時(shí)序參數(shù)變化以及產(chǎn)品高低溫環(huán)境下的時(shí)序變化導(dǎo)致讀寫錯(cuò)誤等技術(shù)難題。經(jīng)在實(shí)際電路中驗(yàn)證,可以達(dá)到200MHz以上的數(shù)據(jù)穩(wěn)定讀寫[9]。
本系統(tǒng)采用可綜合HDL語言為主要設(shè)計(jì)手段,可適用于目前市場上的所有主流FPGA器件,如Xilinx公司的Virtex6、7、Kintex7系列、Altera公司的StratixII~V系列等。本設(shè)計(jì)整體框圖如圖1所示,其中虛框內(nèi)即為在FPGA器件內(nèi)實(shí)現(xiàn)的ZBT讀寫控制器,下方為2片ZBT SRAM芯片組成乒乓緩沖系統(tǒng),右方為ZBT讀寫控制器對(duì)外接口,其中讀端口與寫端口分開,可實(shí)現(xiàn)雙口RAM讀寫操作功能。
圖1 ZBT SRAM讀寫控制器整體框圖
該控制器的主要工作流程可概括如下:
(1)系統(tǒng)上電后,產(chǎn)生全局復(fù)位信號(hào),復(fù)位所有寄存器和狀態(tài)機(jī);
(2)禁用ZBT SRAM輸出使能,置ZBT SRAM寫使能有效,初始化偽隨機(jī)數(shù)種子,并將偽隨機(jī)數(shù)產(chǎn)生器輸出數(shù)據(jù)連續(xù)寫入ZBT SRAM中的每一個(gè)地址;
(3)禁用ZBT SRAM寫使能,并置ZBT SRAM輸出使能有效,開始回讀ZBT數(shù)據(jù),同時(shí)再次初始化偽隨機(jī)數(shù)種子,將每一個(gè)地址回讀得到的ZBT數(shù)據(jù)與偽隨機(jī)數(shù)產(chǎn)生器輸出數(shù)據(jù)比較;
(4)如果二者比較數(shù)據(jù)不完全相同,證明讀寫ZBT SRAM中發(fā)生了時(shí)序違反情況進(jìn)而導(dǎo)致讀寫錯(cuò)誤,由時(shí)鐘相位調(diào)整模塊對(duì)ZBT工作時(shí)鐘進(jìn)行相位調(diào)整,每次相位調(diào)整步進(jìn)約10~20度即可,步進(jìn)過大則難以保證找到最佳時(shí)序裕度位置,過小則會(huì)使相位調(diào)整耗費(fèi)過長時(shí)間才能找出最佳位置;
(5)如果二者比較數(shù)據(jù)完全相同,證明上一輪ZBT讀寫時(shí)序正常,但仍不能保證當(dāng)前的時(shí)序余量已足以保證高低溫下的走線延時(shí)變化,因此還需要繼續(xù)進(jìn)行相位調(diào)整,并繼續(xù)測(cè)試讀寫是否有誤。在連續(xù)6次以上調(diào)整ZBT工作時(shí)鐘相位均讀寫無誤時(shí),證實(shí)已經(jīng)找出覆蓋整個(gè)合法時(shí)序裕量窗口的位置,再將輸出時(shí)鐘相位反相調(diào)整3次,即可使時(shí)鐘沿恰好出現(xiàn)在總線及控制信號(hào)變化的中間位置,從而得到最大的建立保持時(shí)間裕量。
(6)在時(shí)鐘相位調(diào)整完畢后,即可開始正常的ZBT讀寫操作。由于采用了2片ZBT芯片,因而可以組成乒乓緩沖系統(tǒng),對(duì)FPGA的其余模塊相當(dāng)于實(shí)現(xiàn)了雙口RAM操作功能,對(duì)任意地址的讀操作和寫操作可以同時(shí)完成,吞吐量改善了一倍。
系統(tǒng)依據(jù)ZBT的特征進(jìn)行設(shè)計(jì)。ZBT的主要特點(diǎn)是其數(shù)據(jù)總線相對(duì)地址總線和讀寫控制信號(hào)有2個(gè)時(shí)鐘周期的延遲,即在進(jìn)入數(shù)據(jù)寫入時(shí),先給出寫地址和寫使能,然后在經(jīng)過2個(gè)時(shí)鐘周期后,再給出該地址的寫數(shù)據(jù)完成數(shù)據(jù)寫入。同樣地,如果要進(jìn)行數(shù)據(jù)讀操作,在給出讀地址和讀使能信號(hào)后,也要再經(jīng)過2個(gè)時(shí)鐘周期后才能從數(shù)據(jù)總線上得到數(shù)據(jù)??傮w上,ZBT SRAM的基本讀寫時(shí)序如圖2所示。以下介紹各內(nèi)部模塊設(shè)計(jì)技術(shù)。
圖2 ZBT SRAM讀寫基本時(shí)序圖
時(shí)鐘是現(xiàn)代高速數(shù)字電路的核心,由于本設(shè)計(jì)的工作速度很高,而FPGA由于先天架構(gòu)的特點(diǎn),無法實(shí)現(xiàn)各I/O的精準(zhǔn)延時(shí)處理,甚至同一個(gè)I/O端口信號(hào)在不同工作溫度下的延時(shí)特性也常常會(huì)有5ns以上的延時(shí)變化。傳統(tǒng)的ZBT SRAM控制器由于工作頻率較低(通常不超過100MHz),器件I/O延時(shí)特性的變化尚不足以違反建立保持時(shí)間時(shí)序要求,然而對(duì)于超過100MHz甚至200MHz以上的超高頻率應(yīng)用,I/O端口延時(shí)特性變化將會(huì)帶來顯著的時(shí)序影響。
本設(shè)計(jì)共使用了3個(gè)獨(dú)立的時(shí)鐘管理器,每一個(gè)時(shí)鐘管理器內(nèi)部均包括一個(gè)鎖相環(huán)電路PLL,通過反饋通路實(shí)現(xiàn)輸出時(shí)鐘與輸入時(shí)鐘的頻率相位嚴(yán)格對(duì)齊,整個(gè)時(shí)鐘樹如3圖所示:
圖3 ZBT SRAM讀寫控制器時(shí)鐘設(shè)計(jì)策略
可以看到,外部輸入時(shí)鐘經(jīng)過FPGA專用全局時(shí)鐘引腳進(jìn)入時(shí)鐘管理器1,并輸出4路時(shí)鐘信號(hào),其中1路直接輸出供FPGA內(nèi)部邏輯使用,還有1路用于實(shí)現(xiàn)PLL時(shí)鐘反饋,剩余2路時(shí)鐘則各自經(jīng)過一個(gè)獨(dú)立的時(shí)鐘管理器(圖3中的時(shí)鐘管理器2和3)然后輸出至FPGA引腳,并經(jīng)過PCB走線送至2片ZBT的CLK端。但是與時(shí)鐘管理器1不同,時(shí)鐘管理器2和3的輸出相位均具有相位調(diào)整功能,即可以通過控制端口使其輸出時(shí)鐘相對(duì)輸入時(shí)鐘的相位超前或滯后,該技術(shù)稱作動(dòng)態(tài)相移控制,可以實(shí)現(xiàn)輸出時(shí)鐘的任意相位調(diào)整。本設(shè)計(jì)正是通過該功能達(dá)到了無論與ZBT SRAM接口的控制及總線信號(hào)何時(shí)變化,總可以通過調(diào)整時(shí)鐘輸出相位實(shí)現(xiàn)穩(wěn)定的數(shù)據(jù)讀寫功能。
該模塊用于調(diào)整時(shí)鐘管理器2和3的輸出時(shí)鐘相位,對(duì)外接口信號(hào)分別是工作時(shí)鐘PSCLK、時(shí)鐘相位調(diào)整功能使能信號(hào)PSEN以及用于代表是減少還是增加相位步進(jìn)的PSINCDEC。目前主流FPGA器件的時(shí)鐘管理模塊動(dòng)態(tài)相位調(diào)整功能的調(diào)整步進(jìn)可達(dá)其內(nèi)核PLL周期的1/56,而PLL周期一般在1ns左右,因此單次動(dòng)態(tài)相位調(diào)整對(duì)應(yīng)的時(shí)間延遲可控制在20ps以下。如此高的相位調(diào)整精度已大大超過系統(tǒng)需要。因此在實(shí)際設(shè)計(jì)中,可以通過多次置PSEN信號(hào)有效的方式增加調(diào)整步進(jìn)至10~20度。
時(shí)鐘和復(fù)位信號(hào)是FPGA設(shè)計(jì)中最為關(guān)鍵的兩個(gè)信號(hào),復(fù)位信號(hào)本設(shè)計(jì)中用于系統(tǒng)上電時(shí)將所有寄存器和狀態(tài)機(jī)復(fù)位至確知狀態(tài)。由于復(fù)位信號(hào)來源于外部端口輸入,對(duì)FPGA內(nèi)部工作時(shí)鐘是一個(gè)典型的異步信號(hào),因此必須對(duì)其進(jìn)行同步化處理。本設(shè)計(jì)通過級(jí)聯(lián)3級(jí)寄存器實(shí)現(xiàn)復(fù)位信號(hào)的同步化,然后經(jīng)過全局走線資源成為所有寄存器的復(fù)位信號(hào),實(shí)現(xiàn)了同步復(fù)位、同步釋放的效果。
偽隨機(jī)數(shù)產(chǎn)生器用于產(chǎn)生ZBT讀寫測(cè)試數(shù)據(jù)。由于ZBT存儲(chǔ)器容量很大,采用事先在FPGA內(nèi)部存儲(chǔ)測(cè)試向量的做法并不可行,因此采用了基于M序列的偽隨機(jī)數(shù)發(fā)生器,僅使用32個(gè)寄存器及一系列反饋線,即可生成循環(huán)長度高度高達(dá)2Λ32-1的偽隨機(jī)數(shù),循環(huán)長度已超過目前市場上容量最大的ZBT芯片CY7C1470的存儲(chǔ)深度。此外,該產(chǎn)生器的隨機(jī)種子可以動(dòng)態(tài)變化以得到更好的隨機(jī)特性。
讀寫測(cè)試模塊則用于讀寫錯(cuò)誤統(tǒng)計(jì)。在讀寫測(cè)試階段,每次開始寫ZBT芯片及回讀數(shù)據(jù)時(shí),均需對(duì)隨機(jī)種子進(jìn)行初始化,然后開始連續(xù)地址讀寫測(cè)試,先寫入長度達(dá)2^21-1的偽隨機(jī)數(shù),然后再逐一回讀。只有當(dāng)全部寫入數(shù)據(jù)和全部回讀數(shù)據(jù)完全相同時(shí)才認(rèn)為當(dāng)前讀寫操作成功。并將測(cè)試結(jié)果(0代表無誤,1代表有錯(cuò)誤)記錄至6位寬的向量err_array的最低位,同時(shí)err_array左移一位,該向量初始值為全1,因此只有在連續(xù)6次檢測(cè)到讀寫成功后,err_array變量才會(huì)變成零值,這代表已經(jīng)找出最佳讀寫時(shí)序窗口。然后,由主控狀態(tài)機(jī)控制時(shí)鐘相位調(diào)整模塊反相調(diào)整3個(gè)步進(jìn)即可置ZBT工作時(shí)鐘為最佳相位。在正常工作階段,偽隨機(jī)數(shù)產(chǎn)生器及讀寫測(cè)試模塊可處于禁用階段以降低動(dòng)態(tài)功耗。
該控制器的主要功能是將外部模塊輸入的讀使能及讀地址進(jìn)行多級(jí)寄存,即插入多級(jí)流水線,同時(shí)將ZBT芯片輸出的數(shù)據(jù)寄存至FPGA工作時(shí)鐘域并向外部模塊輸出。
該模塊的設(shè)計(jì)關(guān)鍵是必須考慮到FPGA實(shí)際物理引腳的輸入輸出走線延時(shí)。具體的主要延時(shí)路徑包括:ZBT讀地址及輸出使能信號(hào)從FPGA內(nèi)部至FPGA引腳處的輸出延時(shí)(典型值可達(dá)5~7ns,在不同引腳分布、FPGA占用資源及工作溫度等不同條件下略有差異),ZBT數(shù)據(jù)總線經(jīng)過FPGA輸入引腳進(jìn)入內(nèi)部寄存器的輸入延時(shí)(典型值約6~8ns,在不同引腳分布、FPGA占用資源及工作溫度等不同條件下略有差異)。
此外,還必須要考慮到從FPGA引腳輸出地址總線數(shù)據(jù)到ZBT芯片通過自己的工作時(shí)鐘上升沿識(shí)別出該地址的時(shí)間,該時(shí)間的長短與地址總線數(shù)據(jù)變化時(shí)刻和ZBT芯片CLK信號(hào)時(shí)鐘沿之間的時(shí)間長度有關(guān),最長可接近1個(gè)時(shí)鐘周期,最短可能只有1ns左右。對(duì)于傳統(tǒng)的ZBT控制器設(shè)計(jì)策略,這一部分時(shí)間根本無法精確估計(jì),然而,由于采用了時(shí)鐘相位自動(dòng)動(dòng)態(tài)調(diào)整策略,無論FPGA輸出引腳延時(shí)信息如何變化,總可以保證ZBT工作時(shí)鐘沿出現(xiàn)在地址及控制信號(hào)變化的中間位置,即二者相差半個(gè)時(shí)鐘周期。對(duì)200MHz工作頻率的ZBT芯片,該時(shí)間約為2.5ns。
理想情況下,ZBT芯片在當(dāng)前時(shí)鐘沿檢測(cè)到讀地址和讀有效后,可在經(jīng)過1個(gè)時(shí)鐘周期+3ns后通過雙向數(shù)據(jù)總線輸出有效數(shù)據(jù)。因此,考慮到各種延時(shí)信息后,如果是在200MHz工作頻率下,從FPGA給出地址總線信息,到ZBT芯片送出數(shù)據(jù),至少需要經(jīng)過5+2.5+5+3=15.5ns時(shí)間,而該數(shù)據(jù)進(jìn)入FPGA內(nèi)部又至少需要6ns,因此,總體延時(shí)時(shí)間已經(jīng)高達(dá)21.5ns,超過了4個(gè)時(shí)鐘周期,也即FPGA需要經(jīng)過5個(gè)時(shí)鐘周期才能檢測(cè)到正確數(shù)據(jù)。而FPGA內(nèi)部為了提高工作頻率,還必須要對(duì)所有輸入輸出信號(hào)進(jìn)行寄存后再輸入輸出,最終,從ZBT讀寫控制器接收到外部模塊給出的ZBT讀地址開始,必須要等待1+5+1=7個(gè)時(shí)鐘周期后才能得到正確數(shù)據(jù)。其中第一個(gè)時(shí)鐘周期是由于寄存讀地址造成,中間5個(gè)時(shí)鐘周期是由于輸入輸出引腳延時(shí)造成,最后一個(gè)時(shí)鐘周期則是由于對(duì)輸入數(shù)據(jù)進(jìn)行寄存造成。需要說明的是,雖然該ZBT讀寫控制器從讀地址到輸出數(shù)據(jù)的延時(shí)長達(dá)7個(gè)時(shí)鐘周期,但該延時(shí)實(shí)為流水延時(shí),并不會(huì)真正降低ZBT的讀寫效率,仍然可以實(shí)現(xiàn)100%狀態(tài)下的總線利用。
與ZBT讀接口控制器相比,寫接口控制器比較簡單,只需要把外部模塊輸入的寫地址、寫使能、寫數(shù)據(jù)經(jīng)寄存一級(jí)后再輸出至ZBT芯片即可。由于此前的ZBT讀寫測(cè)試功能已經(jīng)確保ZBT工作時(shí)鐘恰好出現(xiàn)在其所有輸入數(shù)據(jù)變化時(shí)刻的中間位置,因此不會(huì)帶來任何時(shí)序違反問題[10]。
如前所述,F(xiàn)PGA的引腳延時(shí)不可事先預(yù)估。但是需要強(qiáng)調(diào)的是,在設(shè)計(jì)代碼基本定型及引腳綁定完成后,由于布局布線策略的效果已經(jīng)趨于固定,各引腳的輸入輸出延時(shí)信息也已經(jīng)基本穩(wěn)定,不會(huì)再發(fā)生顯著變化。此時(shí)如果某些總線或信號(hào)的延時(shí)信息與其它信號(hào)有明顯差異,則會(huì)使該信號(hào)的建立保持時(shí)序裕量大大減少,因此需要調(diào)整其延時(shí)分布,使所有信號(hào)延時(shí)信息盡可能一致[11][12]。
許多傳統(tǒng)FPGA設(shè)計(jì)使用手動(dòng)插入多級(jí)反相器來達(dá)到延時(shí)效果,然而這種方式不可避免會(huì)帶來一系列問題:一是延時(shí)效果無法精確控制且不穩(wěn)定,二是輸出信號(hào)的相位噪聲大大惡化。不僅如此,同樣的代碼在不同的綜合工具下優(yōu)化效果不同,還會(huì)導(dǎo)致不同的時(shí)序延時(shí)效果。因此,這種策略并不適合在高速場合下使用。
為此,采用了FPGA中的高級(jí)可編程I/O資源IDELAYCTRL和IODEALY,其中前者是后者的控制中樞,輸入工作時(shí)鐘可選200MHz或300MHz,后者則用于完成精確的輸入輸出延時(shí)調(diào)整,在200MHz下,延時(shí)單位步進(jìn)為78ps,在300MHz下,延時(shí)單位步進(jìn)可達(dá)52ps。更重要的是,IODEALY是專用于IOB引腳的輸入輸出延時(shí)控制模塊,它不占用任何寄存器及LUT資源,也不會(huì)降低輸出信號(hào)質(zhì)量,高低溫上的延時(shí)參數(shù)保持不變,十分適合在高速高頻場合下采用。而IDELAYCTRL工作時(shí)鐘為200MHz,IODELAY最大延時(shí)量為32個(gè)單位步進(jìn),因此最大延時(shí)量為2.5 ns,但事實(shí)上,還要考慮到接入IODELAY帶來的額外走線延時(shí)(約1~2ns),因此實(shí)際上IODELAY延時(shí)量可超過4 ns,這樣的延時(shí)控制已足以補(bǔ)償由于布局布線造成的IOB輸入輸出不一致性[13]。
該模塊是所有其余子模塊的控制中樞,它采用了一個(gè)復(fù)雜的同步狀態(tài)機(jī)實(shí)現(xiàn),共分成以下10個(gè)狀態(tài):
IDLE:系統(tǒng)復(fù)位及上電后的初始狀態(tài),解除復(fù)位后即自動(dòng)跳至INIT_REG狀態(tài);
INIT_REG:該狀態(tài)用于初始化偽隨機(jī)數(shù)產(chǎn)生種子,初始化完成后即跳至WRITE_ZBT狀態(tài);
WRITE_ZBT:用于完成對(duì)ZBT所有地址的偽隨機(jī)數(shù)據(jù)寫入,寫入完畢后跳至CLR_CNT狀態(tài);
CLR_CNT:用于清除ZBT讀寫計(jì)數(shù)器值,為回讀作準(zhǔn)備,清零完成后跳至READBACK_ZBT狀態(tài),同時(shí)該狀態(tài)再次初始化偽隨機(jī)數(shù)產(chǎn)生種子;
READBACK_ZBT:用于回讀所有地址的ZBT數(shù)據(jù),并與偽隨機(jī)數(shù)產(chǎn)生器的輸出數(shù)據(jù)進(jìn)行比較,統(tǒng)計(jì)是否完全一致,統(tǒng)計(jì)完成后進(jìn)入PS_MODIFY狀態(tài);
PS_MODIFY:該狀態(tài)由時(shí)鐘相位調(diào)整模塊對(duì)時(shí)鐘管理器2和3的輸出時(shí)鐘相位進(jìn)行調(diào)整,每次相位調(diào)整步進(jìn)10~20度,然后跳轉(zhuǎn)至WAIT_PSDONE狀態(tài);
WAIT_PSDONE:在該狀態(tài),等待PSDONE信號(hào)置高,以表明時(shí)鐘管理器2和3輸出時(shí)鐘相位調(diào)整已經(jīng)完畢,然后檢測(cè)最近6次的錯(cuò)誤統(tǒng)計(jì)結(jié)果是否均無誤,若是則進(jìn)入SET_OPT_VALUE狀態(tài),否則轉(zhuǎn)至INIT_REG狀態(tài),繼續(xù)新的時(shí)鐘相位下的讀寫測(cè)試;
SET_OPT_VALUE:在該狀態(tài),將由時(shí)鐘相位調(diào)整模塊對(duì)時(shí)鐘管理器2和3的輸出時(shí)鐘相位進(jìn)行反向調(diào)整3次,以使ZBT工作時(shí)鐘的上升沿出現(xiàn)在總線及控制信號(hào)變化的中間時(shí)刻,從而達(dá)到最大的時(shí)序裕量,調(diào)整完畢后跳至WAIT_PSDONE2狀態(tài);
WAIT_PSDONE:同樣地,在該狀態(tài),等待PSDONE信號(hào)置高,以表明時(shí)鐘管理器2和3輸出時(shí)鐘相位調(diào)整已經(jīng)完畢,調(diào)整完畢后,判斷當(dāng)前是否是第一次進(jìn)入該狀態(tài),若是代表此時(shí)ZBT1芯片時(shí)序調(diào)整已經(jīng)完成,但ZBT2還未進(jìn)行,因此需要跳轉(zhuǎn)INIT_REG狀態(tài),對(duì)ZBT2重復(fù)ZBT1芯片調(diào)整的所有工作,若已經(jīng)是第二次進(jìn)入該狀態(tài),則證明所有ZBT芯片已經(jīng)調(diào)整完畢,可跳轉(zhuǎn)至INIT_DONE狀態(tài);
INIT_DONE:該狀態(tài)為時(shí)序調(diào)整完成后的正常工作狀態(tài),此時(shí)外部模塊可以通過其讀寫數(shù)據(jù)端口完成對(duì)ZBT芯片的同時(shí)數(shù)據(jù)讀寫,達(dá)到乒乓緩沖效果。
FPGA的輸入輸出端口布局布線延時(shí)雖然無法事先得到,然而仍可以通過用戶約束文件使布局布線后的器件最壞走線延時(shí)不超過約束值。需要注意的是,該約束值必須考慮到實(shí)際接口電平形式及芯片速度、工作溫度等參數(shù),否則即使施加約束也無法成功完成布局布線。
具體到本設(shè)計(jì)中,施加的約束共有3種,第一種是周期約束,用于約束FPGA的最高工作頻率;第二種約束是輸出約束,即clk to output約束,利用該約束控制ZBT讀寫控制器所有輸出信號(hào)的最大延時(shí);第三種約束為輸入約束,即對(duì)輸入信號(hào)的建立和保持時(shí)間約束。后兩種約束也稱為偏移約束(OFFSET約束)。
由于本設(shè)計(jì)內(nèi)部采用了多級(jí)流水線策略寄存中間數(shù)據(jù),因此大大提高了時(shí)序性能,在Vetex6平臺(tái)上,最高工作頻率可達(dá)250MHz,已超過目前市面上所有ZBT芯片的工作頻率。輸入和輸出約束則主要用于分析IOB引腳的延時(shí)分布,如果某些引腳延時(shí)與其它信號(hào)相比離散性較大,則可以使用輸入輸出延時(shí)控制功能微調(diào)其延時(shí),最終達(dá)到所有信號(hào)的延時(shí)信息基本一致的效果。
該系統(tǒng)以以下器件和模式驗(yàn)證。選擇目前速度最快、容量最大的Cypress公司的CY7C1470為ZBT SRAM器件代表,以Xilinx公司中端器件Virtex6 LX130為FPGA器件典型代表。整個(gè)設(shè)計(jì)采用2片CY7C1470組成乒乓緩沖系統(tǒng),從而可實(shí)現(xiàn)數(shù)據(jù)流的連續(xù)讀寫,進(jìn)一步提高數(shù)據(jù)吞吐量。工作頻率設(shè)定為160MHz。
CY7C1470的容量為2M*36bit,是典型的流水模式ZBT SRAM,最高工作頻率超過200MHz,其主要對(duì)外接口信號(hào)介紹如下:
A0~A20:21位地址總線,輸入端口;
D0~D35:36位數(shù)據(jù)總線,雙向端口;
WE_N:寫使能,低電平代表寫操作,高電平代表讀操作,輸入端口;
CLK:工作時(shí)鐘,所有信號(hào)變化均與該信號(hào)的上升沿同步,輸入端口;
OE_N:輸出使能信號(hào),只有在該信號(hào)為低電平時(shí),數(shù)據(jù)總線D0~D35才能對(duì)外輸出數(shù)據(jù),否則總線處于高阻態(tài),輸入端口。
按照CY7C1470產(chǎn)品數(shù)據(jù)手冊(cè),所有輸入信號(hào)相對(duì)于CLK上升沿的建立時(shí)間要求是不小于1.4ns,保持時(shí)間要求不小于0.4ns。而輸出信號(hào)D0~D35相對(duì)于CLK上升沿的延遲時(shí)間不超過3ns。
對(duì)FPGA器件,不同制造工藝、不同檔次、不同驅(qū)動(dòng)電平的芯片引腳輸入輸出延時(shí)均有所不同,詳細(xì)的參數(shù)可參見FPGA器件的數(shù)據(jù)手冊(cè)。以Virtex6器件和LVTTL電平為例,在低溫下,輸入信號(hào)從引腳至FPGA內(nèi)部寄存器的走線延時(shí)一般不超過2ns,然而在高溫下,走線延時(shí)可以上升至7ns甚至更高。同樣地,輸出信號(hào)的走線延時(shí)變化范圍也可達(dá)5ns左右。
針對(duì)上述延時(shí)估計(jì),可將160MHz下ZBT輸入輸出偏移約束設(shè)置為:
TIMEGRP "zbt1_abus" OFFSET = out 7 ns AFTER "FPGA_CLK" ;
TIMEGRP "zbt1_dbus" OFFSET = out 7 ns AFTER "FPGA_CLK";
TIMEGRP "zbt1_ctr" OFFSET = out 7 ns AFTER "FPGA_CLK";
TIMEGRP "zbt2_abus" OFFSET = out 7 ns AFTER "FPGA_CLK";
TIMEGRP "zbt2_dbus" OFFSET = out 7 ns AFTER "FPGA_CLK";
TIMEGRP "zbt2_ctr" OFFSET = out 7 ns AFTER "FPGA_CLK";
TIMEGRP "zbt1_dbus" OFFSET = in 7ns BEFORE "FPGA_CLK";
TIMEGRP "zbt2_dbus" OFFSET = in 7ns BEFORE "FPGA_CLK";
其中,abus代表地址總線,dbus代表數(shù)據(jù)總線,ctr代表讀寫使能、輸出使能等控制信號(hào)。
在160MHz下,按照與2.5類似的時(shí)序分析過程,可以計(jì)算出從FPGA給出地址總線信息,到FPGA內(nèi)部寄存器可以穩(wěn)定寄存ZBT輸出數(shù)據(jù)的總路徑延時(shí)約22ns,大于3個(gè)時(shí)鐘周期而小于4個(gè)時(shí)鐘周期。因此該情況下從ZBT讀寫控制器接收到外部模塊給出的ZBT讀地址開始,需要等待1+4+1=6個(gè)時(shí)鐘周期后得到正確數(shù)據(jù),與200MHz下的結(jié)果相比,相當(dāng)于讀數(shù)據(jù)減少了一個(gè)時(shí)鐘周期。在其它工作頻率下的延時(shí)分析仍可基于相同機(jī)理分析,此處不再贅述。
整個(gè)設(shè)計(jì)經(jīng)過ISE13.4軟件完成布局布線后,報(bào)告所有靜態(tài)時(shí)序報(bào)告均合法,同時(shí)該控制器僅占用432個(gè)寄存器和232個(gè)查找表。具有較好的資源經(jīng)濟(jì)性。
該設(shè)計(jì)已在硬件電路中驗(yàn)證成功,并通過高低溫環(huán)境試驗(yàn)驗(yàn)證,證實(shí)了設(shè)計(jì)的正確性和有效性。
該系統(tǒng)對(duì)傳統(tǒng)的基于FPGA的ZBT控制器進(jìn)行了多方面改進(jìn):利用M序列發(fā)生器構(gòu)建偽隨機(jī)數(shù)發(fā)生器,并以此為測(cè)試數(shù)據(jù)源,為控制器增加了隨機(jī)讀寫測(cè)試功能;使能了FPGA內(nèi)部時(shí)鐘管理模塊的動(dòng)態(tài)相位高速功能,通過遍歷所有相位的方式,找出最佳的數(shù)據(jù)采樣時(shí)刻,進(jìn)而保證了ZBT讀寫時(shí)序的穩(wěn)定性,而且不再受代碼調(diào)試、修改以及高低溫變化的影響,總可以確保數(shù)據(jù)讀寫正確;為了降低FPGA引腳延時(shí)分布離散性帶來的影響,通過施加合理的OFFSET約束控制IOB引腳延時(shí),并通過IODELAY高級(jí)可編程資源進(jìn)一步補(bǔ)償各引腳的延時(shí)分布,達(dá)到了所有信號(hào)延時(shí)分布基本一致的良好效果。
采用本設(shè)計(jì)后,可以確保ZBT讀寫時(shí)序穩(wěn)定,F(xiàn)PGA開發(fā)工程師可以將主要精力放在產(chǎn)品的功能調(diào)試上,而不必再通過費(fèi)時(shí)費(fèi)力的增量編譯、手工布局布線、區(qū)域反標(biāo)注、盲目調(diào)整輸出時(shí)鐘相位方式等技巧實(shí)現(xiàn)。此外,本設(shè)計(jì)主要采用HDL代碼和時(shí)序約束,并不局限于具體器件,雖然前述策略主要以Virtex6為實(shí)現(xiàn)器件,但目前市面上在售的所有主流FPGA器件均具有動(dòng)態(tài)相位調(diào)整和可編程輸入輸出延時(shí)功能,因此本設(shè)計(jì)同樣可以在這些產(chǎn)品中成功運(yùn)用,具有很好的通用性。