新手上路
- 积分
- 22
- 金钱
- 22
- 注册时间
- 2022-8-9
- 在线时间
- 7 小时
|
楼主 |
发表于 2022-8-12 15:20:35
|
显示全部楼层
- module ov5640_capture_data(
- input rst_n , //复位信号
- //摄像头接口
- input cam_pclk , //cam 数据像素时钟
- input cam_vsync , //cam 场同步信号
- input cam_href , //cam 行同步信号
- input [7:0] cam_data , //cam 数据
- output cam_rst_n , //cmos 复位信号,低电平有效
- output cam_pwdn , //电源休眠模式选择
- //RGB888接口
- output cmos_frame_clk, //时钟信号
- output cmos_frame_ce, //时钟使能信号
- output cmos_frame_vsync, //帧有效信号
- output cmos_active_video ,//数据有效
- output [23:0] cmos_frame_data //有效数据
- );
- //parameter define
- //寄存器全部配置完成后,先等待10帧数据
- //待寄存器配置生效后再开始采集图像
- localparam WAIT_FRAME = 4'd10 ; //寄存器数据稳定等待的帧个数
- //reg define
- reg rst_n_d0 =1;
- reg rst_n_syn =1;
- reg cam_vsync_d0 ;
- reg cam_vsync_d1 ;
- reg cam_href_d0 ;
- reg cam_href_d1 ;
- reg [3:0] cmos_ps_cnt ; //等待帧数稳定计数器
- reg wait_done ;
- reg byte_flag ;
- reg [7:0] cam_data_d0 ;
- reg [15:0] cmos_data_16b ; //用于8位转16位的临时寄存器
- reg byte_flag_d0 ;
- //wire define
- wire pos_vsync ;
- //*****************************************************
- //** main code
- //*****************************************************
- //采输入场同步信号的上升沿
- assign pos_vsync = (~cam_vsync_d1) & cam_vsync_d0 ;
- //不对摄像头硬件复位,固定高电平
- assign cam_rst_n = 1'b1;
- //电源休眠模式选择 0:正常模式 1:电源休眠模式
- assign cam_pwdn = 1'b0;
- assign cmos_frame_clk = cam_pclk;
- //由于摄像头输入接口的两个时钟周期对应于RGB888输出接口的一个有效时钟周期
- //所以要给出数据有效标志即RGB888输出接口的时钟使能信号
- assign cmos_frame_ce = wait_done ? (byte_flag_d0 & cmos_active_video) || (!cmos_active_video) : 1'b0;
- assign cmos_frame_vsync = wait_done ? cam_vsync_d1 : 1'b0; //输出帧有效信号
- assign cmos_active_video = wait_done ? cam_href_d1 : 1'b0; //输出行有效信号
- assign cmos_frame_data = wait_done ?
- { cmos_data_16b[15:11],3'd0 , cmos_data_16b[10:5],2'd0 , cmos_data_16b[4:0],3'd0 }
- : 24'd0; //输出数据
- //复位信号的异步复位、同步释放处理
- always @(posedge cam_pclk or negedge rst_n) begin
- if(!rst_n) begin
- rst_n_d0 <= 1'b0;
- rst_n_d0 <= 1'b0;
- end
- else begin
- rst_n_d0 <= 1'b1;
- rst_n_syn <= rst_n_d0;
- end
- end
- //对行、场同步信号的延迟打拍
- always @(posedge cam_pclk or negedge rst_n_syn) begin
- if(!rst_n_syn) begin
- cam_vsync_d0 <= 1'b0;
- cam_vsync_d1 <= 1'b0;
- cam_href_d0 <= 1'b0;
- cam_href_d1 <= 1'b0;
- end
- else begin
- cam_vsync_d0 <= cam_vsync;
- cam_vsync_d1 <= cam_vsync_d0;
- cam_href_d0 <= cam_href;
- cam_href_d1 <= cam_href_d0;
- end
- end
- //寄存器全部配置完成后,先等待10帧数据
- //待寄存器配置生效后再开始采集图像
- always @(posedge cam_pclk or negedge rst_n_syn) begin
- if(!rst_n_syn)
- cmos_ps_cnt <= 4'd0;
- else if(pos_vsync && (cmos_ps_cnt < WAIT_FRAME))
- cmos_ps_cnt <= cmos_ps_cnt + 4'd1; //对帧数进行计数
- end
- //等待完成后 给出 等待完成信号
- always @(posedge cam_pclk or negedge rst_n_syn) begin
- if(!rst_n_syn)
- wait_done <= 1'b0;
- else if((cmos_ps_cnt == WAIT_FRAME) && pos_vsync)
- wait_done <= 1'b1;
- end
- //8位数据转16位RGB565数据
- always @(posedge cam_pclk or negedge rst_n_syn) begin
- if(!rst_n_syn) begin
- cmos_data_16b <= 16'd0;
- cam_data_d0 <= 8'd0;
- byte_flag <= 1'b0;
- end
- else if( cam_href ) begin //cam 行同步信号
- byte_flag <= ~byte_flag;
- cam_data_d0 <= cam_data;
- if(byte_flag)
- cmos_data_16b <= {cam_data_d0,cam_data};
- end
- else begin
- byte_flag <= 1'b0;
- cam_data_d0 <= 8'b0;
- end
- end
- always @(posedge cam_pclk or negedge rst_n_syn) begin
- if(!rst_n_syn)
- byte_flag_d0 <= 1'b0;
- else
- byte_flag_d0 <= byte_flag;
- end
- endmodule
复制代码
|
-
ov5640_capture_data
|