
今天給大俠帶來基于FPGA的數字視頻信號處理器設計,由于篇幅較長,分三篇。今天帶來第三篇,下篇,程序測試與運行。話不多說,上貨。
前兩篇放個超鏈接。
基于FPGA的數字視頻信號處理器設計(上)
基于FPGA的數字視頻信號處理器設計(中)
導讀
圖像是用各種觀測系統以不同形式和手段觀測客觀世界而獲得的,可以直接或間接作用于人眼進而產生視知覺的實體。
隨著電子技術和計算機技術的飛速發展,數字圖像技術近年來得到極大的重視和長足的發展,并在科學研究、工業生產、醫療衛生、通信等方面得到廣泛的應用。
視頻信號由一系列連續的圖像組成。對視頻信號的處理已經成為數字圖像處理領域中重要的一部分。例如機器人模式識別的過程就是一個視頻信號處理的過程,電視制導導彈識別目標就是充分利用視頻信號處理技術不斷判斷目標是否和預先設定目標圖像一致。本篇將講解如何用 FPGA 技術實現基本的視頻信號處理。本篇的例子可以作為各位大俠進行視頻信號處理時的一個參考,也可以在這個基礎上根據需要進行擴展。
第三篇內容摘要:本篇會介紹程序測試與運行,包括測試程序、測試結果以及總結等相關內容。
五、程序測試與運行

由于整個 FPGA 程序包括 3 部分:處于 TOP 的主體程序,控制其他各個部分程序的運行;視頻圖像數據采集程序,從 SAA7113 獲得數字圖像數據并保存到 SRAM 中;SRAM 讀寫程序實現對 SRAM 的數據讀寫。測試程序需要仿真數據的全部流程。

