一.0V9732 CSI图像读取:
上电后,首先使用inst_reset_csi_hw模块控制复位信号对ov9732控制器进行复位,复位
成功后通过csi_reset_ok信号告知inst_sccb_ovreg_cfg模块对ov9732进行初始化,初始化完成
后通过sccb_cfg_ok信号告知inst_saxi_video_recv模块可以进行图像数据接收。
2.复位模块inst_reset_csi_hw:
复位模块通过24Mhz的csi_mclk生成ov9732控制器的复位信号csi_reset,
上电后csi_reset保持低2000个csi_mclk时钟周期,
在csi_reset拉高后等待16384个csi_mclk时钟周期后,才拉高csi_reset_ok信号,通知初始化模块可以进行初始化操作。
Lite_resetn和video_resetn则是AxI Lite接口和AxI Stream接口的复位信号,由csi_reset复位信号跨时钟域打拍获得。
// ----------------------------------------------------------------------------- // Copyright (c) 2026 All rights reserved // ----------------------------------------------------------------------------- // Author : lvjitao // File : top_csi.v // Create : 2026-10-10 15:18:33 // Revise : Sat Oct 10 2026 // Description : FPGA Verilog Module // Editor : VS Code // ----------------------------------------------------------------------------- `timescale 1ns/1ps module top_csi( input wire pl_clk,//50M output wire csi_mclk,//24Mhz output wire csi_resetn, output wire csi_scl, inout wire csi_sda, //mipi input wire mipi_csi_clk_hs_n, input wire mipi_csi_clk_hs_p, input wire mipi_csi_clk_lp_n, input wire mipi_csi_clk_lp_p, input wire mipi_csi_data_hs_n, input wire mipi_csi_data_hs_p, input wire mipi_csi_data_lp_n, input wire mipi_csi_data_lp_p ); wire clk50m; wire clk200m; wire lite_clk,video_clk; wire lite_resetn; wire csi_reset_ok; wire video_resetn; wire sccb_cfg_ok; wire fifo_wr_en; wire [31:0] fifo_wr_data; // axi 4 lite register cfg ports wire [7:0] csirxss_s_axi_araddr; wire csirxss_s_axi_arready; wire csirxss_s_axi_arvalid; wire [7:0] csirxss_s_axi_awaddr; wire csirxss_s_axi_awready; wire csirxss_s_axi_awvalid; wire csirxss_s_axi_bready; wire [1:0] csirxss_s_axi_bresp; wire csirxss_s_axi_bvalid; wire [31:0] csirxss_s_axi_rdata; wire csirxss_s_axi_rready; wire [1:0] csirxss_s_axi_rresp; wire csirxss_s_axi_rvalid; wire [31:0] csirxss_s_axi_wdata; wire csirxss_s_axi_wready; wire [3:0] csirxss_s_axi_wstrb; wire csirxss_s_axi_wvalid; wire [39:0] video_out_tdata; wire [9:0] video_out_tdest; wire video_out_tlast; wire video_out_tready; wire [95:0] video_out_tuser; wire video_out_tvalid; // reg [16:0] reset_cnt=0; // always @(posedge clk50m) begin // if (reset_cnt[16] == 1'b0) begin // reset_cnt <= reset_cnt + 1'b1; // end // end assign lite_clk =clk50m; assign video_clk = clk50m; reset_csi_hw inst_reset_csi_hw ( .csi_mclk (csi_mclk), .csi_reset (csi_resetn), .lite_clk (lite_clk), .lite_resetn (lite_resetn), .csi_reset_ok (csi_reset_ok), .video_clk (video_clk), .video_resetn (video_resetn) ); // assign csi_resetn = (reset_cnt>'d32768)?1'b1:1'b0; clk_wiz_0 instance_clk_wiz_0 ( // Clock out ports .clk_out1(clk50m), // output clk_out1 .clk_out2(csi_mclk), // output clk_out2 .clk_out3(clk200m), // 200M // Clock in ports .clk_in1(pl_clk)); // input clk_in1 sccb_ovreg_cfg inst_sccb_ovreg_cfg ( .clk (clk50m), .rst (1'b0), .SCL (csi_scl), .SDA (csi_sda), .hwreset_ok (reset_cnt[16]), .cfg_ok (cfg_ok) ); mipi_csi2_rx_0 your_