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

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

3天内不再提示

基于FPGA的DVP协议实现标准图像数据流转换

FPGA设计论坛 来源:FPGA设计论坛 2025-02-11 14:22 次阅读

一、什么是DVP?

DVP(Digital Video Port) 是传统的sensor输出接口,采用并行输出方式,d数据位宽有8bit、10bit、12bit、16bit,是CMOS电平信号(重点是非差分信号),PCLK最大速率为96MHz,接口如下图:

4b2e1e96-e82f-11ef-9310-92fbcf53809c.png

PCLK:pixel clock ,像素时钟,每个时钟对应一个像素数据;

HSYNC:horizonal synchronization,行同步信号

VSYNC:vertical synchronization,帧同步信号;

DATA:像素数据,视频数据,具体位宽要看ISP是否支持;

XCLK:或者MCLK,ISP芯片输出给驱动sensor的时钟;

SCL,SDA:IIC用来读写sensor的寄存器,配置sensor。

DVP协议是摄像头中常用的协议,除了DVP协议摄像头中还有其他常用的协议如:MIPI、LVDS等协议。其整体协议时序图如图:

4b47263e-e82f-11ef-9310-92fbcf53809c.png

4b5a6d20-e82f-11ef-9310-92fbcf53809c.png

图中PIXCLK信号即是PCLk信号,FV是帧同步信号,LV是行同步信号,输出的P0~Pn就是像素数据。

二、OV7670摄像头的DVP协议时序

(1)水平时序

4b6ec54a-e82f-11ef-9310-92fbcf53809c.png

(2)和VGA对应的帧时序

DVP协议和VGA接口协议基本一样,只是VSYNC信号高低电平相反了。还有DVP协议的HREF信号是在HERF为高电平是直接输出像素数据,而VGA接口的HSYNC信号在HSYNC为高时先后输出显示后沿、有效图像数据、显示前沿。

4b75fbd0-e82f-11ef-9310-92fbcf53809c.png

(3)这里对OV7670摄像头配置输出的是RGB565图像数据,其时序为:

4b7fa19e-e82f-11ef-9310-92fbcf53809c.png

(4)配置成RGB555和RGB444输出时序如图:

4b8cf236-e82f-11ef-9310-92fbcf53809c.png

RGB555

4b96f862-e82f-11ef-9310-92fbcf53809c.png

RGB444

三、RTL设计

从上边所看的时序图可以将DVP协议转换成标准的图像的数据流,代码如下:

// Company :

// Engineer :

// -----------------------------------------------------------------------------

// https://blog.csdn.net/qq_33231534 PHF's CSDN blog

// -----------------------------------------------------------------------------

// Create Date : 2020-09-24 2257

// Revise Data : 2020-09-24 2257

// File Name : ov7670_data_16rgb565.v

// Target Devices : XC7Z015-CLG485-2

// Tool Versions : Vivado 2019.2

// Revision : V1.1

// Editor : sublime text3, tab size (4)

// Description : DVP协议(digital video port)获取ov7670数据并转换成16位RGB565图像数据

module ov7670_data_16rgb565(

inputclk,//输入为摄像头输入时钟pclk 25MHz

inputrst_n,//系统复位

inputvsync,//场同步信号

inputhref,//行同步信号

input[7:0]din,//ov7670摄像头数据输入

inputinit_done,//ov7670摄像头初始化结束标志

outputreg[15:0]data_rgb565,//转换成16位RGB565图像数据

outputregdata_rgb565_vld //16位RGB565图像数据有效标志

);

regvsync_r;

reghref_r;

reg[7:0]din_r;

regvsync_r_ff0;

regvsync_r_ff1;

regdata_start;

reg[3:0]frame_cnt;

regframe_vaild;

wirevsync_r_pos;

regdata_en;

//外部信号打一拍

always @(posedge clk or negedge rst_n) begin

if (!rst_n) begin

vsync_r <= 0;

href_r <= 0;

din_r <= 8'd0;

end

else begin

vsync_r <= vsync;

href_r <= href;

din_r <= din;

end

end

//场同步信号上升沿检测

always @(posedge clk or negedge rst_n) begin

if (!rst_n) begin

vsync_r_ff0 <= 0;

vsync_r_ff1 <= 0;

end

else begin

vsync_r_ff0 <= vsync_r;

vsync_r_ff1 <= vsync_r_ff0;

end

end

assign vsync_r_pos = (vsync_r_ff0 && ~vsync_r_ff1);

