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

    文章

    18275

    浏览量

    222158
  • FPGA
    +关注

    关注

    1602

    文章

    21320

    浏览量

    593195
  • 数字视频信号

    关注

    0

    文章

    4

    浏览量

    6962

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    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

    R&S DVSG数字视频信号

    RSDVSG数字视频信号源基于通用的平台实现了针对压缩和非压缩视音频信号的发生和再播放功能。它不仅提供了TS传输接口,还提供了几乎所有通用的音/视频(高清/标清)接口,用于电视
    发表于 04-05 11:25 32次下载

    数字视频信号及其测试

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

    供应罗德与施瓦茨DVSG数字视频信号

    R&S DVSG数字视频信号源基于通用的平台实现了针对压缩和非压缩视音频信号的发生和再播放功能。它不仅提供了TS传输接口,还提供了几乎所有通用的音/视频(高清/标清)接口,用于电视显
    发表于 01-07 15:00 973次阅读
    供应罗德与施瓦茨DVSG<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>远传设计

    如何保证数字视频信号的质量

    了错误检测和处理E,就有助于监视关键的信号通路,并对系统中潜在的问题进行报警。 从模拟体制到数字体制的过渡为帮助保持设备中视频信号的质量提供了许多有利条件。
    发表于 10-12 18:06 366次阅读

    DVSG数字视频信号源的性能特点及应用分析

    DVSG数字视频信号源支持对最新一代电视机和投影机的研发和质量认证。它作为一种最经济的解决方案,可以在单台设备中产生用于测试的各类音视频信号
    的头像 发表于 12-31 16:50 2549次阅读

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

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

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

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