《ATK

您所在的位置:网站首页 实验动物从业人员证书有效期是多久 《ATK

《ATK

2023-04-17 03:00| 来源: 网络整理| 查看: 265

1)实验平台:正点原子 ATK-DFPGL22G开发板

2) 章节摘自【正点原子】ATK-DFPGL22G之FPGA开发指南_V1.0

3)购买链接:https://detail.tmall.com/item_o.htm?id=692712955836

4)全套实验源码+手册+视频下载地址:紫光PGL22G开发板 - 正点原子资料下载中心 1.0.0 文档

5)正点原子官方B站:正点原子官方的个人空间-正点原子官方个人主页-哔哩哔哩视频

6)FPGA技术交流QQ群:994244016

在OV7725摄像头RGB_LCD显示实验中,成功地在LCD屏上实时显示出了摄像头采集的图像。本章将使用ATK-DFPGL22G FPGA开发板实现将OV7725摄像头采集的视频通过网口传输到电脑的上位机实时显示。

本章分为以下几个章节:

54.1 简介

54.2 实验任务

54.3 硬件设计

54.4 程序设计

54.5 下载验证

54.1 简介

在“OV7725摄像头RGB_LCD显示实验”中对OV7725的视频传输时序、SCCB协议以及寄存器的配置信息等内容作了详细的介绍,如果大家对这部分内容不是很熟悉的话,请参考“OV7725摄像头RGB_LCD显示实验”中的OV7725简介部分。

54.2 实验任务

本节实验任务是使用ATK-DFPGL22G开发板及OV7725摄像头实现图像采集,并通过开发板上的以太网接口发送给上位机实时显示。

54.3 硬件设计

ATK-DFPGL22G开发板上有一个摄像头扩展接口,该接口可以用来连接OV7725/OV5640等摄像头模块。由于SCCB接口通信需要接上拉电阻,因此,将CMOS_SCL信号和CMOS_SDA信号连接上拉电阻,原理图如图 54.3.1所示:

图 54.3.1 摄像头扩展接口原理图

ATK-OV7725是正点原子推出的一款高性能30W像素高清摄像头模块。该模块通过2*9排针(2.54mm间距)同外部连接,我们将摄像头的排针直接插在开发板上的摄像头接口即可,模块外观如图 54.3.2所示:

图 54.3.2 ATK-OV7725摄像头模块实物图

我们在前面说过,OV7725在RGB565模式中只有高8位数据是有效的即D[9:2],而我们的摄像头排针上数据引脚的个数是8位。实际上,摄像头排针上的8位数据连接的就是OV7725传感器的D[9:2],所以我们直接使用摄像头排针上的8位数据引脚即可。

需要注意的是,由图 54.3.1可知,摄像头扩展口的第18个引脚定义为CMOS_PWDN,而我们的OV7725摄像头模块的PWDN引脚固定为低电平,也就是一直处于正常工作模式。OV7725摄像头模块的第18个引脚定义为SGM_CTRL,这个引脚是摄像头驱动时钟的选择引脚。OV7725摄像头模块内部自带晶振的,当SGM_CTRL引脚为低电平时,选择使用摄像头的外部时钟,也就是FPGA需要输出时钟给摄像头;当SGM_CTRL引脚为高电平时,选择使用摄像头的晶振提供时钟。本次实验将SGM_CTRL引脚驱动为高电平,这样就不用为摄像头提供驱动时钟,即不用在CMOS_XCLK引脚上输出时钟。

由于以太网与摄像头引脚数目较多,且在前面相应的章节中已经给出它们的管脚列表,这里就不重复列出了。

54.4 程序设计

OV7725在VGA(分辨率为640*480)帧模式下,以RGB565格式输出最高帧率可达60Hz,每秒钟输出的数据量达到60*640*480*16bit = 294912000bit = 281.25Mbit。我们FPGA开发板上的PHY芯片类型为千兆以太网,理论上最大传输速率为1000Mbit/s,加上帧头、CRC校验以及帧间隙带来的额外开销,实际上能达到的最大传输速率比理论上最大传输速率低。尽管实际传输速率低于1000Mbit/s,但实时传输OV7725摄像头的图像完全没有压力,可以满足带宽要求,因此本次实验不需要通过片外存储器缓存图像,仅将图像数据先经过FIFO进行缓存,然后通过以太网接口进行发送即可。

