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