史 赟,鄭永秋,任勇峰
(中北大學(xué)電子測(cè)試技術(shù)國(guó)家重點(diǎn)實(shí)驗(yàn)室,山西太原 030051)
在高速通信過(guò)程中,發(fā)送方和接收方之間沒(méi)有握手信號(hào),發(fā)送方不停地向接收方發(fā)送數(shù)據(jù),而不管接收方的狀態(tài)。接收方要將收到的數(shù)據(jù)通過(guò)USB電纜上傳到終端計(jì)算機(jī)進(jìn)行分析,需要數(shù)據(jù)緩存保證數(shù)據(jù)流中的數(shù)據(jù)不丟失,而終端計(jì)算機(jī)對(duì)其內(nèi)部的USB設(shè)備是通過(guò)輪詢(xún)算法檢測(cè)的,每次讀完USB設(shè)備中的512 Byte數(shù)據(jù)后,向USB設(shè)備發(fā)送讀請(qǐng)求,就去檢測(cè)其他設(shè)備,直到下次檢測(cè)到USB設(shè)備,才會(huì)讀走數(shù)據(jù)。可以看出,讀數(shù)操作是不連續(xù)的,在終端計(jì)算機(jī)進(jìn)程任務(wù)繁重時(shí),對(duì)USB設(shè)備的檢測(cè)周期就會(huì)延長(zhǎng),滯留在USB設(shè)備中的512 Byte數(shù)據(jù)不能被及時(shí)讀走,就不會(huì)向接收方發(fā)送讀數(shù)請(qǐng)求,接收方的可編程門(mén)陣列(field programmable gate array,F(xiàn)PGA)不斷接收數(shù)據(jù),數(shù)據(jù)在FPGA中存儲(chǔ),而利用FPGA內(nèi)部的先進(jìn)先出(first in first out,F(xiàn)IFO)作為緩存,其容量有限,很容易導(dǎo)致緩存溢出,出現(xiàn)丟數(shù)問(wèn)題。因此,需要較大的存儲(chǔ)介質(zhì)作為數(shù)據(jù)緩存,而靜態(tài)隨機(jī)存儲(chǔ)器(static random access memery,SRAM)具備讀寫(xiě)速度快,控制簡(jiǎn)單,已廣泛應(yīng)用于需要快速存取數(shù)據(jù)的場(chǎng)合[1]。
本文在FPGA外部引入容量為1MByte的SRAM作為外部緩存,設(shè)計(jì)并實(shí)現(xiàn)了三級(jí)緩存結(jié)構(gòu),輸入級(jí)和輸出級(jí)緩存為FPGA內(nèi)部的FIFO,用于實(shí)現(xiàn)與發(fā)送方和終端計(jì)算機(jī)的通信接口,中間級(jí)緩存為SRAM,作為核心存儲(chǔ),對(duì)數(shù)據(jù)進(jìn)行實(shí)時(shí)緩存。利用FPGA控制數(shù)據(jù)的傳輸和對(duì)SRAM的讀寫(xiě)操作,簡(jiǎn)化了硬件設(shè)計(jì)和邏輯設(shè)計(jì)[2]。
圖1為三級(jí)緩存結(jié)構(gòu)示意圖。一級(jí)緩存為數(shù)據(jù)的輸入緩存,是三級(jí)緩存結(jié)構(gòu)與外部的輸入接口,它是利用FPGA內(nèi)部的BLOCK RAM構(gòu)成的,F(xiàn)PGA選用XILINX公司的Spartan3系列的XC3S200芯片,選用其內(nèi)部容量為2 KByte的同步雙口RAM(RAMB16_S9_S9)構(gòu)成一個(gè)8位數(shù)據(jù)位寬,容量為2 KByte的內(nèi)部FIFO。與之對(duì)稱(chēng)的是三級(jí)緩存,它的構(gòu)造和一級(jí)緩存一樣,是數(shù)據(jù)的輸出緩存,作為輸出接口與外部計(jì)算機(jī)進(jìn)行通信。為了不使數(shù)據(jù)在輸入緩存丟數(shù),設(shè)定輸入的高速數(shù)據(jù)在輸入緩存中達(dá)到10 Byte后,就會(huì)存入二級(jí)緩存,使容量更大的二級(jí)緩存作為主要的存儲(chǔ)緩存;而只有接到讀數(shù)請(qǐng)求后,二級(jí)緩存才會(huì)將數(shù)據(jù)寫(xiě)入輸出緩存,輸出緩存中有512 Byte數(shù)據(jù)時(shí),數(shù)據(jù)就會(huì)上傳到計(jì)算機(jī),所以將輸入和輸出緩存容量設(shè)置為2 KByte,緩存容量有較大的冗余量,不會(huì)存在溢出問(wèn)題。
圖1 三級(jí)緩存結(jié)構(gòu)Fig.1 Tri-stage buffer structure
二級(jí)緩存為FPGA外接的容量為1 MByte的SRAM。為確保不丟數(shù),應(yīng)使緩存容量足夠大,本設(shè)計(jì)選用的SRAM容量為1 MByte,可以確保數(shù)據(jù)傳輸可靠性,保證數(shù)據(jù)不會(huì)因?yàn)榫彺嫒萘坎粔蚨鴣G失。二級(jí)緩存實(shí)時(shí)地存儲(chǔ)高速數(shù)據(jù),是高速數(shù)據(jù)存儲(chǔ)的核心部分,數(shù)據(jù)經(jīng)過(guò)一級(jí)緩存后,主要存儲(chǔ)在二級(jí)緩存,當(dāng)接到三級(jí)緩存的讀取數(shù)據(jù)請(qǐng)求時(shí),才把數(shù)據(jù)寫(xiě)入三級(jí)緩存。采用這種三級(jí)緩存結(jié)構(gòu),輸入和輸出緩存為FPGA內(nèi)部的FIFO,便于實(shí)現(xiàn)FPGA對(duì)數(shù)據(jù)傳輸?shù)目刂?,中間級(jí)緩存只需在FPGA外部連接一個(gè)SRAM即可,利用FPGA實(shí)現(xiàn)對(duì)SRAM的讀寫(xiě)操作,從而簡(jiǎn)化了硬件電路。
硬件原理框圖如圖2所示。硬件結(jié)構(gòu)主要由FPGA,SRAM芯片、RS485接口芯片、USB2.0芯片等組成。FPGA控制數(shù)據(jù)存入和讀出緩存以及和計(jì)算機(jī)的USB通信過(guò)程,利用其內(nèi)部資源構(gòu)成三級(jí)緩存結(jié)構(gòu)的輸入和輸出緩存。SRAM芯片連接在FPGA外部,作為三級(jí)緩存結(jié)構(gòu)的中間級(jí)緩存。RS485芯片負(fù)責(zé)將差分形式的數(shù)據(jù)轉(zhuǎn)換為串行形式的數(shù)據(jù)傳遞給FPGA。USB2.0芯片負(fù)責(zé)FPGA與計(jì)算機(jī)USB接口的數(shù)據(jù)通信過(guò)程。
圖2 硬件原理框圖Fig.2 Hardware Schematic block diagram
FPGA選用 XILINX公司的 Spartan3系列的XC3S200芯片,它采用多電壓供電,其中內(nèi)核電壓為1.2 V,I/O口驅(qū)動(dòng)電壓為3.3 V,其他的輔助電壓為2.5 V。該芯片含有4 320個(gè)邏輯資源、141個(gè)可用的I/O口。外部晶振源頻率為36.864 MHz,利用FPGA內(nèi)部的倍頻模塊對(duì)它進(jìn)行倍頻后作為高速數(shù)據(jù)接收的外部時(shí)鐘[3]。
數(shù)據(jù)接收是以RS485標(biāo)準(zhǔn)為物理層基礎(chǔ),硬件設(shè)計(jì)選用RS485芯片分別實(shí)現(xiàn)高速數(shù)據(jù)接口和高速時(shí)鐘接口。數(shù)據(jù)信號(hào)進(jìn)入FPGA之前,必須經(jīng)過(guò)RS485接口芯片進(jìn)行電壓轉(zhuǎn)換。根據(jù)設(shè)計(jì)要求,高速接口最高的輸出碼率為7.372 8 Mbit/s,由于本通信系統(tǒng)只是接收數(shù)據(jù),所以工作在單工模式。因此,RS485接口芯片選用MAX3490,它采用3.3 V單電源供電,波特率最高可達(dá)10 Mbit/s,可以支持全雙工工作模式,輸入電壓范圍為-7~+12 V,輸出電壓高電平為最小供電電壓減去0.4 V,低電平最大為0.4 V。
SRAM芯片選用CY7C1059DV33,它的深度為1 M(1M代表106,深度代表SRAM中的位置數(shù),一個(gè)位置8位)。寬度為8 bit,容量為1×8 Mbit,3個(gè)控制端控制SRAM的讀寫(xiě)操作。經(jīng)過(guò)RS485芯片轉(zhuǎn)換的數(shù)據(jù)首先進(jìn)入FPGA內(nèi)部FIFO,然后進(jìn)入與FPGA相連的外部SRAM,計(jì)算機(jī)下發(fā)讀數(shù)請(qǐng)求后,才將SRAM存儲(chǔ)的數(shù)據(jù)讀出,經(jīng)過(guò)FPGA內(nèi)部FIFO送至USB口。
FPGA利用CY7C68013芯片通過(guò)USB接口與計(jì)算機(jī)進(jìn)行通信。CY7C68013屬于Cypress公司的FX2系列產(chǎn)品,是 Cypress公司生產(chǎn)的第一款USB2.0芯片。CY7C68013是一個(gè)帶增強(qiáng)型MCS51內(nèi)核和USB接口的單片機(jī),完全遵從USB2.0協(xié)議,可提供高達(dá)480 Mbit/s的傳輸速率;內(nèi)部集成PLL(鎖相環(huán)),最高可使5l內(nèi)核工作在48 MHz;對(duì)外提供2個(gè)串口,可以方便地與外部通信;片內(nèi)擁有8 KByte的RAM,可完全滿(mǎn)足系統(tǒng)每次傳輸數(shù)據(jù)的需要,無(wú)需再外接 RAM[4]。
基于XILINX公司的XILINX7.1開(kāi)發(fā)環(huán)境利用超高速集成電路硬件描述語(yǔ)言(VHDL)進(jìn)行邏輯設(shè)計(jì)。FPGA內(nèi)部模塊主要包括高速寫(xiě)FIFO模塊、SRAM控制模塊和讀FIFO模塊。圖3為三級(jí)緩存的邏輯框圖。
圖3 邏輯框圖Fig.3 Logic block diagram
高速寫(xiě)FIFO模塊負(fù)責(zé)將數(shù)據(jù)暫時(shí)存入內(nèi)部FIFO中;SRAM控制模塊的功能主要是控制SRAM的讀出、寫(xiě)入,將一級(jí)緩存 FIFO中的數(shù)據(jù)寫(xiě)入SRAM,將SRAM中的數(shù)據(jù)讀出寫(xiě)入三級(jí)緩存FIFO中。讀FIFO模塊主要是根據(jù)計(jì)算機(jī)下發(fā)的命令,選擇讀取高速FIFO,并將數(shù)據(jù)送至數(shù)據(jù)總線(xiàn)。
高速接口包括時(shí)鐘和數(shù)據(jù)兩個(gè)接口,高速數(shù)據(jù)接收采用同步RS485通信協(xié)議,高速時(shí)鐘速率為3.686 4 MHz,與數(shù)據(jù)發(fā)送時(shí)鐘同源,可以利用同步時(shí)鐘實(shí)現(xiàn)數(shù)據(jù)接收同步。高速數(shù)據(jù)具有特定的幀格式,由標(biāo)志字、ID字和數(shù)據(jù)組成,每幀容量為2 KByte。用特殊的標(biāo)志字來(lái)表示數(shù)據(jù)幀的起始位置,可以識(shí)別有效的數(shù)據(jù)信息,從而實(shí)現(xiàn)同步[5]。標(biāo)志字選用16進(jìn)制數(shù)“FDB18540”,這種標(biāo)志字經(jīng)過(guò)大量測(cè)試表明它的獨(dú)立性很好,不會(huì)和數(shù)據(jù)內(nèi)容重復(fù),可以有效避免假同步現(xiàn)象。高速數(shù)據(jù)進(jìn)入一級(jí)緩存時(shí),在同步高速時(shí)鐘的下降沿時(shí),檢測(cè)高速數(shù)據(jù)的標(biāo)志字,當(dāng)檢測(cè)到標(biāo)志字時(shí),就意味著有效數(shù)據(jù)的到來(lái),將數(shù)據(jù)寫(xiě)入FPGA內(nèi)部FIFO緩存中。寫(xiě)FIFO模塊流程圖如圖4所示。
圖4 寫(xiě)FIFO模塊流程圖Fig.4 Flow chart ofwriting FIFOmodule
讀FIFO模塊是通過(guò)FPGA內(nèi)部集成FIFO半滿(mǎn)信號(hào)觸發(fā)CY7C68013單片機(jī)進(jìn)行讀數(shù)的,單片機(jī)通過(guò)與FPGA相連的PA2接口利用運(yùn)行在其內(nèi)的固件程序檢測(cè)到FIFO半滿(mǎn)信號(hào)后,單片機(jī)才開(kāi)始從FIFO中讀取數(shù)據(jù),執(zhí)行每次讀操作,連續(xù)從FIFO中讀取512 Byte數(shù)據(jù),F(xiàn)IFO半滿(mǎn)信號(hào)是讀FIFO模塊通過(guò)比較FIFO讀寫(xiě)地址的差值而對(duì)其賦值的,當(dāng)寫(xiě)地址與讀地址之差大于512時(shí),F(xiàn)IFO半滿(mǎn)信號(hào)賦值為0,否則為1,這里設(shè)定讀寫(xiě)地址差值為512,是由于USB設(shè)備一次只讀取512 Byte數(shù)據(jù),F(xiàn)IFO中緩存的數(shù)據(jù)只要大于512 Byte時(shí),就應(yīng)觸發(fā)USB設(shè)備讀取數(shù)據(jù),這樣可以避免多余數(shù)據(jù)在FIFO中積存引起的丟數(shù)現(xiàn)象。利用FIFO半滿(mǎn)信號(hào)控制讀數(shù)過(guò)程,可以有效防止空讀和誤讀現(xiàn)象[6]。
SRAM控制模塊包括寫(xiě)SRAM和讀SRAM兩部分,寫(xiě)SRAM是由一級(jí)緩存FIFO的半滿(mǎn)信號(hào)觸發(fā)的,當(dāng)半滿(mǎn)信號(hào)有效時(shí),開(kāi)始寫(xiě)SRAM。讀SRAM是通過(guò)讀FIFO模塊傳遞過(guò)來(lái)的request信號(hào)來(lái)控制的,當(dāng)request信號(hào)有效時(shí),讀取SRAM中的數(shù)據(jù),然后將它寫(xiě)入到三級(jí)FIFO。通過(guò)SRAM的3個(gè)控制端來(lái)控制外部的SRAM的讀寫(xiě)操作,具體的SRAM控制模塊的流程圖如圖5所示。
圖5 SRAM控制模塊的流程圖Fig.5 Flow chart of SRAM controlmodule
SRAM 的訪(fǎng)問(wèn)控制由wesram,oesram,cesram 3個(gè)控制端決定,寫(xiě)SRAM和讀SRAM時(shí),控制線(xiàn)、地址線(xiàn)和數(shù)據(jù)線(xiàn)要有一定的時(shí)序先后,才能保證操作正確。設(shè)計(jì)中對(duì)寫(xiě)SRAM和讀SRAM進(jìn)行了時(shí)序仿真。圖6和圖7分別示意了SRAM的寫(xiě)時(shí)序和讀時(shí)序。外部時(shí)鐘速率為36.864 MHZ。
圖6 SRAM寫(xiě)時(shí)序Fig.6 Time sequence of writing SRAM
執(zhí)行寫(xiě)SRAM操作時(shí),cesram保持低電平,oesram保持高電平,先將地址送到地址線(xiàn)上,同時(shí)wesram變?yōu)榈碗娖?,低電平狀態(tài)至少要保持7 ns,才會(huì)保證數(shù)據(jù)寫(xiě)入SRAM,本設(shè)計(jì)中,wesram低電平保持時(shí)間約為80 ns。地址保持一個(gè)時(shí)鐘周期后,將數(shù)據(jù)送到數(shù)據(jù)線(xiàn)上,數(shù)據(jù)寫(xiě)入SRAM,完成一次寫(xiě)SRAM過(guò)程。而后,寫(xiě)地址遞增,以后的寫(xiě)SRAM操作重復(fù)此過(guò)程。
圖7 SRAM讀時(shí)序Fig.7 Time sequence of reading SRAM
讀SRAM時(shí),cesram保持低電平,wesram保持高電平,請(qǐng)求信號(hào)request為低電平。先將讀地址送到地址線(xiàn)上,同時(shí)oesram變?yōu)榈碗娖?,在?shù)據(jù)到來(lái)之前,oesram的低電平狀態(tài)至少要保持5 ns,本設(shè)計(jì)低電平保持時(shí)間約為160 ns。地址保持兩個(gè)時(shí)鐘周期后,數(shù)據(jù)被讀出送到數(shù)據(jù)線(xiàn)上,完成一次讀SRAM過(guò)程。而后,讀地址遞增,重復(fù)此過(guò)程。
為驗(yàn)證三級(jí)緩存設(shè)計(jì)在高速通信應(yīng)用過(guò)程中的可靠性和穩(wěn)定性,進(jìn)行了多次讀數(shù)測(cè)試,并將接收到的結(jié)果進(jìn)行分析,結(jié)果表明,運(yùn)用此技術(shù)后,高速數(shù)據(jù)通信過(guò)程中沒(méi)有出現(xiàn)丟數(shù)現(xiàn)象,而沒(méi)有應(yīng)用此技術(shù)的情形,丟數(shù)現(xiàn)象在測(cè)試中會(huì)隨機(jī)出現(xiàn)。引入
SRAM作為外部緩存,結(jié)合FPGA內(nèi)部FIFO設(shè)計(jì)的三級(jí)緩存結(jié)構(gòu),可以可靠地緩存高速數(shù)據(jù),目前在高速通信中已得到了很好的應(yīng)用。
[1]王鵬,伊鵬,金德鵬,等.基于三級(jí)存儲(chǔ)陣列緩存高速數(shù)據(jù)包及性能分析[J].軟件學(xué)報(bào),2005,16(12):2181-2189.
WANG Peng,YIPeng,JIN De-peng,etal.Buffering highspeed packetswith tri-stagememortarray and its performance analysis[J].Journalof Software,2005,16(12):2181-2189.
[2] 夏金軍,莊奕琪,包軍林,等.一種基于FPGA的高速數(shù)據(jù)緩存的設(shè)計(jì)[J].微計(jì)算機(jī)信息,2008,24(11):226-228.
XIA Jin-jun,ZHUANG Yi-qi,BAO Jun-lin,et al.The design ofone type of high-speed data cache based on FPGA[J].Control and automation publication group,2008,24(11):226-228.
[3]張永樂(lè),任勇峰,李圣昆.FPGA在多串口讀數(shù)系統(tǒng)中的應(yīng)用[J].電子技術(shù),2010,2:7-8.
ZHANG Yong-le,REN Yong-feng,LI Sheng-kun.The application of FPGA on the data system with several UART[J].Electronic Technology,2010,2:7-8.
[4]林剛勇,馬善農(nóng),許邦蓮.CY7C68013在數(shù)據(jù)傳輸中的應(yīng)用[J].微計(jì)算機(jī)信息,2007,23(10):76-78.
LIN Gang-yong, MA Shan-nong, XU Bang-lian.CY7C68013 at the application among data transfer[J].Control and automation publication group,2007,23(10):76-78.
[5]宮克存,黃永平.一種高效的串行通信協(xié)議及實(shí)現(xiàn)[J].長(zhǎng)春科技大學(xué)學(xué)報(bào),2000,30(1):98-101.
GONG Ke-cun,HUANG Yong-pin.A high efficient serial communication protocol and implementatio[J].Journal of changchun university of science and technology,2000,30(1):98-101.
[6] 于祥鳳,劉學(xué)斌,胡炳樑,等.基于FPGA的高速數(shù)據(jù)存儲(chǔ)系統(tǒng)中FIFO控制的設(shè)計(jì)[J].核電子學(xué)與探測(cè)技術(shù),2010,30(1):59-62.
YU Xiang-feng,LIU Xue-bin,HU Bing-liang,et al.Design of FIFO in High Speed Data Storage System Based on FPGA[J].Nuclear Electronics& Detection Technology,2010,30(1):59-62.