文獻標識碼: B
文章編號: 0258-7998(2011)09-092-05
粒子對撞機[1]是建立在高能同步加速器上的一種粒子對撞裝置。對撞機運行時,能量強大的粒子在其內(nèi)部經(jīng)過加速后對撞,以達到一定的相互反應速率。對實驗數(shù)據(jù)進行分析研究,可以幫助實驗者了解相應粒子的形態(tài)等特性,從而推動各種理論或技術(shù)的發(fā)展。
像素探測器[2]是粒子對撞機內(nèi)部用于探測質(zhì)子撞擊后所形成的離子軌跡的裝置,是一種專用傳感器,由像素探測器探測得出的數(shù)據(jù)結(jié)果即可繪制出撞擊后的離子軌跡。目前,像素探測器主要采用以下幾種設(shè)計方法:ASIC設(shè)計方法[3],其優(yōu)點是集成度高且功耗低,但是設(shè)計成本高、周期長且風險較大;分立元件采用微處理器的設(shè)計方法,其優(yōu)點是成本低、設(shè)計周期短且風險小,但是速度慢且體積大。針對這幾種設(shè)計方法,本文結(jié)合FPGA[4]提出了一種基于粒子對撞機像素探測器的數(shù)據(jù)緩存方法設(shè)計。相對ASIC設(shè)計方法,具有設(shè)計投入低、參數(shù)設(shè)置靈活、開發(fā)風險低而且開發(fā)周期短的優(yōu)勢;相對于分立元件采用微處理器的設(shè)計方法,具有體積小、功耗低且速度快的優(yōu)勢。
由于像素探測器的數(shù)據(jù)輸出具有保持時間短(最少保持時間為25 ns)、數(shù)據(jù)間隔時間不確定等特征,所以對于數(shù)據(jù)的存儲必須經(jīng)過時序轉(zhuǎn)換電路將數(shù)據(jù)事先存入緩存,再寫入存儲器。本文的數(shù)據(jù)緩存設(shè)計由FIFO輸入時序模塊、FIFO模塊和FIFO輸出時序模塊三部分組成,通過驗證可以實現(xiàn)由探測器數(shù)據(jù)輸出端到存儲器的數(shù)據(jù)緩存功能。
1 總體設(shè)計
FPGA是一種新型的可編程邏輯器件,可以通過硬件描述語言生成所需的硬件,相對于傳統(tǒng)的ASIC設(shè)計,具有設(shè)計周期短、靈活性高、開發(fā)費用少、設(shè)計風險低等優(yōu)點,是ASIC的一種高效低成本解決方案。本設(shè)計使用的FPGA是Altera公司的CYCLONE2芯片,最高時鐘頻率100 MHz??傮w架構(gòu)如圖1所示。
由于探測器數(shù)據(jù)輸出需要符合FIFO數(shù)據(jù)輸入的時序,F(xiàn)IFO的數(shù)據(jù)輸出需要符合存儲器輸入的時序,因此設(shè)計了FIFO輸入時序模塊和FIFO輸出時序模塊,使數(shù)據(jù)能夠正確緩存進而存儲。下面對具體的時序規(guī)范及各個模塊進行說明。
2 模塊設(shè)計及說明
2.1 FIFO模塊
FIFO即先進先出緩存器。FIFO與其他存儲器的最大區(qū)別就是沒有外部讀寫的地址線,因此應用起來十分方便簡單,但是相應的缺點就是只能順序?qū)懭牖蛘唔樞蜃x取,其尋址方式由內(nèi)部指針自加自減完成,不能對特定的地址進行讀寫。FIFO通常使用在不同速度的接口數(shù)據(jù)交換中,通過FIFO使得時序分別符合兩個接口的特定速度,以進行數(shù)據(jù)傳輸。
Altera的FIFO按照驅(qū)動時鐘分類有兩種:單時鐘FIFO(SCFIFO),即讀和寫FIFO用的同一個時鐘信號;雙時鐘FIFO(DCFIFO),即讀和寫FIFO分別使用不同時鐘信號。其中雙時鐘FIFO還根據(jù)不同的端口數(shù)據(jù)寬度分為DCFIFO和DCFIFO_MIXED_WIDTH,所謂DCFIFO是輸入數(shù)據(jù)和輸出數(shù)據(jù)具有相同的數(shù)據(jù)寬度;而DCFIFO_MIXED_WIDTH是指輸入輸出端口可以使用不同的數(shù)據(jù)寬度。
使用Altera的FIFO MegaWizard inteface launched對FIFO進行構(gòu)建,像素探測器模型中有16路傳感器輸出,每路輸出需要記錄100個數(shù)據(jù)。根據(jù)模型需要,構(gòu)建FIFO的主要參數(shù)如下:
dcfifo_component.intended_device_family
= "Cyclone II"dcfifo_component.lpm_hint"MAXIMIZE_
SPEED=7 RAM_BLOCK_TYPE=M4K"
dcfifo_component.lpm_numwords = 128
dcfifo_component.lpm_showahead = "OFF"
dcfifo_component.lpm_type = "dcfifo"
dcfifo_component.lpm_width = 16
dcfifo_component.lpm_widthu = 7
dcfifo_component.overflow_checking="ON" dcfifo_compo-
nent.rdsync_delaypipe = 5
dcfifo_component.underflow_checking="ON"
dcfifo_component.use_eab = "ON"
dcfifo_component.write_aclr_synch = "OFF"
dcfifo_component.wrsync_delaypipe = 5;
構(gòu)建完FIFO后,對其進行時序仿真,仿真結(jié)果如圖2所示。
參照時序仿真圖對各個端口及時序進行說明:
aclr: 異步清零端,1 bit。清零所有輸出狀態(tài)端口,對于DCFIFO,3個wrclk時鐘上升沿后清零wrfull端口,清零rdfull端口。如果輸出端口定義reg類型的則會被清零;否則會保持輸出值。
data: 數(shù)據(jù)輸入端口, 16 bit。當寫請求wrreq有效時,保持數(shù)據(jù)直到數(shù)據(jù)被寫入FIFO。當使用手動定義FIFO時,其數(shù)據(jù)寬度用參數(shù)LPM_WIDTH定義。
q: 數(shù)據(jù)輸出端口, 16 bit。當有數(shù)據(jù)請求時(rdreq有效時),輸出數(shù)據(jù)。對于DCFIFO,輸出數(shù)據(jù)的寬度可以與輸入數(shù)據(jù)data端口寬度不同,具體用參數(shù)LPM_WIDTH_R定義。
rdcld: 上升沿出發(fā)時鐘,1bit。用來同步以下信號:q、dreq、dfull、dempty、rdusedw。
rdempty: 輸出數(shù)據(jù)為零時輸出高電平,1 bit。不管目標設(shè)備是什么,在讀請求發(fā)送前必須查詢rdempty信號是否為高電平,以避免錯誤指令發(fā)出。
rdreq: 讀請求信號端口,1 bit。當需要從FIFO中讀數(shù)據(jù)時,向rdreq端發(fā)送讀請求,讀取數(shù)據(jù)個數(shù)與rdreq持續(xù)的時鐘數(shù)相同。需要注意的是,當rdempty有效時不能發(fā)送rdreq信號。對于這種情況,可以開啟空保護功能,通過設(shè)置參數(shù)UNDERFLOW_CHECKING高電平實現(xiàn),當rdempty為高電平時rdreq信號自動被置為無效。
rdusedw: 輸出數(shù)據(jù)顯示FIFO中可讀數(shù)據(jù)的數(shù)據(jù)量,7 bit。在DCFIFO中,其端口寬度要與手動設(shè)置參數(shù)LPM_WIDTHU相等。需要注意的是,對于Cyclone系列的FPGA,當顯示數(shù)據(jù)滿時實際FIFO的存儲數(shù)據(jù)量有可能并沒有達到存儲的最大值,因此應該參考full或者wrfull端口來執(zhí)行正確的寫操作,參考empty或者rdempty端口來執(zhí)行正確的讀操作。
wrclk: 寫數(shù)據(jù)時鐘,上升沿觸發(fā)有效,1 bit。用于同步以下端口:data、wrreq、wrusedw、 wrfull和wrempty。
wrfull: 寫數(shù)據(jù)滿信號,1 bit。當此端口電平有效時,F(xiàn)IFO已經(jīng)被寫滿。其注意事項同rdfull。總體而言,rdfull信號要比wrfull信號有所延遲,因此,應該通過wrfull信號的電平來判斷是否可以發(fā)送寫請求信號wrreq。
wrreq: 寫請求信號。當需要向FIFO寫入數(shù)據(jù)時,向wrreq端發(fā)送讀請求,讀取數(shù)據(jù)個數(shù)與wrreq持續(xù)的時鐘數(shù)相同。需要注意的是,當wrfull有效時不能發(fā)送wrreq信號。對于這種情況,可以開啟溢出保護功能,通過設(shè)置參數(shù)OVERFLOW_CHECKING高電平實現(xiàn),當wrfull為高電平時wrreq信號自動被置為無效。同時在取消aclr信號時不應輸入wrreq信號,否則aclr信號的下降沿和wrreq信號置為高電平后寫數(shù)據(jù)的上升沿會產(chǎn)生競爭冒險現(xiàn)象。對于CYCLONE系列的FPGA中DCFIFO器件,可以選擇添加同步電路同步aclr信號和wrclk信號,在手動設(shè)置中也可以通過設(shè)置參數(shù)WRITE_ACLR_SYNCH有效實現(xiàn)同步。
wrusedw: 輸出數(shù)據(jù)顯示FIFO中寫入數(shù)據(jù)的數(shù)據(jù)量,7 bit。在DCFIFO中,其端口寬度要與手動設(shè)置參數(shù)LPM_WIDTHU相等。需要注意的是,對于Cyclone系列的FPGA,當顯示數(shù)據(jù)滿時實際FIFO的存儲數(shù)據(jù)量有可能并沒有達到存儲的最大值,因此應該參考full或者wrfull端口來執(zhí)行正確的寫操作,參考empty或者rdempty端口來執(zhí)行正確的讀操作。
FIFO工作時的狀態(tài)轉(zhuǎn)換圖如圖3所示。
2.2 FIFO輸入時序模塊
FIFO輸入時序模塊用于使TIME COUNTER_WITHID模塊(用于對信號進行計時)的輸出數(shù)據(jù)時序符合FIFO輸入數(shù)據(jù)時序的接口要求。FIFO的寫請求信號wrreq的長度所包含的周期數(shù)為寫入FIFO數(shù)據(jù)的個數(shù),并且寫請求信號有效時輸入數(shù)據(jù)端口的數(shù)據(jù)即被寫入FIFO,幾乎沒有延遲,因此輸入數(shù)據(jù)長度應符合FIFO的時鐘信號周期長度,并且寫請求信號長度也需要符合FIFO時鐘信號周期長度,兩者在時間上需要達到同步。
為了測試輸出數(shù)據(jù)長度符合FIFO接口的時序要求,分別進行了圖4(a)、圖4(b)、圖4(c)所示的波形仿真,輸入信號的持續(xù)長度分別為10 ns、20 ns、30 ns。如圖所示三種輸入的輸出皆為10 ns保持時間, 同時輸出10 ns write_en使能信號,符合FIFO接口要求。
參照時序仿真圖對各個端口及時序進行說明:
clk: FIFO輸入時序模塊時鐘輸入,1 bit。用于同步datain16、dataout16、write_en、complete、enable、usedw信號,與FIFO中wrclk信號相頻相同。
complete:數(shù)據(jù)接收完成信號,1 bit。當從timecounter_withid模塊接收數(shù)據(jù)完成時發(fā)送給timecounter_withid模塊,持續(xù)時長1周期,timecounter_withid接收到信號時對內(nèi)部數(shù)據(jù)進行初始化,做好準備對新的信號輸入進行計時。
datain16: 16位數(shù)據(jù)輸入端口,16 bit。用于輸入16位數(shù)據(jù)。
dataout16: 16位數(shù)據(jù)輸出端口,16 bit。用于輸出16位數(shù)據(jù)。
enable: 數(shù)據(jù)寫入輸入時序模塊使能,1 bit。當有數(shù)據(jù)要寫入模塊時,首先在此端口輸入高電平,然后輸入數(shù)據(jù)方可被正確接收。
usedw: FIFO中可用數(shù)據(jù)端口,7 bit。用于查詢FIFO中可用數(shù)據(jù)量,以此判斷是否有剩余空間,進而確定是否向FIFO中寫數(shù)據(jù)。
write_en: 寫使能信號,1bit。當要向FIFO中寫入數(shù)據(jù)時為高電平,dataout16進行數(shù)據(jù)輸出。
模塊流程圖如圖5所示。整個模塊以posedge clk為同步時鐘進行循環(huán)判斷。當寫入模塊使能enable有效且寫入完畢信號complete無效時,首先對FIFO的存儲情況進行判斷,當FIFO中字節(jié)小于7 FH時,說明FIFO未被寫滿,可以向其輸入數(shù)據(jù)。數(shù)據(jù)輸入FIFO的同時,寫使能write_en置為有效,對于計數(shù)模塊輸出的接收完成信號complete信號置為有效。對一個周期的計數(shù)寄存器counter進行判斷,如果counter為1即計時一周期到,則寄存器清零。counter的數(shù)值是在每次posedge clk信號到來時對write_en判斷后進行加1,即當write_en為有效電平時,counter才被加1用來計時。
2.3 FIFO輸出時序模塊
FIFO輸出時序模塊用于使FIFO的輸出信號符合Flash讀寫時序規(guī)范。由FIFO的時序仿真圖可以看出,當讀請求信號rdreq發(fā)出后,數(shù)據(jù)要延遲15 ns左右才會輸出。如果Flash控制器發(fā)出讀請求信號后立即讀FIFO的數(shù)據(jù),則會造成差錯。因此本模塊可以銜接FIFO和Flash控制器的端口時序。
時序仿真圖如圖6所示。由時序仿真圖可以看出,sendready信號相對于empty信號延遲了13 ns左右,dataout信號相對于sendready信號延遲了20 ns左右??梢詽M足FIFO時序要求。
參照時序仿真圖對各個端口及時序進行說明:
clk: FIFO輸入時序模塊時鐘輸入,1 bit。用于同步datain16、dataout16、empty、complete、sendready信號,與FIFO中wrclk信號相頻相同。
complete: 數(shù)據(jù)接收完成信號,1 bit。當存儲器從模塊接收數(shù)據(jù)完成時發(fā)送給FIFO輸出時序模塊,持續(xù)時長1周期,F(xiàn)IFO輸出時序模塊接收到此信號時對內(nèi)部數(shù)據(jù)進行初始化,開始對新的信號輸入進行計時。
datain16: 16位數(shù)據(jù)輸入端口,16 bit。用于輸入16位數(shù)據(jù)。
dataout16: 16位數(shù)據(jù)輸出端口,16 bit。用于輸出16位數(shù)據(jù)。
sendready: 數(shù)據(jù)準備就緒信號,1 bit。當FIFO收到讀數(shù)據(jù)請求信號并且有數(shù)據(jù)輸出時sendready發(fā)送有效信號,存儲器讀取輸出數(shù)據(jù)。
write_en: 寫使能信號,1 bit。當要向FIFO中寫入數(shù)據(jù)時為高電平,dataout16進行數(shù)據(jù)輸出。
模塊流程圖如圖7所示。
3 設(shè)計驗證
3.1 驗證
將程序下載到CycloneII FPGA芯片中,并且用按鍵作為輸入信號進行了測試,在控制臺上打印 FIFO的輸出結(jié)果,結(jié)果如圖8所示。
3.2 驗證結(jié)果分析
當FIFO中的數(shù)據(jù)經(jīng)過時序轉(zhuǎn)換模塊可以向存儲器寫入時,ready信號為1,同時數(shù)據(jù)寫入寄存器并在控制臺打印,然后再將寄存器中的數(shù)據(jù)寫入存儲器,并向時序轉(zhuǎn)換模塊返回完成信號complete高電平1,等待從FIFO中讀取新數(shù)據(jù)。經(jīng)過驗證,本設(shè)計可以將輸入數(shù)據(jù)進行緩存并且輸出給NiosII CPU,符合像素探測器數(shù)據(jù)緩存要求。
本文結(jié)合FPGA對粒子對撞機像素探測器的數(shù)據(jù)緩存提出了解決方法并進行了設(shè)計和驗證。相對于傳統(tǒng)的ASIC構(gòu)建方法,具有高效率、低投入的優(yōu)勢,提高了探測器升級和參數(shù)設(shè)置等方面的靈活性;相對于分立元件的設(shè)計方法,具有高速、低功耗和集成度高的優(yōu)勢。通過時序仿真和FPGA驗證,能夠滿足像素探測器的設(shè)計需要。
參考文獻
[1] 王直華. 粒子對撞機與宇宙大爆炸[J]. 科技潮,2008(10).
[2] 孟祥承.新型半導體探測器發(fā)展和應用[J]. 核電子學與探測技術(shù),2004,24(1):87-96.
[3] GAGLIARD G. The ATLAS pixel detector electronics.Nuclear Instruments and Methods in Physics Research,2001:275-281.
[4] 楊海鋼,孫嘉斌,王慰.FPGA器件設(shè)計技術(shù)發(fā)展綜述[J].電子與信息學報,2010,32(3):714-727.