根据实验任务,我们可以大致规划出系统的控制流程:时钟模块用于为IIC驱动模块、以太网顶层模块和开始传输控制模块提供驱动时钟。I2C驱动模块和I2C配置模块用于初始化OV7725图像传感器;摄像头采集模块负责采集摄像头图像数据,并且把图像数据连接至图像数据封装模块,图像数据封装模块将输入的图像数据进行位拼接,并添加图像的帧头和行场分辨率;以太网顶层模块实现以太网数据的收发;开始传输控制模块控制以太网顶层模块开始/停止发送数据。

OV7725的以太网视频传输系统框图如下图所示:

图 54.4.1 系统框图

FPGA顶层模块(ov7725_udp_pc)例化了以下七个模块:时钟模块(clk_wiz_0)、I2C驱动模块(i2c_dri)、I2C配置模块(i2c_ov7725_rgb565_cfg)、摄像头图像采集模块(cmos_capture_data)、开始传输控制模块(start_transfer_ctrl)、图像数据封装模块(img_data_pkt)和以太网顶层模块模块(eth_top)。

时钟模块(clk_wiz_0):时钟IP核模块通过调用PLL IP核来实现,总共输出2个时钟,频率分别为50Mhz和200Mhz时钟。50Mhz时钟作为I2C驱动模块的驱动时钟;200Mhz时钟作为IDELAYCTRL源语的参考时钟。

I2C驱动模块(i2c_dri):I2C驱动模块负责驱动OV7725 SCCB接口总线,用户可根据该模块提供的用户接口可以很方便的对OV7725的寄存器进行配置,该模块和“EEPROM读写实验”章节中用到的I2C驱动模块为同一个模块,有关该模块的详细介绍请大家参考“EEPROM读写实验”章节。

I2C配置模块(i2c_ov7725_rgb565_cfg):I2C配置模块的驱动时钟是由I2C驱动模块输出的时钟提供的,这样方便了I2C驱动模块和I2C配置模块之间的数据交互。该模块寄存需要配置的寄存器地址、数据以及控制初始化的开始与结束,同时该模块输出OV7725的寄存器地址和数据以及控制I2C驱动模块开始执行的控制信号,直接连接到I2C驱动模块的用户接口,从而完成对OV7725传感器的初始化。

摄像头图像采集模块(cmos_capture_data):摄像头采集模块在像素时钟的驱动下将传感器输出的场同步信号、行同步信号以及8位数据转换成16位数据信号,完成对OV7725传感器图像的采集。

开始传输控制模块(start_transfer_ctrl):该模块解析以太网顶层模块接收到的数据,如果收到1个字节的ASCII码“1”,则表示以太网开始传输图像数据;如果收到1个字节的ASCII码“0”,则表示以太网停止传输图像数据。

图像数据封装模块(img_data_pkt):图像数据封装模块负责将输入16位的图像数据,拼接成32位数据,以及添加图像数据的帧头和行场分辨率。该模块控制着以太网发送模块发送的字节数,单次发送一行图像数据的字节数,模块内部例化了一个异步FIFO模块,用于缓存待发送的图像数据。

以太网顶层模块(eth_top):以太网顶层模块实现以太网通信的收发功能,有关该模块的详细介绍请大家参考“以太网UDP测试实验”章节。

顶层模块部分代码如下:

1 module ov7725_udp_pc( 2 input sys_clk , //系统时钟 3 input sys_rst_n , //系统复位信号,低电平有效 4 //以太网接口 5 input eth_rxc , //RGMII接收数据时钟 6 input eth_rx_ctl , //RGMII输入数据有效信号 7 input [3:0] eth_rxd , //RGMII输入数据 8 output eth_txc , //RGMII发送数据时钟 9 output eth_tx_ctl , //RGMII输出数据有效信号 10 output [3:0] eth_txd , //RGMII输出数据 11 output eth_rst_n , //以太网芯片复位信号,低电平有效 12 13 //摄像头接口 14 input cam_pclk , //cmos 数据像素时钟 15 input cam_vsync , //cmos 场同步信号 16 input cam_href , //cmos 行同步信号 17 input [7:0] cam_data , //cmos 数据 18 output cam_rst_n , //cmos 复位信号,低电平有效 19 output cam_sgm_ctrl, //cmos 时钟选择信号, 1:使用摄像头自带的晶振 20 output cam_scl , //cmos SCCB_SCL线 21 inout cam_sda //cmos SCCB_SDA线 22 ); 23 24 //parameter define 25 //开发板MAC地址 00-11-22-33-44-55 26 parameter BOARD_MAC = 48'h00_11_22_33_44_55; 27 //开发板IP地址 192.168.1.10 28 parameter BOARD_IP = {8'd192,8'd168,8'd1,8'd10}; 29 //目的MAC地址 ff_ff_ff_ff_ff_ff 30 parameter DES_MAC = 48'hff_ff_ff_ff_ff_ff; 31 //目的IP地址 192.168.1.102 32 parameter DES_IP = {8'd192,8'd168,8'd1,8'd102}; 33 34 parameter SLAVE_ADDR = 7'h21 ; //OV7725的器件地址7'h21 35 parameter BIT_CTRL = 1'b0 ; //OV7725的字节地址为8位 0:8位 1:16位 36 parameter CLK_FREQ = 26'd50_000_000; //i2c_dri模块的驱动时钟频率 37 parameter I2C_FREQ = 18'd250_000 ; //I2C的SCL时钟频率,不超过400KHz

在代码的第24至32行定义了四个参量:开发板MAC地址BOARD_MAC,开发板IP地址 BOARD_IP,目的MAC地址DES_MAC(这里指PC MAC地址),目的IP地址 DES_IP(PC IP地址)。开发板的MAC地址和IP地址是我们随意定义的,只要不和目的MAC 地址和目的IP地址一样就可以,否则会产生地址冲突。目的MAC地址这里写的是公共MAC 地址(48'hff_ff_ff_ff_ff_ff),也可以修改成电脑网口的MAC地址,DES_IP是对应电脑以太网的IP地址,这里定义的四个参数是向下传递的,需要修改MAC地址或者IP地址时直接在这里修改即可,而不用在以太网顶层模块里面修改。

在代码的第34行定义了OV7725的器件地址,其器件地址为7’h21;第35行定义了寄存器地址的位宽,BIT_CTRL=0表示地址位宽为8位,BIT_CTRL=1表示地址位宽为16位。因为OV7725的地址位宽为8位,所以BIT_CTRL设置为0。第36行和第37行分别定义了i2c_dri模块的驱动时钟频率和I2C的SCL时钟频率。

70 assign rst_n = sys_rst_n & locked; 71 //不对摄像头硬件复位,固定高电平 72 assign cam_rst_n = 1'b1; 73 //cmos 时钟选择信号, 1:使用摄像头自带的晶振 74 assign cam_sgm_ctrl = 1'b1; 75 76 //例化PLL 77 clk_wiz_0 u_clk_wiz_0 78 ( 79 .clk_out1 (clk_50m), 80 .clk_out2 (clk_200m), 81 .reset (~sys_rst_n), 82 .locked (locked), 83 .clk_in1 (sys_clk) 84 ); 85 86 //I2C配置模块 87 i2c_ov7725_rgb565_cfg u_i2c_cfg( 88 .clk (i2c_dri_clk), 89 .rst_n (rst_n), 90 .i2c_done (i2c_done), 91 .i2c_exec (i2c_exec), 92 .i2c_data (i2c_data), 93 .init_done (cam_init_done) 94 ); 95 96 //I2C驱动模块 97 i2c_dri 98 #( 99 .SLAVE_ADDR (SLAVE_ADDR), //参数传递 100 .CLK_FREQ (CLK_FREQ ), 101 .I2C_FREQ (I2C_FREQ ) 102 ) 103 u_i2c_dri( 104 .clk (clk_50m ), 105 .rst_n (rst_n ), 106 //i2c interface 107 .i2c_exec (i2c_exec ), 108 .bit_ctrl (BIT_CTRL ), 109 .i2c_rh_wl (1'b0), //固定为0,只用到了IIC驱动的写操作 110 .i2c_addr (i2c_data[15:8]), 111 .i2c_data_w (i2c_data[7:0]), 112 .i2c_data_r (), 113 .i2c_done (i2c_done ), 114 .scl (cam_scl ), 115 .sda (cam_sda ), 116 //user interface 117 .dri_clk (i2c_dri_clk) //I2C操作时钟 118 ); 119 120 //摄像头数据采集模块 121 cmos_capture_data u_cmos_capture_data( 122 123 .rst_n (rst_n & cam_init_done), 124 .cam_pclk (cam_pclk), 125 .cam_vsync (cam_vsync), 126 .cam_href (cam_href), 127 .cam_data (cam_data), 128 .cmos_frame_vsync (cmos_frame_vsync), 129 .cmos_frame_href (), 130 .cmos_frame_valid (img_data_en), 131 .cmos_frame_data (img_data) 132 );

OV7725摄像头配置模块和IIC驱动模块实现对OV7725摄像头的初始化,在初始化完成后拉高cam_init_done信号,此时开始通过摄像头数据采集模块接收摄像头输出的图像数据(如程序中第123行代码所示),将输入的8位数据转换成16位RGB565数据。

134 //开始传输控制模块 135 start_transfer_ctrl u_start_transfer_ctrl( 136 .clk (eth_rx_clk), 137 .rst_n (rst_n), 138 .udp_rec_pkt_done (udp_rec_pkt_done), 139 .udp_rec_en (udp_rec_en ), 140 .udp_rec_data (udp_rec_data ), 141 .udp_rec_byte_num (udp_rec_byte_num), 142 143 .transfer_flag (transfer_flag) //图像开始传输标志,1:开始传输 0:停止传输 144 ); 145 146 //图像封装模块 147 img_data_pkt u_img_data_pkt( 148 .rst_n (rst_n), 149 150 .cam_pclk (cam_pclk), 151 .img_vsync (cmos_frame_vsync), 152 .img_data_en (img_data_en), 153 .img_data (img_data), 154 .transfer_flag (transfer_flag), 155 .eth_tx_clk (eth_tx_clk ), 156 .udp_tx_req (udp_tx_req ), 157 .udp_tx_done (udp_tx_done ), 158 .udp_tx_start_en (udp_tx_start_en), 159 .udp_tx_data (udp_tx_data ), 160 .udp_tx_byte_num (udp_tx_byte_num) 161 ); 162 163 //以太网顶层模块 164 eth_top #( 165 .BOARD_MAC (BOARD_MAC), //参数例化 166 .BOARD_IP (BOARD_IP ), 167 .DES_MAC (DES_MAC ), 168 .DES_IP (DES_IP ) 169 ) 170 u_eth_top( 171 .sys_rst_n (rst_n ), //系统复位信号,低电平有效 172 .clk_200m (clk_200m), 173 //以太网RGMII接口 174 .eth_rxc (eth_rxc ), //RGMII接收数据时钟 175 .eth_rx_ctl (eth_rx_ctl), //RGMII输入数据有效信号 176 .eth_rxd (eth_rxd ), //RGMII输入数据 177 .eth_txc (eth_txc ), //RGMII发送数据时钟 178 .eth_tx_ctl (eth_tx_ctl), //RGMII输出数据有效信号 179 .eth_txd (eth_txd ), //RGMII输出数据 180 .eth_rst_n (eth_rst_n ), //以太网芯片复位信号,低电平有效 181 182 .gmii_rx_clk (eth_rx_clk), 183 .gmii_tx_clk (eth_tx_clk), 184 .udp_tx_start_en (udp_tx_start_en), 185 .tx_data (udp_tx_data), 186 .tx_byte_num (udp_tx_byte_num), 187 .udp_tx_done (udp_tx_done), 188 .tx_req (udp_tx_req ), 189 .rec_pkt_done (udp_rec_pkt_done), 190 .rec_en (udp_rec_en ), 191 .rec_data (udp_rec_data ), 192 .rec_byte_num (udp_rec_byte_num) 193 ); 194 195 endmodule

在代码的第135行至144行例化了开始传输控制模块,由该模块端口可知,输入端口信号为以太网接收到的数据,而输出信号为图像开始传输标志(transfer_flag)。transfer_flag信号用于控制以太网发送图像数据的开始和停止,连接至图像数据封装模块。

在代码的第147行至161行例化了图像数据封装模块,该模块输入的端口信号为摄像头图像数据,而输出的udp_tx_start_en(以太网开始发送信号)和udp_tx_byte_num(发送的字节数)连接至以太网顶层模块的以太网发送控制端口,从而控制以太网的UDP发送模块开始发送图像数据。

I2C配置模块寄存需要配置的寄存器地址、数据以及控制初始化的开始与结束,代码如下所示:

1 module i2c_ov7725_rgb565_cfg( 2 input clk , //时钟信号 3 input rst_n , //复位信号,低电平有效 4 5 input i2c_done , //I2C寄存器配置完成信号 6 output reg i2c_exec , //I2C触发执行信号 7 output reg [15:0] i2c_data , //I2C要配置的地址与数据(高8位地址,低8位数据) 8 output reg init_done //初始化完成信号 9 ); 10 11 //parameter define 12 parameter REG_NUM = 7'd70 ; //总共需要配置的寄存器个数 13 14 //reg define 15 reg [9:0] start_init_cnt; //等待延时计数器 16 reg [6:0] init_reg_cnt ; //寄存器配置个数计数器 17 18 //***************************************************** 19 //** main code 20 //***************************************************** 21 22 //cam_scl配置成250khz,输入的clk为1Mhz,周期为1us,1023*1us = 1.023ms 23 //寄存器延时配置 24 always @(posedge clk or negedge rst_n) begin 25 if(!rst_n) 26 start_init_cnt


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3