亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于FPGA+GPU的圖像采集處理系統(tǒng)設(shè)計(jì)

        2023-08-30 03:17:26蔣俊倫豐大強(qiáng)徐新瑞常中坤
        計(jì)算機(jī)測量與控制 2023年8期
        關(guān)鍵詞:設(shè)備系統(tǒng)

        蔣俊倫,豐大強(qiáng),徐新瑞,程 坤,常中坤,王 楨

        (山東航天電子技術(shù)研究,山東 煙臺 255000)

        0 引言

        近年來,地面掃描觀測設(shè)備得到快速發(fā)展,掃描觀測需要實(shí)時(shí)采集存儲數(shù)字圖像,對圖像采集技術(shù)的要求也越來越高。圖像采集模塊采集到的圖像的質(zhì)量對后續(xù)設(shè)計(jì)的準(zhǔn)確性有極大的影響。作為圖像信號處理系統(tǒng)的重要組成部分,圖像采集模塊的速度、分辨率、可靠性以及集成性等方面受到了越來越多的關(guān)注[1]。目前,圖像采集系統(tǒng)大多采用電腦端使用的圖像采集卡,這種圖像采集卡采集速度快、可以保證較高的采集精度,但體積大、功耗高,而且只能在電腦端使用,無法在便攜式產(chǎn)品中使用。從適應(yīng)性角度考慮要求圖像采集系統(tǒng)性價(jià)比高,環(huán)境的適應(yīng)能力要強(qiáng),并且要易安裝和使用。嵌入式圖像采集處理系統(tǒng)為圖像采集提供了新的實(shí)現(xiàn)途徑,但單純應(yīng)用ARM或DSP 等嵌入式平臺由于其存儲容量有限、處理速度低、擴(kuò)展性較差的特點(diǎn),不能滿足當(dāng)前圖像采集系統(tǒng)的帶寬需求[2]。

        圖像采集前端模塊是整個(gè)圖像采集系統(tǒng)的核心部件,會直接影響到整個(gè)系統(tǒng)的工作執(zhí)行效率??紤]到目前掃描觀測設(shè)備的圖像數(shù)據(jù)分辨率高、幀頻快,如何使用恰當(dāng)?shù)姆椒ú杉?、傳輸以及存儲高質(zhì)量的圖像是一個(gè)非常重要的問題。圖像采集的整體過程相對比較簡單,但是圖像采集時(shí),圖像的數(shù)據(jù)量非常的大,系統(tǒng)對實(shí)時(shí)性要求非常高[3],圖像采集的實(shí)時(shí)性是僅靠軟件是無法實(shí)現(xiàn)的,開發(fā)人員要考慮使用軟件與高速硬件系統(tǒng)相結(jié)合的方式來完成對圖像的高速實(shí)時(shí)采集[4]。

        文獻(xiàn)[5]中,采用MSP430單片機(jī)作為主控芯片,通過USB數(shù)據(jù)采集技術(shù)實(shí)現(xiàn)對監(jiān)控現(xiàn)場視頻數(shù)據(jù)的采集和傳輸,但該方案最終達(dá)到的數(shù)據(jù)傳輸速率僅為8~10 Mbps。對于目前相機(jī)來說,常規(guī)的相機(jī)參數(shù)可達(dá)到640×512像素,單像素12位采樣,幀頻100 Hz,數(shù)據(jù)量可達(dá)到375 Mbps。該系統(tǒng)難以滿足實(shí)際應(yīng)用需求。

        文獻(xiàn)[6]中,提出了一種基于現(xiàn)場可編程邏輯門陣列(FPGA,field programmable gate array)的高速圖像采集系統(tǒng)硬件方案。采用FPGA 作為圖像采集主控芯片,大大簡化了系統(tǒng)硬件結(jié)構(gòu),并提高了系統(tǒng)可靠性,同時(shí)可以應(yīng)用于高速圖像采集中。但FPGA操作起來流程復(fù)雜,應(yīng)用門檻較高。

        同時(shí)為了保證采集到的圖像的完整性和連續(xù)性,不僅要對圖像數(shù)據(jù)進(jìn)行采集,而且要對原始數(shù)據(jù)進(jìn)行緩存。一般的圖像采集模塊主要包括存儲器單元、CCD或者CMOS相機(jī)接口以及總線接口等。系統(tǒng)中設(shè)計(jì)了一個(gè)圖像采集處理系統(tǒng),采用Xilinx公司的XC7K410T FPGA進(jìn)行相機(jī)圖像采集以及與其他設(shè)備如轉(zhuǎn)臺之間的信息交互。采用英偉達(dá)公司的Jetson TX2 GPU作為圖像數(shù)據(jù)存儲處理的平臺。XC7K410T 通過LVDS接口采集相機(jī)數(shù)據(jù),采集到數(shù)據(jù)后通過PCIE總線將圖像數(shù)據(jù)傳輸給TX2,TX2再將數(shù)據(jù)存儲到固態(tài)硬盤中,以進(jìn)行后續(xù)的處理。

        1 系統(tǒng)結(jié)構(gòu)及原理

        對相機(jī)圖像進(jìn)行采集存儲需要一個(gè)可靠性好、攜帶便捷以及實(shí)時(shí)性高的完整系統(tǒng)。該系統(tǒng)由電源模塊、外設(shè)模塊、FPGA、GPU、固態(tài)硬盤組成。其中:

        電源模塊為系統(tǒng)中FPGA、GPU、外圍電路器件提供供電,典型電壓包括:5 V、3.3 V、1.8 V、1.2 V和1.0 V。外設(shè)模塊實(shí)現(xiàn)與相機(jī)等外部設(shè)備的通信,包括RS422接口、LVDS接口。GPU模塊使用TX2模組,TX2使用Linux操作系統(tǒng)作為底層系統(tǒng),可以充當(dāng)上位機(jī)的功能。與此同時(shí)TX2實(shí)現(xiàn)通過PCIE從FPGA接收傳送的相機(jī)數(shù)據(jù),將接收圖像數(shù)據(jù)通過SATA接口存儲到硬盤中,并執(zhí)行相應(yīng)的圖像處理算法,將處理出的結(jié)果進(jìn)行轉(zhuǎn)發(fā)。FPGA模塊通過16路LVDS接收到圖像數(shù)據(jù)并通過PCIE發(fā)送到TX2模塊中。系統(tǒng)的原理如圖1所示。

        圖1 圖像采集系統(tǒng)原理圖

        2 系統(tǒng)硬件設(shè)計(jì)

        2.1 Jetson TX2模塊

        圖形處理器(GPU,graphic processing unit)是一種專門進(jìn)行圖形處理的硬件設(shè)備,經(jīng)過近年來的快速發(fā)展,GPU已經(jīng)從最初的圖形處理領(lǐng)域擴(kuò)展到機(jī)器學(xué)習(xí)、深度學(xué)習(xí)、三維重建等并行計(jì)算領(lǐng)域,其架構(gòu)從專用于圖像處理的固定架構(gòu)發(fā)展到了用于通用計(jì)算的并行計(jì)算架構(gòu)[7-8]。相比于CPU,GPU在并行計(jì)算、分布計(jì)算和浮點(diǎn)運(yùn)算方面的運(yùn)算能力可以高出數(shù)十倍乃至上百倍。在嵌入式硬件方面,英偉達(dá)公司在2013年推出Jeston TX2模組,TX2是一款高性能、低功耗的AI 單模塊超級計(jì)算機(jī),采用GPU+CPU架構(gòu)設(shè)計(jì),其GPU采用新一代Pascal架構(gòu)設(shè)計(jì),具有256個(gè)CUDA 核;CPU使用集成了四核的ARM○R CortexTM-A57處理器(PS-processing system)。外圍電路方面該模組還包括10/100/1000BASE-T以太網(wǎng)絡(luò)接口,同時(shí)配備了8 GB的DDR4內(nèi)存和32 GB eMMC5.1 Flash存儲空間。另外具備HDMI、CSI、SATA等外部接口,其浮點(diǎn)計(jì)算能力可以達(dá)到1.5 Tflops。因此選用TX2作為圖像采集處理的核心模塊十分方便快捷,其強(qiáng)大的數(shù)據(jù)處理能力可以將圖像數(shù)據(jù)快速的寫入到固態(tài)硬盤中,另外TX2還可以通過圖形化界面與用戶交互,容易操作。

        在本系統(tǒng)中TX2的作用包括兩部分:一是利用SPI模塊發(fā)送消息通知FPGA開始進(jìn)行圖像數(shù)據(jù)采集;二是通過PCIE模塊將圖像數(shù)據(jù)從FPGA接收數(shù)據(jù),并將數(shù)據(jù)通過SATA接口寫入到固態(tài)硬盤中。

        2.2 FPGA模塊

        FPGA是一種可以通過編程來改變內(nèi)部結(jié)構(gòu)的“特殊芯片”,自Xilinx公司于1984年研發(fā)了世界上的首款型號為XC2064的FPGA以來,F(xiàn)PGA的發(fā)展經(jīng)歷了多個(gè)階段[9]。目前最新的FPGA邏輯門的數(shù)量已經(jīng)達(dá)到億級以上,工藝尺寸也達(dá)到了16 nm左右,無論是功耗還是性能,相比于XC2064都得到了極大的提升[10]。與普通的集成電路芯片相比,F(xiàn)PGA具有許多十分突出的特點(diǎn),F(xiàn)PGA的可編程特性使它不僅可以用于ASIC(專用集成電路)的設(shè)計(jì),同時(shí)可以用來完成ASIC芯片的原型驗(yàn)證。FPGA常采用高速的CMOS工藝進(jìn)行設(shè)計(jì),具有低功耗的優(yōu)勢,而且其內(nèi)部包含豐富的觸發(fā)器和可編程I/O資源,可以用于實(shí)現(xiàn)較大規(guī)模的集成電路設(shè)計(jì)。FPGA在體系結(jié)構(gòu)上有很大的并行度,這使其十分擅長并行數(shù)學(xué)計(jì)算[11]。

        FPGA模塊采用Xilinx的XC7K410T 芯片,通過16路LVDS接口接收相機(jī)數(shù)據(jù),其中14位數(shù)據(jù),1位GATE,1位選通。1路RS422作為相機(jī)控制接口,1路RS422作為遙測遙控接口,一路RS232作為轉(zhuǎn)臺控制接口。數(shù)據(jù)采集轉(zhuǎn)發(fā)FPGA具體型號為XC7K410T-2FFG900I,該芯片的主要性能如下[12]:

        具有48萬邏輯單元;

        具有37 Mbit內(nèi)部RAM;

        具有2 800個(gè)DSP48E模塊;

        具有32個(gè)GTX接口模塊;

        具有14個(gè)CMT模塊;

        具有700個(gè)HPIO管腳。

        由于該FPGA是基于SRAM結(jié)構(gòu)的FPGA,具有設(shè)備斷電后數(shù)據(jù)丟失的缺點(diǎn)。需要為XC7K410T-2FFG900I專門配備一個(gè)程序存儲器用來存儲配置數(shù)據(jù),在設(shè)備上電初始化時(shí)完成配置數(shù)據(jù)的裝載。K7系列的FPGA支持×1,×2,×4三種SPI加載方式,F(xiàn)lash選擇S29GL512P11TFI010,該芯片+3.3 V供電,容量512 Mb。

        由于相機(jī)輸出14位寬的數(shù)據(jù),幀頻100 Hz,相機(jī)像素分辨率640×512,由此將產(chǎn)生14 bit×100 MHz×640*512(約為437.5 Mbps)的數(shù)據(jù)量,考慮到TX2使用的是Linux系統(tǒng),Linux是一種非實(shí)時(shí)響應(yīng)的操作系統(tǒng),這么快速的數(shù)據(jù)量即所謂的迸發(fā)數(shù)據(jù)流沒有辦法直接通過DMA傳送給TX2,需要將圖像數(shù)據(jù)臨時(shí)存儲在內(nèi)存條(DDR3 SDRAM)中。DDR3存儲器是一種采用時(shí)鐘雙沿工作的高速存儲器,是處理器常用的片外存儲器。與靜態(tài)隨機(jī)訪問存儲器(SRAM,static random access memory)所采用的CMOS 工藝不同,DDR3存儲器采用動態(tài)隨機(jī)訪問存儲器(DRAM,dynamic random access memory)動態(tài)電路工藝,多采用電容儲值,讀寫之前必須先對數(shù)據(jù)線進(jìn)行預(yù)充電;讀是破壞性的,讀后必須寫回;漏電流的存在使得DDR3 必須保持定期刷新(讀出放大后再寫回)[13]。

        FPGA通過對DDR3 SDRAM的訪問存儲器控制,實(shí)現(xiàn)大容量迸發(fā)數(shù)據(jù)的讀、寫、刷新等時(shí)序操作。當(dāng)FPGA收到圖像數(shù)據(jù)后將數(shù)據(jù)緩存到DDR3內(nèi),當(dāng)收滿一副圖像后FPGA將數(shù)據(jù)放到DMA內(nèi)通過PCIE總線發(fā)送給TX2。

        2.3 電源模塊

        電源模塊為整個(gè)系統(tǒng)供電,采用+28 V電源作為輸入電壓,將直流+28 V供電轉(zhuǎn)化成設(shè)備各組件工作所需的+12 V、+5 V電源等,其中TX2模塊供電模塊與FPGA供電模塊分別采用不同的電源模塊,實(shí)現(xiàn)TX2模塊與FPGA模塊的相互獨(dú)立。

        +12 V為TX2模塊供電,+5 V為FPGA模塊供電。直流28 V輸入電源后,首先經(jīng)過濾波后供給DC/DC轉(zhuǎn)換模塊,轉(zhuǎn)換成設(shè)備所需的工作電壓,濾波后輸出給各用電設(shè)備組件。供電模塊原理如圖2所示。

        圖2 供電模塊原理框圖

        2.4 外設(shè)模塊

        本系統(tǒng)中外設(shè)模塊主要包括低電壓差分信號(lowvoltage differential signaling,LVDS)接口、RS422接口,LVDS共16路,其中14路為數(shù)據(jù)、1路為選通、1路為時(shí)鐘,時(shí)鐘速率為31.25 Mbps。LVDS接口用于保證圖像采集和傳輸,可以將圖像高速數(shù)據(jù)實(shí)時(shí)的進(jìn)行傳輸存儲。RS422接口用于相機(jī)控制、轉(zhuǎn)臺控制等。

        3 系統(tǒng)軟件設(shè)計(jì)

        基于FPGA+GPU的圖像采集處理系統(tǒng)軟件程序主要包括FPGA程序設(shè)計(jì)、TX2驅(qū)動程序設(shè)計(jì)和TX2應(yīng)用程序設(shè)計(jì)。FPGA開發(fā)基于Xilinx公司的Vivado集成開發(fā)仿真環(huán)境。TX2本身自帶Linux操作系統(tǒng),可以在Linux上安裝VScode軟件,使用VScode對TX2驅(qū)動程序和應(yīng)用程序進(jìn)行編寫編譯。

        本系統(tǒng)中TX2是系統(tǒng)軟件的運(yùn)行主體,當(dāng)系統(tǒng)啟動后,操作人員通過TX2上位機(jī)界面,發(fā)送圖像采集指令給FPGA,F(xiàn)PGA接收到指令后對指令進(jìn)行解析處理,讀取圖像數(shù)據(jù),并將數(shù)據(jù)發(fā)送給TX2。系統(tǒng)軟件的程序流程如圖3所示。

        圖3 系統(tǒng)流程圖

        3.1 軟件設(shè)計(jì)思路和編程方法

        3.1.1 FPGA程序設(shè)計(jì)

        FPGA內(nèi)部邏輯結(jié)構(gòu)如圖4所示,包括PCIE模塊,PCIE協(xié)議處理相關(guān)模塊,DDR3緩存模塊和SPI及串口模塊。系統(tǒng)上電后進(jìn)入復(fù)位狀態(tài),復(fù)位完成后接收TX2通過PCIE發(fā)送的指令進(jìn)入相應(yīng)的工作模式,包括空閑模式和采集模式及系統(tǒng)復(fù)位模式。TX2通過PCIE接口配置相關(guān)的寄存器來實(shí)現(xiàn)對設(shè)備工作模式的修改,實(shí)現(xiàn)TX2對相關(guān)外設(shè)的控制。

        圖4 FPGA邏輯框圖

        1)DDR3控制器:DDR3控制器使用Xilinx官方IP核,該IP核為免費(fèi)IP,其內(nèi)部包含了基本的時(shí)鐘和復(fù)位處理模塊、物理層接口處理模塊、延時(shí)控制單元、讀寫控制器、數(shù)據(jù)緩存單元及用戶接口等模塊。其中時(shí)鐘和復(fù)位處理模塊通過內(nèi)部的PLL生成IP核所需的時(shí)鐘網(wǎng)絡(luò)和相應(yīng)的復(fù)位信號。物理層接口模塊負(fù)責(zé)完成和物理芯片的交互,對DDR3物理接口的高速DDR時(shí)序進(jìn)行處理,通過延時(shí)控制單元完成數(shù)據(jù)相位的延時(shí)和相位對齊等操作。此外IP核內(nèi)部還利用FPGA內(nèi)部的緩存器實(shí)現(xiàn)對物理層數(shù)據(jù)的跨時(shí)鐘域緩存,以實(shí)現(xiàn)數(shù)據(jù)位寬的轉(zhuǎn)換以及物理層時(shí)鐘向用戶層時(shí)鐘的跨時(shí)鐘域設(shè)計(jì)。用戶接口模塊負(fù)責(zé)對用戶的指令進(jìn)行譯碼,緩存用戶數(shù)據(jù)以及對用戶的數(shù)據(jù)實(shí)現(xiàn)流控。設(shè)計(jì)中采用的DDR3硬件數(shù)據(jù)位寬為16位,容量為2 Gbit,理論讀寫速率可達(dá)50 Gbps,考慮在實(shí)際控制時(shí)的帶寬損耗,即使是在帶寬效率為50%時(shí)帶寬也可達(dá)到25 Gbps,而實(shí)際應(yīng)用時(shí)相機(jī)的速率為2.5 Gbps,滿足傳輸速率要求。

        設(shè)計(jì)中的INT_BUF模塊負(fù)責(zé)對DDR3用戶數(shù)據(jù)的打包和緩存,實(shí)現(xiàn)時(shí)采用片上FIFO進(jìn)行緩存及實(shí)現(xiàn)跨時(shí)鐘域的處理,根據(jù)設(shè)計(jì)指標(biāo),片上FIFO的讀寫位寬為128位,深度為一幀圖像中的三行數(shù)據(jù)。

        系統(tǒng)上電后,進(jìn)入復(fù)位轉(zhuǎn)臺,復(fù)位完成后狀態(tài)機(jī)為IDLE狀態(tài),在該狀態(tài)下,等待上位機(jī)發(fā)送的讀寫指令。在空閑狀態(tài)下,圖像數(shù)據(jù)雖然實(shí)時(shí)采集,但是不進(jìn)入DDR3緩存,當(dāng)收到采集指令時(shí)通過LVDS協(xié)議區(qū)分?jǐn)?shù)據(jù)格式的開頭和結(jié)尾,對數(shù)據(jù)進(jìn)行讀取和傳輸。

        FPGA與TX2之間大容量數(shù)據(jù)傳輸設(shè)計(jì)原理如下:當(dāng)圖像數(shù)據(jù)采集開始,F(xiàn)PGA將接收到的圖像數(shù)據(jù)寫入DDR3中,并開始將DDR3中的數(shù)據(jù)轉(zhuǎn)存到DMA空間中,等待TX2發(fā)起讀數(shù)據(jù)請求。由于DDR3和FPGA的速度極高,而TX2是非實(shí)時(shí)操作系統(tǒng),所以在圖像數(shù)據(jù)的轉(zhuǎn)存系統(tǒng)設(shè)計(jì)過程中,要著重考慮兩者之間數(shù)據(jù)傳輸?shù)耐絾栴}。在進(jìn)行圖像數(shù)據(jù)傳輸過程中,F(xiàn)PGA應(yīng)時(shí)刻檢測當(dāng)前周期內(nèi)從DMA中讀出的數(shù)據(jù)是否已經(jīng)被TX2接收完畢,若未完成接收,則不能繼續(xù)將數(shù)據(jù)從DDR3寫入到DMA中,直到TX2完成數(shù)據(jù)接收存儲,才進(jìn)行DDR3下一周期的數(shù)據(jù)讀取。

        2)PCIE模塊:PCIE 總線從PCI總線演化而來,PCI總線使用層次式體系結(jié)構(gòu),通過PCI橋?qū)⒏缚偩€和子總線連接起來。PCIE總線是一種全新的串行總線技術(shù),可以實(shí)現(xiàn)全雙工點(diǎn)對點(diǎn)的傳輸。它徹底變革了PCI總線的并行技術(shù),克服了PCI總線在系統(tǒng)帶寬、傳輸速度等方面的固有缺陷[14]。PCIE總線的發(fā)展也是高速IO總線的過程,PCIE總線相比PCI總線具有以下特點(diǎn):PCIE總線在數(shù)據(jù)傳輸模式上,采用雙通道全雙工串行傳輸。一條PCIE通道包括一條發(fā)送通道,一條接收通道,速率可達(dá)到2.5 GB/s。同時(shí)針對不同通信帶寬的設(shè)備,PCIE可根據(jù)具體需求配置成×1、×2、×4、×8的并行通道。在軟件方面PCIE總線完全兼容PCI總線,驅(qū)動程序可直接一直到PCIE系統(tǒng)中。

        目前PCIE 總線憑著傳輸速率快、質(zhì)量高等特點(diǎn),逐漸取代PCI 總線占據(jù)高速數(shù)據(jù)總線的主導(dǎo)地位,在數(shù)據(jù)采集系統(tǒng)傳輸中發(fā)揮了極大的作用。

        PCIE 總線層次結(jié)構(gòu)如圖5所示,從圖中可以看到數(shù)據(jù)在PCIE總線接口傳輸過程。

        圖5 PCIE總線的層次結(jié)構(gòu)圖

        FPGA代碼設(shè)計(jì)過程中,常用的代碼設(shè)計(jì)技巧包括以下幾種:乒乓操作、串行信號并行化設(shè)計(jì)、流水線操作設(shè)計(jì)。合理的使用上述技巧可以提高代碼的可行性,節(jié)省FPGA資源,保證系統(tǒng)的魯棒性,此外還可以提高代碼的執(zhí)行效率以及穩(wěn)定定。

        乒乓操作是一種用來對高速數(shù)據(jù)流進(jìn)行處理的設(shè)計(jì)思想,它的基本思想就是一種以面積換取速度,從某種層面來看,乒乓操作可以看成一種比較特殊的串并轉(zhuǎn)換方式。乒乓操作實(shí)現(xiàn)的關(guān)鍵部分在于要保證不同通路間的數(shù)據(jù)處理是互斥的,使得輸入的數(shù)據(jù)流能夠按照一定的節(jié)拍,相互配合進(jìn)行切換,從而實(shí)現(xiàn)數(shù)據(jù)的無縫緩沖和處理[15]。

        本系統(tǒng)中FPGA通過GTX端口與TX2的PCIE接口進(jìn)行連接,GTX單個(gè)端口速率最高可達(dá)12.5 Gbps[16]。PCIE模塊采用Xilinx的IP核來實(shí)現(xiàn)PCIE物理層和傳輸層等相關(guān)的PCIE協(xié)議。根據(jù)協(xié)議,PCIE的節(jié)點(diǎn)分為Leagcy、Endpoint以及Root complex。根據(jù)設(shè)計(jì),在FPGA中實(shí)現(xiàn)的應(yīng)該為Endpoint類型,所以設(shè)置IP核工作在Endpoint模式[2]。上電后TX2要完成對EP端的遍歷和配置,根據(jù)協(xié)議規(guī)范,在EP模式下,配置空間為type0模式,新的PCIE規(guī)定配置空間的大小為4 KB,前256字節(jié)保持與以往PCIE協(xié)議兼容。

        上電后TX2完成對作為EP端的FPGA PCIE外設(shè)的內(nèi)存映射,為該節(jié)點(diǎn)分配相應(yīng)大小的內(nèi)存。配置IP核的所需空間為128 MB,該信息被記錄在BAR0寄存器中,上電后TX2遍歷找到該EP后讀取該EP內(nèi)的BAR0寄存器,譯碼后獲得所需的內(nèi)存的128 MB,然后TX2為其分配相應(yīng)的存儲空間。設(shè)計(jì)中分配對應(yīng)的起始地址開始的128個(gè)連續(xù)地址為控制寄存器區(qū),TX2通過向該地址區(qū)域?qū)懭霐?shù)據(jù)來配置寄存器的值,更改相關(guān)的工作模式。數(shù)據(jù)傳輸時(shí)采用DMA傳輸機(jī)制配合乒乓操作進(jìn)行圖像數(shù)據(jù)傳輸,首先在PCIE空間開辟兩塊內(nèi)存,分別是內(nèi)存塊1和內(nèi)存塊2,當(dāng)?shù)谝粠瑘D像傳輸時(shí),TX2配置對應(yīng)地址寄存器,告知FPGA本次所需傳輸數(shù)據(jù)的大小以及要寫入的內(nèi)存塊1起始地址后,F(xiàn)PGA自動進(jìn)行數(shù)據(jù)打包和傳輸;當(dāng)?shù)诙瑘D像傳輸時(shí),TX2配置對應(yīng)地址寄存器,告知FPGA本次所需傳輸數(shù)據(jù)的大小以及要寫入的內(nèi)存塊2起始地址后,F(xiàn)PGA自動進(jìn)行數(shù)據(jù)打包和傳輸。將傳輸完成后進(jìn)入等待模式。

        3)SPI模塊:設(shè)備預(yù)留有SPI接口,通過該接口對外設(shè)進(jìn)行控制,SPI接口的時(shí)序如圖6所示。

        圖6 SPI時(shí)序圖

        SPI接口的碼速率為1 Mbps,時(shí)鐘上升沿對準(zhǔn)數(shù)據(jù)中間,數(shù)據(jù)高位在前低位在后,數(shù)據(jù)長度為16 bit。

        4)LVDS模塊:LVDS是一種低擺幅的差分信號技術(shù),采用一對差分線實(shí)現(xiàn)高速信號傳輸,使信號能在差分PCB線對或平衡電纜上以幾百M(fèi)B/s的速率傳輸[17]。設(shè)計(jì)中采用了低至400 mV的電壓擺幅和大約3.5 mA的低電流驅(qū)動輸出,加之差分對線的共模抑制功能,LVDS具有低噪聲和低功耗的優(yōu)點(diǎn)[18]。

        LVDS數(shù)據(jù)發(fā)送和接收均采用三線制同步接口,包括三種信號:門控、時(shí)鐘和數(shù)據(jù),時(shí)鐘頻率可設(shè)置,且時(shí)鐘連續(xù)不間斷。發(fā)送端門控和數(shù)據(jù)信號的邊沿均與時(shí)鐘信號的上升沿對齊,接收方在時(shí)鐘的下降沿讀取數(shù)據(jù)。時(shí)序圖和時(shí)間關(guān)系如圖7所示,時(shí)鐘上升沿與數(shù)據(jù)之間的延時(shí)為4 ns。接口特點(diǎn)為:

        圖7 LVDS時(shí)序圖

        1)門控信號低電平有效,一個(gè)有效門控內(nèi)的數(shù)據(jù)定義為一幀;

        2)門控信號下降沿到來時(shí)開始傳送數(shù)據(jù);高位先輸出、低位后輸出;

        3)時(shí)鐘占空比:45%~55%。

        3.1.2 TX2驅(qū)動程序設(shè)計(jì)

        TX2自帶的Linux系統(tǒng)中已經(jīng)編寫了SPI驅(qū)動和UART驅(qū)動,因此只需對PCIE驅(qū)動程序進(jìn)行設(shè)計(jì)。

        PCIE驅(qū)動程序需要對PCIE 配置空間進(jìn)行讀寫操作。驅(qū)動程序通過PCIE的配置空間與硬件進(jìn)行通信,通信的過程中一般需要讀取設(shè)備ID、廠商ID以及PCI 類設(shè)備三個(gè)寄存器,完成匹配后再對基地址寄存器0(BAR0)進(jìn)行操作。PCIE 配置空間可以將PCI 配置空間完全兼容,PCI配置空間如圖8所示[19],包含由16個(gè)雙字組成的PCI 頭標(biāo)區(qū),和由18個(gè)雙字組成的PCI 設(shè)備寄存器。PCIE空間在PCI空間的基礎(chǔ)上增加了960雙字的配置空間,并在PCI的基礎(chǔ)上增加了PCIE 的高級錯誤報(bào)告、虛通道、電源預(yù)算以及設(shè)備序列號等功能[20]。

        圖8 PCIE配置空間示意圖

        系統(tǒng)中TX2操作系統(tǒng)使用Linux 操作系統(tǒng),首先在內(nèi)存中開辟兩塊DMA 緩沖區(qū)用來完成底層硬件內(nèi)存與TX2應(yīng)用程序之間數(shù)據(jù)的傳輸,DMA緩沖區(qū)在PCIE底層硬件TX2應(yīng)用程序之間相當(dāng)于橋梁。FPGA將數(shù)據(jù)發(fā)送到TX2的PCIE接口,PCIE驅(qū)動程序?qū)?shù)據(jù)存放到DMA緩沖區(qū),通過MSI(message signaled interrupt)中斷機(jī)制通知TX2應(yīng)用程序?qū)?shù)據(jù)進(jìn)行操作。PCIE驅(qū)動程序的總體流程如圖9所示,系統(tǒng)硬件啟動后,TX2在加載驅(qū)動程序時(shí),首先會在驅(qū)動程序入口對PCIE硬件檢測,檢測到PCIE設(shè)備后,對驅(qū)動程序進(jìn)行初始化,主要包括以下步驟:使能PCIE設(shè)備、使能PCIE總線主設(shè)備、讀取EP設(shè)備號、申請IO內(nèi)存區(qū)域、虛擬內(nèi)存映射、使能MSI中斷、申請DMA 緩沖區(qū)以及注冊字符設(shè)備等[4]。在上述步驟完成后,還需要對中斷進(jìn)行處理,以及在IO操作中實(shí)現(xiàn)對DMA緩沖區(qū)的讀寫。完成數(shù)據(jù)傳輸后,需要應(yīng)在卸載驅(qū)動前將申請的內(nèi)存空間進(jìn)行釋放。

        圖9 PCIE驅(qū)動程序流程圖

        PCIE驅(qū)動程序的具體操作流程如下:

        1)打開以及關(guān)閉PCI設(shè)備。驅(qū)動程序中首先要做的是使能PCI設(shè)備,只有完成該步驟后,驅(qū)動程序才能夠訪問設(shè)備IO內(nèi)存和中斷。調(diào)用pci_enable_device()函數(shù),該函數(shù)會將PCI配置空間中命令區(qū)域中最低兩位置為1。當(dāng)PCIE驅(qū)動程序完成任務(wù)后,會調(diào)用關(guān)閉PCI設(shè)備函數(shù)pci_disable_device()。該函數(shù)會將PCI配置空間中命令區(qū)域中最低兩位置為0。

        2)申請PCIE IO資源和內(nèi)存資源,并在程序使用完成后進(jìn)行資源釋放。

        首先獲取IO資源的基地址以及長度。

        sc -> bar0_addr = pci_resource_start(pdev, 0); //獲取PCIE BAR0空間基地址

        sc -> bar0_len = pci_resource_len(pdev, 0); //獲取PCIE BAR0內(nèi)存大小

        將驅(qū)動程序中申請的IO資源通過ioremap函數(shù)將IO資源映射到虛擬地址。

        error = pci_request_regions(pdev, sc -> name); //申請IO內(nèi)存區(qū)域

        sc->bar0 = ioremap(sc ->bar0_addr, sc -> bar0_len); //將BAR0空間的IO內(nèi)存映射為內(nèi)核可用的虛擬內(nèi)存

        pci_release_regions(pdev); //程序最后釋放IO 資源

        iounmap(sc->bar0); //取消IO 資源映射

        3)將TX2端設(shè)置為總線主設(shè)備模式。將PCI命令寄存器中的總線主設(shè)備位設(shè)置為1,在該模式下,設(shè)備可實(shí)時(shí)獲得總線占有權(quán),處于DMA模式下。

        pci_set_master(pdev); //設(shè)置PCIE總線主設(shè)備模式

        4)使能、請求MSI中斷以及禁止、釋放MSI中斷[7]。PCIE中通MSI包進(jìn)行中斷響應(yīng)。調(diào)用pci_enable_msi(dev)函數(shù)使能中斷。然后調(diào)用request_irq(dev -> irq,intrpt_handler,IRQF_SHARED,sc -> name,sc)函數(shù)綁定中斷響應(yīng)函數(shù)。

        當(dāng)驅(qū)動程序釋放時(shí)關(guān)閉MSI中斷,并將中斷釋放。

        pci_disable_msi(pdev); //關(guān)閉MSI 中斷

        free_irq(pdev ->irq, NULL); //釋放中斷

        5)申請與釋放DMA 緩沖區(qū)[6]。調(diào)用Linux系統(tǒng)中的內(nèi)核函數(shù)pci_alloc_consistent申請DMA緩沖區(qū),通過這種方式獲得的DMA緩沖區(qū)可以保證數(shù)據(jù)的一致性。主設(shè)備申請DMA緩沖區(qū)后,主設(shè)備和從設(shè)備均可以訪問DMA緩沖區(qū)。

        nzy_read_vir = pci_alloc_consistent(pdev, BUF_SIZE, &(nzy_read_phy)); //分配DMA緩沖區(qū)

        pci_free_consistent(pdev, BUF_SIZE, sc -> dma_read_vir, sc -> dma_read_phy); //釋放DMA緩沖區(qū)

        6)文件操作:完成上述PCIE驅(qū)動相關(guān)工作后,通過file_operation結(jié)構(gòu)體設(shè)置字符設(shè)備驅(qū)動程序設(shè)計(jì)的主體內(nèi)容,包括open()、write()、read()、close()等函數(shù)。open()函數(shù)用于打開字符設(shè)備;write()/read()函數(shù)實(shí)現(xiàn)對字符設(shè)備讀/寫操作;ioctl()控制字符設(shè)備函數(shù),對DMA寄存器讀寫操作;release()函數(shù)用于關(guān)閉設(shè)備。

        static const struct file_operations fpga_fops = {

        .owner = THIS_MODULE,

        .unlocked_ioctl = fpga_ioctl,

        .fasync = fpga_fasync, //向應(yīng)用提供驅(qū)動異步通知響應(yīng)

        .mmap = my_mmap //將物理地址映射到應(yīng)用空間虛擬地址

        };

        7)DMA操作:本系統(tǒng)中傳輸?shù)膱D像數(shù)據(jù)量大、傳輸速度快,為了實(shí)現(xiàn)數(shù)據(jù)的完整性,采用DMA的方式對圖像數(shù)據(jù)進(jìn)行傳輸。DMA 傳輸?shù)倪^程中,處理器可以進(jìn)行其他操作,提高了系統(tǒng)的性能。此外DMA是直接內(nèi)存讀寫操作,相比于處理器讀寫速度更快。

        DMA讀操作流程如圖10所示。DMA傳輸時(shí)需要將DMA塊的起始地址、要傳輸?shù)臄?shù)據(jù)塊長度以及數(shù)據(jù)傳輸啟動指令發(fā)送給FPGA端。FPGA收到啟動指令后,將相機(jī)數(shù)據(jù)存放到DMA緩沖區(qū)內(nèi),當(dāng)傳輸完成后,F(xiàn)PGA發(fā)送MSI中斷信息,TX2收到中斷信號后進(jìn)去到驅(qū)動中的中斷函數(shù),中斷函數(shù)中SIGIO信號觸發(fā)應(yīng)用程序中斷,進(jìn)而應(yīng)用程序?qū)?shù)據(jù)進(jìn)行存儲。

        圖10 DMA操作流程圖

        部分代碼如下:

        write_reg(fpgas[io.id], DMA_READ_LOW, ((fpgas[io.id] -> dma_read_phy) + BUF_SIZE/2)); //將地址寫入DMA寫的低32位地址

        write_reg(fpgas[io.id], DMA_READ_HIGH, 0); //DMA寫的高32位不使用

        write_reg(fpgas[io.id], DMA_READ_SIZE, io.len); //DMA要寫的大小寫到寄存器中

        write_reg(fpgas[io.id], DMA_READ_ENABLE, 1);

        static irqreturn_t intrpt_handler(int irq, void *dev_id) //中斷處理函數(shù)

        {

        kill_fasync(&dma_async, SIGIO, POLL_IN); //read mem data

        return IRQ_HANDLED;

        }

        8)處理硬件中斷:在中斷函數(shù)中,通過kill_fasync函數(shù)將中斷信號發(fā)送給應(yīng)用程序。

        kill_fasync(&dma_async, SIGIO, POLL_IN);

        3.1.3 TX2應(yīng)用程序設(shè)計(jì)

        1)主程序:主程序中通過open()、read()、write()等函數(shù)接口去調(diào)用內(nèi)核空間的相應(yīng)驅(qū)動函數(shù)對設(shè)備進(jìn)行操作。設(shè)計(jì)中要求使用PCIE進(jìn)行大數(shù)據(jù)傳輸,在應(yīng)用程序中需要指定要讀寫的數(shù)據(jù)量RW_TIME。以接收為例,首先打開要寫入的文件,判斷當(dāng)前寫次數(shù)的奇數(shù)次還是偶數(shù)次,分別不同的內(nèi)存塊中將數(shù)據(jù)寫入文件。應(yīng)用程序部分代碼如下:

        FILE* fp = fopen(tSaveFileInfo.LocalFile, "a+"); //打開存盤數(shù)據(jù)文件

        fpga = (fpga_t *)malloc(sizeof(fpga_t)); //分配內(nèi)存

        fpga->fd = open("/dev/"DEVICE_NAME, O_RDWR | O_SYNC); //打開設(shè)備文件

        ioctl(fpga -> fd, IOCTL_FILL_COPY, 0xBB); //啟動DMA數(shù)據(jù)傳輸

        fseek(fp, 0, SEEK_END);close(fd); //關(guān)閉設(shè)備

        fclose(fp);//關(guān)閉存盤文件

        在本系統(tǒng)中,應(yīng)用程序與驅(qū)動程序之間的通信主要包括以下幾個(gè)方面:

        (1)在應(yīng)用程序中使用open()函數(shù)打開設(shè)備文件,對應(yīng)到底層驅(qū)動是打開PCIE設(shè)備。

        (2)通過ioctl()函數(shù)調(diào)用驅(qū)動層的ioctl()函數(shù)實(shí)現(xiàn)與PCIE的數(shù)據(jù)讀寫。

        (3)通過close()函數(shù)關(guān)閉設(shè)備文件。

        2)中斷程序:在應(yīng)用程序中,使用Signal函數(shù)將驅(qū)動層中斷信號傳輸?shù)綉?yīng)用層。

        signal(SIGIO, vSigHandleFunc);

        在中斷處理函數(shù)中首先判斷當(dāng)前接收中斷的次數(shù),如果是奇數(shù)次則從DMA緩存的上半?yún)^(qū)讀取數(shù)據(jù),如果是偶數(shù)次則從DMA緩存的下班去讀取數(shù)據(jù)。并將讀取到的數(shù)據(jù)寫入到文件中

        ioctl(fpga -> fd, IOCTL_FILL_COPY, 0xBB); //從DMA緩存的上半?yún)^(qū)讀取數(shù)據(jù)

        fseek(fp, 0, SEEK_END);

        fwrite(pRead, 1, VIR_ADDR_SIZE/2, fp);

        4 實(shí)驗(yàn)結(jié)果與分析

        測試環(huán)境及條件:

        1)燒寫固化FPGA程序;

        2)TX2預(yù)先安裝好Ubuntu操作系統(tǒng);

        3)將系統(tǒng)通過LVDS接口連接相機(jī),相機(jī)幀頻100 Hz,像素?cái)?shù)為640×512,單像素?cái)?shù)采樣為14位將系統(tǒng)SATA接口連接固態(tài)硬盤;

        測試步驟及測試項(xiàng)目:

        1)給板卡上電后,電源指示燈點(diǎn)亮,運(yùn)行sudo insmod *.ko 加載PCIE驅(qū)動,驅(qū)動正常加載后終端輸出如圖11所示,并加載PCIE驅(qū)動程序;

        圖11 驅(qū)動加載

        2)運(yùn)行TX2端應(yīng)用程序;

        3)打開相機(jī),系統(tǒng)接收相機(jī)數(shù)據(jù)并將數(shù)據(jù)存儲到固態(tài)硬盤中;

        4)讀取固態(tài)硬盤中存儲的相機(jī)數(shù)據(jù)并對圖像幀計(jì)數(shù)進(jìn)行判斷有無丟失數(shù)據(jù)情況。

        通過測試發(fā)現(xiàn),當(dāng)相機(jī)以437.5 Mbps的速率傳輸數(shù)據(jù)時(shí),系統(tǒng)可以完整接收相機(jī)數(shù)據(jù),數(shù)據(jù)完整無丟失情況,

        5 結(jié)束語

        本項(xiàng)目采用了新型的處理架構(gòu)進(jìn)行圖像采集存儲,并開展了相應(yīng)的軟硬件設(shè)計(jì)。該系統(tǒng)采用FPGA+GPU的形式,采用PCIE總線實(shí)現(xiàn)FPGA與GPU之間的高速通信,實(shí)現(xiàn)了高速數(shù)據(jù)傳輸。系統(tǒng)體積小,可應(yīng)用多種平臺。為后續(xù)的圖像智能處理提供了硬件以及底層基礎(chǔ)。

        猜你喜歡
        設(shè)備系統(tǒng)
        諧響應(yīng)分析在設(shè)備減振中的應(yīng)用
        Smartflower POP 一體式光伏系統(tǒng)
        WJ-700無人機(jī)系統(tǒng)
        ZC系列無人機(jī)遙感系統(tǒng)
        北京測繪(2020年12期)2020-12-29 01:33:58
        基于PowerPC+FPGA顯示系統(tǒng)
        半沸制皂系統(tǒng)(下)
        基于VB6.0+Access2010開發(fā)的設(shè)備管理信息系統(tǒng)
        基于MPU6050簡單控制設(shè)備
        電子制作(2018年11期)2018-08-04 03:26:08
        連通與提升系統(tǒng)的最后一塊拼圖 Audiolab 傲立 M-DAC mini
        500kV輸變電設(shè)備運(yùn)行維護(hù)探討
        亚洲深夜福利| 啦啦啦中文在线观看日本| 中国熟妇人妻xxxxx| 亚洲AV毛片无码成人区httP | 亚洲欧洲精品无码av| 亚洲成在人线久久综合| 日本一区二区三区看片 | 精品无码一区二区三区亚洲桃色| 在线观看av国产自拍| 免费视频一区二区三区美女| 少妇无码av无码专线区大牛影院| 欧美人与动牲猛交xxxxbbbb| 天天干夜夜躁| 国产亚洲精品免费专线视频| 亚洲女同恋av中文一区二区| 艳z门照片无码av| 最新四色米奇影视777在线看| 久久久婷婷综合五月天| 日韩精品乱码中文字幕| 国产伦理一区二区| 亚洲欧洲日本精品| 日韩一二三四区免费观看 | 日本视频二区在线观看| 国产精品无码av天天爽| 国产最新一区二区三区天堂| 国产成av人在线观看| 国产又黄又硬又粗| 永久免费av无码网站性色av| 人妻中文字幕不卡精品| 亚洲一区第二区三区四区| 午夜福利av无码一区二区| 亚洲国产精品sss在线观看av| 91福利国产在线观看网站| 国产人妖视频一区二区| 在线看片免费人成视频电影| 五月天激情综合网| 色婷婷精品国产一区二区三区 | 日韩av一区在线播放| 国产精品视频自拍在线| 少妇放荡的呻吟干柴烈火动漫| 日韩av一区二区毛片|