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

原创 FPGA技术江湖 2022-07-18 09:56

大侠好,欢迎来到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 仿真和测试了程序。本篇为各位大侠提供了一种视频信号处理的设计方案,仅供参考。



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


- -THE END- -


往期精选 

 
 

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

FPGA人才招聘,企业HR,看过来!

系统设计精选 | 基于FPGA的实时图像边缘检测系统设计(附代码)

基于原语的千兆以太网RGMII接口设计

时序分析理论和timequest使用_中文电子版

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

FPGA图像处理专题课新增Vivado部分内容,线上线下均可报名

FPGA时序分析及约束专题课新增Vivado部分内容,线上线下均可报名

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

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

FPGA技术江湖广发江湖帖

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


FPGA技术江湖微信交流群

加群主微信,备注职业+方向+名字进群


FPGA技术江湖QQ交流群

备注地区+职业+方向+名字进群


FPGA技术江湖 任何技术的学习就好比一个江湖,对于每一位侠客都需要不断的历练,从初入江湖的小白到归隐山林的隐世高人,需要不断的自我感悟自己修炼,让我们一起仗剑闯FPGA乃至更大的江湖。
评论
  • HDMI 2.2 规格将至,开启视听新境界2025年1月6日,HDMI Forum, Inc. 宣布即将发布HDMI规范2.2版本。新HDMI规范为规模庞大的 HDMI 生态系统带来更多选择,为创建、分发和体验理想的终端用户效果提供更先进的解决方案。新技术为电视、电影和游戏工作室等内容制作商在当前和未来提供更高质量的选择,同时实现多种分发平台。96Gbps的更高带宽和新一代 HDMI 固定比率速率传输(Fixed Rate Link)技术为各种设备应用提供更优质的音频和视频。终端用户显示器能以最
    百佳泰测试实验室 2025-01-09 17:33 84浏览
  • 1月7日-10日,2025年国际消费电子产品展览会(CES 2025)盛大举行,广和通发布Fibocom AI Stack,赋智千行百业端侧应用。Fibocom AI Stack提供集高性能模组、AI工具链、高性能推理引擎、海量模型、支持与服务一体化的端侧AI解决方案,帮助智能设备快速实现AI能力商用。为适应不同端侧场景的应用,AI Stack具备海量端侧AI模型及行业端侧模型,基于不同等级算力的芯片平台或模组,Fibocom AI Stack可将TensorFlow、PyTorch、ONNX、
    物吾悟小通 2025-01-08 18:17 72浏览
  • 在智能网联汽车中,各种通信技术如2G/3G/4G/5G、GNSS(全球导航卫星系统)、V2X(车联网通信)等在行业内被广泛使用。这些技术让汽车能够实现紧急呼叫、在线娱乐、导航等多种功能。EMC测试就是为了确保在复杂电磁环境下,汽车的通信系统仍然可以正常工作,保护驾乘者的安全。参考《QCT-基于LTE-V2X直连通信的车载信息交互系统技术要求及试验方法-1》标准10.5电磁兼容试验方法,下面将会从整车功能层面为大家解读V2X整车电磁兼容试验的过程。测试过程揭秘1. 设备准备为了进行电磁兼容试验,技
    北汇信息 2025-01-09 11:24 80浏览
  • 故障现象一辆2017款东风风神AX7车,搭载DFMA14T发动机,累计行驶里程约为13.7万km。该车冷起动后怠速运转正常,热机后怠速运转不稳,组合仪表上的发动机转速表指针上下轻微抖动。 故障诊断 用故障检测仪检测,发动机控制单元中无故障代码存储;读取发动机数据流,发现进气歧管绝对压力波动明显,有时能达到69 kPa,明显偏高,推断可能的原因有:进气系统漏气;进气歧管绝对压力传感器信号失真;发动机机械故障。首先从节气门处打烟雾,没有发现进气管周围有漏气的地方;接着拔下进气管上的两个真空
    虹科Pico汽车示波器 2025-01-08 16:51 111浏览
  • 在过去十年中,自动驾驶和高级驾驶辅助系统(AD/ADAS)软件与硬件的快速发展对多传感器数据采集的设计需求提出了更高的要求。然而,目前仍缺乏能够高质量集成多传感器数据采集的解决方案。康谋ADTF正是应运而生,它提供了一个广受认可和广泛引用的软件框架,包含模块化的标准化应用程序和工具,旨在为ADAS功能的开发提供一站式体验。一、ADTF的关键之处!无论是奥迪、大众、宝马还是梅赛德斯-奔驰:他们都依赖我们不断发展的ADTF来开发智能驾驶辅助解决方案,直至实现自动驾驶的目标。从新功能的最初构思到批量生
    康谋 2025-01-09 10:04 75浏览
  •  在全球能源结构加速向清洁、可再生方向转型的今天,风力发电作为一种绿色能源,已成为各国新能源发展的重要组成部分。然而,风力发电系统在复杂的环境中长时间运行,对系统的安全性、稳定性和抗干扰能力提出了极高要求。光耦(光电耦合器)作为一种电气隔离与信号传输器件,凭借其优秀的隔离保护性能和信号传输能力,已成为风力发电系统中不可或缺的关键组件。 风力发电系统对隔离与控制的需求风力发电系统中,包括发电机、变流器、变压器和控制系统等多个部分,通常工作在高压、大功率的环境中。光耦在这里扮演了
    晶台光耦 2025-01-08 16:03 87浏览
  • 「他明明跟我同梯进来,为什么就是升得比我快?」许多人都有这样的疑问:明明就战绩也不比隔壁同事差,升迁之路却比别人苦。其实,之间的差异就在于「领导力」。並非必须当管理者才需要「领导力」,而是散发领导力特质的人,才更容易被晓明。许多领导力和特质,都可以通过努力和学习获得,因此就算不是天生的领导者,也能成为一个具备领导魅力的人,进而被老板看见,向你伸出升迁的橘子枝。领导力是什么?领导力是一种能力或特质,甚至可以说是一种「影响力」。好的领导者通常具备影响和鼓励他人的能力,并导引他们朝着共同的目标和愿景前
    优思学院 2025-01-08 14:54 93浏览
  • 职场是人生的重要战场,既是谋生之地,也是实现个人价值的平台。然而,有些思维方式却会悄无声息地拖住你的后腿,让你原地踏步甚至退步。今天,我们就来聊聊职场中最忌讳的五种思维方式,看看自己有没有中招。1. 固步自封的思维在职场中,最可怕的事情莫过于自满于现状,拒绝学习和改变。世界在不断变化,行业的趋势、技术的革新都在要求我们与时俱进。如果你总觉得自己的方法最优,或者害怕尝试新事物,那就很容易被淘汰。与其等待机会找上门,不如主动出击,保持学习和探索的心态。加入优思学院,可以帮助你快速提升自己,与行业前沿
    优思学院 2025-01-09 15:48 69浏览
  • 在当前人工智能(AI)与物联网(IoT)的快速发展趋势下,各行各业的数字转型与自动化进程正以惊人的速度持续进行。如今企业在设计与营运技术系统时所面临的挑战不仅是技术本身,更包含硬件设施、第三方软件及配件等复杂的外部因素。然而这些系统往往讲究更精密的设计与高稳定性,哪怕是任何一个小小的问题,都可能对整体业务运作造成严重影响。 POS应用环境与客户需求以本次分享的客户个案为例,该客户是一家全球领先的信息技术服务与数字解决方案提供商,遭遇到一个由他们所开发的POS机(Point of Sal
    百佳泰测试实验室 2025-01-09 17:35 78浏览
  • 光伏逆变器是一种高效的能量转换设备,它能够将光伏太阳能板(PV)产生的不稳定的直流电压转换成与市电频率同步的交流电。这种转换后的电能不仅可以回馈至商用输电网络,还能供独立电网系统使用。光伏逆变器在商业光伏储能电站和家庭独立储能系统等应用领域中得到了广泛的应用。光耦合器,以其高速信号传输、出色的共模抑制比以及单向信号传输和光电隔离的特性,在光伏逆变器中扮演着至关重要的角色。它确保了系统的安全隔离、干扰的有效隔离以及通信信号的精准传输。光耦合器的使用不仅提高了系统的稳定性和安全性,而且由于其低功耗的
    晶台光耦 2025-01-09 09:58 62浏览
  • 一个真正的质量工程师(QE)必须将一件产品设计的“意图”与系统的可制造性、可服务性以及资源在现实中实现设计和产品的能力结合起来。所以,可以说,这确实是一种工程学科。我们常开玩笑说,质量工程师是工程领域里的「侦探」、「警察」或「律师」,守护神是"墨菲”,信奉的哲学就是「墨菲定律」。(注:墨菲定律是一种启发性原则,常被表述为:任何可能出错的事情最终都会出错。)做质量工程师的,有时会不受欢迎,也会被忽视,甚至可能遭遇主动或被动的阻碍,而一旦出了问题,责任往往就落在质量工程师的头上。虽然质量工程师并不负
    优思学院 2025-01-09 11:48 97浏览
  • 根据环洋市场咨询(Global Info Research)项目团队最新调研,预计2030年全球中空长航时无人机产值达到9009百万美元,2024-2030年期间年复合增长率CAGR为8.0%。 环洋市场咨询机构出版了的【全球中空长航时无人机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球中空长航时无人机总体规模,包括产量、产值、消费量、主要生产地区、主要生产商及市场份额,同时分析中空长航时无人机市场主要驱动因素、阻碍因素、市场机遇、挑战、新产品发布等。报告从中空长航时
    GIRtina 2025-01-09 10:35 74浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