一、摘要
該博文主要將視頻采集、壓縮技術、總線切換技術和UDP數據傳輸結合在一起,完成了基於UDP的網絡攝像頭的開發。以下闡述了具體開發過程,一些關鍵問題的調試過程見下篇博文。
二、實驗平台
硬件平台:DIY_DE2
軟件平台:Quartus II 9.0 + Nios II 9.0 + Visual Studio 2008
三、實驗原理
1、系統整體框圖
圖1 系統整體框圖
2、系統的工作流程
首先,視頻采集部分一直工作並進行VGA顯示,當NIOS II端給出寫視頻數據命令后,切換總線為寫視頻方式,同時視頻壓縮部分開始工作,將視頻數據壓縮並寫入到SRAM中,當寫滿一幀圖像后,通知NIOS II讀取視頻數據,NIOS II通過中斷形式,進入中斷服務函數,將總線切換為讀視頻方式,之后讀取SRAM中的視頻,讀完一幀圖像之后,再次切換總線為寫視頻方式,同時傳輸視頻數據,PC端接收並顯示。
3、各個模塊的說明
(1)視頻采集
采用博文“DE2_TV例程的幾點說明”中分析的例程。
(2)視頻壓縮
該部分為了盡快驗證網絡攝像頭的可行性,采用了有損壓縮的方式,即隔一行采集一行,隔一列采集一列,並使用RGB555格式,最終的分辨率降低到320*240。
(3)總線切換
由於視頻采集是用的verilog實現的,而網絡傳輸部分是采用NIOS II軟核實現的,為了將二者聯系起來,采用了SRAM作為視頻緩存的存儲器;需要存儲數據時,將總線切換到視頻寫那一端,即Quartus II那一端;需要傳輸視頻數據時,將總線切換到視頻讀一端,即NIOS II那一端。
(4)網絡傳輸
采用的是UDP協議,在博文“DIY_DE2之DM9000A網卡調試系列例程(二)——DM9000A測試、自收發、實現UDP”中有提及,在NIOS II端完成,運行內存為SDRAM。
(5)PC顯示
這一部分,采用Visual Studio 2008作為上位機軟件平台,完成UDP協議,並將收到的視頻數據顯示在控件上。
四、實驗步驟
1、硬件平台部分
頂層文件采用原理圖的形式,如圖2所示。
圖2 頂層文件
FPGA端的底層文件主要有視頻采集及VGA顯示、視頻壓縮、總線切換和NIOS II網絡傳輸4個部分組成,其中除NIOS II網絡傳輸的原理圖是通過SOPC生成的外,其他的均需要手動生成。
對於DIY_DE2開發板,視頻采集及VGA顯示部分采用SDRAM1作為緩存,NIOS II部分僅采用SDRAM0作為運行內存,SRAM0做為總線切換器件。
另外,下面是幾個需要注意的問題:
(1)鎖相環
整個系統總共采用了一個鎖相環,時鍾輸入為50MHz,輸出為clk0:100MHz,偏移2ns,SDRAM的物理時鍾;clk1:100MHz,視頻采集端SDRAM1的控制器時鍾;clk2:100MHz,NIOS II控制器時鍾;另外,PLL部分采用in zero delay buffer mode(多一個警告)、with no compensation(優先)兩種模式均可。
(2)NIOS II處理器
采用NIOS II/f最高性能的處理器,並關掉二級緩存功能,初始化向量設為CFI,異常向量設為SDRAM0。
(3)NIOS II端的兩個PIO
一個輸入,一個輸出。輸入的設置為中斷,上升沿檢測;輸出的初始值設置為0。輸入的為給NIOS II的讀視頻信號,輸出的為NIOS II給外面的寫視頻信號。
(4)時序約束是采用的timequest工具。
2、NIOS II部分
NIOS II部分主要實現兩個功能:讀取緩存在SRAM中的圖像數據和通過UDP協議傳輸。而這兩個功能的實現均是在中斷服務函數中實現。一些關鍵代碼如下:
//讀緩存中的數據
for(j = 0;j < 76800;j++) { a[j] = IORD(SRAM_16BIT_512K_0_BASE,j); b[j] = IORD(SRAM_16BIT_512K_0_BASE,j) >> 8; } //再次將其置高,往SRAM里面寫數據 IOWR(PIO_1_BASE,0,1); //第一包數據全為0,作為一幀圖像開始信號 for(i = 0;i < 1;i++) { for(k = 42;k < 1506;k++) { SND[k] = 0; } TransmitPacket(SND,1510); // Send repetitively 1468 bytes of data. } //接下來的105包數據為有效的圖像數據 for(i = 1;i < 106;i++) { for(k = 42;k < 1506;k++) { if((k%2) == 0) SND[k] = a[k/2 - 21 + i*732]; else SND[k] = b[k/2 - 21 + i*732]; // IOWR_ALTERA_AVALON_PIO_DATA(LED_GREEN_BASE,SND[k]); // msleep(500); } TransmitPacket(SND,1510); // Send repetitively 1468 bytes of data. }
注:網絡傳輸部分無論發送還是接收,都是先傳輸低位,再傳輸高位。
注意:系統初始化的IP部分,應正確填寫DE2和PC的IP,並使其在同一網段中。
3、PC端
PC端實現UDP傳輸協議和視頻顯示是采用C#語言,其設計界面如下所示。
圖3 C#界面
五、實驗結果
VGA顯示結果和PC端顯示結果分別如圖所示。
圖4 VGA顯示效果
圖5 C#端顯示效果