熊 璟 ,劉 怡 ,唐 廣 ,黃自力
(1.電子科技大學 電子工程學院,四川 成都 610054;2.西南技術物理研究所,四川 成都 610041)
責任編輯:任健男
視頻字符疊加就是通過一定電路產生字符或時間信號并與輸入的視頻信號進行疊加,使字符或時間在監示器的指定位置上與圖像信號同時顯示。用FPGA實現數字視頻字符疊加不僅簡化了電路結構,而且在現有成本的前提下充分利用了FPGA的資源[1]。它采用了參數化、模塊化的設計方式,因此顯示穩定;在顯示格式、內容變動時容易修改。
Nios II是Altera公司開發的第二代可進行SoPC設計的RISC型處理器軟核,具有高性能、參數可配置、可移植、可裁剪等特點,并且具有很高的靈活性、實用性,更能滿足設計的要求。Nios II處理器可以通過AVALON接口采用“基地址+地址偏移量”的方式來訪問某寄存器,從而實現對這個系統的控制。
筆者提出了一種基于Nios II的視頻字符疊加實現的新方案,在Altera公司的Cyclone III系列的EP3C40F484I7器件上完成了硬件驗證,用Nios II來替代串口的功能,給FPGA發送指令或數據以方便功能調試。該設計結合ADSP-BF561芯片,應用到某視頻監控系統中。
采用模塊化進行設計,整個設計分為圖像顯示模塊(包含視頻字符疊加模塊、圖像十字中心線及波門跟蹤框顯示模塊、ROM字符庫生成等功能模塊)、ADV7179和ADV7180的I2C實現、Nios II控制模塊、時鐘生成模塊等幾部分。其中,ADV7180是ADI公司生產的一款多格式SDTV解碼芯片,可以支持包括NTSC,PAL以及SECAM電視格式,并將其轉換為符合CCIR6564∶2∶2格式的視頻數據,其并行數據輸出與ADSP-BF561的PPI口通過2個通用I/O口采用I2C方式相連,接口電路簡單,不需要外圍器件,節省成本,增加了電路的可靠性。ADV7179是與視頻解碼芯片ADV7180相配套的單芯片PAL/NTSC視頻編碼芯片,用于ITU-RI BT601/BT656 YCrCb到PAL/NTSC的視頻編碼,采用3.3 V或2.8 V供電,可通過其接口I2C對芯片內部電路進行控制,并且每個DAC可以單獨關閉,功耗極低,可以保證視頻采集的質量和流暢性。ADV7180將模擬視頻信號經處理后(8 bit)輸出 720×576 的標準 CCIR6564∶2∶2數字信號,并產生相應的行、場同步信號HS和VS,以及與HS鎖定的時鐘信號LLC和LLC2。系統框圖如圖1所示。

本設計采用的圖像分辨力是720×576,圖像采用隔行掃描方式。顯示界面上所有字符字體為WST_Czec,字號為6號,大小為16×16。波門跟蹤框和十字在圖像上初始位置為360×288,波門跟蹤框大小為128×128,小十字大小為32×32,大十字大小為200×200。顯示界面如圖2所示。

圖像顯示模塊的主要作用是利用視頻行同步信號,在特定位置從FPGA的ROM中讀出待疊加字符的信息,與視頻信號疊加,產生有字符的視頻信號。
對ADV7179和ADV7180的控制和I2C的實現,以及字符疊加功能的實現用Verilog編程實現。整個字符疊加功能的實現包括行/列計數器的生成、字符位置的確定、字符庫的建立、查找地址、字符塊顯示模塊、顯示狀態模塊等。其中,行/列計數器由行/場信號決定;字符的位置由字符點陣大小、行/場信號和用戶需求決定,圖像中心十字線固定在圖像中心位置,波門跟蹤框位置由用戶指令和跟蹤坐標決定,參考圖2的顯示界面,本設計的特點是可以在視頻的任意位置疊加字符和圖像,內容變動時容易修改;由用戶所給指令決定在某指令下各個字符和圖像的顯示或消隱,如果用戶給出跟蹤狀態指令時要求不顯示圖像中心十字線、顯示波門跟蹤框和跟蹤坐標及相應狀態字符,就將圖像中心十字線輸出為輸入視頻信號,而其他待顯示內容的相應位置為0xff時,就將其在圖像上顯示出來,其他位置則在圖像上輸出輸入視頻信號。
字符由16×8個像素構成,字符中的一個點對應顯示屏的一個像素,由于本設計的圖像掃描是隔行掃描方式,所以這樣一個字符在屏幕上就是16×16個像素的陣列。因此,在屏幕上疊加字符就是把相應的像素疊加到指定的位置。本設計利用字模生成工具suki_v5.0來構造各個16×8點陣字符,以字母X為例,其中黑點代表二進制中的“1”,白點代表“0”,如圖 3所示。用 16 bit表示該字符即為 0x0C18,0x0630,0x0360,0x01C0,0x01C0,0x0360,0x0630,0x0C18。

