石汶奇,干鈺靜,黃光明
華中師范大學 物理科學與技術學院,湖北 武漢 430079
近 年 來, 隨 著CMOS(Complementary Metal Oxide Semiconductor)圖像傳感器技術的發展,越來越多廉價且圖像效果優良的CMOS 傳感器芯片誕生。新興的CMOS 傳感器逐漸取代一些傳統CCD(Charge Coupled Device)圖像傳感器被廣泛應用于醫療、安保等各個行業和領域[1-3]。
德 國Awaiba 公 司 設 計 的1 mm×1 mm×1.7 mm,250×250 像素的小封裝、低功耗、異步通信的CMOS 微型圖像傳感器NanEye 2D,體積微小且具有優良的EMC 特性[4-5]。該攝像頭在安保、醫療、科學研究和生物測定等有特殊要求的領域具有很大的開發和應用前景[2-3,5]。但是NanEye 2D 特有的4 線接口、異步通信模式以及其自身內部串行數據輸出時鐘存在±20%的抖動[6],這使得我們對NanEye 2D 傳感器數據的采集變得比較困難。再加上目前國內外并沒有NanEye 2D 攝像頭數據采集方面相關的公開的應用研究和應用文獻,使得NanEye 2D 攝像頭的開發和應用變得更加困難。
為了解決這一技術難題,本文對NanEye 2D 攝像頭的4 線接口、異步通信模式以及內部時鐘±20%的抖動等進行了分析,在Altera 公司的FPGA 平臺上設計并實現了一個針對NanEye 2D 攝像頭數據采集的定制IP 核。該設計對于進一步開發NanEye 2D 圖像傳感器具有一定的借鑒意義。
NanEye 2D 全數字攝像頭是2016 年歐洲Sensor Expo & Conference 的創新銀獎作品[7]。NanEye 2D 傳感器是一個提供真正的片上系統的攝像頭。該傳感器內的片上系統具有10 位ADC(Analog-to-Digital Converter)轉換功能,自定時順序讀出功能以及串行位數據LVDS(Low-Voltage Differential Signaling)傳輸功能[7]。NanEye 2D 攝像頭能夠以42~55 Fps 的幀速率通過4 線的接口傳輸250×250 分辨率的圖像。幀速率大于40 Fps 使得該攝像頭的圖像能夠流暢地同步到絕大多數顯示接口上。此外,Awaiba 特有的4線數據接口技術允許NanEye 2D 攝像頭的傳輸線在遠端沒有任何輔助部件的情況下可以達到3 m 的長度。由于這種接口的低能量損耗,攝像頭不需要復雜的屏蔽來滿足EMC(Electro Magnetic Compatibility)規范接口耗散[8]。該攝像頭可應用于安保、醫療、科學應用和生物測定等領域。
如圖1 和圖2 所示,NanEye 2D 圖像傳感器具體的工作時序為:從第一行開始,每一行都有一段3 PP(1 PP 為12 bit 數據)的行開頭,接著是每一行的pixel 數據,如此反復,直到完成傳輸所有pixel 值。當完成250 行pixel 數據的傳輸后,系統進入phase nbr 251 幀結尾階段,連續傳輸4 PP 的0;之后進入phase nbr 252 階段(即NanEye 2D攝像頭寄存器上行配置階段),外部可以通過差分數據線對攝像頭的有關寄存器進行配置。配置結束后,進入phase nbr 253 數據時鐘同步階段和phase nbr 253a 狀態跳轉階段并開始新的一幀圖像數據傳輸[6,8]。在每個角落都有兩個具有電氣特性的黑像素和兩個電氣上飽和的像素,用于檢查接收數據的一致性[6,8]。

圖1 內部自定時工作流程示意圖

圖2 數據流協議
攝像頭的數據格式為12 bit,其中數據頭部是固定的“1”,尾部是固定的“0”,中間10 bit 為有效的pixel 數據[6,8]。pixel 數據格式如圖3 所示。

圖3 pixel數據格式
如圖4 所示,攝像頭的數據在向外傳輸時會經過內部時鐘的異或,將1 bit 的數據變成兩位的數據,即進行了曼徹斯特編碼,其中“01”表示“1”,“10”表示“0”。例如:有效pixel 數據“0110001101”,包含數據起始位和結尾位為“101100011010”,經過異或后為“0110010110101001011 00110”[6,8]。

