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

原创 FPGA技术江湖 2023-01-28 08:40

大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。


今天给大侠带来基于FPGA的数字视频信号处理器设计,由于篇幅较长,分三篇。今天带来第三篇,下篇,程序测试与运行话不多说,上货。

前两篇这里也放上超链接:

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

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


之前也有图像处理相关方面的文章,这里超链接几篇,给各位大侠作为参考。

《冈萨雷斯数字图像处理MATLAB版》中文版(第二版) 电子版

荐读:FPGA设计经验之图像处理

基于FPGA的实时图像边缘检测系统设计(下)

FPGA设计中 Verilog HDL实现基本的图像滤波处理仿真






导读 




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

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

视频信号由一系列连续的图像组成。对视频信号的处理已经成为数字图像处理领域中重要的一部分。例如机器人模式识别的过程就是一个视频信号处理的过程,电视制导导弹识别目标就是充分利用视频信号处理技术不断判断目标是否和预先设定目标图像一致。本将讲解如何用 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("\n status : %t TestBench of saa7113 started! \n\n",$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;        endendmodule




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

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

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

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


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

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

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

图 21 两块 SRAM 之间的切换

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


七、总结


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



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


END


往期精选 

 
 

【免费】FPGA工程师招聘平台

简谈FPGA设计中系统运行频率计算方法与组合逻辑的层级

SANXIN-B01开发板verilog教程V3电子版

求职面试 | FPGA或IC面试题最新汇总篇

FPGA项目开发:204B实战应用-LMK04821代码详解(二)

资料汇总|FPGA软件安装包、书籍、源码、技术文档…(2023.01.02更新)

FPGA就业班,2023.02.08开班,课程内容丰富,系统性学习FPGA,高薪就业,线上线下同步!


FPGA技术江湖广发江湖帖

无广告纯净模式,给技术交流一片净土,从初学小白到行业精英业界大佬等,从军工领域到民用企业等,从通信、图像处理到人工智能等各个方向应有尽有,QQ微信双选,FPGA技术江湖打造最纯净最专业的技术交流学习平台。


FPGA技术江湖微信交流群

加群主微信,备注姓名+公司/学校+岗位/专业进群


FPGA技术江湖QQ交流群

备注姓名+公司/学校+岗位/专业进群

FPGA技术江湖 任何技术的学习就好比一个江湖,对于每一位侠客都需要不断的历练,从初入江湖的小白到归隐山林的隐世高人,需要不断的自我感悟自己修炼,让我们一起仗剑闯FPGA乃至更大的江湖。
评论
  • 在智能家居领域中,Wi-Fi、蓝牙、Zigbee、Thread与Z-Wave等无线通信协议是构建短距物联局域网的关键手段,它们常在实际应用中交叉运用,以满足智能家居生态系统多样化的功能需求。然而,这些协议之间并未遵循统一的互通标准,缺乏直接的互操作性,在进行组网时需要引入额外的网关作为“翻译桥梁”,极大地增加了系统的复杂性。 同时,Apple HomeKit、SamSung SmartThings、Amazon Alexa、Google Home等主流智能家居平台为了提升市占率与消费者
    华普微HOPERF 2025-01-06 17:23 204浏览
  • 根据环洋市场咨询(Global Info Research)项目团队最新调研,预计2030年全球无人机锂电池产值达到2457百万美元,2024-2030年期间年复合增长率CAGR为9.6%。 无人机锂电池是无人机动力系统中存储并释放能量的部分。无人机使用的动力电池,大多数是锂聚合物电池,相较其他电池,锂聚合物电池具有较高的能量密度,较长寿命,同时也具有良好的放电特性和安全性。 全球无人机锂电池核心厂商有宁德新能源科技、欣旺达、鹏辉能源、深圳格瑞普和EaglePicher等,前五大厂商占有全球
    GIRtina 2025-01-07 11:02 124浏览
  • 本文介绍编译Android13 ROOT权限固件的方法,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。关闭selinux修改此文件("+"号为修改内容)device/rockchip/common/BoardConfig.mkBOARD_BOOT_HEADER_VERSION ?= 2BOARD_MKBOOTIMG_ARGS :=BOARD_PREBUILT_DTB
    Industio_触觉智能 2025-01-08 00:06 92浏览
  • 每日可见的315MHz和433MHz遥控模块,你能分清楚吗?众所周知,一套遥控设备主要由发射部分和接收部分组成,发射器可以将控制者的控制按键经过编码,调制到射频信号上面,然后经天线发射出无线信号。而接收器是将天线接收到的无线信号进行解码,从而得到与控制按键相对应的信号,然后再去控制相应的设备工作。当前,常见的遥控设备主要分为红外遥控与无线电遥控两大类,其主要区别为所采用的载波频率及其应用场景不一致。红外遥控设备所采用的射频信号频率一般为38kHz,通常应用在电视、投影仪等设备中;而无线电遥控设备
    华普微HOPERF 2025-01-06 15:29 167浏览
  • By Toradex 秦海1). 简介嵌入式平台设备基于Yocto Linux 在开发后期量产前期,为了安全以及提高启动速度等考虑,希望将 ARM 处理器平台的 Debug Console 输出关闭,本文就基于 NXP i.MX8MP ARM 处理器平台来演示相关流程。 本文所示例的平台来自于 Toradex Verdin i.MX8MP 嵌入式平台。  2. 准备a). Verdin i.MX8MP ARM核心版配合Dahlia载板并
    hai.qin_651820742 2025-01-07 14:52 108浏览
  • 大模型的赋能是指利用大型机器学习模型(如深度学习模型)来增强或改进各种应用和服务。这种技术在许多领域都显示出了巨大的潜力,包括但不限于以下几个方面: 1. 企业服务:大模型可以用于构建智能客服系统、知识库问答系统等,提升企业的服务质量和运营效率。 2. 教育服务:在教育领域,大模型被应用于个性化学习、智能辅导、作业批改等,帮助教师减轻工作负担,提高教学质量。 3. 工业智能化:大模型有助于解决工业领域的复杂性和不确定性问题,尽管在认知能力方面尚未完全具备专家级的复杂决策能力。 4. 消费
    丙丁先生 2025-01-07 09:25 117浏览
  • 村田是目前全球量产硅电容的领先企业,其在2016年收购了法国IPDiA头部硅电容器公司,并于2023年6月宣布投资约100亿日元将硅电容产能提升两倍。以下内容主要来自村田官网信息整理,村田高密度硅电容器采用半导体MOS工艺开发,并使用3D结构来大幅增加电极表面,因此在给定的占位面积内增加了静电容量。村田的硅技术以嵌入非结晶基板的单片结构为基础(单层MIM和多层MIM—MIM是指金属 / 绝缘体/ 金属) 村田硅电容采用先进3D拓扑结构在100um内,使开发的有效静电容量面积相当于80个
    知白 2025-01-07 15:02 144浏览
  • 故障现象一辆2017款东风风神AX7车,搭载DFMA14T发动机,累计行驶里程约为13.7万km。该车冷起动后怠速运转正常,热机后怠速运转不稳,组合仪表上的发动机转速表指针上下轻微抖动。 故障诊断 用故障检测仪检测,发动机控制单元中无故障代码存储;读取发动机数据流,发现进气歧管绝对压力波动明显,有时能达到69 kPa,明显偏高,推断可能的原因有:进气系统漏气;进气歧管绝对压力传感器信号失真;发动机机械故障。首先从节气门处打烟雾,没有发现进气管周围有漏气的地方;接着拔下进气管上的两个真空
    虹科Pico汽车示波器 2025-01-08 16:51 70浏览
  • 这篇内容主要讨论三个基本问题,硅电容是什么,为什么要使用硅电容,如何正确使用硅电容?1.  硅电容是什么首先我们需要了解电容是什么?物理学上电容的概念指的是给定电位差下自由电荷的储藏量,记为C,单位是F,指的是容纳电荷的能力,C=εS/d=ε0εrS/4πkd(真空)=Q/U。百度百科上电容器的概念指的是两个相互靠近的导体,中间夹一层不导电的绝缘介质。通过观察电容本身的定义公式中可以看到,在各个变量中比较能够改变的就是εr,S和d,也就是介质的介电常数,金属板有效相对面积以及距离。当前
    知白 2025-01-06 12:04 223浏览
  •  在全球能源结构加速向清洁、可再生方向转型的今天,风力发电作为一种绿色能源,已成为各国新能源发展的重要组成部分。然而,风力发电系统在复杂的环境中长时间运行,对系统的安全性、稳定性和抗干扰能力提出了极高要求。光耦(光电耦合器)作为一种电气隔离与信号传输器件,凭借其优秀的隔离保护性能和信号传输能力,已成为风力发电系统中不可或缺的关键组件。 风力发电系统对隔离与控制的需求风力发电系统中,包括发电机、变流器、变压器和控制系统等多个部分,通常工作在高压、大功率的环境中。光耦在这里扮演了
    晶台光耦 2025-01-08 16:03 61浏览
  • 彼得·德鲁克被誉为“现代管理学之父”,他的管理思想影响了无数企业和管理者。然而,关于他的书籍分类,一种流行的说法令人感到困惑:德鲁克一生写了39本书,其中15本是关于管理的,而其中“专门写工商企业或为企业管理者写的”只有两本——《为成果而管理》和《创新与企业家精神》。这样的表述广为流传,但深入探讨后却发现并不完全准确。让我们一起重新审视这一说法,解析其中的矛盾与根源,进而重新认识德鲁克的管理思想及其著作的真正价值。从《创新与企业家精神》看德鲁克的视角《创新与企业家精神》通常被认为是一本专为企业管
    优思学院 2025-01-06 12:03 158浏览
  • 「他明明跟我同梯进来,为什么就是升得比我快?」许多人都有这样的疑问:明明就战绩也不比隔壁同事差,升迁之路却比别人苦。其实,之间的差异就在于「领导力」。並非必须当管理者才需要「领导力」,而是散发领导力特质的人,才更容易被晓明。许多领导力和特质,都可以通过努力和学习获得,因此就算不是天生的领导者,也能成为一个具备领导魅力的人,进而被老板看见,向你伸出升迁的橘子枝。领导力是什么?领导力是一种能力或特质,甚至可以说是一种「影响力」。好的领导者通常具备影响和鼓励他人的能力,并导引他们朝着共同的目标和愿景前
    优思学院 2025-01-08 14:54 66浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