測試程序代碼如下:
`include"timescale.v"moduletst_saa7113(error,dsprst,xreset,saareset,ARDY,ED_O,ED_OEN_O,SRAM_1_EA,SRAM_2_EA,SRAM_1_O_ED,SRAM_2_O_ED);//內部寄存器regreset;regclk;//50MHz 時鐘regllck;//SAA7113 的時鐘reg[7:0] vpo;//來自 saa7113 的圖像數據regcapture;//采集數據標志regtoggle;//總線切換標志reg[1:0] rst;//輸入inputerror;inputdsprst,xreset,saareset;inputARDY;input[7:0] ED_O;inputED_OEN_O;input[18:0] SRAM_1_EA;input[7:0] SRAM_1_O_ED;input[18:0] SRAM_2_EA;input[7:0] SRAM_2_O_ED;//來自dsp 的信號regCE3_;regARE_;regAWE_;reg[21:2] EA;reg[7:0] ED_I;//TOSRAMreg[7:0] SRAM_1_IN_ED;reg[7:0] SRAM_2_IN_ED;//wires//fromsaa7113wireSRAM_CE_;wireSRAM_OE_;wireSRAM_WE_;wire[18:0] la;wire[7:0] ld;//FROMDSPwireCE_SRAM;wireWE_SRAM;wireOE_SRAM;wire[7:0] ED_SRAM;wire[18:0] EA_SRAM;//連接各個子程序LWBSAA7113L_SAA7113 (.reset(reset),.clk(clk),.llck(llck),.vpo(vpo),.rst(rst),.capture(capture),.error(error),.SRAM_CE_(SRAM_CE_),.SRAM_OE_(SRAM_OE_),.SRAM_WE_(SRAM_WE_),.la(la),.ld(ld));LWBDECODEL_DECODE (.reset(reset),.CE3_(CE3_),.ARE_(ARE_),.AWE_(AWE_),.EA(EA),.ED_I(ED_I),.ED_O(ED_O),.ED_OEN_O(ED_OEN_O),.ARDY(ARDY),.EA_SRAM(EA_SRAM),.ED_SRAM(ED_SRAM),.CE_SRAM(CE_SRAM),.WE_SRAM(WE_SRAM),.OE_SRAM(OE_SRAM),.dsprst(dsprst),.xreset(xreset),.saareset(saareset));LWBBUSCHANGEL_BUSCHANGE (.EA_SRAM(EA_SRAM),.ED_SRAM(ED_SRAM),.CE_SRAM(CE_SRAM),.WE_SRAM(WE_SRAM),.OE_SRAM(OE_SRAM),.la(la),.ld(ld),.SRAM_CE_(SRAM_CE_),.SRAM_WE_(SRAM_WE_),.SRAM_OE_(SRAM_OE_),.SRAM_1_IN_ED(SRAM_1_IN_ED),.SRAM_2_IN_ED(SRAM_2_IN_ED),.toggle(toggle),.SRAM_1_EA(SRAM_1_EA),.SRAM_1_O_ED(SRAM_1_O_ED),.SRAM_2_EA(SRAM_2_EA),.SRAM_2_O_ED(SRAM_2_O_ED));//產生時鐘信號alwaysalwaysinitialbegin$display("\nstatus : %t TestBench of saa7113 started! \n\n",$time);//initialvalueclk = 0;llck =0;//resetreset = 1;//dsp初始化ARE_ = 1;AWE_ = 1;CE3_ = 1;//初始化capture = 0;toggle = 1;reset = 0;repeat(20)@(posedge clk);reset = 1'b1; // negate reset//dsp讀取數據內容SRAM_1_IN_ED = 8'h1d;SRAM_2_IN_ED = 8'h2d;//dsp地址總線EA[21:16] = 6'b000000;EA[15:7] = 9'b000000000;EA[6:2]= 5'b00001;CE3_ = 0;ARE_ = 0;//saa7113輸出內容capture = 1;@(posedgellck) vpo = 8'haa;@(posedgellck) vpo = 8'hbb;@(posedgellck) vpo = 8'hcc;@(posedgellck) vpo = 8'hdd;@(posedgellck) vpo = 8'hee;//場同步信號//1@(posedgellck) vpo = 8'hff;//begin@(posedgellck) vpo = 8'h00;@(posedgellck) vpo = 8'h00;@(posedgellck) vpo = 8'b00100000;//sav//2@(posedgellck) vpo = 8'hff;//begin@(posedgellck) vpo = 8'h00;@(posedgellck) vpo = 8'h00;@(posedgellck) vpo = 8'b00100000;//數據開始@(posedgellck) vpo = 8'hff;//begin@(posedgellck) vpo = 8'h00;@(posedgellck) vpo = 8'h00;@(posedgellck) vpo = 8'b00000000;//data@(posedgellck) vpo = 8'h01;//Cb@(posedgellck) vpo = 8'h02;//Yb@(posedgellck) vpo = 8'h03;//Cr@(posedgellck) vpo = 8'h04;//Yr--1@(posedgellck) vpo = 8'h05;//Cb@(posedgellck) vpo = 8'h06;//Yb@(posedgellck) vpo = 8'h07;//Cr@(posedgellck) vpo = 8'h08;//Yr--2@(posedgellck) vpo = 8'h09;//Cb@(posedgellck) vpo = 8'h0a;//Yb@(posedgellck) vpo = 8'h0b;//Cr@(posedgellck) vpo = 8'h0c;//Yr--3@(posedgellck) vpo = 8'h0d;//Cb@(posedgellck) vpo = 8'h0e;//Yb@(posedgellck) vpo = 8'h0f;//Cr@(posedgellck) vpo = 8'h10;//Yr--4@(posedgellck) vpo = 8'h11;//Cb@(posedgellck) vpo = 8'h12;//Yb@(posedgellck) vpo = 8'h13;//Cr@(posedgellck) vpo = 8'h14;//Yr--5@(posedgellck) vpo = 8'h15;//Cb@(posedgellck) vpo = 8'h16;//Yb@(posedgellck) vpo = 8'h17;//Cr@(posedgellck) vpo = 8'h18;//Yr--6@(posedgellck) vpo = 8'h19;//Cb@(posedgellck) vpo = 8'h1a;//Yb@(posedgellck) vpo = 8'h1b;//Cr@(posedgellck) vpo = 8'h1c;//Yr--7@(posedgellck) vpo = 8'h1d;//Cb@(posedgellck) vpo = 8'h1e;//Yb@(posedgellck) vpo = 8'h1f;//Cr@(posedgellck) vpo = 8'h20;//Yr--8@(posedgellck) vpo = 8'h21;//Cb@(posedgellck) vpo = 8'h22;//Yb@(posedgellck) vpo = 8'h23;//Cr@(posedgellck) vpo = 8'h24;//Yr--9@(posedgellck) vpo = 8'h25;//Cb@(posedgellck) vpo = 8'h26;//Yb@(posedgellck) vpo = 8'h27;//Cr@(posedgellck) vpo = 8'h28;//Yr--10@(posedgellck) vpo = 8'h29;//Cb@(posedgellck) vpo = 8'h3a;//Yb@(posedgellck) vpo = 8'h3b;//Cr@(posedgellck) vpo = 8'h3c;//Yr--11//數據結束@(posedgellck) vpo = 8'hff;//ff@(posedgellck) vpo = 8'h00;//00@(posedgellck) vpo = 8'h00;//00@(posedgellck) vpo = 8'b01110000;//end of field 1ARE_ = 1;capture = 0;//開始切換toggle = 0;ARE_ = 0;//開始采集數據capture = 1;//verticalblanking stage//1@(posedgellck) vpo = 8'hff;//begin@(posedgellck) vpo = 8'h00;@(posedgellck) vpo = 8'h00;@(posedgellck) vpo = 8'b00100000;//sav//2@(posedgellck) vpo = 8'hff;//begin@(posedgellck) vpo = 8'h00;@(posedgellck) vpo = 8'h00;@(posedgellck) vpo = 8'b00100000;//datastart@(posedgellck) vpo = 8'hff;//begin@(posedgellck) vpo = 8'h00;@(posedgellck) vpo = 8'h00;@(posedgellck) vpo = 8'b00000000;//data@(posedgellck) vpo = 8'h01;//Cb@(posedgellck) vpo = 8'h02;//Yb@(posedgellck) vpo = 8'h03;//Cr@(posedgellck) vpo = 8'h04;//Yr--1@(posedgellck) vpo = 8'h05;//Cb@(posedgellck) vpo = 8'h06;//Yb@(posedgellck) vpo = 8'h07;//Cr@(posedgellck) vpo = 8'h08;//Yr--2@(posedgellck) vpo = 8'h09;//Cb@(posedgellck) vpo = 8'h0a;//Yb@(posedgellck) vpo = 8'h0b;//Cr@(posedgellck) vpo = 8'h0c;//Yr--3@(posedgellck) vpo = 8'h0d;//Cb@(posedgellck) vpo = 8'h0e;//Yb@(posedgellck) vpo = 8'h0f;//Cr@(posedgellck) vpo = 8'h10;//Yr--4@(posedgellck) vpo = 8'h11;//Cb@(posedgellck) vpo = 8'h12;//Yb@(posedgellck) vpo = 8'h13;//Cr@(posedgellck) vpo = 8'h14;//Yr--5@(posedgellck) vpo = 8'h15;//Cb@(posedgellck) vpo = 8'h16;//Yb@(posedgellck) vpo = 8'h17;//Cr@(posedgellck) vpo = 8'h18;//Yr--6@(posedgellck) vpo = 8'h19;//Cb@(posedgellck) vpo = 8'h1a;//Yb@(posedgellck) vpo = 8'h1b;//Cr@(posedgellck) vpo = 8'h1c;//Yr--7@(posedgellck) vpo = 8'h1d;//Cb@(posedgellck) vpo = 8'h1e;//Yb@(posedgellck) vpo = 8'h1f;//Cr@(posedgellck) vpo = 8'h20;//Yr--8@(posedgellck) vpo = 8'h21;//Cb@(posedgellck) vpo = 8'h22;//Yb@(posedgellck) vpo = 8'h23;//Cr@(posedgellck) vpo = 8'h24;//Yr--9@(posedgellck) vpo = 8'h25;//Cb@(posedgellck) vpo = 8'h26;//Yb@(posedgellck) vpo = 8'h27;//Cr@(posedgellck) vpo = 8'h28;//Yr--10@(posedgellck) vpo = 8'h29;//Cb@(posedgellck) vpo = 8'h3a;//Yb@(posedgellck) vpo = 8'h3b;//Cr@(posedgellck) vpo = 8'h3c;//Yr--11//數據結束@(posedgellck) vpo = 8'hff;//ff@(posedgellck) vpo = 8'h00;//00@(posedgellck) vpo = 8'h00;//00@(posedgellck) vpo = 8'b01110000;//end of field 1//結束數據采集capture = 0;//測試程序結束$finish;endendmodule



圖 19 FPGA 采集得到的有效圖像數據并產生的地址信號


七、總結

本篇首先介紹了視頻信號的基本原理、組成等,然后講解了進行視頻信號處理的基本過程和框架。接下來結合實例講解用 FPGA 及其他芯片組成視頻處理的電路設計和 FPGA 的程序實現。最后用 Modelsim 仿真和測試了程序。本篇為各位大俠提供了一種視頻信號處理的設計方案,僅供參考。

本篇到此結束,各位大俠,有緣再見!

往期精選




FPGA技術江湖廣發江湖帖
無廣告純凈模式,給技術交流一片凈土,從初學小白到行業精英業界大佬等,從軍工領域到民用企業等,從通信、圖像處理到人工智能等各個方向應有盡有,QQ微信雙選,FPGA技術江湖打造最純凈最專業的技術交流學習平臺。
FPGA技術江湖微信交流群

加群主微信,備注姓名+學校/公司+專業/崗位進群
FPGA技術江湖QQ交流群

備注姓名+學校/公司+專業/崗位進群