圖4 數據異或編碼(曼徹斯特編碼)
攝像頭進行上行配置階段的數據格式如圖5 所示,寄存器配置的數據為16 bit 的格式。對攝像頭寄存器進行寫操作的順序如下:首先,向寄存器發送4 bit 的 update code(“1001”),接著發送3 bit 的register address(“000”),最后發送16 bit 的寄存器配置數據。當不對寄存器操作時,寄存器默認值為“1010011000000010”[6,8]。了解NanEye 2D 圖像傳感器的數據傳輸方式后,通過過采樣監測數據流,對數據進行曼徹斯特解碼后找到對應的幀同步、行同步、上行配置階段等就可以對有效的pixel 數據進行提取,從而獲取原始的幀圖像數據。

圖5 上行寄存器配置數據格式
整個IP 核模塊內部主要由Rx_decoder(串行數據接收和解碼模塊)、Deserializer(串行數據轉并行數據模塊)、Sensor_confi gure(上行配置模塊)、ram_ctrl(存儲控制模塊)和uart(UART 傳輸接口模塊)五個部分組成(圖6)。

圖6 NanEye 2D攝像頭數據采集IP核數據流框圖
在該設計中,數據采集主要由兩部分完成。其中一個部分是Rx_decoder 模塊,該部分負責攝像頭的串行信號的接收,過采樣解碼恢復獲取原始的串行有效數據;另一部分是Deserializer 模塊,該模塊實現對Rx_decoder 部分獲得的原始串行數據的行開頭、幀結尾的識別、pixel 有效10位串行數據的提取,串行數據轉換為并行數據輸出和當前幀的行列數計數。
ram_ctrl 模塊負責將解串后的并行數據存儲到RAM對應的地址中。通過外部按鍵產生傳輸開始信號,觸發UART 的數據傳輸。IP 核通過uart 將一幀完整的數據上傳到上位機,供后面進一步處理和分析。Sensor_confi gure 模塊則負責在數據上行配置階段通過I2C 通信協議對NanEye 2D 傳感器的寄存器參數進行配置。本設計中的測試,NanEye 2D 寄存器的參數均為默認值。
Rx_decoder 模塊是數據采集IP 核部分最重要的模塊,本模塊負責對攝像頭傳感器輸出的曼徹斯特編碼的數據流進行接收和解碼。此外,Rx_decoder 模塊還通過一直觀察輸入信號,檢測和產生幀開始信號“frame_sync_start”和上行配置開始信號“confi g_en”(該信號供Sensor_confi gure上行配置模塊使用)。
曼徹斯特編碼表示串行數據(DATA)與其串行時鐘(CLOCK)的邏輯組合(圖7)。一個時鐘周期信號至少改變一次其高低電平狀態,這使得接收器在不需要發送器同時發送時鐘信號和數據信號的情況下,能夠正確對齊數據流。被接收器解碼的數據流可以看作只有兩個可能的高或低持續時間的脈沖序列,一種是T_short=0.5 T_Bit(這里也稱為“半位周期”)和T_long = T_Bit(這里也稱為“全位周期”)。

圖7 曼徹斯特編碼的數據流
為了解碼攝像頭輸出的曼徹斯特編碼后的信號,接收機需要不斷測量兩次電平轉換之間的時間。在這種測量的基礎上,解碼器必須區分最后的電平轉換是由短脈沖(S)引起的還是長脈沖(L)引起的。短脈沖總是意味著原始數據流沒有改變電平狀態,而長脈沖意味著在原始比特流內發生了電平轉換。將上面例子中的曼徹斯特編碼的數據流(圖7)應用到接收器應該最終產生圖8 中所示的脈沖序列。每個長脈沖都會導致解碼輸出信號改變其狀態。如果數據信號的最初狀態是已知的,原始數據的比特流就可以如圖8 所示重構。在這個例子中,NanEye 圖像傳感器發送的每行的行開始,原始數據的初始狀態信號都是“0”。

