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