將各個字符用字模生成工具構造,在Quartus II的環境下,調用一個大小為16 bit×256 words ROM IP核,并建立一個字符庫的.mif存儲文件用來存放各個字符的數據,如圖4所示。

由于字符的點陣值反映的是屏幕上被二值化后的某一點是亮還是暗的信息,而顯示時需要的數據是某點的灰度級數,所以從字符里讀出的每1 bit均需轉化成0x00或0xff。每個字符的信息在顯示時是一行一行讀取的,并且視頻信號的掃描方式是隔行掃描。每場圖像在要疊加字符的行從ROM中讀取字符信息,疊加允許位置為“1”,ROM中的數據為“0”,則直接輸出視頻信號;ROM中的數據為“1”,則輸出相關的顏色信號。疊加允許位置為“0”,不讀取ROM中的數據,直接輸出視頻信號[2]。這種方法的優點是各個字符是并行調用ROM,速度快,但占用ROM資源多;如果資源有限,且對其速度沒有特別要求,可以采用以速度換面積的思想,用一個多路選擇器,將所有要實現的字符的地址、位置作為選擇條件,只調用一次ROM,面積減少了,但會增加一些復雜的組合邏輯,降低系統的工作頻率。其主要思路是:基于每個字符顯示位置的固定性及每個字符顯示大小的固定和同一性,行列時鐘計數器在某一范圍便是某一字符的有效域,從而賦予某一值以確定讀取的是第幾個字符的點陣信息[3]。
另外,如果字符是數字,比如是4位十進制數abcd,而字符庫里只存有0~9這10個數字,對其按式(1)進行一些簡單的處理即可

如果是4位十六進制數,只須將其依次移位,或用d={4’b0,abcd[3:0]}描述即可實現每一位,并在ROM上找到每一位對應的地址。本設計為了方便查找地址,分別用0~9查找字符0~9的地址, 用a~f查找字符 a~f的地址,其他字符依次排序。
本設計采用的視頻ADV7180_P輸入數據信號是16 bit,但有效信號是8 bit,故將其有效位引出轉換為8 bit數據信號 ADV7180_TEM,即 ADV7180_TEM={ADV7180_P[15:9],ADV7180_P[7]},輸出視頻數據信號ADV7179_P也是8 bit。本設計選用或(OR)門來實現視頻數據輸出,而不用IF-ELSE風格。因為選用后者在符合某行某列或是某區域時將此字符顯示出來,會使有些字符或圖像重疊。而使用或門就可以簡單地解決這一問題,并使程序顯得簡潔不冗長。程序如下:


本設計利用Nios II的靈活性,將視頻疊加字符模塊中由用戶給出的指令和參數引出來,在SoPC Builder[4]生成一個Nios II processor,并且添加On_chip_ram和PIO等模塊,設置參數,并在工程頂層文件實例化所生成的CPU核,完成相當于與DSP通信的串口工作,這樣就可以跳過DSP程序直接完成FPGA視頻字符疊加的功能實現,方便又快捷。原本應由DSP在某約定地址寫給FPGA的數據包括x,y坐標,狀態信息,命令和顯示狀態等,現在均可在Nios II 8.1 IDE的編譯環境中通過編寫程序直接給PIO口定義的變量賦值實現。代碼如下:

搭建調試平臺,連接攝像機、硬件電路板和監視器(顯示屏幕)等,將程序下載到FPGA中,在線調試字符疊加功能,通過監視器屏幕可以看到對應當前狀態的視頻圖像和字符顯示。
筆者設計了一種視頻字符疊加模塊,并成功地基于Nios II對其進行控制、調試。設計中增加了電路的面積,但避免了復雜的組合邏輯,提高了系統的工作效率。
[1]孫漲波,顧紅,蘇為民.視頻字符疊加技術的發展及四種實現方案[J]. 電子技術應用,2001(11):44-46.
[2]宋承杰,王景存.基于FPGA的視頻字符疊加的設計與實現[J].電視技術,2009,33(12):24-27.
[3]劉桂芬,張長明,高升久,等.基于FPGA的視頻字符疊加設計及其實現[J]. 國外電子元器件,2005(11):7-10.
[4]周立功.SoPC嵌入式系統基礎教程[M].北京:北京航空航天大學出版社,2006.