圖8 曼徹斯特解碼的數據流
由此可知,正確判定還原信號脈沖時間的長度是正確解碼恢復原始數據的必要條件。但是由于傳感器內部設計的不足,該時鐘會根據變化的溫度或電源電壓等條件產生漂移,即其內部異或時鐘Sensor Clock 存在±20%的抖動,該時鐘發生器的頻率并不完全已知。Rx_decoder 必須通過使用它自己的采樣時種SCLOCK,將傳感器的輸出信號作為異步信號進行采樣。由于這個原因,選擇適當的采樣頻率是很重要的。合適的采樣頻率保證了通過分析計數器總是可以區分長脈沖值和短脈沖值,但是又不能對FPGA 芯片要求太高[9-11]。為了解決這個問題,我們調用了Altera FPGA 的雙邊沿采樣IP 核模塊,通過FPGA PLL IP 核模塊將50 MHz 時鐘倍頻到200 MHz 來實現400 MHz 的采樣效果[12-13]。另一方面為了能夠適應攝像頭的時鐘抖動,我們設計了一個脈沖寬度計數模塊。將上一幀數據的脈沖寬度統計值用于下一幀數據的長脈沖和短脈沖的判定閾值,從而實現判定門限值的動態調節。
這樣設計的Rx_decoder 模塊能夠正確穩定地對NanEye 2D 攝像頭數據進行采樣和解碼恢復,同時產生位有效信號。
Deserializer 模塊用于將Rx_decoder 部分輸出的串行數據轉換成10 位并行的數據,并輸出存儲到ram_ctrl 部分。Deserializer 模塊將數據串轉并的主要組成部分是一個12 位移位寄存器。該模塊通過該移位寄存器實現對Rx_decoder解碼輸出的比特序列的串并轉換。每當串行位數據有效信號s_wren=“1”時,移位寄存器的數據向高位移一位。同時,移位計數器的值會“+1”。當移位寄存器中的數據被識別為有效的pixel 數據值(“1xxxxxxxxxx0”)時,有效的10 位pixel 數據將被提取出來,同時產生輸出使能信號,存入到ram_ctrl 模塊的片上RAM 中[14]。當收到的完整的像素點值,但其起始位不為“1”或是結束位不為“0”時,表示該像素點值出錯,錯誤標志位error 被激活。
該模塊的另一個功能是使用解碼的比特流,在正確的時間點激活信號行同步和行結尾信號,通過計算列和行的數量,來檢測由NanEye 傳感器輸出數據的行和幀邊界。
結合上面的模塊,通過狀態機等邏輯我們可以對圖像有效數據進行正確提取。值得一提的是,傳感器實際上每行只發送249 個像素。最后一行(第250 行)只包含248個像素。狀態機在設計時已經考慮到該問題。當錯誤標志位信號error 被激活時,上述有關信號都被重置并且重新開始解串,這樣保證了每幀的第一行始終被正確接收。
IP 核編譯后接上NanEye 2D 傳感器在SignalTap II(Altera 公司的Quartus II 開發軟平臺軟件自帶的嵌入式邏輯分析儀)上測試,觀察到的信號如圖9 所示。結果表明,該IP 核可以每秒44 幀正常識別和提取攝像頭的幀同步、行同步、列同步和pixel 值等數據,實現了設計的目標功能。

圖9 IP核SignalTap II測試結果
IP 核正常獲取到NanEye 2D 的幀圖像數據后,將IP核采集到的幀圖像流通過UART 上傳到PC 機上,經過軟件Bayer 解碼算法[15-16]恢復后得到的結果圖(圖10a,手機打光,偏黃)。圖10b 為手機拍攝的實物圖(白色日光燈照射,由華為榮耀10 拍攝)。對比圖10a 和圖10b,雖然獲得的圖像整體較暗且色彩飽和度不夠,但結果表明IP 核采集到的幀圖像數據經過軟件解碼算法后可正確顯示流暢的視頻流,本IP 核獲取的數據是正確連續且穩定可靠的。

圖10 圖像數據顯示測試
本IP 核作為NanEye 2D 微型圖像傳感器的數據采集部分,負責完成圖像數據的采樣和幀數據提取。經測試結果證明,該IP 核運用在NanEye 2D 攝像頭傳感器上可以每秒44 幀的速率采集和提取圖像數據。該速率大于NanEye 2D 理論的最小幀速率42 Fps,小于最大幀速率55 Fps。采集到的幀圖像數據通過UART 接口上傳到PC 機上,經過軟件漢密爾頓Bayer 插值解碼算法[17]后可以顯示流暢的視頻流。結果表明,本IP 核很好地解決了NanEye 2D 圖像傳感器的數據采集問題。本文中的研究成果為后續開發基于NanEye 2D 微型圖像傳感器的醫用內窺鏡成像系統奠定了重要基礎。