基于PC104(Plus)總線的數(shù)據(jù)接收存儲(chǔ)顯示系統(tǒng)設(shè)計(jì)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
摘要:提出了一種雙通道大容量數(shù)據(jù)接收存儲(chǔ)顯示系統(tǒng)的實(shí)現(xiàn)方案。闡述了以PLX9054為核心、以異步FIFO為數(shù)據(jù)緩沖通道的PC104(Plus)接口電路的設(shè)計(jì)方法,同時(shí)給出了FPGA控制邏輯設(shè)計(jì)與Linux系統(tǒng)下基于Qt/Embedded和Framebuffer工控機(jī)存儲(chǔ)顯示程序的實(shí)現(xiàn)方法。
關(guān)鍵詞:PC104(Plus);Qt/Embedded;Framebuffer;實(shí)時(shí)存儲(chǔ);同步顯示;工控機(jī)
0 引言
在現(xiàn)代數(shù)字信號(hào)處理領(lǐng)域,對(duì)于大容量高速數(shù)據(jù)的存儲(chǔ)和顯示是進(jìn)行后續(xù)相關(guān)處理的基礎(chǔ),也是信息處理系統(tǒng)的關(guān)鍵組成部分。隨著數(shù)字視頻視覺技術(shù)和視頻采集技術(shù)的發(fā)展,很多應(yīng)用場(chǎng)合都需要對(duì)接收到的模擬數(shù)據(jù)進(jìn)行模數(shù)轉(zhuǎn)換,然后再進(jìn)行數(shù)據(jù)的實(shí)時(shí)存儲(chǔ)和同步顯示。為此,本文介紹了對(duì)模數(shù)轉(zhuǎn)換后的數(shù)字信號(hào)所進(jìn)行的處理,提出了一種基于PC104 (Plus)總線的雙通道大容量高速數(shù)據(jù)的接收、存儲(chǔ)和顯示系統(tǒng)的設(shè)計(jì)方法。該系統(tǒng)通過(guò)FPGA-PC104(Plus)接口對(duì)數(shù)據(jù)進(jìn)行接收和預(yù)處理,再通過(guò)FIFO數(shù)據(jù)傳輸通道來(lái)上傳數(shù)據(jù),最后由工控機(jī)的軟件來(lái)實(shí)現(xiàn)數(shù)據(jù)的實(shí)時(shí)存儲(chǔ)和同步顯示。其中工控機(jī)軟件采用Linux(2.6內(nèi)核)下Qt/Embedded的GUI來(lái)設(shè)計(jì),并用Framebuffer的顯示技術(shù)來(lái)提供良好的人機(jī)界面交互和快速的存儲(chǔ)顯示操作。
1 系統(tǒng)結(jié)構(gòu)
本系統(tǒng)由數(shù)據(jù)接收模塊、FPGA控制模塊和工控機(jī)顯示存儲(chǔ)模塊組成,其系統(tǒng)結(jié)構(gòu)如圖1所示。圖中的FPGA選用Xilinx Spartan3系列的XC3S2000F456,其最大用戶IO為333個(gè),系統(tǒng)門達(dá)到200萬(wàn)門,并內(nèi)置576KB的RAM塊;FIFO選用IDT公司的IDT72V36110,該芯片容量為512KB,可支持36位輸入、輸出數(shù)據(jù),最高工作頻率可達(dá)166MHz;另外,PLX9054是PLX公司的總線橋接芯片,它支持多種工作模式,本系統(tǒng)采用C模式。在該模式下的DMA傳輸時(shí),PLX9054對(duì)PC104(Plus)總線和本地總線都是主控制器;工控機(jī)選用Senbo公司的LX-3072PC/104 CPU模塊,該模塊搭載的AMD Geode LX800 CPU,其工作頻率高達(dá)500MHz,遵從PC/104+標(biāo)準(zhǔn),并提供有PC104(Plus)總線,同時(shí)集成了PS/2、RT、IDE、USB2.0和10M/100M網(wǎng)口等接口,而且功耗低,可靠性高,可廣泛適用于數(shù)據(jù)采集、通信等領(lǐng)域。為了保證系統(tǒng)的實(shí)時(shí)性和穩(wěn)定性,本工控機(jī)上運(yùn)行的是Linux操作系統(tǒng)。
數(shù)據(jù)接收模塊的兩路輸入通道分別連向FPGA的IO端口,在FPGA模塊的控制下,兩路輸入數(shù)據(jù)同時(shí)分別進(jìn)入各自的FIFO進(jìn)行緩存。為了避免PLX9054控制本地端時(shí)的總線競(jìng)爭(zhēng)以及簡(jiǎn)化時(shí)序設(shè)計(jì),可將兩片F(xiàn)IFO的輸出端復(fù)用,且經(jīng)由FPGA的IO端口連向PLX9054的本地?cái)?shù)據(jù)端,進(jìn)而在FIFO產(chǎn)生相應(yīng)狀態(tài)響應(yīng)的時(shí)候,由FPGA控制模塊向PLX9054發(fā)出讀取FIFO的中斷請(qǐng)求,PLX9054在響應(yīng)中斷后,即將數(shù)據(jù)以DMA的方式經(jīng)由PC104(Plus)總線上傳至上位機(jī),上位機(jī)通過(guò)PCI驅(qū)動(dòng)讀取DMA傳輸?shù)臄?shù)據(jù),然后進(jìn)行數(shù)據(jù)分析,再分別進(jìn)行存儲(chǔ)和顯示。
2 系統(tǒng)設(shè)計(jì)
2.1 數(shù)據(jù)接收模塊設(shè)計(jì)
本系統(tǒng)中的數(shù)據(jù)接收模塊采用J18型37針視頻通信接口,該接口協(xié)議可根據(jù)實(shí)際需求自行定義,但最大為32位。由于輸入數(shù)據(jù)為高速數(shù)字信號(hào),因此,為防止輸入FPGA的信號(hào)產(chǎn)生過(guò)沖,可在視頻通信接口的后端對(duì)32位數(shù)據(jù)分別進(jìn)行RC端接,并串聯(lián)33Ω的電阻和0.01μF的電容。
2.2 FPGA控制模塊設(shè)計(jì)
本系統(tǒng)的數(shù)據(jù)傳送采用DMA結(jié)合中斷的方式。該方式不僅能保證數(shù)據(jù)傳輸?shù)乃俾剩夷芴岣呦到y(tǒng)的工作效率。接收高速數(shù)據(jù)時(shí),要使用緩沖區(qū)對(duì)數(shù)據(jù)進(jìn)行緩存,但是,如果等緩沖區(qū)全部存滿以后再進(jìn)行DMA傳輸,那么,在數(shù)據(jù)流速率比較高的時(shí)候,就會(huì)造成數(shù)據(jù)的丟失。因此,在FIFO半滿時(shí)就必須進(jìn)行數(shù)據(jù)的DMA傳輸,這樣可使工控機(jī)從FIFO讀取數(shù)據(jù)和FPGA從外部接收數(shù)據(jù)能同時(shí)進(jìn)行。
FPGA控制模塊是本系統(tǒng)的硬件核心,其主要功能是完成系統(tǒng)復(fù)位,接收數(shù)據(jù)進(jìn)行緩存,控制讀取兩個(gè)FIFO數(shù)據(jù)的邏輯順序,并控制DMA傳輸。FPGA控制模塊電路如圖2所示。
在圖2電路中,為了保證FPGA與FIFO同步工作,應(yīng)將兩片F(xiàn)IFO的各自讀寫時(shí)鐘連接在一起,且分別由FPGA輸入到時(shí)鐘驅(qū)動(dòng)芯片以后獲得。
為了滿足PLX9054上電啟動(dòng)速度的要求,其時(shí)鐘應(yīng)由晶振直接提供。
系統(tǒng)上電后,PLX9054NFPGA發(fā)出復(fù)位命令,同時(shí)由FPGA對(duì)FIFO進(jìn)行復(fù)位,并完成對(duì)FIFO的初始化,以使其處于工作狀態(tài)。在FP-GA接收數(shù)據(jù)時(shí),存儲(chǔ)數(shù)據(jù)通道和顯示數(shù)據(jù)通道的數(shù)據(jù)同時(shí)進(jìn)入FPGA,為了使工控機(jī)軟件能夠區(qū)分兩路數(shù)據(jù),可在FPGA內(nèi)部根據(jù)數(shù)據(jù)同步信號(hào)分別對(duì)兩路數(shù)據(jù)加上幀頭,然后同時(shí)寫入FIFO1的D1[0…31]和FIFO2的D2[0…31]。數(shù)據(jù)半滿后,F(xiàn)PGA要根據(jù)兩片F(xiàn)IFO的半滿信號(hào)和對(duì)其進(jìn)行讀取控制。FIFO的讀取控制主要由實(shí)現(xiàn)。在實(shí)際應(yīng)用中,存儲(chǔ)數(shù)據(jù)一般要求能夠優(yōu)先上傳,且數(shù)據(jù)連續(xù),而對(duì)同步顯示的要求相對(duì)較低,顯示數(shù)據(jù)的速率也較低,只要能夠滿足顯示刷新率的要求即可,因此,本設(shè)計(jì)中存儲(chǔ)數(shù)據(jù)緩沖區(qū)FIFO1的半滿信號(hào)的優(yōu)先級(jí)高于。具體實(shí)現(xiàn)方法是對(duì)進(jìn)行邏輯運(yùn)算,圖3所示是其運(yùn)算邏輯圖。
運(yùn)算后可得到化簡(jiǎn)結(jié)果,然后令;之后再在FPGA內(nèi)部將、做與運(yùn)算,可得到,然后判斷,若為低,則FPGA向PLX9054發(fā)出中斷。這樣就能保證兩片F(xiàn)IFO的數(shù)據(jù)根據(jù)優(yōu)先級(jí)不斷向上發(fā)送。
PLX9054響應(yīng)中斷后,即可通過(guò)LHOLD申請(qǐng)對(duì)本地總線進(jìn)行控制,F(xiàn)PGA則通過(guò)LHOLDA作出應(yīng)答,進(jìn)而由PLX9054獲得本地總線控制權(quán)并啟動(dòng)DMA傳輸周期。FPGA收到讀信號(hào)和地址選通信號(hào)后,產(chǎn)生信號(hào),并在最后一個(gè)數(shù)據(jù)傳送信號(hào)有效之前一直保持有效。在此期間,F(xiàn)PGA將根據(jù)圖3所示的運(yùn)算邏輯結(jié)果,并按照優(yōu)先級(jí)讀取相應(yīng)FIFO的數(shù)據(jù)進(jìn)行上傳。具體的控制及數(shù)據(jù)傳輸時(shí)序如圖4所示。
由圖4可見,當(dāng)同時(shí)有效時(shí),其FIFO1的優(yōu)先級(jí)高于FIFO2,故可滿足設(shè)計(jì)要求。
2.3 工控機(jī)顯示存儲(chǔ)模塊設(shè)計(jì)
本系統(tǒng)利用PLX9054和Linux的DMA技術(shù)來(lái)實(shí)現(xiàn)大量數(shù)據(jù)的高速傳輸,同時(shí)使用Qt/Ernbedded進(jìn)行人機(jī)界面設(shè)計(jì)和Framebuffer的幀緩沖顯示,以對(duì)視頻數(shù)據(jù)進(jìn)行存儲(chǔ)和顯示控制。整個(gè)軟件的功能圖如圖5所示。
PLX9054的PCI設(shè)備驅(qū)動(dòng)是DMA傳輸?shù)年P(guān)鍵,驅(qū)動(dòng)程序利用PLX9054芯片的DMA功能可將FPGA控制模塊中的數(shù)據(jù)快速傳輸?shù)絃inux操作系統(tǒng)的內(nèi)核內(nèi)存中。要實(shí)現(xiàn)對(duì)PLX9054的DMA操作并設(shè)置DMA控制寄存器,設(shè)備驅(qū)動(dòng)程序需要做兩件事:一是檢測(cè)PCI設(shè)備并初始化:二是建立DMA操作環(huán)境。在Linux2.6內(nèi)核中,PCI設(shè)備檢測(cè)和初始化可通過(guò)專門的注冊(cè)函數(shù)pci_regis-ter-driver來(lái)實(shí)現(xiàn)。內(nèi)核根據(jù)pci_device_id結(jié)構(gòu)中的預(yù)設(shè)ID來(lái)對(duì)pci_devices鏈表進(jìn)行搜索,一旦找到目標(biāo)PCI設(shè)備,pci_register_driver函數(shù)將調(diào)用設(shè)備探測(cè)函數(shù)(probe)并向該函數(shù)傳遞該設(shè)備的pci_dev變量,然后由設(shè)備探測(cè)函數(shù)完成對(duì)設(shè)備的初始化。建立DMA操作環(huán)境的工作包括DMA緩沖區(qū)的分配和中斷處理。本系統(tǒng)使用流式DMA映射(dma_map_single())來(lái)申請(qǐng)適當(dāng)大小的DMA緩沖區(qū)。當(dāng)一個(gè)緩沖區(qū)被流式映射后,只有將其unmap除掉以后,驅(qū)動(dòng)程序才能安全地訪問(wèn)里面的數(shù)據(jù)內(nèi)容,并通過(guò)request_irq函數(shù)實(shí)現(xiàn)中斷處理程序的注冊(cè)。這里有兩個(gè)問(wèn)題需要注意:一是PCI設(shè)備注冊(cè)中斷時(shí),必須使用共享中斷方式,并應(yīng)在中斷處理程序中增加對(duì)中斷源的檢查;二是PLX9054的中斷信號(hào)一旦產(chǎn)生就一直有效,它必須通過(guò)代碼清除中斷。
本系統(tǒng)采用Qt/Embedded(4.5)進(jìn)行GUI設(shè)計(jì),以便為系統(tǒng)用戶提供一個(gè)高性能、高可靠的GUl支持。Qt/Embedded是著名的Qt庫(kù)開發(fā)商Trolltech公司開發(fā)的、面向嵌入式系統(tǒng)的Qt版本,許多基于Qt的X Window程序都可以非常方便地移植到Qt/Embedded上,而且與X11版本的Qt在最大程度上接口兼容,因而延續(xù)了在XWindow上的強(qiáng)大功能,并在底層徹底摒棄了X lib,而僅采用Framebuffer作為底層圖形接口。同時(shí),使用Qt的多線程設(shè)計(jì)則使人機(jī)交互、視頻顯示和數(shù)據(jù)存儲(chǔ)能夠同時(shí)進(jìn)行。
本系統(tǒng)采用Framebuffer幀緩沖技術(shù)來(lái)實(shí)現(xiàn)視頻數(shù)據(jù)的快速顯示。Framebuffer機(jī)制模仿的是顯卡的功能,它將顯卡硬件結(jié)構(gòu)抽象掉,可通過(guò)Framebuffer的讀寫直接對(duì)顯存進(jìn)行操作。內(nèi)核編譯時(shí)可選上對(duì)Framebuffer的支持。進(jìn)入Framebuffer可以在系統(tǒng)啟動(dòng)時(shí)向內(nèi)核傳送vga= modenumber的參數(shù)來(lái)激活Framebuffer設(shè)備(如:vga=791)。Framebuffer的設(shè)備文件一般是/dev/fb0、/dev/fb1等。
在應(yīng)用程序中,一般可將Framebuffer設(shè)備映射到進(jìn)程地址空間的方式使用,比如利用下面的程序就可以打開/dev/fb0設(shè)備,并通過(guò)mmap系統(tǒng)調(diào)用進(jìn)行地址映射,隨后用memset將屏幕清空(這里假設(shè)顯示模式是1024x768-32位色模式和線性內(nèi)存模式):
在子函數(shù)initFb中,對(duì)映射過(guò)的內(nèi)存地址(即顯存)再進(jìn)行分行映射,即把原來(lái)的一維線性地址轉(zhuǎn)換為二維線性空間,這樣,映射后的fbp[x][y]就可以在屏幕上表示水平位置為y、垂直位置為x的像素。
利用該映射能夠?qū)︼@示區(qū)域中的某一行進(jìn)行操作,也可以對(duì)顯示數(shù)據(jù)包的每一幀進(jìn)行行分析,進(jìn)而對(duì)每一行進(jìn)行控制和顯示。這樣既可保證顯示的靈活性,又具有良好的顯示速度。
3 結(jié)束語(yǔ)
本文給出了一種基于FPGA控制邏輯的高速數(shù)據(jù)接收存儲(chǔ)顯示系統(tǒng)的硬件設(shè)計(jì)方案,同時(shí)詳細(xì)介紹了Linux系統(tǒng)下基于Qt/Embedded和Fr-amebuffer的工控機(jī)存儲(chǔ)顯示程序的實(shí)現(xiàn)方法。