一種模擬數(shù)據(jù)源的圖像采集裝置和方法
【專利摘要】本申請公開了一種模擬數(shù)據(jù)源的圖像采集裝置和方法,包括:相機(jī)和上位機(jī)、相機(jī)控制模塊、模擬數(shù)據(jù)源模塊、采集控制模塊、數(shù)據(jù)包讀寫控制模塊、數(shù)據(jù)包緩存fifo模塊、DMA接口fifo模塊、DMA控制器模塊、PCIE協(xié)議模塊。利用本發(fā)明技術(shù)方案既可以實(shí)現(xiàn)CameraLink接口的外接工業(yè)相機(jī)的高速數(shù)據(jù)采集,也可通過軟件來配置采集卡內(nèi)部的模擬數(shù)據(jù)源模塊,實(shí)現(xiàn)FPGA內(nèi)部數(shù)據(jù)源的采集。另外,實(shí)現(xiàn)了一種DMA傳輸管理的算法,提高了DMA傳輸?shù)倪B續(xù)性,從而提高了傳輸帶寬。借助于本發(fā)明的上述技術(shù)方案,可以將高速相機(jī)和片內(nèi)模擬數(shù)據(jù)源產(chǎn)生的高速率數(shù)據(jù)實(shí)時(shí)采集到上位機(jī)中,win7環(huán)境下數(shù)據(jù)傳輸帶寬達(dá)1000MB/S。
【專利說明】
一種模擬數(shù)據(jù)源的圖像采集裝置和方法
技術(shù)領(lǐng)域
[0001]本申請屬于圖像采集領(lǐng)域,特別是涉及一種模擬數(shù)據(jù)源的圖像采集裝置和方法
【背景技術(shù)】
[0002]圖像采集卡,一般是一種用于將數(shù)字相機(jī)的數(shù)字圖像信號實(shí)時(shí)采集到上位機(jī)的電路板卡。為了滿足高分辨率、高幀率圖像的實(shí)時(shí)采集,采集卡一般通過內(nèi)置的DMA控制器與上位機(jī)內(nèi)存通過pcie進(jìn)行高速數(shù)據(jù)傳輸。目前技術(shù)中,為了便于硬件升級和維護(hù),圖像采集卡的主控芯片大都采用FPGA實(shí)現(xiàn),而工業(yè)相機(jī)的數(shù)據(jù)帶寬一般在500MB/S以上,因此對FPGA的采集和傳輸?shù)倪壿嬰娐吩O(shè)計(jì)和對應(yīng)的驅(qū)動(dòng)程序要求很高。
[0003]為了提高數(shù)據(jù)傳輸帶寬,硬件上,采集卡和上位機(jī)一般采用PCIE通信。如圖1所示,其為一種典型的基于FPGA的圖像采集卡結(jié)構(gòu)框圖。其中,F(xiàn)PGA內(nèi)部一般包括前端采集控制模塊、DMA控制器模塊和PCIE協(xié)議模塊。CMOS相機(jī)數(shù)據(jù)經(jīng)過Camera Link接口進(jìn)入FPGA的采集控制模塊,然后DMA控制器將數(shù)據(jù)封裝到PCIE事務(wù)包(TLP)中,根據(jù)PCIE規(guī)范,采集卡向PC機(jī)發(fā)送存儲器寫請求事務(wù)TLP,PC內(nèi)存控制器收到后將TLP中的數(shù)據(jù)存入指定內(nèi)存地址中。
[0004]軟件上,采集卡作為PC系統(tǒng)的一種外設(shè)需要相應(yīng)的驅(qū)動(dòng)程序。由于采集卡與PC機(jī)的數(shù)據(jù)傳輸由DMA控制器控制,因此windows驅(qū)動(dòng)程序?qū)MA引擎的控制和管理很關(guān)鍵。如圖2所示,其為一種典型的基于微軟WDF驅(qū)動(dòng)開發(fā)模型的DMA驅(qū)動(dòng)架構(gòu)。階段101中,創(chuàng)建并初始化驅(qū)動(dòng)對象,然后申請公共緩沖;階段102中,當(dāng)上層發(fā)出1請求后,驅(qū)動(dòng)創(chuàng)建并初始化DMA事務(wù)對象并執(zhí)行DMA事務(wù),一次DMA傳輸事務(wù)表示應(yīng)用程序緩沖區(qū)完成的一次接收,如果應(yīng)用程序緩沖區(qū)比較大,而硬件支持的傳輸單位比較小,則一次DMA傳輸事務(wù)需要硬件上的多次傳輸才能完成;階段103中,對設(shè)備DMA傳輸相關(guān)的寄存器如源地址、目的地址、傳輸長度等進(jìn)行編程,再開啟設(shè)備傳輸。每完成一次傳輸,向CPU提交一次中斷,在中斷DPC(延遲過程調(diào)用)中判斷DMA事務(wù)是否結(jié)束。之后循環(huán)執(zhí)行階段103直到DMA事務(wù)結(jié)束。
[0005]上述現(xiàn)有技術(shù)存在三個(gè)問題:一、采集卡自身不帶數(shù)據(jù)源,必須通過外部相機(jī)提供數(shù)據(jù),不方便系統(tǒng)的采集傳輸測試;二、對于驅(qū)動(dòng)程序,當(dāng)用戶緩沖區(qū)比較大時(shí),由于設(shè)備與主機(jī)的每次傳輸?shù)臄?shù)據(jù)量大小是固定的,具體取決于windows內(nèi)map寄存器的個(gè)數(shù)和應(yīng)用層接收緩沖的大小。那么每完成一次DMA事務(wù)可能需要多次硬件傳輸,這意味著每完成一次用戶緩沖區(qū)的接收,需要多次對DMA寄存器編程,設(shè)置新的目的地址,再次開啟傳輸。這降低了 DMA的傳輸帶寬。三、每完成一次DMA傳輸事務(wù),需等待應(yīng)用程序處理完接收到的數(shù)據(jù)后,才重新編程DMA寄存器,開啟下一次DMA傳輸事務(wù),從而造成了 DMA傳輸帶寬的浪費(fèi)。
【發(fā)明內(nèi)容】
[0006]本發(fā)明的目的在于提供一種模擬數(shù)據(jù)源的圖像采集裝置和方法,以克服現(xiàn)有技術(shù)中的不足。
[0007]為實(shí)現(xiàn)上述目的,本發(fā)明提供如下技術(shù)方案:
[0008]本申請實(shí)施例公開了一種模擬數(shù)據(jù)源的圖像采集裝置,包括:
[0009]相機(jī)和上位機(jī);
[0010]相機(jī)控制模塊,通過Xilinx的Picoblaze嵌入式軟核微控制器和Uart軟核實(shí)現(xiàn)上位機(jī)和相機(jī)的串行通信,用來控制相機(jī)內(nèi)部參數(shù);
[0011]模擬數(shù)據(jù)源模塊,在上位機(jī)軟件的控制下可產(chǎn)生加I模式、豎條紋模式、橫條紋模式和棋盤模式圖像;
[0012]采集控制模塊,在上位機(jī)軟件的控制下采集指定的數(shù)據(jù)源的數(shù)據(jù),同時(shí)根據(jù)用戶指令決定是否加入圖像幀頭;
[0013]數(shù)據(jù)包讀寫控制模塊,從采集控制模塊的輸出fifo中讀出一個(gè)數(shù)據(jù)包,將其緩存到數(shù)據(jù)包緩存fifo模塊中,再從數(shù)據(jù)包緩存fifo模塊中把數(shù)據(jù)轉(zhuǎn)化為DMA規(guī)定的格式輸入到DMA接口 fifo模塊中;
[0014]數(shù)據(jù)包緩存fifo模塊;
[0015]DMA 接口 fifo 模塊;
[0016]DMA控制器模塊,把DMA接口 fifo模塊中的數(shù)據(jù)封裝為存儲器寫請求事務(wù)TLP,然后通過PCIE協(xié)議模塊發(fā)送給上位機(jī),最終傳輸?shù)街付ǖ膬?nèi)存處;
[0017]PCIE協(xié)議模塊。
[0018]優(yōu)選的,在上述的模擬數(shù)據(jù)源的圖像采集裝置中,所述DMA控制器模塊和PCIE協(xié)議模塊分別采用了 NorthWest和Xilinx的IP核。
[0019]優(yōu)選的,在上述的模擬數(shù)據(jù)源的圖像采集裝置中,所述DMA控制器模塊包括:
[0020]C2S傳輸通道:數(shù)據(jù)從設(shè)備傳往host機(jī);
[0021 ] S2C傳輸通道:數(shù)據(jù)從host機(jī)傳往設(shè)備;
[0022]描述符處理邏輯:獲取保存于host機(jī)中的描述符并根據(jù)描述符內(nèi)部字段執(zhí)行對應(yīng)的數(shù)據(jù)傳輸;
[0023]控制寄存器:驅(qū)動(dòng)程序通過控制寄存器控制DMA。
[0024]優(yōu)選的,在上述的模擬數(shù)據(jù)源的圖像采集裝置中,所述上位機(jī)的驅(qū)動(dòng)模塊包括:
[0025]用戶緩沖區(qū)映射模塊,負(fù)責(zé)獲得用戶接收緩沖的物理頁地址;
[0026]DMA描述符初始化模塊,構(gòu)建一個(gè)環(huán)形DMA描述符鏈表,并初始化每個(gè)描述符;
[0027]單packet接收模塊和單packet接收DPC模塊,負(fù)責(zé)處理上層發(fā)過來的單數(shù)據(jù)包接收請求。
[0028]優(yōu)選的,在上述的模擬數(shù)據(jù)源的圖像采集裝置中,所述上位機(jī)的驅(qū)動(dòng)模塊還包括單packet接收模塊,其工作流程包括:
[0029]步驟501中,判斷當(dāng)前請求是否第一個(gè)請求,如果是第一個(gè)請求,就進(jìn)入步驟502,否則調(diào)用歸還描述符過程,進(jìn)入步驟504 ;
[0030]步驟502中,將請求插入鏈表,進(jìn)入步驟503 ;
[0031]步驟503中,排隊(duì)一次中斷DPC函數(shù),然后結(jié)束;
[0032]步驟504中,設(shè)內(nèi)部變量Token:上次接收到的packet的第一個(gè)描述符號,判斷Token是否和pTailDesc指向描述符的下一個(gè)描述符號相等,相等則進(jìn)入步驟505,不等則進(jìn)入步驟508 ;
[0033]步驟505中,標(biāo)記上次packet對應(yīng)描述符為Do,進(jìn)入步驟506 ;
[0034]步驟506中,將緊鄰的Uf標(biāo)記的描述符標(biāo)記為Do,進(jìn)入步驟507 ;
[0035]步驟507中,移動(dòng)pTailDesc指針,更新設(shè)備寄存器,然后返回主調(diào)函數(shù);
[0036]步驟508中,標(biāo)記上次packet對應(yīng)描述符為Uf,然后返回主調(diào)函數(shù)。
[0037]優(yōu)選的,在上述的模擬數(shù)據(jù)源的圖像采集裝置中,所述上位機(jī)的驅(qū)動(dòng)模塊還包括單packet接收DPC模塊,其工作流程包括:
[0038]步驟601中,判斷請求鏈表是否空,非空則進(jìn)入步驟602,空則直接退出;
[0039]步驟602中,從pNextDesc處查找I個(gè)完成的packet,查找成功則進(jìn)入步驟603,否則直接退出;
[0040]步驟603中,從請求鏈表取出表頭請求,然后進(jìn)入步驟604 ;
[0041]步驟604中,標(biāo)記該packet為Uo,并且將本packet的長度、起始描述符號、結(jié)束描述符號和歸還令牌號填入PacketReceive結(jié)構(gòu)中,然后進(jìn)入步驟605 ;
[0042]步驟605中,驅(qū)動(dòng)完成該請求并且將PacketReceive結(jié)構(gòu)返回應(yīng)用層,然后結(jié)束。
[0043]本申請實(shí)施例還公開了一種模擬數(shù)據(jù)源模塊的控制方法,包括:
[0044]狀態(tài)201,模塊加載特定模式的像素初值,等待若干周期結(jié)束后,進(jìn)入狀態(tài)202 ;
[0045]狀態(tài)202,模塊拉高幀有效輸出信號,保持若干周期后,進(jìn)入狀態(tài)203 ;
[0046]狀態(tài)203,模塊拉高行有效輸出信號,同時(shí)輸出特定模式的數(shù)據(jù),同時(shí)判斷當(dāng)前幀是否結(jié)束和當(dāng)前行是否結(jié)束,若當(dāng)前行結(jié)束,則進(jìn)入狀態(tài)204預(yù)置下一行特定模式的像素初值,然后回到狀態(tài)203,若當(dāng)前幀結(jié)束,則進(jìn)入狀態(tài)205預(yù)置下一幀特定模式的像素初值,然后回到狀態(tài)201 ;
[0047]狀態(tài)204,預(yù)置下一行特定模式的像素初值;
[0048]狀態(tài)205,預(yù)置下一幀特定模式的像素初值。
[0049]本申請實(shí)施例還公開了一種采集控制模塊的控制方法,包括:
[0050]復(fù)位后模塊首先進(jìn)入空閑狀態(tài)301,然后等待上一幀結(jié)束信號和采集允許信號,當(dāng)采集允許并且上一幀結(jié)束時(shí),模塊進(jìn)入302狀態(tài);
[0051]狀態(tài)302中,模塊判斷幀有效和幀頭允許信號,當(dāng)幀有效并允許幀頭,則進(jìn)入狀態(tài)303 ;當(dāng)幀有效不允許幀頭,則進(jìn)入狀態(tài)304 ;
[0052]狀態(tài)303中,模塊產(chǎn)生幀頭數(shù)據(jù),并存入輸出fifo中;
[0053]狀態(tài)304中,將三路圖像數(shù)據(jù)緩存入3個(gè)輸入fifo中,然后判斷輸入fifo中是否積累到足夠數(shù)據(jù),當(dāng)每一路fifo中都超過4個(gè)周期數(shù)據(jù)時(shí),數(shù)據(jù)準(zhǔn)備好,進(jìn)入305狀態(tài);
[0054]305狀態(tài)中,從3路輸入fifo中連續(xù)讀出4次數(shù)據(jù),拼接數(shù)據(jù),并存入輸出fifo中,然后判斷當(dāng)前幀是否結(jié)束,若沒結(jié)束,則回到狀態(tài)305 ;若幀結(jié)束,則進(jìn)入狀態(tài)306 ;
[0055]狀態(tài)306中,改變幀頭信息,將當(dāng)前幀號字段加1,然后回到狀態(tài)302。
[0056]本申請實(shí)施例還公開了一種數(shù)據(jù)包讀寫控制模塊的控制方法,包括:
[0057]復(fù)位后模塊首先進(jìn)入空閑狀態(tài)501,當(dāng)前端數(shù)據(jù)準(zhǔn)備好時(shí)進(jìn)入狀態(tài)502 ;
[0058]狀態(tài)502中,從前端的采集控制模塊的輸出fifo中讀取16KB數(shù)據(jù)緩存到后端的緩存fifo中,當(dāng)存完16KB時(shí),進(jìn)入狀態(tài)503 ;
[0059]狀態(tài)503中,讀取緩存fifo中的數(shù)據(jù)并進(jìn)行數(shù)據(jù)格式轉(zhuǎn)化,當(dāng)16KB數(shù)據(jù)傳輸完畢后,回到狀態(tài)502中。
[0060]與現(xiàn)有技術(shù)相比,本發(fā)明的優(yōu)點(diǎn)在于:利用本發(fā)明技術(shù)方案既可以實(shí)現(xiàn)CameraLink接口的外接工業(yè)相機(jī)的高速數(shù)據(jù)采集,也可通過軟件來配置采集卡內(nèi)部的模擬數(shù)據(jù)源模塊,實(shí)現(xiàn)FPGA內(nèi)部數(shù)據(jù)源的采集。另外,實(shí)現(xiàn)了一種DMA傳輸管理的算法,提高了 DMA傳輸?shù)倪B續(xù)性,從而提高了傳輸帶寬。借助于本發(fā)明的上述技術(shù)方案,可以將高速相機(jī)和片內(nèi)模擬數(shù)據(jù)源產(chǎn)生的高速率數(shù)據(jù)實(shí)時(shí)采集到上位機(jī)中,win7環(huán)境下數(shù)據(jù)傳輸帶寬達(dá)1000MB/S。
【附圖說明】
[0061]為了更清楚地說明本申請實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本申請中記載的一些實(shí)施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
[0062]圖1是現(xiàn)有技術(shù)中一種典型的基于FPGA的圖像采集卡結(jié)構(gòu)框圖;
[0063]圖2是現(xiàn)有技術(shù)中一種典型的基于WDK的DMA驅(qū)動(dòng)程序結(jié)構(gòu)框圖;
[0064]圖3是本發(fā)明具體實(shí)施例中的采集裝置硬件結(jié)構(gòu)框圖;
[0065]圖4是本發(fā)明具體實(shí)施例中的采集卡驅(qū)動(dòng)程序結(jié)構(gòu)框圖;
[0066]圖5是本發(fā)明具體實(shí)施例中DMA控制器模塊的內(nèi)部結(jié)構(gòu)圖和描述符結(jié)構(gòu)圖;
[0067]圖6是本發(fā)明具體實(shí)施例中的采集卡中模擬數(shù)據(jù)源的控制狀態(tài)圖;
[0068]圖7是本發(fā)明具體實(shí)施例中的采集卡中采集控制模塊的控制狀態(tài)圖;
[0069]圖8是本發(fā)明具體實(shí)施例中的采集卡中采用的DMA控制器IP核所要求的數(shù)據(jù)接口時(shí)序圖;
[0070]圖9是本發(fā)明具體實(shí)施例中的采集卡中數(shù)據(jù)包讀寫控制模塊的控制狀態(tài)圖;
[0071]圖10是本發(fā)明具體實(shí)施例中的驅(qū)動(dòng)程序中DMA描述符內(nèi)存映射示意圖;
[0072]圖11是本發(fā)明具體實(shí)施例中的驅(qū)動(dòng)程序中DMA傳輸過程中描述符管理算法示意圖;
[0073]圖12是本發(fā)明具體實(shí)施例中的驅(qū)動(dòng)程序中PacketReceive結(jié)構(gòu)的內(nèi)部字段;
[0074]圖13是本發(fā)明具體實(shí)施例中的驅(qū)動(dòng)程序中單packet接收模塊的流程圖;
[0075]圖14是本發(fā)明具體實(shí)施例中的驅(qū)動(dòng)程序中單packet接收DPC的流程圖;
[0076]圖15是本發(fā)明具體實(shí)施例中通過模擬數(shù)據(jù)源所采集的棋盤模式圖像;
[0077]圖16是本發(fā)明具體實(shí)施例中連接CMOS工業(yè)相機(jī)所采集的打火機(jī)電弧光圖像。
【具體實(shí)施方式】
[0078]為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面結(jié)合附圖對本發(fā)明的【具體實(shí)施方式】進(jìn)行詳細(xì)說明。這些優(yōu)選實(shí)施方式的示例在附圖中進(jìn)行了例示。附圖中所示和根據(jù)附圖描述的本發(fā)明的實(shí)施方式僅僅是示例性的,并且本發(fā)明并不限于這些實(shí)施方式。
[0079]在此,還需要說明的是,為了避免因不必要的細(xì)節(jié)而模糊了本發(fā)明,在附圖中僅僅示出了與根據(jù)本發(fā)明的方案密切相關(guān)的結(jié)構(gòu)和/或處理步驟,而省略了與本發(fā)明關(guān)系不大的其他細(xì)節(jié)。
[0080]本發(fā)明實(shí)施例提供基于PCIE接口的高速相機(jī)以及模擬數(shù)據(jù)源的圖像采集裝置和驅(qū)動(dòng)方法,硬件結(jié)構(gòu)如圖3所示,包括相機(jī)控制模塊101、模擬數(shù)據(jù)源模塊102、采集控制模塊103、數(shù)據(jù)包讀寫控制模塊104、數(shù)據(jù)包緩存fifo模塊105、DMA接口 fifo模塊106、DMA控制器模塊107和pcie協(xié)議模塊108組成。驅(qū)動(dòng)程序結(jié)構(gòu)如圖4所示,包括用戶緩沖區(qū)映射模塊201、DMA描述符初始化模塊202、單packet接收模塊203、單packet接收DPC模塊204以及其它功能模塊組成。
[0081]硬件方面,所述的相機(jī)控制模塊101通過Xilinx的Picoblaze嵌入式軟核微控制器和Uart軟核實(shí)現(xiàn)上位機(jī)和相機(jī)的串行通信,用來控制相機(jī)內(nèi)部參數(shù)。
[0082]模擬數(shù)據(jù)源模塊102在上位機(jī)軟件的控制下可產(chǎn)生加I模式、豎條紋模式、橫條紋模式和棋盤模式圖像。同時(shí)可設(shè)置其圖像分辨率、幀率、像素初值種子、幀間像素變化值等。
[0083]采集控制模塊103在上位機(jī)軟件的控制下采集指定的數(shù)據(jù)源的數(shù)據(jù),同時(shí)根據(jù)用戶指令決定是否加入圖像幀頭。
[0084]具體地,當(dāng)用戶啟動(dòng)相機(jī)或模擬數(shù)據(jù)源后,在狀態(tài)機(jī)的控制下,首先,采集控制模塊103會將CameraLink總線full模式下的3路信號還原為原始的3路信號;其次,采集控制模塊103將還原后的三路信號中的有效數(shù)據(jù)緩存到3路fifo中;之后,將這3個(gè)fifo中的數(shù)據(jù)進(jìn)行拼接,最后再緩存入輸出fifo中。
[0085]數(shù)據(jù)包讀寫控制模塊104從采集控制模塊103的輸出fifo中讀出一個(gè)數(shù)據(jù)包,將其緩存到數(shù)據(jù)包緩存fifo模塊105中,再從數(shù)據(jù)包緩存fifo模塊105中把數(shù)據(jù)轉(zhuǎn)化為DMA規(guī)定的格式輸入到DMA接口 fifo模塊106中。
[0086]具體地,圖8是DMA控制器的接口 fifo模塊的輸入數(shù)據(jù)接口時(shí)序圖。主要包括4個(gè)輸出信號和一個(gè)輸入信號,其中輸出數(shù)據(jù)位寬為128位。Sop表示數(shù)據(jù)包開始信號,高電平期間data[127:0]輸出數(shù)據(jù)包第一個(gè)有效數(shù)據(jù);eop表示數(shù)據(jù)包結(jié)束信號,高電平期間data[127:0]輸出數(shù)據(jù)包最后一個(gè)有效數(shù)據(jù);Src_rdy表示輸出數(shù)據(jù)準(zhǔn)備好,Dst_rdy表示Dma輸入接口 fifo模塊準(zhǔn)備好接收數(shù)據(jù),當(dāng)Src_rdy和Dst_rdy都有效時(shí),有效data將進(jìn)入Dma輸入接口 fifo模塊中。
[0087]DMA控制器模塊107把DMA接口 fifo模塊106中的數(shù)據(jù)封裝為存儲器寫請求事務(wù)TLP,然后通過PCIE協(xié)議模塊108發(fā)送給上位機(jī),最終傳輸?shù)街付ǖ膬?nèi)存處。其中DMA控制器模塊107和PCIE協(xié)議模塊108分別采用了 Northffest和Xilinx的IP核。
[0088]具體地,圖5是DMA控制器模塊的內(nèi)部結(jié)構(gòu)圖和描述符結(jié)構(gòu)圖。其中DMA控制器模塊主要部分的功能如下:
[0089](I) C2S傳輸通道:數(shù)據(jù)從設(shè)備傳往host機(jī);
[0090](2) S2C傳輸通道:數(shù)據(jù)從host機(jī)傳往設(shè)備;
[0091](3)描述符處理邏輯:獲取保存于host機(jī)中的描述符并根據(jù)描述符內(nèi)部字段執(zhí)行對應(yīng)的數(shù)據(jù)傳輸;
[0092](4)控制寄存器:驅(qū)動(dòng)程序通過控制寄存器控制DMA。重要的寄存器有下面幾個(gè),
[0093]NextDescriptorPtr:host中下一個(gè)要在DMA控制器中執(zhí)行的描述符的地址;SoftwareDescriptorPtr:host中屬于驅(qū)動(dòng)程序的第一個(gè)描述符的地址;
[0094]DMA_Enab I e:啟動(dòng) DMA 控制器。
[0095]描述符結(jié)構(gòu)的內(nèi)部字段的含義如下:
[0096](I) StatFlag_BytesCpld:本描述符的狀態(tài)和傳輸完成的字節(jié)數(shù);
[0097](2) UserStatus:DMA外圍電路的工作狀態(tài);
[0098](3)CtrlFlag_ByteCnt:本描述符的控制標(biāo)志和攜帶的數(shù)據(jù)量;
[0099](4) CardAddr:設(shè)備發(fā)送數(shù)據(jù)的地址;
[0100](5) SystemAddr:host 端接收數(shù)據(jù)的地址;
[0101](6)NextDescPtr:host內(nèi)存中下一個(gè)描述符的物理地址
[0102]啟動(dòng)DMA 后,當(dāng) NextDescriptorPtr ! = SoftwareDescriptorPtr 時(shí),DMA 控制器不斷的從host內(nèi)存中取出描述符,然后解析描述符信息,進(jìn)行相應(yīng)的從CardAddr到SystemAddr的數(shù)據(jù)傳輸。
[0103]采集卡上位機(jī)驅(qū)動(dòng)方面,如圖4所示,包括用戶緩沖區(qū)映射模塊201、DMA描述符初始化模塊202、單packet接收模塊203、單packet接收DPC模塊204以及其它功能模塊組成。
[0104]所述的用戶緩沖區(qū)映射模塊201負(fù)責(zé)獲得用戶接收緩沖的物理頁地址。具體地,以MDL(存儲描述符表)的方式獲得應(yīng)用層傳給內(nèi)核層的接收緩沖區(qū),再通過APIMmGetMdlPfnArray (IN PMDL Mdl)獲得MDL對應(yīng)的物理內(nèi)存頁數(shù)組。
[0105]DMA描述符初始化模塊202構(gòu)建一個(gè)環(huán)形DMA描述符鏈表,并初始化每個(gè)描述符,主要包括描述符號、描述符標(biāo)志、下一個(gè)描述符指針、描述符對應(yīng)的系統(tǒng)內(nèi)存接收地址等。
[0106]單packet接收模塊203和單packet接收DPC模塊204負(fù)責(zé)處理上層發(fā)過來的單數(shù)據(jù)包接收請求。
[0107]具體地,當(dāng)完成用戶緩沖區(qū)映射和DMA描述符初始化后,描述符內(nèi)對應(yīng)的內(nèi)存數(shù)據(jù)接收緩沖布局如圖10所示。圖10中,假定有N個(gè)描述符,每個(gè)描述符除了自己私有的域(包括控制DMA設(shè)備傳輸?shù)墓潭ㄓ蚣膀?qū)動(dòng)用來管理的自定義的域),還關(guān)聯(lián)了一個(gè)內(nèi)存頁用于接收具體數(shù)據(jù)。這N個(gè)描述符組成一個(gè)環(huán)形鏈表。
[0108]引入描述符標(biāo)記:Do(DmaOwned),Uo (UserOwned),Uf (UserFreed)。同時(shí)引入 2 個(gè)指針pNextDesc:指向描述符環(huán)形鏈表中的驅(qū)動(dòng)下一個(gè)要處理的描述符,pTailDesc:DMA設(shè)備可使用的最后一個(gè)描述符。單數(shù)據(jù)包接收時(shí)的流程圖如圖13所示。
[0109]單線程環(huán)境下的工作過程為:當(dāng)接收到用戶數(shù)據(jù)請求后,首先根據(jù)收到的當(dāng)前用戶請求歸還上一次請求的描述符。歸還時(shí),根據(jù)上一次請求的第一個(gè)描述符號然后將上次packet的對應(yīng)描述符標(biāo)記為Do (DmaOwned),然后移動(dòng)pTailDesc指針到上一個(gè)packet的最后一個(gè)描述符處,增加DMA可用的描述符。歸還結(jié)束后再將當(dāng)前請求插入請求鏈表。
[0110]傳輸完一個(gè)packet產(chǎn)生中斷后,在DPC函數(shù)中,如圖14所示,當(dāng)請求鏈表非空時(shí),取出一個(gè)數(shù)據(jù)請求,同時(shí)處理當(dāng)前描述符鏈表中的完成的一個(gè)數(shù)據(jù)包所對應(yīng)的若干描述符。根據(jù)描述符結(jié)構(gòu)內(nèi)的域信息,判斷是否接收到一個(gè)完整的packet,如果接收到一個(gè)完整packet,則標(biāo)記對應(yīng)的描述符為Uo (UserOwned),移動(dòng)pNextDesc指針,使其指向鏈表中驅(qū)動(dòng)下一次要處理的描述符。分離出這個(gè)packet的內(nèi)存地址和長度后,將地址、長度、描述符號等信息填入接收請求中,然后完成這次數(shù)據(jù)接收請求。應(yīng)用程序根據(jù)驅(qū)動(dòng)返回的接收請求,處理收到的數(shù)據(jù)。
[0111]其它功能模塊包括多packet接收模塊、多packet接收DPC模塊和自由接收模塊。其中多packet部分表示當(dāng)應(yīng)用程序設(shè)置為每次接收多個(gè)packet時(shí)的對應(yīng)的處理;自由接收部分表示應(yīng)用程序設(shè)置為測試硬件鏈路帶寬時(shí)對應(yīng)的處理。
[0112]圖6是本發(fā)明實(shí)施例中的采集卡中模擬數(shù)據(jù)源的控制狀態(tài)圖。
[0113]狀態(tài)201中,模塊加載特定模式的像素初值,等待若干周期結(jié)束后,進(jìn)入狀態(tài)202 ;
[0114]狀態(tài)202中,模塊拉高幀有效輸出信號,保持若干周期后,進(jìn)入狀態(tài)203 ;
[0115]狀態(tài)203中,模塊拉高行有效輸出信號,同時(shí)輸出特定模式的數(shù)據(jù),同時(shí)判斷當(dāng)前幀是否結(jié)束和當(dāng)前行是否結(jié)束。若當(dāng)前行結(jié)束,則進(jìn)入狀態(tài)204預(yù)置下一行特定模式的像素初值,然后回到狀態(tài)203。若當(dāng)前幀結(jié)束,則進(jìn)入狀態(tài)205預(yù)置下一幀特定模式的像素初值,然后回到狀態(tài)201。
[0116]圖7是本發(fā)明實(shí)施例中的采集卡中采集控制模塊的控制狀態(tài)圖。
[0117]復(fù)位后模塊首先進(jìn)入空閑狀態(tài)301,然后等待上一幀結(jié)束信號和采集允許信號,當(dāng)采集允許并且上一幀結(jié)束時(shí),模塊進(jìn)入302狀態(tài);
[0118]狀態(tài)302中,模塊判斷幀有效和幀頭允許信號,當(dāng)幀有效并允許幀頭,則進(jìn)入狀態(tài)303 ;當(dāng)幀有效不允許幀頭,則進(jìn)入狀態(tài)304 ;
[0119]狀態(tài)303中,模塊產(chǎn)生幀頭數(shù)據(jù),并存入輸出fifo中;
[0120]狀態(tài)304中,將三路圖像數(shù)據(jù)緩存入3個(gè)輸入fifo中,然后判斷輸入fifo中是否積累到足夠數(shù)據(jù),當(dāng)每一路fifo中都超過4個(gè)周期數(shù)據(jù)時(shí),數(shù)據(jù)準(zhǔn)備好,進(jìn)入305狀態(tài);
[0121]305狀態(tài)中,從3路輸入fifo中連續(xù)讀出4次數(shù)據(jù),拼接數(shù)據(jù),并存入輸出fifo中。然后判斷當(dāng)前幀是否結(jié)束,若沒結(jié)束,則回到狀態(tài)305 ;若幀結(jié)束,則進(jìn)入狀態(tài)306 ;
[0122]狀態(tài)306中,改變幀頭信息,將當(dāng)前幀號字段加1,然后回到狀態(tài)302。
[0123]圖9是本發(fā)明實(shí)施例中的采集卡中數(shù)據(jù)包讀寫控制模塊的控制狀態(tài)圖。
[0124]復(fù)位后模塊首先進(jìn)入空閑狀態(tài)501,當(dāng)前端數(shù)據(jù)準(zhǔn)備好時(shí)進(jìn)入狀態(tài)502 ;
[0125]狀態(tài)502中,從前端的采集控制模塊的輸出fifo中讀取16KB數(shù)據(jù)緩存到后端的緩存fifo中。當(dāng)存完16KB時(shí),進(jìn)入狀態(tài)503 ;
[0126]狀態(tài)503中,讀取緩存fifo中的數(shù)據(jù)并按照圖8的時(shí)序進(jìn)行數(shù)據(jù)格式轉(zhuǎn)化,當(dāng)16KB數(shù)據(jù)傳輸完畢后,回到狀態(tài)502中。
[0127]圖11是本發(fā)明實(shí)施例中的驅(qū)動(dòng)程序中DMA傳輸過程中描述符管理算法示意圖。
[0128]在多線程工作環(huán)境下,如前所述,引入描述符標(biāo)記:Do (DmaOwned),Uo (UserOwned) ,Uf (UserFreed)。同時(shí)引入2個(gè)指針pNextDesc:指向描述符環(huán)形鏈表中的驅(qū)動(dòng)下一個(gè)要處理的描述符,pTailDesc:DMA設(shè)備可使用的最后一個(gè)描述符。
[0129]具體地,設(shè)應(yīng)用層數(shù)據(jù)接收線程TC,Tl各自發(fā)送2個(gè)接收請求reqO,reqlo假定每個(gè)請求(或packet)需要2個(gè)描述符。首先,初始階段N個(gè)描述符均標(biāo)記為Do。之后執(zhí)行過程中,假定驅(qū)動(dòng)程序先處理TO的reqO,然后處理Tl的reqO,之后處理Tl的reql,最后處理TO的reql。那么描述符的標(biāo)記及指針pNextDesc和pTailDesc的變化過程如圖11所示。
[0130]具體地,初始階段所有描述符均標(biāo)記為Do。應(yīng)用層線程??、Τ1發(fā)送reqO。假定驅(qū)動(dòng)程序第一次處理TO的reqO,第二次處理Tl的reqO。于是TO的reqO首先插入請求鏈表,之后Tl的reqO再插入請求鏈表。當(dāng)硬件完成2個(gè)packet的傳輸時(shí),驅(qū)動(dòng)的中斷DPC先從請求鏈表中取出TO的reqO,同時(shí)將O、I號描述符標(biāo)記為Uo,將packet的具體信息返回給應(yīng)用程序,然后結(jié)束TO的reqO,再從請求鏈表中取出Tl的reqO,同時(shí)將2、3號描述符標(biāo)記為Uo,將packet的具體信息返回給應(yīng)用程序,然后結(jié)束Tl的reqO。
[0131]然后應(yīng)用層線程T0、T1發(fā)送reql。假定驅(qū)動(dòng)程序先處理Tl的reql,此時(shí),驅(qū)動(dòng)先歸還Tl的reqO所占用的描述符給DMA設(shè)備,由于Tl的reqO所占用的描述符號為2、3 ;而pTailDesc指向描述符的下一個(gè)為O號描述符,暫不把2、3描述符歸還給DMA設(shè)備,只是將
2、3描述符標(biāo)記為Uf0之后Tl的reql插入請求鏈表,當(dāng)硬件傳輸完I個(gè)packet時(shí),驅(qū)動(dòng)的中斷DPC從請求鏈表中取出Tl的reql,同時(shí)將4、5號描述符標(biāo)記為Uo,將packet的具體信息返回給應(yīng)用程序,然后結(jié)束Tl的reql。接著,驅(qū)動(dòng)程序處理TO的reql,此時(shí),驅(qū)動(dòng)先歸還TO的reqO所占用的描述符給DMA設(shè)備,由于TO的reqO所占用的描述符號為0、1 ;而pTailDesc指向描述符的下一個(gè)為O號描述符,于是將O、I號以及標(biāo)記為Uf的2、3號描述符標(biāo)記為Do。更新pTailDesc指針指向3號描述符,并更新DMA設(shè)備寄存器。
[0132]圖12是本發(fā)明實(shí)施例中的驅(qū)動(dòng)程序中PacketReceive結(jié)構(gòu)的內(nèi)部字段。
[0133]其中,Length字段為本次接收的packet的長度,由驅(qū)動(dòng)填充并返回。startDescNum字段為本次接收的packet的第一個(gè)描述符號,由驅(qū)動(dòng)填充并返回。endDescNum字段為本次接收的packet的最后一個(gè)描述符號,由驅(qū)動(dòng)填充并返回。ReturnToken字段為本次接收的歸還標(biāo)志。
[0134]具體地,應(yīng)用程序接收數(shù)據(jù)時(shí),建立PacketReceive結(jié)構(gòu),第一次接收時(shí)填充本次接收的歸還標(biāo)志ReturnToken為-1,之后填充ReturnToken為上次收到的packet的第一個(gè)描述符號。其余字段均初始化為O。
[0135]圖13是本發(fā)明實(shí)施例中的驅(qū)動(dòng)程序中單packet接收模塊的流程圖。
[0136]步驟501中,判斷當(dāng)前請求是否第一個(gè)請求。如果是第一個(gè)請求,就進(jìn)入步驟502,否則調(diào)用歸還描述符過程,進(jìn)入步驟504 ;
[0137]步驟502中,將請求插入鏈表,進(jìn)入步驟503 ;
[0138]步驟503中,排隊(duì)一次中斷DPC函數(shù),然后結(jié)束;
[0139]步驟504中,設(shè)內(nèi)部變量Token(歸還的Packet的令牌):上次接收到的packet的第一個(gè)描述符號。判斷Token是否和pTailDesc指向描述符的下一個(gè)描述符號相等。相等則進(jìn)入步驟505,不等則進(jìn)入步驟508 ;
[0140]步驟505中,標(biāo)記上次packet對應(yīng)描述符為Do (DmaOwned),進(jìn)入步驟506 ;
[0141]步驟506中,將緊鄰的Uf(UserFreed)標(biāo)記的描述符標(biāo)記為Do,進(jìn)入步驟507 ;
[0142]步驟507中,移動(dòng)pTailDesc指針,更新設(shè)備寄存器,然后返回主調(diào)函數(shù);
[0143]步驟508中,標(biāo)記上次packet對應(yīng)描述符為Uf,然后返回主調(diào)函數(shù)。
[0144]圖14是本發(fā)明實(shí)施例中的驅(qū)動(dòng)程序中單packet接收DPC的流程圖。
[0145]步驟601中,判斷請求鏈表是否空。非空則進(jìn)入步驟602,空則直接退出;
[0146]步驟602中,從pNextDesc處查找I個(gè)完成的packet,查找成功則進(jìn)入步驟603,否則直接退出;
[0147]步驟603中,從請求鏈表取出表頭請求,然后進(jìn)入步驟604 ;
[0148]步驟604中,標(biāo)記該packet為Uo (UserOwned),并且將本packet的長度、起始描述符號、結(jié)束描述符號和歸還令牌號填入PacketReceive結(jié)構(gòu)中,然后進(jìn)入步驟605 ;
[0149]步驟605中,驅(qū)動(dòng)完成該請求并且將PacketReceive結(jié)構(gòu)返回應(yīng)用層,然后結(jié)束。
[0150]圖15是本發(fā)明具體實(shí)施例中通過模擬數(shù)據(jù)源所采集的棋盤模式圖像;
[0151]圖16是本發(fā)明具體實(shí)施例中連接CMOS工業(yè)相機(jī)所采集的打火機(jī)電弧光圖像。
[0152]最后,還需要說明的是,術(shù)語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者設(shè)備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、物品或者設(shè)備所固有的要素。
【主權(quán)項(xiàng)】
1.一種模擬數(shù)據(jù)源的圖像采集裝置,其特征在于,包括: 相機(jī)和上位機(jī); 相機(jī)控制模塊,通過Xilinx的Picoblaze嵌入式軟核微控制器和Uart軟核實(shí)現(xiàn)上位機(jī)和相機(jī)的串行通信,用來控制相機(jī)內(nèi)部參數(shù); 模擬數(shù)據(jù)源模塊,在上位機(jī)軟件的控制下可產(chǎn)生加I模式、豎條紋模式、橫條紋模式和棋盤模式圖像; 采集控制模塊,在上位機(jī)軟件的控制下采集指定的數(shù)據(jù)源的數(shù)據(jù),同時(shí)根據(jù)用戶指令決定是否加入圖像幀頭; 數(shù)據(jù)包讀寫控制模塊,從采集控制模塊的輸出fifo中讀出一個(gè)數(shù)據(jù)包,將其緩存到數(shù)據(jù)包緩存fifo模塊中,再從數(shù)據(jù)包緩存fifo模塊中把數(shù)據(jù)轉(zhuǎn)化為DMA規(guī)定的格式輸入到DMA接口 fifo模塊中; 數(shù)據(jù)包緩存fifo模塊; DMA接口 fifo模塊; DMA控制器模塊,把DMA接口 fifo模塊中的數(shù)據(jù)封裝為存儲器寫請求事務(wù)TLP,然后通過PCIE協(xié)議模塊發(fā)送給上位機(jī),最終傳輸?shù)街付ǖ膬?nèi)存處; PCIE協(xié)議模塊。2.根據(jù)權(quán)利要求1所述的模擬數(shù)據(jù)源的圖像采集裝置,其特征在于:所述DMA控制器模塊和PCIE協(xié)議模塊分別采用了 NorthWest和Xilinx的IP核。3.根據(jù)權(quán)利要求1所述的模擬數(shù)據(jù)源的圖像采集裝置,其特征在于:所述DMA控制器豐吳塊包括: C2S傳輸通道:數(shù)據(jù)從設(shè)備傳往host機(jī); S2C傳輸通道:數(shù)據(jù)從host機(jī)傳往設(shè)備; 描述符處理邏輯:獲取保存于host機(jī)中的描述符并根據(jù)描述符內(nèi)部字段執(zhí)行對應(yīng)的數(shù)據(jù)傳輸; 控制寄存器:驅(qū)動(dòng)程序通過控制寄存器控制DMA。4.根據(jù)權(quán)利要求1所述的模擬數(shù)據(jù)源的圖像采集裝置,其特征在于:所述上位機(jī)的驅(qū)動(dòng)豐吳塊包括: 用戶緩沖區(qū)映射模塊,負(fù)責(zé)獲得用戶接收緩沖的物理頁地址; DMA描述符初始化模塊,構(gòu)建一個(gè)環(huán)形DMA描述符鏈表,并初始化每個(gè)描述符; 單packet接收模塊和單packet接收DPC模塊,負(fù)責(zé)處理上層發(fā)過來的單數(shù)據(jù)包接收請求。5.根據(jù)權(quán)利要求4所述的模擬數(shù)據(jù)源的圖像采集裝置,其特征在于:所述上位機(jī)的驅(qū)動(dòng)模塊還包括單packet接收模塊,其工作流程包括: 步驟501中,判斷當(dāng)前請求是否第一個(gè)請求,如果是第一個(gè)請求,就進(jìn)入步驟502,否則調(diào)用歸還描述符過程,進(jìn)入步驟504 ; 步驟502中,將請求插入鏈表,進(jìn)入步驟503 ; 步驟503中,排隊(duì)一次中斷DPC函數(shù),然后結(jié)束; 步驟504中,設(shè)內(nèi)部變量Token:上次接收到的packet的第一個(gè)描述符號,判斷Token是否和pTailDesc指向描述符的下一個(gè)描述符號相等,相等則進(jìn)入步驟505,不等則進(jìn)入步驟 508 ; 步驟505中,標(biāo)記上次packet對應(yīng)描述符為Do,進(jìn)入步驟506 ; 步驟506中,將緊鄰的Uf標(biāo)記的描述符標(biāo)記為Do,進(jìn)入步驟507 ; 步驟507中,移動(dòng)pTailDesc指針,更新設(shè)備寄存器,然后返回主調(diào)函數(shù); 步驟508中,標(biāo)記上次packet對應(yīng)描述符為Uf,然后返回主調(diào)函數(shù)。6.根據(jù)權(quán)利要求4所述的模擬數(shù)據(jù)源的圖像采集裝置,其特征在于:所述上位機(jī)的驅(qū)動(dòng)模塊還包括單packet接收DPC模塊,其工作流程包括: 步驟601中,判斷請求鏈表是否空,非空則進(jìn)入步驟602,空則直接退出; 步驟602中,從pNextDesc處查找I個(gè)完成的packet,查找成功則進(jìn)入步驟603,否則直接退出; 步驟603中,從請求鏈表取出表頭請求,然后進(jìn)入步驟604 ; 步驟604中,標(biāo)記該packet為Uo,并且將本packet的長度、起始描述符號、結(jié)束描述符號和歸還令牌號填入PacketReceive結(jié)構(gòu)中,然后進(jìn)入步驟605 ; 步驟605中,驅(qū)動(dòng)完成該請求并且將PacketReceive結(jié)構(gòu)返回應(yīng)用層,然后結(jié)束。7.權(quán)利要求1至6中任一所述模擬數(shù)據(jù)源模塊的控制方法,其特征在于,包括: 狀態(tài)201,模塊加載特定模式的像素初值,等待若干周期結(jié)束后,進(jìn)入狀態(tài)202 ; 狀態(tài)202,模塊拉高幀有效輸出信號,保持若干周期后,進(jìn)入狀態(tài)203 ; 狀態(tài)203,模塊拉高行有效輸出信號,同時(shí)輸出特定模式的數(shù)據(jù),同時(shí)判斷當(dāng)前幀是否結(jié)束和當(dāng)前行是否結(jié)束,若當(dāng)前行結(jié)束,則進(jìn)入狀態(tài)204預(yù)置下一行特定模式的像素初值,然后回到狀態(tài)203,若當(dāng)前幀結(jié)束,則進(jìn)入狀態(tài)205預(yù)置下一幀特定模式的像素初值,然后回到狀態(tài)201 ; 狀態(tài)204,預(yù)置下一行特定模式的像素初值; 狀態(tài)205,預(yù)置下一幀特定模式的像素初值。8.權(quán)利要求1至6中任一所述采集控制模塊的控制方法,其特征在于,包括: 復(fù)位后模塊首先進(jìn)入空閑狀態(tài)301,然后等待上一幀結(jié)束信號和采集允許信號,當(dāng)采集允許并且上一幀結(jié)束時(shí),模塊進(jìn)入302狀態(tài); 狀態(tài)302中,模塊判斷幀有效和幀頭允許信號,當(dāng)幀有效并允許幀頭,則進(jìn)入狀態(tài)303 ;當(dāng)幀有效不允許幀頭,則進(jìn)入狀態(tài)304 ; 狀態(tài)303中,模塊產(chǎn)生幀頭數(shù)據(jù),并存入輸出fifo中; 狀態(tài)304中,將三路圖像數(shù)據(jù)緩存入3個(gè)輸入fifo中,然后判斷輸入fifo中是否積累到足夠數(shù)據(jù),當(dāng)每一路fifo中都超過4個(gè)周期數(shù)據(jù)時(shí),數(shù)據(jù)準(zhǔn)備好,進(jìn)入305狀態(tài); 305狀態(tài)中,從3路輸入fifo中連續(xù)讀出4次數(shù)據(jù),拼接數(shù)據(jù),并存入輸出fifo中,然后判斷當(dāng)前幀是否結(jié)束,若沒結(jié)束,則回到狀態(tài)305 ;若幀結(jié)束,則進(jìn)入狀態(tài)306 ; 狀態(tài)306中,改變幀頭信息,將當(dāng)前幀號字段加1,然后回到狀態(tài)302。9.權(quán)利要求1至6中任一所述數(shù)據(jù)包讀寫控制模塊的控制方法,其特征在于,包括: 復(fù)位后模塊首先進(jìn)入空閑狀態(tài)501,當(dāng)前端數(shù)據(jù)準(zhǔn)備好時(shí)進(jìn)入狀態(tài)502 ; 狀態(tài)502中,從前端的采集控制模塊的輸出fifo中讀取16KB數(shù)據(jù)緩存到后端的緩存fifo中,當(dāng)存完16KB時(shí),進(jìn)入狀態(tài)503 ; 狀態(tài)503中,讀取緩存fifo中的數(shù)據(jù)并進(jìn)行數(shù)據(jù)格式轉(zhuǎn)化,當(dāng)16KB數(shù)據(jù)傳輸完畢后,回到狀態(tài)502中。
【文檔編號】H04N5/232GK106034199SQ201510119592
【公開日】2016年10月19日
【申請日】2015年3月18日
【發(fā)明人】張廣文, 王旭光
【申請人】中國科學(xué)院蘇州納米技術(shù)與納米仿生研究所