24. 基于OV5640的以太网视频传输¶
在前面的章节,我们已经实现了以太网数据回环,以及基于VGA、HDMI、TFT_LCD的以太网传输图片显示。在本章节,我们将以太网、OV5640摄像头与野火上位机相结合,通过OV5640摄像头采集图像信息,使用以太网传输给PC机,通过PC机上的上位机实时显示。
24.1. 理论学习¶
本章节涉及到的以太网、SDRAM以及OV5640摄像头的相关知识在前面章节均有详细讲解,此处不再赘述。读者若有遗忘,请回顾相关章节进行学习巩固。
24.2. 实战演练¶
24.2.1. 实验目标¶
通过实验设计并实现基于OV5640的以太网视频传输。使用OV5640摄像头采集图像信息,将图像信息暂存到SDRAM中,读取暂存的图像信息,通过以太网将读取的图片信息发送给PC机,使用上位机读取图像信息并实时显示,图像分辨率位640*480。
24.2.2. 硬件资源¶
硬件资源部分,读者可参阅“SDRAM读写控制器的设计与验证”“OV5640摄像头VGA图像显示”和“以太网数据环回实验”章节的硬件资源小节。
24.4. 上板调试¶
24.4.1. 引脚约束¶
实验目标已经明确,硬件资源也已经介绍完毕,我们开始程序设计部分的讲解。我们先来对实验工程进行一个整体说明,让读者了解整个实验工程的框架结构。实验工程整体框图,具体见图 74‑1;子功能模块简介,具体见表格 74‑1。
图 74‑1 实验工程整体框图
表格 74‑1 子功能模块功能描述
模块名称 |
功能描述 |
---|---|
clk_gen |
时钟信号生成模块(IP核) |
ov5640_top |
OV5640摄像头驱动模块 |
image_format |
图像格式配置模块 |
image_data |
图像数据打包模块 |
eth_udp_rmii |
以太网数据收发器(RMII) |
sdram_top |
SDRAM数据读写控制器 |
eth_ov5640_rgb |
顶层模块 |
由上述图表可知,实验工程包含6个子功能模块:时钟信号生成模块(clk_gen(IP核))、OV5640摄像头驱动模块(ov5640_top)、图像格式配置模块(image_format)、图像数据打包模块(image_data)、以太网数据收发器 (eth_udp_rmii)、SDRAM数据读写控制器(sdram_top)和顶层模块(eth_ov5640_rgb)。
时钟信号生成模块(clk_gen),为实验工程各模块提供工作时钟,调用IP核生成;OV5640摄像头驱动模块(ov5640_top),实现OV5640摄像头的寄存器配置、初始化,经OV5640摄像头传输的图像数据进行拼接,并暂存到SDRAM中;图像格式配置模块(image_format),生成图像格 式配置包,将图像格式按照野火上位机数据包格式进行打包,通过以太网发送给上位机,配置上位机的显示格式;图像数据打包模块(image_data),读取暂存在SDRAM中的图像数据,按照野火上位机图像格式进行打包,将图像数据通过以太网发送给上位机,实现图像显示;以太网数据收发器 (eth_udp_rmii),实现以太网数据收发操作;SDRAM数据读写控制器(sdram_top),暂存OV5640摄像头采集的图像数据;顶层模块(eth_ov5640_rgb),例化子功能模块,连接各自对应信号。
这一部分我们对实验工程整体做了简要介绍,工程涉及的子功能模块在前面章节已有详细介绍,下面我们顶层模块进行解释和说明。
24.4.1.1. 顶层模块¶
模块框图
顶层模块作用较为简单,内部实例化各子功能模块,连接子模块对应信号;外部输入输出摄像头、SDRAM、以太网等相关数据。在此我们只对顶层模块的整体框图和参考代码做一下介绍,无需绘制波形图。模块框图和输入输出信号简介,具体见图 74‑2、表格 74‑2。
图 74‑2 顶层模块框图
表格 74‑2 输入输出信号功能描述
信号 |
位宽 |
类型 |
功能描述 |
---|---|---|---|
sys_clk |
1Bit |
Input |
板卡晶振输入时钟,50MHz |
sys_rst_n |
1Bit |
Input |
系统复位,低电平有效 |
ov5640_pclk |
1Bit |
Input |
摄像头传入工作时钟,频率24MHz |
ov5640_vsync |
1Bit |
Input |
传入图像场同步信号 |
ov5640_href |
1Bit |
Input |
传入图像行有效区域 |
ov5640_data |
8Bit |
Input |
传入图像信息 |
eth_clk |
1Bit |
Input |
PHY芯片传入以太网时钟,频率50MHz |
eth_rxdv_r |
1Bit |
Input |
输入数据有效信号 |
eth_rx_data_r |
2Bit |
Input |
输入数据 |
ov5640_rst_n |
1Bit |
Output |
摄像头复位信号 |
ov5640_pwdn |
1Bit |
Output |
摄像头时钟选择信号 |
sccb_scl |
1Bit |
Output |
摄像头SCCB_SCL线 |
sccb_sda |
1Bit |
Inout |
摄像头SCCB_SDA线 |
sdram_clk |
1Bit |
Output |
SDRAM芯片时钟 |
sdram_cke |
1Bit |
Output |
SDRAM时钟有效信号 |
sdram_cs_n |
1Bit |
Output |
SDRAM片选信号 |
sdram_ras_n |
1Bit |
Output |
SDRAM行地址选通信号 |
sdram_cas_n |
1Bit |
Output |
SDRAM列地址选通信号 |
sdram_we_n |
1Bit |
Output |
SDRAM写允许信号 |
sdram_ba |
2Bit |
Output |
SDRAM的L-Bank地址线 |
sdram_addr |
13Bit |
Output |
SDRAM地址总线 |
sdram_dqm |
2Bit |
Output |
SDRAM数据掩码 |
sdram_dq |
16Bit |
Inout |
SDRAM数据总线 |
eth_tx_en_r |
1Bit |
Output |
以太网输出数据有效信号 |
eth_tx_data_r |
2Bit |
Output |
以太网输出数据 |
eth_rst_n |
1Bit |
Output |
PHY芯片复位信号,低电平有效 |
代码编写
顶层模块参考代码,具体见代码清单 74‑1。
代码清单 74‑1 顶层模块参考代码(eth_ov5640_rgb.v)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 | module eth_ov5640_rgb
(
input wire sys_clk , //系统时钟
input wire sys_rst_n , //系统复位,低电平有效
//摄像头
input wire ov5640_pclk , //摄像头数据像素时钟
input wire ov5640_vsync, //摄像头场同步信号
input wire ov5640_href , //摄像头行同步信号
input wire [7:0] ov5640_data , //摄像头数据
output wire ov5640_rst_n, //摄像头复位信号,低电平有效
output wire ov5640_pwdn , //摄像头时钟选择信号
output wire sccb_scl , //摄像头SCCB_SCL线
inout wire sccb_sda , //摄像头SCCB_SDA线
//SDRAM
output wire sdram_clk , //SDRAM 时钟
output wire sdram_cke , //SDRAM 时钟使能
output wire sdram_cs_n , //SDRAM 片选
output wire sdram_ras_n , //SDRAM 行有效
output wire sdram_cas_n , //SDRAM 列有效
output wire sdram_we_n , //SDRAM 写有效
output wire [1:0] sdram_ba , //SDRAM Bank地址
output wire [1:0] sdram_dqm , //SDRAM 数据掩码
output wire [12:0] sdram_addr , //SDRAM 地址
inout wire [15:0] sdram_dq , //SDRAM 数据
//以太网
input wire eth_clk , //PHY芯片接收数据时钟
input wire eth_rxdv_r , //PHY芯片输入数据有效信号
input wire [1:0] eth_rx_data_r, //PHY芯片输入数据
output wire eth_tx_en_r , //PHY芯片输出数据有效信号
output wire [1:0] eth_tx_data_r, //PHY芯片输出数据
output wire eth_rst_n //PHY芯片复位信号,低电平有效
);
////
//\* Parameter and Internal Signal \//
////
//parameter define
parameter H_PIXEL = 24'd640 ; //CMOS水平方向像素个数,用于设置SDRAM缓存大小
parameter V_PIXEL = 24'd480 ; //CMOS垂直方向像素个数,用于设置SDRAM缓存大小
//板卡MAC地址
parameter BOARD_MAC = 48'h12_34_56_78_9A_BC;
//板卡IP地址
parameter BOARD_IP = {8'd169,8'd254,8'd255,8'd255};
//板卡端口号
parameter BOARD_PORT = 16'd1234;
//PC机MAC地址
parameter DES_MAC = 48'hff_ff_ff_ff_ff_ff;
//PC机IP地址
//parameter DES_IP = {8'd255,8'd255,8'd255,8'd255};
parameter DES_IP = {8'd192,8'd168,8'd0,8'd245};
//PC机端口号
parameter DES_PORT = 16'd1234;
//wire define
wire clk_25m ; //25MHz时钟,提供给摄像头驱动时钟
wire clk_100m ; //100MHz时钟,SDRAM操作时钟
wire clk_100m_shift ; //100MHz时钟,SDRAM相位偏移时钟
wire locked ; //时钟输出有效
wire rst_n ; //系统复位信号
wire cfg_done ; //摄像头初始化完成
wire wr_en ; //sdram写使能
wire [15:0] wr_data ; //sdram写数据
wire rd_en ; //sdram读使能
wire [15:0] rd_data ; //sdram读数据
wire sdram_init_done ; //SDRAM初始化完成
wire sys_init_done ; //系统初始化完成(SDRAM初始化+摄像头初始化)
wire eth_tx_req ; //以太网发送数据请求信号
wire eth_tx_done ; //以太网发送数据完成
wire eth_tx_start ; //以太网开始发送信号
wire [31:0] eth_tx_data ; //以太网发送的数据
wire [15:0] eth_tx_data_num ; //以太网单包发送的有效字节数
wire eth_tx_start_f ; //以太网开始发送信号(格式)
wire [31:0] eth_tx_data_f ; //以太网发送的数据(格式)
wire [15:0] eth_tx_data_num_f; //以太网单包发送的有效字节数(格式)
wire i_config_end ; //图像格式包发送完成
wire eth_tx_start_i ; //以太网开始发送信号(图像)
wire [31:0] eth_tx_data_i ; //以太网发送的数据(图像)
wire [15:0] eth_tx_data_num_i; //以太网单包发送的有效字节数(图像)
wire eth_rxdv ; //输入数据有效信号(mii)
wire [3:0] eth_rx_data ; //输入数据(mii)
wire eth_tx_en ; //输出数据有效信号(mii)
wire [3:0] eth_tx_data_m ; //输出数据(mii)
//reg define
reg mii_clk ; //mii时钟
////
//\* Main Code \//
////
assign eth_tx_start = (i_config_end == 1'b1) ? eth_tx_start_i : eth_tx_start_f;
assign eth_tx_data = (i_config_end == 1'b1) ? eth_tx_data_i : eth_tx_data_f;
assign eth_tx_data_num = (i_config_end == 1'b1) ? eth_tx_data_num_i : eth_tx_data_num_f;
//rst_n:复位信号(sys_rst_n & locked)
assign rst_n = sys_rst_n && locked;
//sys_init_done:系统初始化完成(SDRAM初始化+摄像头初始化)
assign sys_init_done = sdram_init_done && cfg_done;
//ov5640_rst_n:摄像头复位,固定高电平
assign ov5640_rst_n = 1'b1;
//ov5640_pwdn:摄像头时钟选择信号,0:使用引脚XCLK提供的时钟 1:使用摄像头自带的晶振
assign ov5640_pwdn = 1'b0;
//mii_clk:mii时钟
always@(negedge eth_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
mii_clk <= 1'b0;
else
mii_clk <= ~mii_clk;
////
//\* Instantiation \//
////
//------------- clk_gen_inst -------------
clk_gen clk_gen_inst
(
.areset (~sys_rst_n ),
.inclk0 (sys_clk ),
.c0 (clk_100m ),
.c1 (clk_100m_shift ),
.c2 (clk_25m ),
.locked (locked )
);
//------------- ov5640_top_inst -------------
ov5640_top ov5640_top_inst
(
.sys_clk (clk_25m ), //系统时钟
.sys_rst_n (rst_n ), //复位信号
.sys_init_done (sys_init_done ), //系统初始化完成(SDRAM + 摄像头)
.ov5640_pclk (ov5640_pclk ), //摄像头像素时钟
.ov5640_href (ov5640_href ), //摄像头行同步信号
.ov5640_vsync (ov5640_vsync ), //摄像头场同步信号
.ov5640_data (ov5640_data ), //摄像头图像数据
.cfg_done (cfg_done ), //寄存器配置完成
.sccb_scl (sccb_scl ), //SCL
.sccb_sda (sccb_sda ), //SDA
.ov5640_wr_en (wr_en ), //图像数据有效使能信号
.ov5640_data_out (wr_data ) //图像数据
);
//------------- sdram_top_inst -------------
sdram_top sdram_top_inst
(
.sys_clk (clk_100m ), //sdram 控制器参考时钟
.clk_out (clk_100m_shift ), //用于输出的相位偏移时钟
.sys_rst_n (rst_n ), //系统复位
//用户写端口
.wr_fifo_wr_clk (ov5640_pclk ), //写端口FIFO: 写时钟
.wr_fifo_wr_req (wr_en ), //写端口FIFO: 写使能
.wr_fifo_wr_data (wr_data ), //写端口FIFO: 写数据
.sdram_wr_b_addr (24'd0 ), //写SDRAM的起始地址
.sdram_wr_e_addr (H_PIXEL*V_PIXEL), //写SDRAM的结束地址
.wr_burst_len (10'd512 ), //写SDRAM时的数据突发长度
.wr_rst (~rst_n ), //写复位信号
//用户读端口
.rd_fifo_rd_clk (mii_clk ), //读端口FIFO: 读时钟
.rd_fifo_rd_req (rd_en ), //读端口FIFO: 读使能
.rd_fifo_rd_data (rd_data ), //读端口FIFO: 读数据
.sdram_rd_b_addr (24'd0 ), //读SDRAM的起始地址
.sdram_rd_e_addr (H_PIXEL*V_PIXEL), //读SDRAM的结束地址
.rd_burst_len (10'd512 ), //从SDRAM中读数据时的突发长度
.rd_fifo_num ( ), //读fifo中的数据量
.rd_rst (~rst_n ), //读复位信号
//用户控制端口
.read_valid (1'b1 ), //SDRAM 读使能
.pingpang_en (1'b1 ), //SDRAM 乒乓操作使能
.init_end (sdram_init_done), //SDRAM 初始化完成标志
//SDRAM 芯片接口
.sdram_clk (sdram_clk ), //SDRAM 芯片时钟
.sdram_cke (sdram_cke ), //SDRAM 时钟有效
.sdram_cs_n (sdram_cs_n ), //SDRAM 片选
.sdram_ras_n (sdram_ras_n ), //SDRAM 行有效
.sdram_cas_n (sdram_cas_n ), //SDRAM 列有效
.sdram_we_n (sdram_we_n ), //SDRAM 写有效
.sdram_ba (sdram_ba ), //SDRAM Bank地址
.sdram_addr (sdram_addr ), //SDRAM 行/列地址
.sdram_dq (sdram_dq ), //SDRAM 数据
.sdram_dqm (sdram_dqm ) //SDRAM 数据掩码
);
//------------- image_format_inst -------------
image_format image_format_inst
(
.sys_clk (mii_clk ), //系统时钟
.sys_rst_n (rst_n && sys_init_done ), //系统复位,低电平有效
.eth_tx_req (eth_tx_req && (~i_config_end)),//以太网数据请求信号
.eth_tx_done (eth_tx_done ), //单包以太网数据发送完成信号
.eth_tx_start (eth_tx_start_f ), //以太网发送数据开始信号
.eth_tx_data (eth_tx_data_f ), //以太网发送数据
.i_config_end (i_config_end ), //图像格式包发送完成
.eth_tx_data_num (eth_tx_data_num_f ) //以太网单包数据有效字节数
);
//------------- image_data_inst -------------
image_data
#(
.H_PIXEL (H_PIXEL ), //图像水平方向像素个数
.V_PIXEL (V_PIXEL ) //图像竖直方向像素个数
)
image_data_inst
(
.sys_clk (mii_clk ), //系统时钟,频率25MHz
.sys_rst_n (rst_n & sys_init_done& i_config_end), //复位信号,低电平有效eth_tx_end
.image_data (rd_data ), //自SDRAM中读取的16位图像数据
.eth_tx_req (eth_tx_req ), //以太网发送数据请求信号
.eth_tx_done (eth_tx_done ), //以太网发送数据完成信号
.data_rd_req (rd_en ), //图像数据请求信号
.eth_tx_start (eth_tx_start_i ), //以太网发送数据开始信号
.eth_tx_data (eth_tx_data_i ), //以太网发送数据
.eth_tx_data_num (eth_tx_data_num_i ) //以太网单包数据有效字节数
);
//------------- eth_udp_rmii_inst -------------
eth_udp_rmii
#(
.BOARD_MAC (BOARD_MAC ), //板卡MAC地址
.BOARD_IP (BOARD_IP ), //板卡IP地址
.BOARD_PORT (BOARD_PORT ), //板卡端口号
.DES_MAC (DES_MAC ), //PC机MAC地址
.DES_IP (DES_IP ), //PC机IP地址
.DES_PORT (DES_PORT ) //PC机端口号
)
eth_udp_rmii_inst
(
.eth_rmii_clk (eth_clk ), //rmii时钟
.eth_mii_clk (mii_clk ), //mii时钟
.sys_rst_n (rst_n ), //复位信号,低电平有效
.rx_dv (eth_rxdv_r ), //输入数据有效信号(rmii)
.rx_data (eth_rx_data_r ), //输入数据(rmii)
.send_en (eth_tx_start ), //开始发送信号
.send_data (eth_tx_data ), //发送数据
.send_data_num (eth_tx_data_num), //发送有效数据字节数
.send_end (eth_tx_done ), //单包数据发送完成信号
.read_data_req (eth_tx_req ), //读数据请求信号
.rec_end ( ), //单包数据接收完成信号
.rec_en ( ), //接收数据使能信号
.rec_data ( ), //接收数据
.rec_data_num ( ), //接收有效数据字节数
.eth_tx_dv (eth_tx_en_r ), //输出数据有效信号(rmii)
.eth_tx_data (eth_tx_data_r ), //输出数据(rmii)
.eth_rst_n (eth_rst_n ) //PHY芯片复位信号,低电平有效
);
endmodule
|
24.5. 上板调试¶
24.5.1. 引脚约束¶
仿真验证通过后,准备上板验证,上板验证之前先要进行引脚约束。工程中各输入输出信号与开发板引脚对应关系如表格 74‑3所示。
表格 74‑3 引脚分配表
信号名 |
信号类型 |
对应引脚 |
备注 |
---|---|---|---|
sys_clk |
Input |
E1 |
板卡晶振传入时钟,频率50MHz |
sys_rst_n |
Input |
M15 |
复位信号,低有效 |
ov5640_pclk |
Input |
M16 |
摄像头数据像素时钟 |
ov5640_vsync |
Input |
C16 |
摄像头场同步信号 |
ov5640_href |
Input |
J13 |
摄像头行同步信号 |
ov5640_data[7] |
Input |
L13 |
OV5640摄像头采集图像数据 |
ov5640_data[6] |
Input |
F13 |
OV5640摄像头采集图像数据 |
ov5640_data[5] |
Input |
B16 |
OV5640摄像头采集图像数据 |
ov5640_data[4] |
Input |
C15 |
OV5640摄像头采集图像数据 |
ov5640_data[3] |
Input |
D16 |
OV5640摄像头采集图像数据 |
ov5640_data[2] |
Input |
F14 |
OV5640摄像头采集图像数据 |
ov5640_data[1] |
Input |
F15 |
OV5640摄像头采集图像数据 |
ov5640_data[0] |
Input |
G15 |
OV5640摄像头采集图像数据 |
eth_clk |
Input |
C3 |
PHY芯片传入以太网时钟,频率50MHz |
eth_rxdv_r |
Input |
D3 |
输入数据有效信号 |
eth_rx_data_r[1] |
Input |
D8 |
输入数据 |
eth_rx_data_r[0] |
Input |
A4 |
输入数据 |
sccb_scl |
Output |
P15 |
摄像头SCCB_SCL |
sccb_sda |
Inout |
N14 |
摄像头SCCB_SDA |
sdram_clk |
Output |
R4 |
SDRAM芯片时钟 |
sdram_cke |
Output |
R9 |
SDRAM时钟有效信号 |
sdram_cs_n |
Output |
R12 |
SDRAM片选信号 |
sdram_cas_n |
Output |
R10 |
SDRAM列地址选通脉冲 |
sdram_ras_n |
Output |
R11 |
SDRAM行地址选通脉冲 |
sdram_we_n |
Output |
L9 |
SDRAM写允许位 |
sdram_ba[0] |
Output |
R13 |
SDRAM的L-Bank地址线 |
sdram_ba[1] |
Output |
R14 |
SDRAM的L-Bank地址线 |
sdram_addr[0] |
Output |
P11 |
SDRAM地址总线 |
sdram_addr[1] |
Output |
P14 |
SDRAM地址总线 |
sdram_addr[2] |
Output |
N9 |
SDRAM地址总线 |
sdram_addr[3] |
Output |
N11 |
SDRAM地址总线 |
sdram_addr[4] |
Output |
T14 |
SDRAM地址总线 |
sdram_addr[5] |
Output |
T13 |
SDRAM地址总线 |
sdram_addr[6] |
Output |
T12 |
SDRAM地址总线 |
sdram_addr[7] |
Output |
T11 |
SDRAM地址总线 |
sdram_addr[8] |
Output |
T10 |
SDRAM地址总线 |
sdram_addr[9] |
Output |
P9 |
SDRAM地址总线 |
sdram_addr[10] |
Output |
T15 |
SDRAM地址总线 |
sdram_addr[11] |
Output |
N12 |
SDRAM地址总线 |
sdram_addr[12] |
Output |
M11 |
SDRAM地址总线 |
sdram_dqm[0] |
Output |
M10 |
SDRAM数据掩码 |
sdram_dqm[1] |
Output |
M9 |
SDRAM数据掩码 |
sdram_dq[0] |
Output |
R3 |
SDRAM数据总线 |
sdram_dq[1] |
Output |
T9 |
SDRAM数据总线 |
sdram_dq[2] |
Output |
R5 |
SDRAM数据总线 |
sdram_dq[3] |
Output |
R6 |
SDRAM数据总线 |
sdram_dq[4] |
Output |
R7 |
SDRAM数据总线 |
sdram_dq[5] |
Output |
M8 |
SDRAM数据总线 |
sdram_dq[6] |
Output |
R8 |
SDRAM数据总线 |
sdram_dq[7] |
Output |
N8 |
SDRAM数据总线 |
sdram_dq[8] |
Output |
P8 |
SDRAM数据总线 |
sdram_dq[9] |
Output |
T8 |
SDRAM数据总线 |
sdram_dq[10] |
Output |
T7 |
SDRAM数据总线 |
sdram_dq[11] |
Output |
T6 |
SDRAM数据总线 |
sdram_dq[12] |
Output |
T5 |
SDRAM数据总线 |
sdram_dq[13] |
Output |
T4 |
SDRAM数据总线 |
sdram_dq[14] |
Output |
T3 |
SDRAM数据总线 |
sdram_dq[15] |
Output |
T2 |
SDRAM数据总线 |
eth_tx_en_r |
Output |
D5 |
输出数据使能信号 |
eth_tx_data_r[1] |
Output |
D6 |
输出数据 |
eth_tx_data_r[0] |
Output |
C8 |
输出数据 |
eth_rst_n |
Output |
B3 |
PHY复位信号 |
下面进行管脚分配,管脚的分配方法在前面章节已有所讲解,在此就不再过多叙述,管脚的分配如下图 74‑3、图 74‑4所示。
图 74‑3 管脚分配
图 74‑4 管脚分配
24.5.1.1. 结果验证¶
如图 74‑5所示,开发板连接12V直流电源、USB-Blaster下载器JTAG端口、网线以及OV5640摄像头,网线另一端连接路由器;PC机也使用另一条网线与路由器相连。线路正确连接后,打开开关为板卡上电。
图 74‑5 程序下载连线图
如图 74‑6所示,打开网络调试助手,按照如所示进行参数配置,随后启动监听。
图 74‑6 配置上位机参数
如图 74‑7所示,使用“Programmer”为开发板下载程序。
图 74‑7 程序下载连线图
如图 74‑8所示,上位机左下角滚动显示格式配置成功。
图 74‑8 上位机图像格式配置成功
随后,实时显示ov5640摄像头实时采集的图像,如图 74‑9所示。
图 74‑9 上位机显示图像
上位机能够正确的显示摄像头采集图像,验证通过。读者也可使用与“以太网数据回环”章节相同的验证方法进行验证。
24.6. 章末总结¶
在本章节中,我们实现了基于以太网的摄像头采集图像上位机实时显示实验,实验工程中的诸多模块是复用的前面实验的功能模块,本实验中只编写了上位机图像格式配置模块和图像数据打包模块,以保证上位机图像的正确显示。
24.7. 章末总结¶
本实验中对传输到上位机的数据未进行CRC-16校验,各位学员可在原实验的基础上自行添加CRC-16校验模块,并上板验证。