always @(posedge clk or negedge rst_n) begin

if (!rst_n) begin

data_start <= 0;

end

else if (init_done) begin

data_start <= 1;

end

else begin

data_start <= data_start;

end

end

always @(posedge clk or negedge rst_n) begin

if (!rst_n) begin

frame_cnt <= 0;

end

else if (data_start && frame_vaild==0 && vsync_r_pos) begin

frame_cnt <= frame_cnt + 1'b1;

end

else begin

frame_cnt <= frame_cnt;

end

end

always @(posedge clk or negedge rst_n) begin

if (!rst_n) begin

frame_vaild <= 0;

end

else if (frame_cnt >= 10) begin

frame_vaild <= 1;

end

else begin

frame_vaild <= frame_vaild;

end

end

always @(posedge clk or negedge rst_n) begin

if (!rst_n) begin

data_en <= 0;

end

else if (href_r && frame_vaild) begin

data_en <= ~data_en;

end

else begin

data_en <= 0;

end

end

always @(posedge clk or negedge rst_n) begin

if (!rst_n) begin

data_rgb565_vld <= 0;

end

else if (data_en) begin

data_rgb565_vld <= 1;

end

else begin

data_rgb565_vld <= 0;

end

end

always @(posedge clk or negedge rst_n) begin

if (!rst_n) begin

data_rgb565 <= 16'd0;

end

else if (data_en) begin

data_rgb565 <= {data_rgb565[15:8],din_r};

end

else begin

data_rgb565 <= {din_r,data_rgb565[7:0]};

end

end

endmodule

测试代码:

