CCD系統(tǒng)下基于FPGA的PCI圖像采集卡設(shè)計(jì)與實(shí)現(xiàn)
摘要:文章設(shè)計(jì)了一種基于FPGA的CCD圖像數(shù)據(jù)采集卡。以FPGA作為圖像數(shù)據(jù)采集卡的核心,通過LVDS傳輸技術(shù),異步FIFO,異步塊RAM,SRAM緩存乒乓操作等技術(shù),在PCI核的基礎(chǔ)上實(shí)現(xiàn)了Initiator下的DMA傳輸;并基于VxWorks平臺(tái)編寫PCI圖像采集卡的驅(qū)動(dòng)程序。經(jīng)測(cè)試和驗(yàn)證,PCI圖像采集卡穩(wěn)定可靠,能夠?qū)崿F(xiàn)數(shù)據(jù)流為60Mb/s的CCD系統(tǒng)圖像數(shù)據(jù)的高速傳輸。
關(guān)鍵詞:圖像采集;PCI總線;FIFO;DMA傳輸;VxWorks
0 引言
CCD是一種高性能光電轉(zhuǎn)換式圖像傳感器。由于其幾何精度高、穩(wěn)定性好、噪聲小,廣泛用于遙感遙測(cè),天文測(cè)量等領(lǐng)域?,F(xiàn)實(shí)中許多利用單片機(jī)作為控制核心,并配備其他一些外圍電路實(shí)現(xiàn)CCD的數(shù)據(jù)采集,這種方式速度慢、集成度低。
由于CCD相機(jī)的精度和分辨率的不斷提高,以及對(duì)CCD成像系統(tǒng)本身可靠性要求的不斷提高,對(duì)數(shù)據(jù)采集系統(tǒng)采集速度、可靠性,以及易用性提出了更高的要求。本文設(shè)計(jì)的基于FPGA的PCI數(shù)據(jù)采集及回放系統(tǒng),系統(tǒng)設(shè)計(jì)以Xilinx的FPGA為核心,以LVDS芯片傳輸過來的CCD數(shù)據(jù)為源頭,運(yùn)用成熟的PCI總線傳輸技術(shù),實(shí)現(xiàn)了高速數(shù)據(jù)采集的功能。在VxWorks平臺(tái)下編寫了相應(yīng)的驅(qū)動(dòng)程序。經(jīng)測(cè)試和驗(yàn)證,該系統(tǒng)穩(wěn)定可靠,傳輸速率高,滿足應(yīng)用的要求。
1 系統(tǒng)的總體結(jié)構(gòu)以及原理
整個(gè)系統(tǒng)由模擬前端和采集后端組成,如圖1所示。前端主要由CCD鏡頭,CCD傳感器、垂直驅(qū)動(dòng)器、A/D轉(zhuǎn)換器、FPGA、電源管理電路以及高速串行總線接口LVDS組成。CCD鏡頭把光線聚焦在CCD傳感器的感光面上,CCD傳感器完成光信號(hào)到電信號(hào)的轉(zhuǎn)換。在驅(qū)動(dòng)器的控制下完成像素電荷的轉(zhuǎn)移,輸出模擬信號(hào),再經(jīng)過A/D轉(zhuǎn)換芯片把模擬信號(hào)轉(zhuǎn)換成數(shù)字信號(hào),經(jīng)LVDS輸出到后端。
采集后端的硬件主要由LVDS芯片、用作緩存圖像數(shù)據(jù)的SRAM芯片、電源管理模塊、FPGA組成。FPGA是整個(gè)后端采集模塊的核心模塊,F(xiàn)P GA不僅要完成數(shù)據(jù)的采集、組織、傳輸,還要根據(jù)PCI規(guī)范配置成標(biāo)準(zhǔn)的PCI設(shè)備,進(jìn)行數(shù)據(jù)與主機(jī)之前的傳送。由于數(shù)據(jù)傳輸要求60Mb/s的速度,所以簡(jiǎn)單的單次傳輸不能滿足系統(tǒng)的整體需求。FPGA必須能支持DMA方式的數(shù)據(jù)傳送。為了使PCI圖像采集卡有更大的通用性,在修改最小的驅(qū)動(dòng)代碼的情況下跨平臺(tái)地使用,須把FPGA配置成能作為主動(dòng)發(fā)起DMA請(qǐng)求的PCI設(shè)備,從而屏蔽不同的橋芯片之間的差異。
本文主要關(guān)注采集后端,即PCI圖像采集卡的硬件、邏輯、以及軟件的設(shè)計(jì)與實(shí)現(xiàn)。
[!--empirenews.page--]
2 PCI圖像采集卡回放系統(tǒng)硬件設(shè)計(jì)
為了提高數(shù)據(jù)傳輸?shù)目煽啃?,降低串?dāng)_、輻射等在高速傳輸數(shù)據(jù)中常見的問題,PCI圖像采集卡采用INDS(低壓差分信號(hào)技術(shù))進(jìn)行圖像數(shù)據(jù)的接收和控制數(shù)據(jù)的發(fā)送。在實(shí)際應(yīng)用中,我們選擇了國(guó)家半導(dǎo)體的DS92LV16芯片作為接收和發(fā)送數(shù)據(jù)芯片。功能框圖如圖2所示。
該芯片利用內(nèi)部時(shí)鐘把16位的并行數(shù)據(jù)轉(zhuǎn)換成LVDS數(shù)據(jù)進(jìn)行傳輸;同時(shí)可以把LVDS數(shù)據(jù)轉(zhuǎn)換成16位并行數(shù)據(jù)供芯片或者可編程邏輯器件進(jìn)行處理。該芯片最大傳輸速率可達(dá)2.56Gbps;單一的3.3V供電即可使用;較低的EMI;發(fā)送端和接收端有單獨(dú)的時(shí)鐘和省電管腳。
采用Xilinx公司的一片XC4VLX25-11FF668I可編程邏輯芯片,F(xiàn)PGA被配置成PCI接口。LX25邏輯單元可達(dá)24192個(gè),最大分布式RAM是168 k,最大塊RAM可達(dá)1296kb,并且有8個(gè)DCM供編程人員使用,LX25功耗較低,易于使用。選擇FLASH芯片為XCF08P。
需要外部存儲(chǔ)器對(duì)圖像處理中的大量數(shù)據(jù)進(jìn)行緩存,要求存儲(chǔ)器存取速度快、讀取時(shí)間短、實(shí)時(shí)性匹配強(qiáng)。選擇CYPRESS公司的SRAMCY7 C1470BV33的SRAM作為數(shù)據(jù)緩存芯片。CY7C1470BV33的速度可以達(dá)到250MHz,滿足系統(tǒng)時(shí)鐘頻率要求。
3 FPGA邏輯設(shè)計(jì)
3.1 總體設(shè)計(jì)
邏輯的整體設(shè)計(jì)如圖3所示,當(dāng)圖像數(shù)據(jù)進(jìn)入FPGA后,通過異步FIFO進(jìn)行異步時(shí)鐘域的轉(zhuǎn)換。在第一個(gè)緩沖周期通過數(shù)據(jù)流選擇電路將圖像數(shù)據(jù)緩存到SRAM1中;在第二個(gè)緩沖周期,通過數(shù)據(jù)流選擇電路將圖像數(shù)據(jù)緩存到SRAM2中,同時(shí)將SRAM1中的數(shù)據(jù)經(jīng)后端FIFO、PCI接口發(fā)送給主機(jī)。在第三個(gè)緩沖周期內(nèi)再次通過輸入數(shù)據(jù)流選擇電路,把圖像數(shù)據(jù)緩存到SRAM1中,同時(shí)將SRAM2中的數(shù)據(jù)經(jīng)后端FIFO、PCI接口發(fā)送給主機(jī),如此循環(huán)。由于乒乓操作的FPGA邏輯實(shí)現(xiàn)比較簡(jiǎn)單,這里不再贅述。下面主要來設(shè)計(jì)PCI接口的邏輯。
[!--empirenews.page--]
3.2 PCI接口的設(shè)計(jì)
PCI圖像采集卡的接口設(shè)計(jì)非常重要。由于PCI總線規(guī)范復(fù)雜,設(shè)計(jì)復(fù)雜,為了加快開發(fā)周期,采用Xilinx提供的PCI core來完成PCI總線控制器的設(shè)計(jì)。PCI控制器核logic core的內(nèi)部框圖如圖4所示。
PCI控制核主要完成用戶設(shè)備和PCI總線之間的數(shù)據(jù)傳輸。PCI核可工作在Target傳輸模式和Initiator傳輸模式。每種傳輸模式又可以分單次傳輸和突發(fā)傳輸。由于單次傳輸速度達(dá)不到要求,我們選擇突發(fā)傳輸模式以便提高傳輸速度。
Target模式下的突發(fā)傳輸模式相對(duì)Initiator下的突發(fā)傳輸模式的控制邏輯簡(jiǎn)單,但是考慮到PCI圖像采集卡的可移植性,故采用Initia tor突發(fā)傳輸模式。在Initiator突發(fā)傳輸模式下,PCI圖像采集卡主動(dòng)向橋芯片申請(qǐng)PCI總線控制權(quán),并主動(dòng)傳送數(shù)據(jù);在Target模式下,必須用軟件對(duì)橋芯片進(jìn)行配置,也就是說PCI圖像采集卡作為一個(gè)PCI從設(shè)備等待橋芯片的配置、數(shù)據(jù)讀取等。所以采用Initiator下的突發(fā)傳輸模式邏輯控制復(fù)雜,但是移植性好。
3.3 PCI圖像采集卡地址空間配置
PCI的地址空間可分為三種,分別是PCI配置空間、PCI I/O空間和PCI內(nèi)存空間。
我們需要對(duì)PCI核進(jìn)行配置。
Xilinx提供的PCI核提供了BAR0、BAR1、BAR2三個(gè)地址空間。這三個(gè)地址空間可以配置成內(nèi)存地址空間或I/O地址空間。為了PCI圖像采集卡在不同橋芯片下和不同的操作系統(tǒng)下工作。我們把所有的地址空間都配置成了內(nèi)存空間,因?yàn)椴皇撬刑幚砥鞫贾С諭/O操作。在我們的設(shè)計(jì)中,使用了BAR0和BAR1兩個(gè)地址空間,配置成了內(nèi)存空間,并全部配置成可以預(yù)取模式。以配制BAR0為例說明配置方法。
3.4 地址指針的設(shè)計(jì)
對(duì)于Initiator下的突發(fā)模式傳輸,因?yàn)閺脑O(shè)備可以在任何時(shí)刻結(jié)束數(shù)據(jù)的傳輸,應(yīng)用程序必須始終對(duì)地址進(jìn)行跟蹤,以便在Initiator再次發(fā)起傳輸時(shí)能得到正確的地址進(jìn)行重新傳送。
我們?cè)谠O(shè)計(jì)的時(shí)候用了一個(gè)32bit的寄存器對(duì)地址進(jìn)行跟蹤,其中低2位始終為0,高30位用來保存數(shù)據(jù)。利用M_DATA_VLD信號(hào)來控制地址的增加。當(dāng)M_ADDR_N有效的時(shí)候把地址輸送到地址總線上。
3.5 Initiator突發(fā)數(shù)據(jù)傳輸狀態(tài)機(jī)的實(shí)現(xiàn)
狀態(tài)機(jī)用來控制突發(fā)模式的讀寫時(shí)序。整個(gè)狀態(tài)機(jī)由六個(gè)狀態(tài)組成,分別是IDLES、REOS、WRITES、READS、RSTS、OOPS。下面分對(duì)這六
個(gè)狀態(tài)的功能進(jìn)行描述。
IDLES:狀態(tài)機(jī)處于空閑狀態(tài),狀態(tài)機(jī)等待用戶發(fā)起讀或者寫請(qǐng)求。
REOS:用戶發(fā)起了傳送請(qǐng)求。當(dāng)是讀請(qǐng)求時(shí),狀態(tài)機(jī)進(jìn)入READS狀態(tài)。當(dāng)是寫請(qǐng)求時(shí),狀態(tài)機(jī)進(jìn)入WRITES狀態(tài)。
READS:狀態(tài)機(jī)一直處于數(shù)據(jù)讀取狀態(tài)直到傳輸完成,或者在傳輸過程中發(fā)生了不可恢復(fù)的錯(cuò)誤。當(dāng)數(shù)據(jù)正常傳輸完成時(shí),狀態(tài)機(jī)會(huì)跳到OOPS_S狀態(tài);當(dāng)發(fā)生致命錯(cuò)誤時(shí),狀態(tài)機(jī)會(huì)處于RSTS。
WRITES:狀態(tài)WRITES和READS基本類似。不同的是數(shù)據(jù)傳輸方向不同。
RSTS:當(dāng)狀態(tài)機(jī)處于RSTS時(shí)說明整個(gè)系統(tǒng)發(fā)生了不可恢復(fù)的錯(cuò)誤,必須重新復(fù)位讓軟硬件。
OOPS:當(dāng)狀態(tài)機(jī)處于OOPS狀態(tài),如果需要對(duì)前端的FIFO進(jìn)行回滾操作,狀態(tài)機(jī)就一直處于OOPS。如果前端FIFO檢測(cè)傳輸完成信號(hào),完成則進(jìn)入IDLES狀態(tài),否則進(jìn)入申請(qǐng)總線狀態(tài)REQS。
3.6 異步存儲(chǔ)器的實(shí)現(xiàn)
由于PCI讀存儲(chǔ)器的時(shí)鐘頻率和數(shù)據(jù)寬度與收發(fā)器寫存儲(chǔ)器的時(shí)鐘頻率和數(shù)據(jù)寬度不一致,所以要設(shè)計(jì)在兩個(gè)異步時(shí)鐘之間傳輸數(shù)據(jù)的接口電路。Xilinx自帶的FIFO IP核是一種解決方案。但是由于異步FIFO沒有Initiator突發(fā)數(shù)據(jù)傳輸下的需要的back_up信號(hào),所以利用Xilinx自帶的塊RAM作為數(shù)據(jù)寬度可以控制的存儲(chǔ)器。
[!--empirenews.page--]
4 VxWorks下驅(qū)動(dòng)軟件的編寫
VxWorks是一種高可靠、微內(nèi)核、可裁剪的實(shí)時(shí)嵌入式操作系統(tǒng),由于它具有高效的實(shí)時(shí)任務(wù)調(diào)度、中斷管理等優(yōu)點(diǎn),成為了航空、航天、醫(yī)療、通信等領(lǐng)域首選的實(shí)時(shí)操作系統(tǒng)。PCI圖像采集卡的驅(qū)動(dòng)就是基于VxWorks實(shí)時(shí)操作系統(tǒng)進(jìn)行開發(fā)的。
4.1 PCI設(shè)備驅(qū)動(dòng)開發(fā)
每個(gè)PCI設(shè)備都有一容量為256字節(jié)并具有特定結(jié)構(gòu)的地址空間,前64個(gè)字節(jié)包含PCI接口的信息,也成為PCI配置頭。其余的192個(gè)字節(jié)可以由板卡的設(shè)計(jì)自己定義。為了讓VxWorks支持PCI驅(qū)動(dòng),需要對(duì)BSP中的sysLib.c文件進(jìn)行修改,使得系統(tǒng)支持初始化配置支持庫(kù)和中斷支持庫(kù),以提供對(duì)PCI設(shè)備配置空間的訪問租PCI中斷復(fù)用功能的支持。
設(shè)備驅(qū)動(dòng)程序初始化PCI圖像采集卡的流程一般如下:根據(jù)PCI設(shè)備的廠商ID和設(shè)備ID號(hào)來找到PCI設(shè)備的總線號(hào)、設(shè)備號(hào)和功能號(hào);根據(jù)總線號(hào)、設(shè)備號(hào)和功能號(hào)來映射PCI設(shè)備的地址空間;并且配置中斷線性寄存器;最后使能PCI內(nèi)存空間。其他寄存器要根據(jù)具體應(yīng)用來配置。
4.2 數(shù)據(jù)采集方式
由于前端數(shù)據(jù)量很大,所以簡(jiǎn)單的單次傳輸不能滿足系統(tǒng)的整體需求。必須用DMA方式進(jìn)行傳送。通知數(shù)據(jù)可以讀取通常有兩種模式,查詢模式和中斷模式。由于查詢模式要大量消耗CPU資源,所以采用DMA結(jié)合中斷模式進(jìn)行數(shù)據(jù)采集。
對(duì)數(shù)據(jù)的采集使用乒乓操作。當(dāng)寫滿一片SRAM中就發(fā)中斷給CPU,通知數(shù)據(jù)已經(jīng)準(zhǔn)備好,這個(gè)時(shí)候驅(qū)動(dòng)程序就開始讀取數(shù)據(jù),同時(shí)前端數(shù)據(jù)繼續(xù)寫入另一片SRAM,寫滿后再次發(fā)送中斷。如此反復(fù),直到PCI圖像采集卡接收到應(yīng)用程序的停止傳送數(shù)據(jù)命令。
4.3 中斷的運(yùn)用和管理
在VxWorks中,中斷的響應(yīng)速度非???。經(jīng)測(cè)量,在我們的系統(tǒng)中PCI圖像采集卡從發(fā)出中斷到進(jìn)入中斷處理函數(shù)的時(shí)間為7 μs。通過函數(shù)intConnect把中斷處理函數(shù)和中斷向量掛接起來。
在VxWorks中,中斷服務(wù)程序擁有獨(dú)立于各種任務(wù)的程序上下文,所以中斷服務(wù)程序不能執(zhí)行需要任務(wù)上下文的函數(shù)。
5 結(jié)果驗(yàn)證
我們對(duì)整個(gè)系統(tǒng)進(jìn)行了驗(yàn)證,CCD成像系統(tǒng)把采集的圖像數(shù)據(jù)經(jīng)變化,如加上校驗(yàn)和傳送給PCI圖像采集卡。用邏輯分析儀對(duì)PCI的一些關(guān)鍵信號(hào)進(jìn)行了測(cè)量。如圖5所示。
從圖中不難看出,PCI圖像采集卡一直處于數(shù)據(jù)傳輸狀態(tài),經(jīng)測(cè)試,傳輸速度完全滿足系統(tǒng)的要求。在應(yīng)用程序中對(duì)圖像數(shù)據(jù)進(jìn)行了存盤,并計(jì)算校驗(yàn)和,發(fā)現(xiàn)校驗(yàn)和正確。
6 結(jié)論
本文設(shè)計(jì)的PCI圖像采集卡以FPGA為核心,在PCI核的基礎(chǔ)上用邏輯實(shí)現(xiàn)了PCI圖像采集卡Initiator下的突發(fā)模式傳輸,從而實(shí)現(xiàn)了視頻數(shù)據(jù)的高速傳輸。為了傳輸?shù)姆€(wěn)定性和可靠性,使用低壓差分信號(hào)技術(shù)進(jìn)行圖像數(shù)據(jù)的接收和控制數(shù)據(jù)的發(fā)送。最后在VxWorks平臺(tái)上實(shí)現(xiàn)了PCI圖像采集模塊的驅(qū)動(dòng)編寫。經(jīng)過測(cè)試,圖像數(shù)據(jù)傳輸穩(wěn)定可靠,傳輸速率也能滿足系統(tǒng)的整體需求。