?
今天給大俠帶來基于FPGA的數(shù)字視頻信號處理器設(shè)計,由于篇幅較長,分三篇。今天帶來第三篇,下篇,程序測試與運(yùn)行。話不多說,上貨。
?
?
導(dǎo)讀
??
?
圖像是用各種觀測系統(tǒng)以不同形式和手段觀測客觀世界而獲得的,可以直接或間接作用于人眼進(jìn)而產(chǎn)生視知覺的實體。
隨著電子技術(shù)和計算機(jī)技術(shù)的飛速發(fā)展,數(shù)字圖像技術(shù)近年來得到極大的重視和長足的發(fā)展,并在科學(xué)研究、工業(yè)生產(chǎn)、醫(yī)療衛(wèi)生、通信等方面得到廣泛的應(yīng)用。
視頻信號由一系列連續(xù)的圖像組成。對視頻信號的處理已經(jīng)成為數(shù)字圖像處理領(lǐng)域中重要的一部分。例如機(jī)器人模式識別的過程就是一個視頻信號處理的過程,電視制導(dǎo)導(dǎo)彈識別目標(biāo)就是充分利用視頻信號處理技術(shù)不斷判斷目標(biāo)是否和預(yù)先設(shè)定目標(biāo)圖像一致。本篇將講解如何用 FPGA 技術(shù)實現(xiàn)基本的視頻信號處理。本篇的例子可以作為各位大俠進(jìn)行視頻信號處理時的一個參考,也可以在這個基礎(chǔ)上根據(jù)需要進(jìn)行擴(kuò)展。
第三篇內(nèi)容摘要:本篇會介紹程序測試與運(yùn)行,包括測試程序、測試結(jié)果以及總結(jié)等相關(guān)內(nèi)容。
?
?
五、程序測試與運(yùn)行
??
?
由于整個 FPGA 程序包括 3 部分:處于 TOP 的主體程序,控制其他各個部分程序的運(yùn)行;視頻圖像數(shù)據(jù)采集程序,從 SAA7113 獲得數(shù)字圖像數(shù)據(jù)并保存到 SRAM 中;SRAM 讀寫程序?qū)崿F(xiàn)對 SRAM 的數(shù)據(jù)讀寫。測試程序需要仿真數(shù)據(jù)的全部流程。
?
??
5.1 測試程序測試程序代碼如下:
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
"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);//內(nèi)部寄存器reg reset;reg clk;//50MHz 時鐘reg llck;//SAA7113 的時鐘reg [7:0] vpo;//來自 saa7113 的圖像數(shù)據(jù)reg capture;//采集數(shù)據(jù)標(biāo)志reg toggle;//總線切換標(biāo)志reg [1:0] rst;//輸入input error;input dsprst,xreset,saareset;input ARDY;input [7:0] ED_O;input ED_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 的信號reg CE3_;reg ARE_;reg AWE_;reg [21:2] EA;reg [7:0] ED_I;SRAMreg [7:0] SRAM_1_IN_ED;reg [7:0] SRAM_2_IN_ED;//wiressaa7113wire SRAM_CE_;wire SRAM_OE_;wire SRAM_WE_;wire [18:0] la;wire [7:0] ld;DSPwire CE_SRAM;wire WE_SRAM;wire OE_SRAM;wire [7:0] ED_SRAM;wire [18:0] EA_SRAM;//連接各個子程序LWBSAA7113 L_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));LWBDECODE L_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));LWBBUSCHANGE L_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));//產(chǎn)生時鐘信號always #10 clk=~clk;always #20 llck = ~llck;initialbeginstatus : %t TestBench of saa7113 started! ",$time);valueclk = 0;#7;llck =0;//resetreset = 1;初始化ARE_ = 1;AWE_ = 1;CE3_ = 1;//初始化capture = 0;toggle = 1;#2;reset = 0;@(posedge clk);reset = 1'b1; // negate reset讀取數(shù)據(jù)內(nèi)容SRAM_1_IN_ED = 8'h1d;SRAM_2_IN_ED = 8'h2d;地址總線:16] = 6'b000000;:7] = 9'b000000000;:2]= 5'b00001;#5;CE3_ = 0;ARE_ = 0;輸出內(nèi)容capture = 1;#5;llck) vpo = 8'haa;llck) vpo = 8'hbb;llck) vpo = 8'hcc;llck) vpo = 8'hdd;llck) vpo = 8'hee;//場同步信號//1llck) vpo = 8'hff;//beginllck) vpo = 8'h00;llck) vpo = 8'h00;llck) vpo = 8'b00100000;//sav//2llck) vpo = 8'hff;//beginllck) vpo = 8'h00;llck) vpo = 8'h00;llck) vpo = 8'b00100000;//數(shù)據(jù)開始llck) vpo = 8'hff;//beginllck) vpo = 8'h00;llck) vpo = 8'h00;llck) vpo = 8'b00000000;//datallck) vpo = 8'h01;//Cbllck) vpo = 8'h02;//Ybllck) vpo = 8'h03;//Crllck) vpo = 8'h04;//Yr--1llck) vpo = 8'h05;//Cbllck) vpo = 8'h06;//Ybllck) vpo = 8'h07;//Crllck) vpo = 8'h08;//Yr--2llck) vpo = 8'h09;//Cbllck) vpo = 8'h0a;//Ybllck) vpo = 8'h0b;//Crllck) vpo = 8'h0c;//Yr--3llck) vpo = 8'h0d;//Cbllck) vpo = 8'h0e;//Ybllck) vpo = 8'h0f;//Crllck) vpo = 8'h10;//Yr--4llck) vpo = 8'h11;//Cbllck) vpo = 8'h12;//Ybllck) vpo = 8'h13;//Crllck) vpo = 8'h14;//Yr--5llck) vpo = 8'h15;//Cbllck) vpo = 8'h16;//Ybllck) vpo = 8'h17;//Crllck) vpo = 8'h18;//Yr--6llck) vpo = 8'h19;//Cbllck) vpo = 8'h1a;//Ybllck) vpo = 8'h1b;//Crllck) vpo = 8'h1c;//Yr--7llck) vpo = 8'h1d;//Cbllck) vpo = 8'h1e;//Ybllck) vpo = 8'h1f;//Crllck) vpo = 8'h20;//Yr--8llck) vpo = 8'h21;//Cbllck) vpo = 8'h22;//Ybllck) vpo = 8'h23;//Crllck) vpo = 8'h24;//Yr--9llck) vpo = 8'h25;//Cbllck) vpo = 8'h26;//Ybllck) vpo = 8'h27;//Crllck) vpo = 8'h28;//Yr--10llck) vpo = 8'h29;//Cbllck) vpo = 8'h3a;//Ybllck) vpo = 8'h3b;//Crllck) vpo = 8'h3c;//Yr--11//數(shù)據(jù)結(jié)束llck) vpo = 8'hff;//ffllck) vpo = 8'h00;//00llck) vpo = 8'h00;//00llck) vpo = 8'b01110000;//end of field 1#20;ARE_ = 1;capture = 0;#200;//開始切換toggle = 0;#100;ARE_ = 0;//開始采集數(shù)據(jù)capture = 1;blanking stage//1llck) vpo = 8'hff;//beginllck) vpo = 8'h00;llck) vpo = 8'h00;llck) vpo = 8'b00100000;//sav//2llck) vpo = 8'hff;//beginllck) vpo = 8'h00;llck) vpo = 8'h00;llck) vpo = 8'b00100000;startllck) vpo = 8'hff;//beginllck) vpo = 8'h00;llck) vpo = 8'h00;llck) vpo = 8'b00000000;//datallck) vpo = 8'h01;//Cbllck) vpo = 8'h02;//Ybllck) vpo = 8'h03;//Crllck) vpo = 8'h04;//Yr--1llck) vpo = 8'h05;//Cbllck) vpo = 8'h06;//Ybllck) vpo = 8'h07;//Crllck) vpo = 8'h08;//Yr--2llck) vpo = 8'h09;//Cbllck) vpo = 8'h0a;//Ybllck) vpo = 8'h0b;//Crllck) vpo = 8'h0c;//Yr--3llck) vpo = 8'h0d;//Cbllck) vpo = 8'h0e;//Ybllck) vpo = 8'h0f;//Crllck) vpo = 8'h10;//Yr--4llck) vpo = 8'h11;//Cbllck) vpo = 8'h12;//Ybllck) vpo = 8'h13;//Crllck) vpo = 8'h14;//Yr--5llck) vpo = 8'h15;//Cbllck) vpo = 8'h16;//Ybllck) vpo = 8'h17;//Crllck) vpo = 8'h18;//Yr--6llck) vpo = 8'h19;//Cbllck) vpo = 8'h1a;//Ybllck) vpo = 8'h1b;//Crllck) vpo = 8'h1c;//Yr--7llck) vpo = 8'h1d;//Cbllck) vpo = 8'h1e;//Ybllck) vpo = 8'h1f;//Crllck) vpo = 8'h20;//Yr--8llck) vpo = 8'h21;//Cbllck) vpo = 8'h22;//Ybllck) vpo = 8'h23;//Crllck) vpo = 8'h24;//Yr--9llck) vpo = 8'h25;//Cbllck) vpo = 8'h26;//Ybllck) vpo = 8'h27;//Crllck) vpo = 8'h28;//Yr--10llck) vpo = 8'h29;//Cbllck) vpo = 8'h3a;//Ybllck) vpo = 8'h3b;//Crllck) vpo = 8'h3c;//Yr--11//數(shù)據(jù)結(jié)束llck) vpo = 8'hff;//ffllck) vpo = 8'h00;//00llck) vpo = 8'h00;//00llck) vpo = 8'b01110000;//end of field 1#20;//結(jié)束數(shù)據(jù)采集capture = 0;#200;//測試程序結(jié)束$finish;endendmodule
?
?
??
?
5.2 測試結(jié)果仿真程序產(chǎn)生的視頻圖像數(shù)據(jù)如圖 18 所示。開始的“aa bb cc dd ee ff”是無效數(shù)據(jù),“ff 00 20”表示場同步信號。 ?


圖 19 FPGA 采集得到的有效圖像數(shù)據(jù)并產(chǎn)生的地址信號
?對 SRAM 的讀寫控制,如圖 20 所示。 ?


七、總結(jié)
??
本篇首先介紹了視頻信號的基本原理、組成等,然后講解了進(jìn)行視頻信號處理的基本過程和框架。接下來結(jié)合實例講解用 FPGA 及其他芯片組成視頻處理的電路設(shè)計和 FPGA 的程序?qū)崿F(xiàn)。最后用 Modelsim 仿真和測試了程序。本篇為各位大俠提供了一種視頻信號處理的設(shè)計方案,僅供參考。
?
?
?
本篇到此結(jié)束,各位大俠,有緣再見!
審核編輯:湯梓紅
電子發(fā)燒友App


























評論