`timescale 1ns/1ns

module ov7670_data_16rgb565_tb (); /* this is automatically generated */

reg rst_n;

reg clk;

localparam clk_period = 20;

reg vsync;

reg href;

reg [7:0] din;

reg init_done;

wire [15:0] data_rgb565;

wire data_rgb565_vld;

ov7670_data_16rgb565 inst_ov7670_data_16rgb565

(

.clk (clk),

.rst_n (rst_n),

.vsync (vsync),

.href (href),

.din (din),

.init_done (init_done),

.data_rgb565 (data_rgb565),

.data_rgb565_vld (data_rgb565_vld)

);

initial clk = 1;

always #(clk_period/2) clk = ~clk;

initial begin

#2;

rst_n = 0;

vsync = 0;

href = 0;

din = 0;

init_done = 0;

#(clk_period*20);

rst_n = 1;

#(clk_period*20);

init_done = 1;

#clk_period;

init_done = 0;

#(clk_period*20);

repeat(12)begin

#(clk_period*500);

dvp_data();

end

#(clk_period*20);

$stop;

end

task dvp_data;

integer i,j;

begin

vsync = 0;

#(clk_period*10);

vsync = 1;

#(clk_period*10);

vsync = 0;

#(clk_period*100);

for(i=0;i<480;i=i+1)begin

for(j=0;j<640*2;j=j+1)begin

href = 1;

#(clk_period);

din = din + 1'b1;

end

href = 0;

#(clk_period*100);

end

din = 0;

end

endtask

endmodule

仿真图如图所示:

(1)传输12帧图像数据

4ba8ea9a-e82f-11ef-9310-92fbcf53809c.png

可以看到,data_rgb565_vld数据有效信号在10帧图像数据后才有输出,这是为了在初始化后图像数据可能会有不稳定情况,因此将前十帧图像丢弃。

(2)1帧图像数据(注意看帧同步信号)

4bbda520-e82f-11ef-9310-92fbcf53809c.png

(3)传输数据部分细节

4bd0612e-e82f-11ef-9310-92fbcf53809c.png

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

    关注

    1637

    文章

    21849

    浏览量

    608801
  • 寄存器
    +关注

    关注

    31

    文章

    5393

    浏览量

    121999
  • 接口
    +关注

    关注

    33

    文章

    8785

    浏览量

    152476
  • 图像数据
    +关注

    关注

    0

    文章

    54

    浏览量

    11367
  • dvp
    dvp
    +关注

    关注

    0

    文章

    14

    浏览量

    9155

原文标题:基于FPGA的DVP协议实现标准图像数据流转换

文章出处:【微信号:gh_9d70b445f494,微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    相关推荐

    FPGA配置TVP5150,把PAL制标准视频转换成BT656数据格式,能否把数据流直接给SAA7121?

    FPGA配置TVP5150,把PAL制标准视频转换成BT656数据格式,请问能否把数据流直接给SAA7121这样的编码芯片,我这么做的,
    发表于 02-11 07:14

    #硬声创作季 #FPGA FPGA-54-01 RAW数据流转换到RGB888图像数据原理分析-2

    fpga图像
    水管工
    发布于 :2022年10月29日 03:01:07

    #硬声创作季 #FPGA FPGA-54-01 RAW数据流转换到RGB888图像数据原理分析-3

    fpga图像
    水管工
    发布于 :2022年10月29日 03:01:26

    基于FPGA的数字视频转换接口的设计与实现

    数据流发送,通过DVI-I端口发送给显示终端显示。本设计方案中,MT9M111输出图像的分辨率为1280×960。 图1 系统采集与显示过程 在现实景物的采集与显示过程中,视频转换接口功能的
    发表于 12-11 10:59

    采用FPGA的数字视频接口转换设备设计

    图像传感器MT9M111采集到现实景物后,将生成的ITU-R BT.656数据流由ITU数据输出端口发送给视频转换接口。视频转换接口将IT
    发表于 04-17 07:00

    采用FPGA作为主控芯片的数字视频接口转换设备

    的ITU-R BT.656数据流转换成TMDS数据流发送,通过DVI-I端口发送给显示终端显示。本设计方案中,MT9M111输出图像的分辨率为1280×960。 图1 系统采集与显示过程在现实景物的采集与显示
    发表于 04-22 07:00

    采用FPGA的数字视频接口转换设备

    端口送来的ITU-R BT.656数据流转换成TMDS数据流发送,通过DVI-I端口发送给显示终端显示。本设计方案中,MT9M111输出图像的分辨率为1280×960。图1 系统采集与显示过程在现实
    发表于 04-23 07:00

    采用FPGA实现数字视频转换接口设计

    1所示。图像传感器MT9M111采集到现实景物后,将生成的ITU-R BT.656数据流由ITU数据输出端口发送给视频转换接口。视频转换接口
    发表于 05-05 09:29

    采用FPGA的数字视频接口转换设备设计

    引言本文从实际应用的角度出发,采用FPGA作为主控芯片,设计了一款数字视频接口转换设备,该设备针对于MT9M111这款数字图像传感器产生的ITU-R BT.656格式数据进行采集、色彩
    发表于 05-29 05:00

    【工程源码】基于FPGA的OV5640数据流接收和应用基本逻辑设计

    本文和设计代码由FPGA爱好者小梅哥编写,未经作者许可,本文仅允许网络论坛复制转载,且转载时请标明原作者。OV5640提供了一个DVP接口用来输出采集到的图像数据流,本文提供了一个将
    发表于 02-18 19:56

    基于FPGA和EPP的图像传感器高速数据采集

    。因此,为了采集数据量大的图像数据,本文采用了具有较高传输速率的增强型并行口协议(EPP)和FPGA
    发表于 04-30 07:47

    yuv422p格式数据流转换成RGB888格式数据流

    yuv422p格式数据流转换成RGB888格式数据流,亲测可用
    发表于 02-25 18:12 14次下载

    基于FPGA芯片的数据流结构分析

    Virtex 型FPGA 芯片是Xilinx 公司芯片系列中的一种,Virtex 系列的数据流及配置逻辑与XC4000 的数据流及配置逻辑有显著不同,但却与Xilinx 的FPGA
    发表于 11-18 11:37 2494次阅读

    FPGA与ADC数字数据输出接口的协议标准

    场可编程门阵列(FPGA)与模数转换器(ADC)输出的接口是一项常见的工程设计挑战。本文简要介绍各种接口协议标准,并提供有关在高速数据
    的头像 发表于 09-15 10:29 6185次阅读
    <b class='flag-5'>FPGA</b>与ADC数字<b class='flag-5'>数据</b>输出接口的<b class='flag-5'>协议</b>及<b class='flag-5'>标准</b>

    如何使用FPGA实现Bayer到RGB图像格式转换的设计

    利用FPGA处理数据量大、处理速度快,结合CMOS图像传感器MT9M001和BayerCFA格式图像的特点,设计一种基于FPGA
    发表于 01-25 16:04 6次下载
    如何使用<b class='flag-5'>FPGA</b><b class='flag-5'>实现</b>Bayer到RGB<b class='flag-5'>图像</b>格式<b class='flag-5'>转换</b>的设计