0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于FPGA的数字视频信号处理器设计(附代码)

FPGA技术江湖 来源:FPGA技术江湖 作者:FPGA技术江湖 2022-11-07 10:49 次阅读

导读

图像是用各种观测系统以不同形式和手段观测客观世界而获得的,可以直接或间接作用于人眼进而产生视知觉的实体。

随着电子技术和计算机技术的飞速发展,数字图像技术近年来得到极大的重视和长足的发展,并在科学研究、工业生产、医疗卫生、通信等方面得到广泛的应用。

视频信号由一系列连续的图像组成。对视频信号的处理已经成为数字图像处理领域中重要的一部分。例如机器人模式识别的过程就是一个视频信号处理的过程,电视制导导弹识别目标就是充分利用视频信号处理技术不断判断目标是否和预先设定目标图像一致。本篇将讲解如何用 FPGA 技术实现基本的视频信号处理。本篇的例子可以作为各位大侠进行视频信号处理时的一个参考,也可以在这个基础上根据需要进行扩展。

第三篇内容摘要:本篇会介绍程序测试与运行,包括测试程序、测试结果以及总结等相关内容。

五、程序测试与运行

由于整个 FPGA 程序包括 3 部分:处于 TOP 的主体程序,控制其他各个部分程序的运行;视频图像数据采集程序,从 SAA7113 获得数字图像数据并保存到 SRAM 中;SRAM 读写程序实现对 SRAM 的数据读写。测试程序需要仿真数据的全部流程。

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);
    //内部寄存器
    reg reset;
    reg clk;//50MHz 时钟
    reg llck;//SAA7113 的时钟
    reg [7:0] vpo;//来自 saa7113 的图像数据
    reg capture;//采集数据标志
    reg toggle;//总线切换标志
    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)
                          );
    //产生时钟信号
    always #10 clk=~clk;
    always #20 llck = ~llck;
    initial
        begin
            $display("
 status : %t TestBench of saa7113 started! 

",$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 读取数据内容
            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 输出内容
            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;
            
            //数据开始
            @(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
            
            //数据结束
            @(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;
            
            //开始采集数据
            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
            
            //数据结束
            @(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;
            
            //结束数据采集
            capture = 0;
            
            #200;
            //测试程序结束
            $finish;
        end
endmodule

5.2 测试结果

仿真程序产生的视频图像数据如图 18 所示。开始的“aa bb cc dd ee ff”是无效数据,“ff 00 20”表示场同步信号。

37923074-5ca0-11ed-a3b6-dac502259ad0.png

图 18 仿真产生的视频图像数据

经过 FPGA 处理后获得有效图像数据并产生相应的地址信号,如图 19 所示。由于只进行灰度运算,只取亮度信息,因此获得数据为“04 08 0c”,同时产生地址信号“00 01 02”。

37be5ae6-5ca0-11ed-a3b6-dac502259ad0.png

图 19 FPGA 采集得到的有效图像数据并产生的地址信号

对 SRAM 的读写控制,如图 20 所示。

37d99c20-5ca0-11ed-a3b6-dac502259ad0.png

图 20 产生的对 SRAM 的读写控制

两块 SRAM 之间的切换,如图 21 所示。

3808eebc-5ca0-11ed-a3b6-dac502259ad0.png

图 21 两块 SRAM 之间的切换

仿真结果表明整个视频信号处理程序完成了预先设定的设计目标。

七、总结

本篇首先介绍了视频信号的基本原理、组成等,然后讲解了进行视频信号处理的基本过程和框架。接下来结合实例讲解用 FPGA 及其他芯片组成视频处理的电路设计和 FPGA 的程序实现。最后用 Modelsim 仿真和测试了程序。本篇为各位大侠提供了一种视频信号处理的设计方案,仅供参考。

本篇到此结束,各位大侠,有缘再见!

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    19170

    浏览量

    229184
  • FPGA
    +关注

    关注

    1626

    文章

    21675

    浏览量

    601961
  • 数字视频信号

    关注

    0

    文章

    4

    浏览量

    6982

原文标题:基于FPGA的数字视频信号处理器设计(附代码)

文章出处:【微信号:HXSLH1010101010,微信公众号:FPGA技术江湖】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何用FPGA技术实现基本的视频信号处理

    今天给大侠带来基于FPGA数字视频信号处理器设计,由于篇幅较长,分三篇。今天带来第三篇,下篇,程序测试与运行。话不多说,上货。
    发表于 07-18 11:04 1268次阅读

    FPGA应用视频信号处理的基本过程是怎样的

    一场图像加入一个场同步信号。同时为了保证扫描逆程光栅不显示,应加入和同步信号同周期的消隐信号。对视频信号进行处理,需要先进行 A/D 转换、
    发表于 12-04 09:36

    FPGA数字视频信号的格式

    PAL 制电视信号转化为数字视频信号后的具体格式如图 7-3 所示,一般数据格式符合 ITU656 YUV 4:2:2 标准(在后面的章节将结合数字视频处理器数字视频格式详细介绍)。
    发表于 12-05 09:17

    FPGA视频信号处理的框架是怎样的

    (Digital Signal Processor,数字信号处理器)完成计算,也可以选择 FPGA。• 通信模块 实现与外界的数据交换。虽然视频信号
    发表于 12-05 09:22

    HIV025数字视频信号处理器相关资料分享

    HIV025数字视频信号处理器介绍
    发表于 03-30 06:10

    数字视频信号处理集成电路HTV025电子资料

    概述:HTV025是一款数字视频信号处理集成电路,其具有多路信号输入、输出接口。
    发表于 04-08 07:20

    用EDMA传输数字视频信号

    提出了如何利用EDMA将数字视频信号从较小的缓冲区转移到较大的存储,经过排序组成一幅完整的图像的方法。    关键词:EDMA
    发表于 05-05 20:38 884次阅读
    用EDMA传输<b class='flag-5'>数字视频信号</b>

    一种基于DSP与FPGA实现场发射平板显示视频信号处理系统的方案

    摘要:数字视频信号处理涉及对高速实时视频信号的传输和处理,要求相关电路系统具有强大的数据处理能力。介绍一种以DSP和
    发表于 02-25 16:39 53次下载

    数字视频信号及其测试

    数字电视系统较模拟系统有无可比拟的优势随着技术的成熟及价格的降低数字视频设备已逐渐成为广播电视设备的主流本文就数字视频信号格式系统的测试与评估方法作一探讨
    发表于 05-26 18:00 64次下载
    <b class='flag-5'>数字视频信号</b>及其测试

    多制式数字视频信号转换电路的开发实践

    介绍了多制式数字视频信号转换电路的实验设计。其主要功能是对模拟视频信号进行解码和数字化,并作隔行/逐行转换、尺度变换、帧频转换等处理,同时为PDP整机提供行、场同步信
    发表于 01-09 17:47 14次下载
    多制式<b class='flag-5'>数字视频信号</b>转换电路的开发实践

    基于FPGA的实时视频信号处理平台的设计

    提出一种基于FPGA的实时视频信号处理平台的设计方法,该系统接收低帧率数字YCbCr 视频信号,对接收的
    发表于 08-13 17:17 100次下载
    基于<b class='flag-5'>FPGA</b>的实时<b class='flag-5'>视频信号</b><b class='flag-5'>处理</b>平台的设计

    采用FPD-Link III技术实现数字视频信号远传设计

    针对高带宽数字视频信号的特点和某些应用场景下信号远传的需求,提出一种基于FPD-Link lII传输技术的数字视频信号远传设计。该设计采用型号为DS90ub925的串行芯片和型号为
    发表于 11-15 11:27 32次下载
    采用FPD-Link III技术实现<b class='flag-5'>数字视频信号</b>远传设计

    如何使用DSP和FPGA实现场发射平板显示视频信号处理系统的方案说明

    数字视频信号处理涉及对高速实时视频信号的传输和处理,要求相关电路系统具有强大的数据处理能力。介绍一种以DSP和
    发表于 02-05 15:22 14次下载
    如何使用DSP和<b class='flag-5'>FPGA</b>实现场发射平板显示<b class='flag-5'>器</b><b class='flag-5'>视频信号</b><b class='flag-5'>处理</b>系统的方案说明

    基于AIT2139全数字视频信号处理器实现视频转换的应用方案

    AIT2139是一种单片、晶控、全数字视频信号处理器。文章在介绍视频转换芯片AIT2139的基础上,给出了用其设计VGA-TV视频转换的原
    的头像 发表于 03-17 17:14 3301次阅读
    基于AIT2139全<b class='flag-5'>数字视频信号</b><b class='flag-5'>处理器</b>实现<b class='flag-5'>视频</b>转换<b class='flag-5'>器</b>的应用方案

    基于FPGA数字视频信号处理器设计

    今天给大侠带来基于FPGA数字视频信号处理器设计,由于篇幅较长,分三篇。 今天带来第一篇,上篇,视频信号概述和视频信号
    的头像 发表于 05-19 10:56 1465次阅读
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>数字视频信号</b><b class='flag-5'>处理器</b>设计