FPGA精简版UDP协议实现板间网线传输视频,提供3套工程源码

news/2024/5/18 14:41:21 标签: udp, fpga开发, 网络传输, 图像处理, ov5640

目录

  • 1.FPGA精简版UDP介绍
  • 2.网线板间视频传输---精简版UDP再次精简
  • 3.网线板间视频传输---实现方案
  • 4.网线板间视频传输---发送端方案
  • 5.网线板间视频传输---接收端方案
  • 6.工程1介绍---Artix7(RTL8211)双网口环回
  • 7.工程2介绍---Artix7发送--->Kintex7(B50610)接收
  • 8.工程3介绍---Kintex7发送--->Artix7接收
  • 9.板极调试验证
  • 10.福利:工程代码的获取

1.FPGA精简版UDP介绍

精简版UDP协议是一种资源占用少,不限FPGA硬件平台,纯Verilog代码实现的UDP通信方案,经本人反复验证,稳定性很高,关于精简版UDP请参考我之前写的文章点击查看:精简版UDP

2.网线板间视频传输—精简版UDP再次精简

查看我之前写的文章点击查看:精简版UDP后,应该会知道整个UDP方案如下:
在这里插入图片描述
但对于板件视频传输而言,ARP协议是不需要的,我们只需用到串并转换和UDP收发即可,再次精简后的UDP架构如下:
在这里插入图片描述

3.网线板间视频传输—实现方案

总体方案如下图:
在这里插入图片描述

下面解释一下图中的关系:
开发板1:视频发送
视频源:这里是OV5640摄像头,当然,其他视频也可以;
数据采集:OV5640摄像头输出的是RGB565格式图像,这里做数据采集,并生成vs、hs、de等时序;
FDMA视频三帧缓存通路:这部分在UDP发送中并没有实际意义,之所以缓存并输出是为了验证视频采集的正确性,也为了和接收板卡的输出进行比较,看传输是否正确,在验证正确后,可删除此部分,关于FDMA视频三帧缓存通路请参考我之前写的文章点击查看:FDMA视频三帧缓存架构
UDP编码:将摄像头采集数据进行数据编码,为UDP发送做准备;
这里的做准备有如下几层意思:
1、数据位宽的转换:RGB565的16bit数据转换到32bit的UDP数据位宽;
2、时钟域的转换,OV5640输出时钟大概30M左右,转换到UDP千兆模式的125M;
3、数据组包:UDP一次传输一行视频数据,称为一个UDP包,每个UDP包都好包含包头和数据段;包头包括固定的4字节帧头和视频行号,一个UDP包组成如下:
UDP发送:使用精简版UDP再精简实现,关于精简版UDP请参考我之前写的文章点击查看:精简版UDP
PHY1:也就是网络PHY芯片,这里不再多讲;
在这里插入图片描述
图中的字节数需要好好理解一下;

开发板2:视频接收
PHY2:也就是网络PHY芯片,这里不再多讲;
UDP接收:使用精简版UDP再精简实现,关于精简版UDP请参考我之前写的文章点击查看:精简版UDP
UDP解码:将接收到的UDP数据解码为视频数据,并生成vs、hs、de等时序;
这里的解码有如下几层意思:
1、解包,丢弃帧头,保留有效数据;
2、数据位宽的转换:32bit的UDP数据位宽转换到RGB565的16bit数据;
FDMA视频三帧缓存通路:这部分实现将接收到的UDP视频数据输出到显示器上显示,关于FDMA视频三帧缓存通路请参考我之前写的文章点击查看:FDMA视频三帧缓存架构

4.网线板间视频传输—发送端方案

发送端主要实现的功能上面已经讲了,这里主要讲如何实现,很显然,只需一个fifo即可;
发送端顶层接口部分如下:

module ov5640_tx_rj45(
    input              gmii_tx_clk     ,	//发送端时钟	
	input              cam_pclk        ,	//摄像头时钟
    input              rst_n           ,	//系统复位信号,低电平有效  	
    input              tx_done         ,	//以太网发送完成信号
    input              tx_req          ,	//读数据请求信号 	
    output             tx_start_en     ,	//以太网开始发送信号
    output     [31:0]  tx_data         ,	//以太网待发送数据                    
    input              cmos_frame_vsync,    //输入场信号
	input              cmos_frame_href ,    //输入行信号
    input              cmos_frame_valid,    //输入数据有效信号
    input      [15:0]  cmos_data        	//输入数据
    );

关键的部分是数据的组包和fifo读使能的控制,总体思路就是:fifo先缓存一行视频数据,存满后通知UDP来读,然后发起一次UDP发送,就这么简单;
组包部分关键代码如下:

