宋 娟,吳榮斌,張 剛
(1.太原理工大學(xué)信息工程學(xué)院,山西太原030024;2.蘭州交通大學(xué)電子與信息工程學(xué)院,甘肅蘭州730070)
大數(shù)據(jù)時(shí)代,越來(lái)越多的信息轉(zhuǎn)換為數(shù)據(jù)進(jìn)行存儲(chǔ)和處理,因此對(duì)控制系統(tǒng)中存儲(chǔ)系統(tǒng)的數(shù)據(jù)快速處理能力和實(shí)時(shí)性提出更高要求,否則極易造成數(shù)據(jù)處理中的“瓶頸”現(xiàn)象[1-2]。并行傳輸方式在提升時(shí)鐘頻率時(shí)容易引起信號(hào)線間的互擾,導(dǎo)致傳輸錯(cuò)誤,同時(shí)增加位寬會(huì)增加系統(tǒng)板布線密度,因此串行通信技術(shù)正在取代并行總線而成為高速數(shù)據(jù)接口的主流,而低壓差分信號(hào)技術(shù)(Low Voltage Differential Signaling,LVDS)在各種高速串行總線得到普遍應(yīng)用。
目前,嵌入式系統(tǒng)CPU與RAM的控制端口、讀寫使能、地址及數(shù)據(jù)總線相連,為節(jié)約CPU引腳資源,提高其訪問內(nèi)存的速度,本文使用FPGA提供的RAM IP核,設(shè)計(jì)實(shí)現(xiàn)了基于有限狀態(tài)機(jī)的單向串行只寫總線型接口RAM存儲(chǔ)器,該存儲(chǔ)器與CPU通過(guò)單向串行只寫總線(One-way Write-Only Serial Bus,OWOSB)進(jìn)行數(shù)據(jù)交換[3],并且使用低壓差分傳輸技術(shù)抑制信號(hào)干擾,有利于提高數(shù)據(jù)訪問速率和傳輸可靠性。不同于CPU直接通過(guò)并行線對(duì)RAM存儲(chǔ)器進(jìn)行訪問的模式,該存儲(chǔ)器以消息包的方式進(jìn)行訪問。
CPU與存儲(chǔ)器之間只有兩對(duì)差分?jǐn)?shù)據(jù)線相連,很大程度上節(jié)約了RAM之前所需要的并行總線,因此CPU可以不受地址和數(shù)據(jù)引腳的限制,增大訪問的內(nèi)存容量。并且串行差分信號(hào)線間干擾較小,有利于提高CPU訪問存儲(chǔ)器的速度,具有良好的擴(kuò)展性。
單向串行只寫總線型接口RAM存儲(chǔ)器有時(shí)鐘、復(fù)位和單向串行只寫上行總線3個(gè)輸入和1個(gè)單向串行只寫下行總線端口。主要由8個(gè)模塊組成:時(shí)鐘模塊、串行數(shù)據(jù)接收模塊、串轉(zhuǎn)并模塊、控制模塊、數(shù)據(jù)模塊、串行數(shù)據(jù)發(fā)送模塊、并轉(zhuǎn)串模塊以及校驗(yàn)?zāi)K,見圖1。
圖1 RAM存儲(chǔ)器系統(tǒng)結(jié)構(gòu)框圖
時(shí)鐘模塊:為存儲(chǔ)器的其他各個(gè)模塊提供所需時(shí)鐘頻率。
串行接收/發(fā)送模塊:接收或發(fā)送消息包。
串轉(zhuǎn)并模塊:對(duì)串行數(shù)據(jù)包進(jìn)行解析分包,把串行數(shù)據(jù)轉(zhuǎn)為并行數(shù)據(jù)。
并轉(zhuǎn)串模塊:把RAM中讀出的并行數(shù)據(jù)由高位到低位串行發(fā)送,并把發(fā)送數(shù)據(jù)幀頭與32位校驗(yàn)值封裝到數(shù)據(jù)包。
控制模塊:從并行數(shù)據(jù)中提取出片選信號(hào)、讀寫使能、讀寫數(shù)據(jù)長(zhǎng)度、命令和地址等信息,控制RAM讀寫操作。
校驗(yàn)?zāi)K:對(duì)數(shù)據(jù)進(jìn)行校驗(yàn)計(jì)算。
數(shù)據(jù)模塊:提供與RAM IP核的數(shù)據(jù)接口。
存儲(chǔ)器與嵌入式CPU之間首先需要1個(gè)緩存來(lái)暫時(shí)存放CPU向RAM中寫入的數(shù)據(jù),本文所使用的緩存都是Xilinx公司提供的FIFO緩存IP核。CPU以32位為單位進(jìn)行數(shù)據(jù)處理,而本文所設(shè)計(jì)的RAM存儲(chǔ)器是以串行數(shù)據(jù)進(jìn)行接收的,因此,F(xiàn)IFO的輸入數(shù)據(jù)寬度為32 bit,輸出數(shù)據(jù)寬度為1 bit。緩存讀和寫采用不同頻率的時(shí)鐘,寫時(shí)鐘頻率與CPU相同,讀時(shí)鐘頻率與串行傳輸頻率相同,這是考慮到串行傳輸?shù)奶攸c(diǎn),可以通過(guò)提高時(shí)鐘頻率來(lái)提高傳輸?shù)乃俣?,也方便?shù)據(jù)的存取。
發(fā)送緩存模塊類似,不再贅述。
Xilinx Virtex-5開發(fā)板內(nèi)含鎖相環(huán)(Phase Locked Loop,PLL)模塊與8個(gè)數(shù)字時(shí)鐘處理器(Digital Clock Management,DCM)模塊[4-5]。PLL 是一種反饋電路,利用外部輸入的參考信號(hào)控制環(huán)路內(nèi)部振蕩信號(hào)的頻率和相位,從而使得電路上的時(shí)鐘和某一外部時(shí)鐘的相位同步,DCM模塊內(nèi)部構(gòu)成:延遲鎖相環(huán)(Delay Locked Loop,DLL),其核心功能是消除輸入時(shí)鐘與輸出時(shí)鐘之間的延時(shí);數(shù)字頻率綜合器(Digital Frequency Synthesiser,DFS):可對(duì)時(shí)鐘進(jìn)行倍頻、分頻合成新頻率;PS(相位偏移):可對(duì)DCM模塊的9個(gè)輸出信號(hào)進(jìn)行相位的偏移;狀態(tài)邏輯:LOCKED信號(hào)有效時(shí),輸出時(shí)鐘才可以使用,在此之前,輸出時(shí)鐘處于復(fù)雜不穩(wěn)定狀態(tài)。
該開發(fā)平臺(tái)系統(tǒng)時(shí)鐘為100 MHz,本文使用2個(gè)DCM模塊和2個(gè)PLL模塊進(jìn)行級(jí)聯(lián),最后輸出2.15 GHz提供給RAM存儲(chǔ)器,具體如圖2。
圖2 時(shí)鐘模塊
在高速數(shù)據(jù)采集系統(tǒng)中,必須保證在限定時(shí)間內(nèi)有足夠的數(shù)據(jù)傳輸速率和存儲(chǔ)容量,而信號(hào)在總線的傳輸過(guò)程中不可避免的會(huì)發(fā)生突發(fā)性錯(cuò)誤,為了提高系統(tǒng)的可靠性,引入數(shù)據(jù)檢錯(cuò)機(jī)制,即循環(huán)冗余校驗(yàn)(Cyclic Redundancy Check ,CRC)并行算法[6-7]。
CRC是一種誤碼檢測(cè)能力強(qiáng)、開銷小、抗干擾性能優(yōu)異的校驗(yàn)碼,從其檢錯(cuò)能力來(lái)看,它所不能發(fā)現(xiàn)的錯(cuò)誤的幾率僅為0.004 7%以下。從性能上和資源上考慮,均遠(yuǎn)遠(yuǎn)優(yōu)于奇偶校驗(yàn)及算術(shù)和校驗(yàn)等方式,也是數(shù)據(jù)存儲(chǔ)和數(shù)據(jù)通訊領(lǐng)域最常用的差錯(cuò)校驗(yàn)碼,其特征是信息字段和校驗(yàn)字段的長(zhǎng)度可以任意選定。
本文在存儲(chǔ)器數(shù)據(jù)收發(fā)過(guò)程中均使用8位并行CRC校驗(yàn)法進(jìn)行數(shù)據(jù)檢錯(cuò),其生成多項(xiàng)式為G(x)=1+x+x2+x3+x6+x7,系數(shù)序列記為11001111。存儲(chǔ)器在接收數(shù)據(jù)結(jié)束后,把計(jì)算出的CRC校驗(yàn)值與CPU發(fā)送的校驗(yàn)值進(jìn)行比較,如果兩個(gè)值不一樣,則在數(shù)據(jù)傳輸過(guò)程中產(chǎn)生錯(cuò)誤,返回傳輸失敗信號(hào),請(qǐng)求CPU重新發(fā)送,若相同,則傳輸正確,返回傳輸成功信號(hào)。
單向串行只寫總線OWOSB,其信息的傳遞只能沿單一方向進(jìn)行傳輸,在本文OWOSB只用到兩根,一根為上行總線,一根為下行總線。
本文定義了RAM存儲(chǔ)器OWOSB通信數(shù)據(jù)寫/讀幀格式,具體如表1~表2。
表1 串行寫數(shù)據(jù)幀格式 byte
表2 讀數(shù)據(jù)幀格式 byte
RAM地址:使用1 byte給每個(gè)RAM存儲(chǔ)器進(jìn)行編號(hào);
命令:表示寫/讀命令,使用“00001111”表示寫命令,“11110000”表示讀命令;
首地址:代表寫/讀數(shù)據(jù)的起始地址;
數(shù)據(jù):寫入/讀取的數(shù)據(jù),通過(guò)數(shù)據(jù)長(zhǎng)度決定該字段長(zhǎng)度;
校驗(yàn)序列:表示幀校驗(yàn);
Read_flag(讀數(shù)據(jù)先導(dǎo)):用“10101010”表示,CPU 檢測(cè)到“10101010”時(shí),則可識(shí)別該幀為RAM中讀出的數(shù)據(jù)幀。
本文使用有限狀態(tài)機(jī)來(lái)實(shí)現(xiàn)單向串行LVDS接口RAM存儲(chǔ)器,圖3是RAM存儲(chǔ)器接收狀態(tài)轉(zhuǎn)移圖,各個(gè)狀態(tài)含義如下:
St1:空閑,等待接收數(shù)據(jù)幀;
St2:接收CPU發(fā)送的寫/讀數(shù)據(jù)命令;
St3:接收寫/讀數(shù)據(jù)的首地址;
水分含量在42.99~64.78g/100g之間,平均含量為59.12g/100g,不同部位的平均含量高低依次為頸肩肉含量61.78g/100g、后腿肉含量60.83g/100g、前腿肉含量57.85g/100g、最長(zhǎng)肌肉含量55.35g/100g、胸腹部肉含量43.27g/100g。
St4:接收讀數(shù)據(jù)長(zhǎng)度;
St5:接收寫數(shù)據(jù)長(zhǎng)度;
St6:接收要向存儲(chǔ)器寫入的數(shù)據(jù);
St7:接收32bit的校驗(yàn)序列;
St8:驗(yàn)證接收到的數(shù)據(jù)是否正確;
St9:接收數(shù)據(jù)結(jié)束。
圖3 接收命令狀態(tài)轉(zhuǎn)移圖
系統(tǒng)復(fù)位后存儲(chǔ)器處于空閑狀態(tài);當(dāng)接收到8 bit數(shù)據(jù)時(shí),先判斷該數(shù)據(jù)是否與本RAM地址相符合,如相符,說(shuō)明該幀是發(fā)送到本RAM的,繼續(xù)接收數(shù)據(jù),如不符合,則跳轉(zhuǎn)到結(jié)束狀態(tài);接收到RAM地址,經(jīng)過(guò)8個(gè)時(shí)鐘周期,判斷接收到的數(shù)據(jù),若是“00001111”或者“11110000”,則將該命令保存到cmd_s,繼續(xù)下一步狀態(tài)跳轉(zhuǎn),若為其他,則狀態(tài)機(jī)跳轉(zhuǎn)到結(jié)束狀態(tài);命令接收完畢,再經(jīng)過(guò)8個(gè)時(shí)鐘周期,把接收到的讀寫起始地址存到寄存器;如果是cmd_s是“00001111”,表示CPU寫入數(shù)據(jù),此時(shí)狀態(tài)跳轉(zhuǎn)到接收寫數(shù)據(jù)長(zhǎng)度;如果cmd_s是“11110000”,則表示CPU讀取數(shù)據(jù),此時(shí)狀態(tài)跳轉(zhuǎn)到接收讀數(shù)據(jù)長(zhǎng)度。
在接收寫數(shù)據(jù)長(zhǎng)度狀態(tài)下,根據(jù)數(shù)據(jù)長(zhǎng)度,接收來(lái)自CPU的存儲(chǔ)數(shù)據(jù)和4個(gè)字節(jié)的校驗(yàn)數(shù)據(jù),并返回一個(gè)校驗(yàn)標(biāo)識(shí)信號(hào)。如果數(shù)據(jù)接收正確,用“1”表示;否則用“0”表示,并跳轉(zhuǎn)到結(jié)束狀態(tài)。最后返回空閑狀態(tài)。在接收讀數(shù)據(jù)狀態(tài)下,接收要讀取的數(shù)據(jù)長(zhǎng)度,最后接收數(shù)據(jù)結(jié)束并返回空閑狀態(tài)。
復(fù)位后,存儲(chǔ)器為空閑狀態(tài);依據(jù)發(fā)送數(shù)據(jù)幀格式,RAM存儲(chǔ)器先發(fā)送讀數(shù)據(jù)先導(dǎo),之后發(fā)送從RAM內(nèi)讀出的數(shù)據(jù),發(fā)送過(guò)程中要對(duì)數(shù)據(jù)進(jìn)行校驗(yàn)計(jì)算,發(fā)送數(shù)據(jù)完畢,發(fā)送32位校驗(yàn)值。最后發(fā)送結(jié)束,返回等待狀態(tài)。RAM存儲(chǔ)器發(fā)送讀數(shù)據(jù)狀態(tài)轉(zhuǎn)移見圖4。
本文使用ISE在線邏輯分析儀ChipScope,采集RAM存儲(chǔ)器寫/讀操作,采集所用時(shí)鐘頻率為2.15 GHz,RAM存儲(chǔ)器數(shù)據(jù)寬度16,深度256。
圖5中,Datain是存儲(chǔ)器串行輸入端口得到的數(shù)據(jù),接收到RAM地址后,與本RAM地址相符合,則將本RAM的使能置高,接收到命令為“0F”即向RAM寫入數(shù)據(jù),因此將讀寫使能置高,接收到命令“F0”即從RAM讀出數(shù)據(jù),因此將讀寫使能置低,其他均為標(biāo)志位,為高電平時(shí)代表成功接收幀的各個(gè)字段,rcv_done_o=1,標(biāo)志著存儲(chǔ)器接收正確。
圖6中,Dataout是存儲(chǔ)器向CPU發(fā)送的串行數(shù)據(jù),依照幀格式定義,該端口先發(fā)送讀先導(dǎo)“10101010”,之后發(fā)送讀出的數(shù)據(jù)以及32位校驗(yàn)值。sd_read_done_out=1,表示從RAM中讀出的數(shù)據(jù)正確。
由綜合報(bào)告可知該RAM存儲(chǔ)器資源占用情況,具體如表3。由Utilization一列可以清晰地看到,本文所設(shè)計(jì)的串行接口RAM存儲(chǔ)器使用資源比較少,引腳個(gè)數(shù)節(jié)約了84.6%,非常有效地降低了SoC的空間和成本,同時(shí)數(shù)據(jù)傳輸速率提高了37.5%。表4中對(duì)比了傳統(tǒng)RAM存儲(chǔ)器與本文所設(shè)計(jì)的單向串行只寫總線型RAM存儲(chǔ)器,具體如下。
圖5 RAM存儲(chǔ)器接收CPU發(fā)送的寫和讀命令結(jié)果(截圖)
圖6 RAM控制器向CPU發(fā)送串行數(shù)據(jù)結(jié)果(截圖)
表3 串行接口RAM存儲(chǔ)器使用資源的情況
表4 RAM存儲(chǔ)器對(duì)比
本文應(yīng)用Xilinx Vertex-5開發(fā)板上豐富的FPGA資源,利用其高速工作特性,以及內(nèi)嵌的單端口RAM IP核,構(gòu)造并實(shí)現(xiàn)了具有單向串行只寫總線接口的RAM存儲(chǔ)器,并采用LVDS技術(shù)抑制高速信號(hào)間干擾,大大提高了數(shù)據(jù)的傳輸速率與可靠性。通過(guò)下載驗(yàn)證,該存儲(chǔ)器的設(shè)計(jì)方案正確,靈活性很高,可以很方便地進(jìn)行擴(kuò)展[8]。RAM為可配置軟IP核,其存儲(chǔ)容量可以根據(jù)需要定制。嵌入式CPU可以通過(guò)增加RAM節(jié)點(diǎn)個(gè)數(shù)形成存儲(chǔ)陣列來(lái)達(dá)到擴(kuò)展緩存容量的目的,因此在單位時(shí)間內(nèi)可以訪問更大的內(nèi)存,處理更大規(guī)模的數(shù)據(jù),從而加快其訪問內(nèi)存的速度。FPGA具有硬件邏輯可編程性、大容量、高速、內(nèi)嵌存儲(chǔ)陣列等特點(diǎn),使其特別適合于高速數(shù)據(jù)采集、精確時(shí)序邏輯等場(chǎng)合的應(yīng)用[3]。
[1]李慶誠(chéng),劉嘉欣,張金.嵌入式系統(tǒng)原理[M].北京:北京航空航天大學(xué)出版社,2008.
[2]秦鴻剛,劉京科,吳迪.基于FPGA的雙口RAM實(shí)現(xiàn)及應(yīng)用[J].電子設(shè)計(jì)工程,2010(2):72-74.
[3]馬玉春,宋瀚濤.串行通信協(xié)議的研究及應(yīng)用[J].計(jì)算機(jī)應(yīng)用研究,2004(4):228-232.
[4]Virtex-5 FPGA Data Sheet[EB/OL].[2013-10-30].http://wenku.baidu.com/link?url=AeiuPIDTJ-8xJnQ4wQuxAvDetu7FPi5qtsOFPw JUcXmGaCp85oy1RL8xEV2jqlgMS7tSkMuYL2bwc_RYy8XAkhF_jeYeM-hQwbqV8GQF-NSS.
[5]封彥彪,劉興春.基于Xilinx FPGA的時(shí)鐘管理設(shè)計(jì)與實(shí)現(xiàn)[J].電子測(cè)量技術(shù),2010(10):52-55.
[6]張友,鄭世寶.一種SPI濾波器設(shè)計(jì)中的并行CRC算法[J].電視技術(shù),2005,29(3):28-30.
[7]杜瑞,張偉功,鄧哲,等.新型總線中并行CRC算法的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2013(1):131-135.
[8]田豐,鄧建國(guó),李巍,等.SDRAM控制器的設(shè)計(jì)與VHDL實(shí)現(xiàn)[J].電子技術(shù)應(yīng)用,2005(2):74-79.