加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 五、程序測試與運行
    • 七、總結(jié)
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

基于FPGA的數(shù)字視頻信號處理器設(shè)計(附代碼)

2023/11/23
3577
閱讀需 23 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

大俠好,歡迎來到FPGA技術(shù)江湖,江湖偌大,相見即是緣分。大俠可以關(guān)注FPGA技術(shù)江湖,在“闖蕩江湖”、"行俠仗義"欄里獲取其他感興趣的資源,或者一起煮酒言歡。

今天給大俠帶來基于FPGA的數(shù)字視頻信號處理器設(shè)計,由于篇幅較長,分三篇。今天帶來第三篇,下篇,程序測試與運行。話不多說,上貨。

圖像是用各種觀測系統(tǒng)以不同形式和手段觀測客觀世界而獲得的,可以直接或間接作用于人眼進(jìn)而產(chǎn)生視知覺的實體。

隨著電子技術(shù)和計算機技術(shù)的飛速發(fā)展,數(shù)字圖像技術(shù)近年來得到極大的重視和長足的發(fā)展,并在科學(xué)研究、工業(yè)生產(chǎn)、醫(yī)療衛(wèi)生、通信等方面得到廣泛的應(yīng)用。

視頻信號由一系列連續(xù)的圖像組成。對視頻信號的處理已經(jīng)成為數(shù)字圖像處理領(lǐng)域中重要的一部分。例如機器人模式識別的過程就是一個視頻信號處理的過程,電視制導(dǎo)導(dǎo)彈識別目標(biāo)就是充分利用視頻信號處理技術(shù)不斷判斷目標(biāo)是否和預(yù)先設(shè)定目標(biāo)圖像一致。本篇將講解如何用 FPGA 技術(shù)實現(xiàn)基本的視頻信號處理。本篇的例子可以作為各位大俠進(jìn)行視頻信號處理時的一個參考,也可以在這個基礎(chǔ)上根據(jù)需要進(jìn)行擴展。

第三篇內(nèi)容摘要:本篇會介紹程序測試與運行,包括測試程序、測試結(jié)果以及總結(jié)等相關(guān)內(nèi)容。

五、程序測試與運行

由于整個 FPGA 程序包括 3 部分:處于 TOP 的主體程序,控制其他各個部分程序的運行;視頻圖像數(shù)據(jù)采集程序,從 SAA7113 獲得數(shù)字圖像數(shù)據(jù)并保存到 SRAM 中;SRAM 讀寫程序?qū)崿F(xiàn)對 SRAM 的數(shù)據(jù)讀寫。測試程序需要仿真數(shù)據(jù)的全部流程。

5.1 測試程序

測試程序代碼如下:

`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);    //內(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;        //TO SRAM    reg [7:0] SRAM_1_IN_ED;    reg [7:0] SRAM_2_IN_ED;        //wires    //from saa7113    wire SRAM_CE_;    wire SRAM_OE_;    wire SRAM_WE_;    wire [18:0] la;    wire [7:0] ld;        //FROM DSP    wire 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;    initial        begin            $display("n status : %t TestBench of saa7113 started! nn",$time);                        //initial value            clk = 0;            #7;            llck =0;                        //reset            reset = 1;                        //dsp 初始化            ARE_ = 1;            AWE_ = 1;            CE3_ = 1;                        //初始化            capture = 0;            toggle = 1;            #2;            reset = 0;            repeat(20) @(posedge clk);            reset = 1'b1; // negate reset                        //dsp 讀取數(shù)據(jù)內(nèi)容            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;            #5;            CE3_ = 0;            ARE_ = 0;            //saa7113 輸出內(nèi)容            capture = 1;            #5;            @(posedge llck) vpo = 8'haa;            @(posedge llck) vpo = 8'hbb;            @(posedge llck) vpo = 8'hcc;            @(posedge llck) vpo = 8'hdd;            @(posedge llck) vpo = 8'hee;                        //場同步信號            //1            @(posedge llck) vpo = 8'hff;//begin            @(posedge llck) vpo = 8'h00;            @(posedge llck) vpo = 8'h00;            @(posedge llck) vpo = 8'b00100000;//sav                       //2            @(posedge llck) vpo = 8'hff;//begin            @(posedge llck) vpo = 8'h00;            @(posedge llck) vpo = 8'h00;            @(posedge llck) vpo = 8'b00100000;                        //數(shù)據(jù)開始            @(posedge llck) vpo = 8'hff;//begin            @(posedge llck) vpo = 8'h00;            @(posedge llck) vpo = 8'h00;            @(posedge llck) vpo = 8'b00000000;                        //data            @(posedge llck) vpo = 8'h01;//Cb            @(posedge llck) vpo = 8'h02;//Yb            @(posedge llck) vpo = 8'h03;//Cr            @(posedge llck) vpo = 8'h04;//Yr--1                        @(posedge llck) vpo = 8'h05;//Cb            @(posedge llck) vpo = 8'h06;//Yb            @(posedge llck) vpo = 8'h07;//Cr            @(posedge llck) vpo = 8'h08;//Yr--2                        @(posedge llck) vpo = 8'h09;//Cb            @(posedge llck) vpo = 8'h0a;//Yb            @(posedge llck) vpo = 8'h0b;//Cr            @(posedge llck) vpo = 8'h0c;//Yr--3                        @(posedge llck) vpo = 8'h0d;//Cb            @(posedge llck) vpo = 8'h0e;//Yb            @(posedge llck) vpo = 8'h0f;//Cr            @(posedge llck) vpo = 8'h10;//Yr--4                        @(posedge llck) vpo = 8'h11;//Cb            @(posedge llck) vpo = 8'h12;//Yb            @(posedge llck) vpo = 8'h13;//Cr            @(posedge llck) vpo = 8'h14;//Yr--5                        @(posedge llck) vpo = 8'h15;//Cb            @(posedge llck) vpo = 8'h16;//Yb            @(posedge llck) vpo = 8'h17;//Cr            @(posedge llck) vpo = 8'h18;//Yr--6                        @(posedge llck) vpo = 8'h19;//Cb            @(posedge llck) vpo = 8'h1a;//Yb            @(posedge llck) vpo = 8'h1b;//Cr            @(posedge llck) vpo = 8'h1c;//Yr--7                        @(posedge llck) vpo = 8'h1d;//Cb            @(posedge llck) vpo = 8'h1e;//Yb            @(posedge llck) vpo = 8'h1f;//Cr            @(posedge llck) vpo = 8'h20;//Yr--8                        @(posedge llck) vpo = 8'h21;//Cb            @(posedge llck) vpo = 8'h22;//Yb            @(posedge llck) vpo = 8'h23;//Cr            @(posedge llck) vpo = 8'h24;//Yr--9                        @(posedge llck) vpo = 8'h25;//Cb            @(posedge llck) vpo = 8'h26;//Yb            @(posedge llck) vpo = 8'h27;//Cr            @(posedge llck) vpo = 8'h28;//Yr--10                        @(posedge llck) vpo = 8'h29;//Cb            @(posedge llck) vpo = 8'h3a;//Yb            @(posedge llck) vpo = 8'h3b;//Cr            @(posedge llck) vpo = 8'h3c;//Yr--11                        //數(shù)據(jù)結(jié)束            @(posedge llck) vpo = 8'hff;//ff            @(posedge llck) vpo = 8'h00;//00            @(posedge llck) vpo = 8'h00;//00            @(posedge llck) vpo = 8'b01110000;//end of field 1                        #20;            ARE_ = 1;            capture = 0;            #200;                        //開始切換            toggle = 0;            #100;            ARE_ = 0;                        //開始采集數(shù)據(jù)            capture = 1;                        //vertical blanking stage            //1            @(posedge llck) vpo = 8'hff;//begin            @(posedge llck) vpo = 8'h00;            @(posedge llck) vpo = 8'h00;            @(posedge llck) vpo = 8'b00100000;//sav                        //2            @(posedge llck) vpo = 8'hff;//begin            @(posedge llck) vpo = 8'h00;            @(posedge llck) vpo = 8'h00;            @(posedge llck) vpo = 8'b00100000;                        //data start            @(posedge llck) vpo = 8'hff;//begin            @(posedge llck) vpo = 8'h00;            @(posedge llck) vpo = 8'h00;            @(posedge llck) vpo = 8'b00000000;                        //data            @(posedge llck) vpo = 8'h01;//Cb            @(posedge llck) vpo = 8'h02;//Yb            @(posedge llck) vpo = 8'h03;//Cr            @(posedge llck) vpo = 8'h04;//Yr--1                        @(posedge llck) vpo = 8'h05;//Cb            @(posedge llck) vpo = 8'h06;//Yb            @(posedge llck) vpo = 8'h07;//Cr            @(posedge llck) vpo = 8'h08;//Yr--2                        @(posedge llck) vpo = 8'h09;//Cb            @(posedge llck) vpo = 8'h0a;//Yb            @(posedge llck) vpo = 8'h0b;//Cr            @(posedge llck) vpo = 8'h0c;//Yr--3                        @(posedge llck) vpo = 8'h0d;//Cb            @(posedge llck) vpo = 8'h0e;//Yb            @(posedge llck) vpo = 8'h0f;//Cr            @(posedge llck) vpo = 8'h10;//Yr--4                        @(posedge llck) vpo = 8'h11;//Cb            @(posedge llck) vpo = 8'h12;//Yb            @(posedge llck) vpo = 8'h13;//Cr            @(posedge llck) vpo = 8'h14;//Yr--5                        @(posedge llck) vpo = 8'h15;//Cb            @(posedge llck) vpo = 8'h16;//Yb            @(posedge llck) vpo = 8'h17;//Cr            @(posedge llck) vpo = 8'h18;//Yr--6                        @(posedge llck) vpo = 8'h19;//Cb            @(posedge llck) vpo = 8'h1a;//Yb            @(posedge llck) vpo = 8'h1b;//Cr            @(posedge llck) vpo = 8'h1c;//Yr--7                        @(posedge llck) vpo = 8'h1d;//Cb            @(posedge llck) vpo = 8'h1e;//Yb            @(posedge llck) vpo = 8'h1f;//Cr            @(posedge llck) vpo = 8'h20;//Yr--8                        @(posedge llck) vpo = 8'h21;//Cb            @(posedge llck) vpo = 8'h22;//Yb            @(posedge llck) vpo = 8'h23;//Cr            @(posedge llck) vpo = 8'h24;//Yr--9                        @(posedge llck) vpo = 8'h25;//Cb            @(posedge llck) vpo = 8'h26;//Yb            @(posedge llck) vpo = 8'h27;//Cr            @(posedge llck) vpo = 8'h28;//Yr--10                        @(posedge llck) vpo = 8'h29;//Cb            @(posedge llck) vpo = 8'h3a;//Yb            @(posedge llck) vpo = 8'h3b;//Cr            @(posedge llck) vpo = 8'h3c;//Yr--11                        //數(shù)據(jù)結(jié)束            @(posedge llck) vpo = 8'hff;//ff            @(posedge llck) vpo = 8'h00;//00            @(posedge llck) vpo = 8'h00;//00            @(posedge llck) 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”表示場同步信號。

圖 18 仿真產(chǎn)生的視頻圖像數(shù)據(jù)

經(jīng)過 FPGA 處理后獲得有效圖像數(shù)據(jù)并產(chǎn)生相應(yīng)的地址信號,如圖 19 所示。由于只進(jìn)行灰度運算,只取亮度信息,因此獲得數(shù)據(jù)為“04 08 0c”,同時產(chǎn)生地址信號“00 01 02”。

圖 19 FPGA 采集得到的有效圖像數(shù)據(jù)并產(chǎn)生的地址信號

對 SRAM 的讀寫控制,如圖 20 所示。

圖 20 產(chǎn)生的對 SRAM 的讀寫控制

兩塊 SRAM 之間的切換,如圖 21 所示。

圖 21 兩塊 SRAM 之間的切換

仿真結(jié)果表明整個視頻信號處理程序完成了預(yù)先設(shè)定的設(shè)計目標(biāo)。

七、總結(jié)

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

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

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風(fēng)險等級 參考價格 更多信息
A3P250-PQG208 1 Microsemi FPGA & SoC Field Programmable Gate Array, 250000 Gates, CMOS, PQFP208, 0.50 MM PITCH, PLASTIC, QFP-208
$22.32 查看
EPM240F100I5 1 Intel Corporation Flash PLD, 7.5ns, 192-Cell, CMOS, PBGA100,
$11.93 查看
A3P250-FG144 1 Microsemi FPGA & SoC Field Programmable Gate Array, 250000 Gates, CMOS, PBGA144, 1 MM PITCH, FBGA-144
$21.67 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

任何技術(shù)的學(xué)習(xí)就好比一個江湖,對于每一位俠客都需要不斷的歷練,從初入江湖的小白到歸隱山林的隱世高人,需要不斷的自我感悟自己修煉,讓我們一起仗劍闖FPGA乃至更大的江湖。