//产生tx端发送数据
always@(posedge gmii_tx_clk)begin
	if(!rst_n || frame_flag_t) tx_data <= 0;
	else if(tx_req && cnt_tx_req == 0) tx_data <= {16'ha151,cnt_v};		
	else if(tx_rd_en) tx_data <= tx_rd_data;		
    else tx_data <= tx_data;		
end	

5.网线板间视频传输—接收端方案

接收端是发送端的逆过程,实现方法依然是一个fifo搞定,不同的是接收端不需要跨时钟域,因为直接把接收时钟作为ddr缓存的写入时钟;
接收端顶层接口部分如下:

module rj45_rx_ov5640(
    input         gmii_rx_clk ,	//接受端时钟	
    input         rst_n       ,	//系统复位信号,低电平有效  	
    input         rec_pkt_done,	//以太网单包数据接收完成信号
    input         rec_en      ,	//以太网接收的数据使能信号
    input  [31:0] rec_data    ,	//以太网接收的数据  
	output        vout_vs     ,	//输出场vs
	output        vout_de     ,	//输出场de
	output [15:0] vout_rgb565	//输出场rgb565 
    );

解包部分关键代码如下:

//产生网络帧帧头
always@(posedge gmii_rx_clk)begin
	if(!rst_n) rx_frame_flag <= 0;
    else if(rec_en_d1 && (pkt_head == 32'ha1510000) && (cnt_rec_en == 1)) rx_frame_flag <= 1;
	else if(cnt_rx_frame_flag >= 100) rx_frame_flag <= 0;
    else rx_frame_flag <= rx_frame_flag;	
end

6.工程1介绍—Artix7(RTL8211)双网口环回

开发板:Artix7开发板;
网络PHY:RTL8211;
开发环境:vivado2019.1;
输入:OV5640摄像头,720P,RGB565;
输出:网线,HDMI显示器;
Artix7开发板有2个网口,PHY均为RTL8211,用网线连接2个网口实现视频回环收发;
工程BD如下:
在这里插入图片描述
工程代码架构如下:
在这里插入图片描述

7.工程2介绍—Artix7发送—>Kintex7(B50610)接收

发送端:
开发板:Artix7开发板;
网络PHY:RTL8211;
开发环境:vivado2019.1;
输入:OV5640摄像头,720P,RGB565;
输出:网线;
接收端:
开发板:Kintex7开发板;
网络PHY:B50610;
开发环境:vivado2019.1;
输入:网线;
输出:HDMI显示器;
整个架构需要两块板子,一根网线,当然也有两个工程,这里就不具体展示了,截图太多手软了;

8.工程3介绍—Kintex7发送—>Artix7接收

发送端:
开发板:Kintex7开发板;
网络PHY:B50610;
开发环境:vivado2019.1;
输入:OV5640摄像头,720P,RGB565;
输出:网线
接收端:
开发板:Artix7开发板;
网络PHY:RTL8211;
开发环境:vivado2019.1
输入:网线;
输出:HDMI显示器;
整个架构需要两块板子,一根网线,当然也有两个工程,这里就不具体展示了,截图太多手软了;

9.板极调试验证

回环工程如图:
在这里插入图片描述
板间收发连接如图:
在这里插入图片描述
再来个视频演示:A7发送K7接收的演示;

udp板间视频传输

10.福利:工程代码的获取

福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料如下:获取方式:私。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


http://www.niftyadmin.cn/n/10450.html

相关文章

微信小程序|使用小程序制作一个2048小游戏

文章目录一、文章前言二、创建小程序三、功能开发一、文章前言 此文主要通过小程序实现2048游戏&#xff0c;游戏操作简单&#xff0c;容易上手。 规则&#xff1a;正常打开游戏的界面&#xff0c;会只有两个2&#xff0c;每次移动后都会出现一个2&#xff0c;数字大了之后会出…

若依框架字典配置以及使用(结合vue和emelent)

一&#xff1a;字典数据创建&#xff08;我们公司是后端做的&#xff0c;前端不用管&#xff09; 1.首先新建要指定的默认角色 &#xff08;1&#xff09;必须用管理员账号登录才能看到角色管理 &#xff08;2&#xff09;具体怎写&#xff0c;可以参考已有的数据&#xff08…

c++编程实例

26&#xff0c;一个数介入恰好等于它的因子之和&#xff0c;那个数就称为完数.例似&#xff0c;6的因子为2&#xff0c;2&#xff0c;3&#xff0c;而6223&#xff0c;是以6是完数.编程求2000以内全部完数. #define M 2000 #include <stdio.h> int main&#xff08;) { i…

黑马点评--分布式锁

黑马点评–分布式锁 基本原理与不同实现方式对比&#xff1a; 什么是分布式锁&#xff1a; ​ 分布式锁&#xff1a;满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心是实现多进程之间互斥&#xff0c;而满足这一点的方式有很多&#xff0c;常见的有三种…

博客资源汇总

资源汇总 前言 各位小伙伴大家好&#xff0c;很久没有更新博客了。鄙人由于自己的事务很久没有进行创作&#xff0c;再加上经验和技术不足需要进行深刻的学习&#xff0c;停更了较长时间。首先给一直给予关注的小伙伴们致歉&#xff0c;开了很多坑但是还没完成。这顿时间忙着…

Oracle Primavera Unifier组合管理器(Portfolio Manager)

目录 一&#xff1a;前言 二&#xff1a;介绍​​​​​​​ 一&#xff1a;前言 Oracle Primavera Unifier uDesigner Portfolio Manager 项目组合管理器是公司的预算员/计划工程师可以收集项目&#xff08;计划和执行中&#xff09;的成本和进度信息&#xff0c;并对“假设…

【Kafka从成神到升仙系列 四】你真的了解 Kafka 的缓存池机制嘛

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小黄&#xff0c;独角兽企业的Java开发工程师&#xff0c;CSDN博客专家&#xff0c;Java领域新星创作者&#x1f4d5;系列专栏&#xff1a;Java设计模式、数据结构和算法、Kafka从入门到成神、Kafka从成神到…

实验四 软中断信号及处理

1.利用sleep、pause、alarm函数设定闹钟&#xff0c;定时显示信息。 #include<unistd.h> #include<stdio.h> #include<stdlib.h> #include<signal.h> int main(){int ret;alarm(50);sleep(30);retalarm(10);printf("%d\n",ret);pause();pri…