时间:2024-07-28 来源:网络搜集 关于我们 0
1)实验平台:正点原子开拓者FPGA 开发板
2)摘自《开拓者FPGA开发指南》关注官方微信号公众号,获取更多资料:正点原子
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-13912-1-1.html
第四十六章 基于OV7725的以太网传输视频实验
在“OV7725摄像头VGA显示实验”中,我们成功地在VGA显示器上实时显示出了摄像头采集
的图像;在“以太网通信实验”中,我们通过网口调试助手成功地和开发板完成了以太网通信
的功能。本章我们将使用FPGA开发板实现对OV7725的数字图像采集,并通过开发板上的以太网
接口发送给上位机实时显示。
本章包括以下几个部分:
46.1 以太网视频传输简介
46.2 实验任务
46.3 硬件设计
46.4 程序设计
46.5 下载验证
以太网视频传输简介
随着图像技术、监控技术的发展,通信的数据量越来越大,这无疑对数据传输系统的实时
性、稳定性和高效性都提出了苛刻的要求。对于大量数据的高速传输,一般使用以太网或者usb
传输方案,而以太网相比于usb,有着传输距离更远的优势。传统的以太网视频传输方案采用
百兆以太网进行传输,对于高帧率、高分辨率的视频才会用到千兆以太网,本章将使用开发板
上的百兆以太网PHY芯片学习如何使用以太网传输视频并通过上位机实时显示。
以太网实时视频传输采用的传输层方案一般有TCP和UDP两种。TCP协议能为两个端点间的
数据传输提供相对可靠的保障,这种保障是通过一个握手机制实现的。当数据发送给接收者时,
接收者要检查数据的正确性,当接收者接收到正确数据后给发送者一个确认报文信号,发送者
只有接收到接收者的确认报文信号后才能发送下一个数据块。如果没有接收到确认报文,这个
数据块就必须要重新发送。尽管这种机制对传输数据来说是非常合理的,但当它用在以太网视
频实时传输时就会引发很多问题。首先就是延迟问题,在传输信道丢包率较高时,TCP的传输
质量下滑严重,重传拥塞导致视频延时非常大,失去实时互通的意义。UDP同TCP相比能提供更
高的吞吐量和较低的延迟,非常适合低延时的视频传输场合。
UDP性能的提高是以不能保障数据完整性为代价的,它不能对所传数据提供担保,有时会
出现数据丢包的现象。为了降低丢包对视频显示带来的影响,我们为每帧图像添加一个帧头,
用于标志一帧图像的开始。上位机解析到图像帧头之后,接下来将接收到的像素数据重新放到
图像显示区域的起始位置,保证了在视频传输过程中,即使出现丢包的现象,视频也能恢复到
正常显示的画面。
实验任务
本节实验任务是使用FPGA开发板及OV7725摄像头实现图像采集,并通过开发板上的以太网
接口发送给上位机实时显示。
硬件设计
摄像头扩展接口原理图及OV7725模块说明与“OV7725摄像头VGA显示实验”完全相同,请
参考“OV7725摄像头VGA显示实验”硬件设计部分。以太网接口部分的硬件设计请参考“以太
网通信实验”中的硬件设计部分。
由于OV7725、以太网接口和SDRAM引脚数目较多且在前面相应的章节中已经给出它们的管
脚列表,这里不再列出管脚分配。
程序设计
OV7725在VGA(分辨率为640*480)帧模式下,以RGB565格式输出最高帧率可达60Hz,每秒
钟输出的数据量达到60*640*480*16bit = 294912000bit = 281.25Mbit。我们FPGA开发板上的
PHY芯片类型为百兆以太网,理论上最大传输速率为100Mbit/s,加上帧头、CRC校验以及帧间
隙带来的额外开销,实际上能达到的最大传输速率比理论上最大传输速率低。如果直接通过以
太网发送图像数据,由于数据传输速度不够而无法实时发送摄像头采集的一帧完整图像,因此
必须先缓存一帧图像之后再通过以太网发送出去。我们FPGA开发板芯片型号为 EP4CE10F17C8,
从Altera提供的Cyclone IV器件手册可以发现,EP4CE10的片内存储资源为414Kbit,远不能达
到存储要求。因此只能使用板载的外部存储器:SDRAM。我们FPGA开发板上的SDRAM容量为
256Mbit,足以满足缓存图像数据的需求。
图 46.4.1是根据本章实验任务画出的系统框图。PLL时钟模块用于为IIC驱动模块、SDRAM
控制模块提供驱动时钟,而UDP模块的驱动时钟是由开发板上的PHY芯片提供。I2C驱动模块和
I2C配置模块用于初始化OV7725图像传感器;摄像头采集模块负责采集摄像头图像数据,并且
把图像数据写入SDRAM读写控制模块中;SDRAM读写控制模块负责将用户数据写入和读出片外
SDRAM存储器;图像数据封装模块从SDRAM读写控制模块中读出数据,封装成以太网发送模块的
数据格式,包括添加图像的帧头;以太网发送模块发送封装后的图像数据,其发送的CRC校验
值由CRC32校验模块负责计算。
OV7725的以太网视频传输系统框图如下图所示:
图 46.4.1 基于OV7725的以太网视频传输系统框图
顶层模块的原理图如下图所示:
图 46.4.2 顶层模块原理图
由上图可知,FPGA顶层模块(
ov7725_rgb565_640x480_udp_pc)例化了以下七个模块:PLL时钟模块(pll_clk)、I2C驱动模块(i2c_dri)、I2C配置模块(i2c_ov7725_rgb565_cfg)、
摄像头图像采集模块(cmos_capture_data)、SDRAM读写控制模块(sdram_top)、图像数据封装模块(img_data_pkt)和UDP模块(udp)。
PLL时钟模块(pll_clk):PLL时钟模块通过调用锁相环(PLL)IP核来实现,总共输出3
个时钟,频率分别为100Mhz、100Mhz(SDRAM相位偏移时钟)和25Mhz时钟。100Mhz时钟和100Mhz
相位偏移时钟作为SDRAM读写控制模块的驱动时钟,25Mhz时钟作为I2C驱动模块的驱动时钟。
I2C驱动模块(i2c_dri):I2C驱动模块负责驱动OV7725 SCCB接口总线,用户可根据该模
块提供的用户接口可以很方便的对OV7725的寄存器进行配置,该模块和“EEPROM读写实验”章
节中用到的I2C驱动模块为同一个模块,有关该模块的详细介绍请大家参考“EEPROM读写实验”
章节。
I2C配置模块(i2c_ov7725_rgb565_cfg):I2C配置模块的驱动时钟是由I2C驱动模块输出
的时钟提供的,这样方便了I2C驱动模块和I2C配置模块之间的数据交互。该模块寄存需要配置
的寄存器地址、数据以及控制初始化的开始与结束,同时该模块输出OV7725的寄存器地址和数
据以及控制I2C驱动模块开始执行的控制信号,直接连接到I2C驱动模块的用户接口,从而完成
对OV7725传感器的初始化。有关该模块的详细介绍请大家参考“OV7725摄像头VGA显示实验”
章节。
摄像头图像采集模块(cmos_capture_data):摄像头采集模块在像素时钟的驱动下将传
感器输出的场同步信号、行同步信号以及8位数据转换成SDRAM读写控制模块的写使能信号和16
位写数据信号,完成对OV7725传感器图像的采集。有关该模块的详细介绍请大家参考“OV7725
摄像头VGA显示实验”章节。
SDRAM读写控制模块(sdram_top):SDRAM读写控制器模块负责驱动SDRAM片外存储器,缓
存图像传感器输出的图像数据。该模块将SDRAM复杂的读写操作封装成类似FIFO的用户接口,
非常方便用户的使用。
图像数据封装模块(img_data_pkt):图像数据封装模块负责从SDRAM中读取16位的图像
数据,并转换成以太网发送模块方便调用的32位数据,以及添加图像数据的帧头。该模块控制
着以太网发送模块发送的字节数,单次发送一行图像数据,模块内部例化了一个同步FIFO模块,
用于缓存待发送的图像数据。
UDP模块(udp):UDP模块实现以太网通信的收发功能,该模块内部例化了以太网接收模
块(ip_receive)、以太网发送模块(ip_send)和CRC32校验模块(crc32_d4)。其中以太网
的接收功能并没有用到。有关该模块的详细介绍请大家参考“以太网通信实验”章节。
顶层模块部分代码如下:
55 //parameter define
56 parameter SLAVE_ADDR = 7h21 ; //OV7725的器件地址7h21
57 parameter BIT_CTRL = 1b0 ; //OV7725的字节地址为8位 0:8位 1:16位
58 parameter CLK_FREQ = 26d25_000_000; //i2c_dri模块的驱动时钟频率 25MHz
59 parameter I2C_FREQ = 18d250_000 ; //I2C的SCL时钟频率,不超过400KHz
60 parameter CMOS_H_PIXEL = 24d640 ; //CMOS水平方向像素个数,用于设置SDRAM缓存大小
61 parameter CMOS_V_PIXEL = 24d480 ; //CMOS垂直方向像素个数,用于设置SDRAM缓存大小
62
63 //开发板MAC地址 00-11-22-33-44-55
64 parameter BOARD_MAC = 48h00_11_22_33_44_55;
65 //开发板IP地址 192.168.1.123
66 parameter BOARD_IP = {8d192,8d168,8d1,8d123};
67 //目的MAC地址 ff_ff_ff_ff_ff_ff
68 parameter DES_MAC = 48hff_ff_ff_ff_ff_ff;
69 //目的IP地址 192.168.1.102
70 parameter DES_IP = {8d192,8d168,8d1,8d102};
代码较长,省略部分代码……
211 //图像数据封装模块
212 img_data_pkt
213 #(
214 .CMOS_H_PIXEL (CMOS_H_PIXEL),
215 .CMOS_V_PIXEL (CMOS_V_PIXEL)
216 )
217 u_img_data_pkt(
218 .clk (eth_tx_clk),
219 .rst_n (rst_n & sys_init_done),
220 .img_data (rd_data),
221 .udp_tx_req (udp_tx_req),
222 .udp_tx_done (udp_tx_done),
223 .img_req (rd_en),
224 .udp_tx_start_en (tx_start_en),
225 .udp_tx_data (tx_data),
226 .udp_tx_byte_num (tx_byte_num)
227 );
228
229 //UDP模块
230 udp
231 #(
232 .BOARD_MAC (BOARD_MAC), //参数例化
233 .BOARD_IP (BOARD_IP ),
234 .DES_MAC (DES_MAC ),
235 .DES_IP (DES_IP )
236 )
237 u_udp(
238 .eth_rx_clk (eth_rx_clk ),
239 .rst_n (rst_n ),
240 .eth_rxdv (eth_rxdv ),
241 .eth_rx_data (eth_rx_data ),
242 .eth_tx_clk (eth_tx_clk ),
243 .tx_start_en (tx_start_en ),
244 .tx_data (tx_data ),
245 .tx_byte_num (tx_byte_num ),
246 .tx_done (udp_tx_done ),
247 .tx_req (udp_tx_req ),
248 .rec_pkt_done (),
249 .rec_en (),
250 .rec_data (),
251 .rec_byte_num (),
252 .eth_tx_en (eth_tx_en ),
253 .eth_tx_data (eth_tx_data ),
254 .eth_rst_n (eth_rst_n )
255 );
256
257 endmodule
在代码的第56行定义了OV7725的器件地址,其器件地址为7’h21;第57行定义了寄存器地
址的位宽,BIT_CTRL=0表示地址位宽为8位,BIT_CTRL=1表示地址位宽为16位。因为OV7725的
地址位宽为8位,所以BIT_CTRL设置为0。第60行和第61行分别定义了CMOS输出的水平像素个数
和垂直像素个数,在这里这两个参数用于设置在SDRAM中开辟的缓存大小和控制图像数据封装
模块内部的参数。由于上位机按照固定分辨率640*480来解析图像数据,因此CMOS_H_PIXEL=640,
CMOS_H_PIXEL=480。
在代码的第63至第70行定义了四个参量:开发板MAC地址BOARD_MAC,开发板IP地址
BOARD_IP,目的MAC地址DES_MAC(这里指PC MAC地址),目的IP地址DES_IP(PC IP地址)。
开发板的MAC地址和IP地址是我们随意定义的,只要不和目的MAC地址和目的IP地址一样就可以,
否则会产生地址冲突。目的MAC地址这里写的是公共MAC地址(48hff_ff_ff_ff_ff_ff),也
可以修改成电脑网口的MAC地址,DES_IP是对应电脑以太网的IP地址,这里定义的四个参数是
向下传递的,需要修改MAC地址或者IP地址时直接在这里修改即可,而不用在udp模块里面修改。
在代码的第224行至第226行代码中,图像数据封装模块输出的udp开始发送信号
(tx_start_en)、tx_data(发送的数据)和tx_byte_num(发送的字节数)连接至udp模块的
以太网发送端口,从而控制以太网发送模块的开始发送信号、发送字节数以及发送的数据。
图像数据封装模块负责从SDRAM中读取16位的图像数据,并转换成以太网发送模块方便调
用的32位数据,以及添加图像数据的帧头。图像数据封装模块代码如下所示:
1 module img_data_pkt
2 #(
3 parameter CMOS_H_PIXEL = 11d640, //CMOS水平方向像素个数
4 parameter CMOS_V_PIXEL = 11d480 //CMOS垂直方向像素个数
5 )
6 (
7 input clk , //时钟信号
8 input rst_n , //复位信号,低电平有效
9 input [15:0] img_data , //从sdram中读取的16位rgb565数据
10 input udp_tx_req , //udp发送数据请求信号
11 input udp_tx_done , //udp发送数据完成信号
12 output reg img_req , //图像数据请求信号
13 output reg udp_tx_start_en, //udp开始发送信号
14 output [31:0] udp_tx_data , //udp发送的数据
15 output reg [15:0] udp_tx_byte_num //udp单包发送的有效字节数
16 );
17
18 //parameter define
19 //图像帧头,用于标志一帧数据的开始
20 localparam IMG_FRAME_HEAD = {32hf0_5a_a5_0f};
21 //以太网帧间隙,单位:时钟周期40ns,百兆以太网中要求帧间隙至少为960ns
22 localparam ETH_IFG = 8d25;
23 //图像数据帧间隙 时钟周期 40ns, 22hf_ff_ff = 1048575; 1048575 * 40ns = 41.943ms
24 //在此处用于降低图像的发送帧率,因为上位机解析图像较慢,如果数据发送太快图像容易卡顿
25 localparam IMG_IFG = 22hf_ff_ff;
26
27 //reg define
28 reg img_ifg_done ; //以太网帧间隙延时完成信号
29 reg [21:0] img_ifg_cnt ; //以太网帧间隙延时计数器
30
31 reg [7:0] eth_ifg_cnt ; //图像数据帧间隙延时计数器
32 reg [10:0] img_h_cnt ; //图像水平像素计数器,用于控制img_req信号
33 reg [10:0] img_v_cnt ; //图像垂直像素计数器,用于添加帧头
34 reg img_val_en ; //图像数据有效使能信号
35 reg wr_sw ; //用于位拼接的标志
36 reg wr_fifo_en ; //写fifo使能
37 reg [31:0] wr_fifo_data ; //写fifo数据
38 reg head_flag ; //标志当前数据包是否需要添加帧头
39 reg [15:0] img_data_t ; //寄存16位图像数据,用于拼接成32位数据
40 reg fifo_empty_d0 ; //对fifo空信号进行打拍
41
42 //wire define
43 wire fifo_empty ; //fifo空信号
44 wire neg_fifo_empty ; //fifo空信号的下降沿
45
46 //*****************************************************
47 //** main code
48 //*****************************************************
49
50 //采fifo空信号的下降沿,当fifo_empty信号由高电平变为低电平时,说明fifo中已经有数据
51 assign neg_fifo_empty = fifo_empty_d0 & (~fifo_empty);
52
53 //控制图像帧间隙延时计数
54 always @(posedge clk or negedge rst_n) begin
55 if(!rst_n) begin
56 img_ifg_done <= 1b0;
57 img_ifg_cnt <= 22d0;
58 end
59 else begin
60 img_ifg_done <= 1b0;
61 if(udp_tx_done) begin
62 if(img_v_cnt == CMOS_V_PIXEL - 1b1)
63 //最后一行图像数据发送完成,延时计数器赋值
64 img_ifg_cnt <= IMG_IFG;
65 else
66 //非最后一行图像数据发送完成
67 img_ifg_done <= 1b1;
68 end
69 else if(img_ifg_cnt !=22d0 ) begin
70 img_ifg_cnt <= img_ifg_cnt - 22d1;
71 if(img_ifg_cnt == 22d1)
72 img_ifg_done <= 1b1;
73 end
74 end
75 end
76
77 //控制以太网帧间隙
78 always @(posedge clk or negedge rst_n) begin
79 if(!rst_n)
80 eth_ifg_cnt <= 8d0;
81 else if(img_ifg_done)
82 eth_ifg_cnt <= 8d0;
83 else if(eth_ifg_cnt <= ETH_IFG - 8b1)
84 eth_ifg_cnt <= eth_ifg_cnt + 8d1;
85 end
86
87 //图像水平像素计数器,用于控制img_req信号,一次请求一行数据
88 always @(posedge clk or negedge rst_n) begin
89 if(!rst_n)
90 img_h_cnt <= 11b0;
91 else if(img_h_cnt == 11d0) begin
92 if(eth_ifg_cnt == ETH_IFG - 8d1)
93 img_h_cnt <= CMOS_H_PIXEL;
94 end
95 else
96 img_h_cnt <= img_h_cnt - 11b1;
97 end
98
99 //图像垂直像素计数器,用于添加帧头
100 always @(posedge clk or negedge rst_n) begin
101 if(!rst_n)
102 img_v_cnt <= 11b0;
103 else if(udp_tx_done) begin
104 img_v_cnt <= img_v_cnt + 11d1;
105 if(img_v_cnt == CMOS_V_PIXEL - 1b1)
106 img_v_cnt <= 11d0;
107 end
108 end
109
110 //图像请求信号,用于读取SDRAM控制模块的读使能信号
111 always @(posedge clk or negedge rst_n) begin
112 if(!rst_n)
113 img_req <= 1b0;
114 else if(img_h_cnt!=11d0)
115 img_req <= 1b1;
116 else
117 img_req <= 1b0;
118 end
119
120 //sdram数据有效标志
121 always @(posedge clk or negedge rst_n) begin
122 if(!rst_n)
123 img_val_en <= 1b0;
124 else
125 img_val_en <= img_req;
126 end
127
128 //图像数据有效之后,向fifo中写入数据
129 always @(posedge clk or negedge rst_n) begin
130 if(!rst_n) begin
131 wr_fifo_en <= 1b0;
132 wr_fifo_data <= 32b0;
133 img_data_t <= 16d0;
134 wr_sw <= 1b0;
135 head_flag <= 1b0;
136 end
137 else begin
138 if(img_val_en) begin
139 wr_sw <= ~wr_sw;
140 if(wr_sw==1b0) begin
141 img_data_t <= img_data;
142 //head_flag = 0,像fifo中写入帧头
143 if(img_v_cnt == 11d0 && head_flag == 1b0) begin
144 wr_fifo_en <= 1b1;
145 wr_fifo_data <= IMG_FRAME_HEAD;
146 head_flag <= 1b1;
147 end
148 else
149 wr_fifo_en <= 1b0;
150 end
151 else begin
152 //16位数据转32位数据,将32位数据写入fifo
153 wr_fifo_en <= 1b1;
154 wr_fifo_data <= {img_data_t,img_data};
155 end
156 end
157 else begin
158 wr_fifo_en <= 1b0;
159 wr_fifo_data <= 32b0;
160 wr_sw <= 1b0;
161 head_flag <= 1b0;
162 end
163 end
164 end
165
166 //fifo空信号打拍,用于采沿
167 always @(posedge clk or negedge rst_n) begin
168 if(rst_n == 1b0)
169 fifo_empty_d0 <= 1b1;
170 else
171 fifo_empty_d0 <= fifo_empty;
172 end
173
174 //采到fifo信号的下降沿之后,说明fifo中已经有数据,此时开始通知udp模块发送数据
175 //因为写入速度大于读出速度,在一行数据写完之前,不会出现fifo读空的情况
176 always @(posedge clk or negedge rst_n) begin
177 if(rst_n == 1b0) begin
178 udp_tx_start_en <= 1b0;
179 udp_tx_byte_num <= 16d0;
180 end
181 else begin
182 if(neg_fifo_empty) begin
183 udp_tx_start_en <= 1b1;
184 if(head_flag == 1b0)
185 //发送的字节数 = 行像素数(rgb565)*2
186 udp_tx_byte_num <= {CMOS_H_PIXEL,1b0};
187 else
188 //发送的字节数 = 行像素数(rgb565)*2 + 4(帧头)
189 udp_tx_byte_num <= {CMOS_H_PIXEL,1b0} + 16d4;
190 end
191 else
192 udp_tx_start_en <= 1b0;
193 end
194 end
195
196 //同步fifo
197 sync_fifo_1024x32b u_sync_fifo_1024x32b(
198 .aclr (~rst_n),
199 .clock (clk),
200 .data (wr_fifo_data),
201 .rdreq (udp_tx_req),
202 .wrreq (wr_fifo_en),
203 .empty (fifo_empty),
204 .full (),
205 .q (udp_tx_data)
206 );
207
208 endmodule
在代码的第19行至第25行定义了三个参数,分别是IMG_FRAME_HEAD(图像帧头)、ETH_IFG
(以太网帧间隙)和IMG_IFG(图像帧间隙)。需要注意的是udp是一种不可靠、无连接的传输
协议,在使用udp传输数据时,有时会出现数据丢包的现象。这里说的丢包现象并不是开发板
没有把数据发送出去,而是电脑接收端系统繁忙或者其它的原因没有接收到数据。为了降低丢
包对视频显示带来的影响,我们为每帧图像添加一个帧头,上位机解析到帧头之后,接下来将
接收到的数据重新放到图像显示区域的起始位置,保证了在视频传输过程中,即使出现丢包的
现象,视频也能恢复到正常显示的画面。
图像帧头的值要尽量选择图像数据不容易出现的值,否则很容易把图像数据当成帧头,程
序中把图像帧头设置为{32hf0_5a_a5_0f},图像中出现的像素数据和帧头相同的概率极低,
因为上位机软件按照帧头为{32hf0_5a_a5_0f}来解析数据,所以帧头的值不可以随意修改。
以太网的帧间隙是网络设备和组件在接收一帧之后,需要短暂的时间来恢复并为接收下一帧做
准备的时间,在百兆以太网中,帧间隙的时间为960ns。图像帧间隙用于降低图像的发送帧率,因为上位机解析图像较慢(跟电脑性能有关,电脑性能越强,上位机图像解析速度越快),如
果数据发送太快图像容易卡顿。
代码中定义了img_h_cnt(图像水平像素计数器)和img_v_cnt(图像垂直像素计数器)。
img_h_cnt计数器用于控制img_req(图像请求)信号,计数的最大值为CMOS输出的水平像素分
辨率,因此每次img_h_cnt计数达最大值时完成一行图像数据的读取;img_v_cnt对已发送图像
的行数进行计数,计数最大值为CMOS输出的垂直像素分辨率。因此可以用img_v_cnt来表示当
前请求图像数据的行数,在每帧图像的第一行添加图像帧头。
图 46.4.3为图像数据封装模块采集过程中SignalTap抓取的波形图,img_req拉高之后开
始读取SDRAM控制模块中的图像数据,有效数据返回之后如果是返回第一行的数据,先把图像
帧头写入fifo(如下图的wr_fifo_en和wr_fifo_data)。fifo非空之后空信号由高电平变为低
电平,此时输出一个开始发送脉冲信号(udp_tx_start_en),并且输出的有效字节数由1280
变成1284。
图 46.4.3 摄像头采集行场同步信号的SignalTap波形图
下载验证
首 先 我 们 打 开 OV7725 的 以 太 网 视 频 传 输 实 验 工程, 在 工 程 所 在 的 路 径 下 打 开
ov7725_rgb565_640x480_udp_pc/par文件夹,在里 面 找 到“
ov7725_rgb565_640x480_udp_pc.qpf”并双击打开。注意工程所在的路径名只能由字母、数字以及下划线组成,不能出现中文、空格以及特殊字符等。工程打开后如图 46.5.1所示:
图 46.5.1 OV7725以太网视频传输工程
然后将OV7725摄像头插入开发板上的摄像头扩展接口(注意摄像头镜头朝外),然后将网
线一端连接电脑网口,另一端与开发板上的网口连接。再将下载器一端连电脑,另一端与开发
板上对应端口连接,最后连接电源线并打开电源开关。
开发板连接实物图如下所示:
图 46.5.2 OV7725摄像头
接下来我们下载程序,验证OV7725以太网视频传输上位机显示功能。工程打开后通过点击
工 具 栏 中 的 “Programmer” 图 标 打 开 下 载 界 面 , 通 过 “Add File” 按 钮 选 择
ov7725_rgb565_640x480_udp_pc/par/output_files
目 录 下 的
“
ov7725_rgb565_640x480_udp_pc.sof”文件。开发板电源打开后,在程序下载界面点击“Hardware Setup”,在弹出的对话框中选择当前的硬件连接为“USB-Blaster[USB-0]”。然
后点击“Start”将工程编译完成后得到的sof文件下载到开发板中,如图 46.5.3所示:
图 46.5.3 程序下载完成界面
程序下载完成后并且硬件连接无误的话,我们可以看到开发板上的以太网接口上的灯会不
停的闪烁,说明此时开发板正在向PC传输图像。电脑需要绑定开发板的MAC地址和IP地址才能
和开发板进行通信,有关MAC地址和IP地址的绑定方法请大家参考“以太网通信实验”的下载
验证部分。
开发板的MAC地址和IP地址绑定成功后,打开视频传输上位机显示软件,该软件位于开发
板所随附的资料“6_软件资料/1_软件/RawNetCapture”目录下找到“RawNetCapture V1.2.3”
并双击打开,打开后的界面如下:
图 46.5.4 视频传输上位机显示软件打开界面
在这里端口号设置为1234,见ip_send模块代码如下所示:
252 //16位源端口号:1234 16位目的端口号:1234
253 ip_head[5] <= {16’d1234,16’d1234};
端口号设置完成之后,点击开始按钮,此时可以看到上位机显示的图像画面,视频实时显
示界面如下图所示:
图 46.5.5 视频显示实时画面
从上图可以看到,上位机实时显示出了摄像头拍摄的画面,说明以太网视频传输上位机显示实验验证成功。需要注意的是,我们为每幅图像中间增加了时间间隔(图像帧间隙),再加
上传输图像所消耗的时间,一秒钟传输9~10帧图像,在拍摄运动的画面中可能会有点卡顿的现
象,但整体看上去图像画面还是比较流畅的。
我们现在打开wireshark,界面如下图所示:
图 46.5.6 wireshark打开界面
双击上图所示的本地连接或者先选中本地连接,再点击红框选中的蓝色按钮,即可开始抓
取本地连接的数据包,抓取界面如下图所示:
图 46.5.7 wireshark本地连接打开界面
上图中抓取的数据包为开发板发送的图像数据,单包发送一行数据为1280个字节,第一行
图像数据加帧头为1284个字节。双击其中一包数据可以查看数据包的详细数据,我们双击一个
字节数为1284的数据包,界面如下图所示:
图 46.5.8 wireshark抓取到的详细数据
从上图中可以看到,图像帧头和我们程序中设置的值是一样的。至此,基于OV7725的以太
网视频传输实验已经全部介绍完毕。