秉火OV7725驱动日志 第二天

来源:互联网 发布:java往word中写入文本 编辑:程序博客网 时间:2024/05/20 05:45
完成SCCB协议共有3个模块
第一模块TIMING_control
输入输出接口连接
   //global clock
    .clk                (clk_ref),        //100MHz
    .rst_n                (sys_rst_n),    //system reset

    //i2c interface
    .i2c_sclk            (cmos_sclk),    //i2c clock
    .i2c_sdat            (cmos_sdat),    //i2c data for bidirection

    //i2c config data
    .i2c_config_index    (i2c_config_index),    //i2c config reg index, read 2 reg and write xx reg
    .i2c_config_data    ({8'h42, i2c_config_data}),    //i2c config data
    .i2c_config_size    (i2c_config_size),    //i2c config data counte
    .i2c_config_done    (i2c_config_done),    //i2c config timing complete
    .i2c_rdata            (i2c_rdata)      

第二个模块
 I2C_OV7725_RGB565_Config    u_I2C_OV7725_RGB565_Config
(
    .LUT_INDEX        (i2c_config_index),
    .LUT_DATA        (i2c_config_data),
    .LUT_SIZE        (i2c_config_size)
);
第三个模块
//global clock
    .clk_cmos                (clk_cmos),            //24MHz CMOS Driver clock input
    .rst_n                    (sys_rst_n & cmos_init_done),    //global reset

    //CMOS Sensor Interface
    .cmos_pclk                (cmos_pclk),          //24MHz CMOS Pixel clock input
    .cmos_xclk                (cmos_xclk),        //24MHz drive clock
    .cmos_data                (cmos_data),        //8 bits cmos data input
    .cmos_vsync                (cmos_vsync),        //L: vaild, H: invalid
    .cmos_href                (cmos_href),        //H: vaild, L: invalid

    //CMOS SYNC Data output
    .cmos_frame_vsync        (cmos_frame_vsync),    //cmos frame data vsync valid signal
    .cmos_frame_href        (cmos_frame_href),    //cmos frame data href vaild  signal
    .cmos_frame_data        (cmos_frame_data),    //cmos frame RGB output: {{R[4:0],G[5:3]}, {G2:0}, B[4:0]}   
    .cmos_frame_clken        (cmos_frame_clken),    //cmos frame data output/capture enable clock

    //user interface
    .cmos_fps_rate            (cmos_fps_rate)        //cmos image output rate
);
模块连接如上,我们继续来说状态转移
状态一:利用SIO_C和SIO_D两个引脚写入寄存器初始设置,复位写指针(最初是在状态二中复位写指针的,但是若在状态一中复位信号不会对寄存器的配置造成影响,而且如果放在第二个状态中当WEN信号变化时复位同时进行会发生冒险,位保稳妥,先将写指针进行复位。
状态二:检测VSYNC变为高电平时,将WEN引脚设置为高电平
状态三:再次检测VSYNC,将WEN设置为低电平,复位读指针
状态四:通过FIFO的RCLK和DO[0:7]将FIFO中的数据读出
状态五:读取结束后,等待下一次VSYNC信号(重点在于如何来判定读取已经结束。传输的速度为24MHZ,比VGA借口的读取速度要慢,所以只需等待下一个VSYNC信号即可

主体使用一个状态机,实现五种状态的转移。
简单的时序代码(尚未经验证,预计明天会做一下)

'timescape 1ns/1psmodule center_crtl(                    clk,                    rst_n,);    //input    input             clk;    input            rst_n;    input            vsync_sig;    input            vga_vsync_sig;    //output    output             wen;    output            wrst;    //write reset    output            rrst;    //read  reset    output            oe_n;   // read able    //state_reg    reg [2:0]         now_state;    reg [2:0]        next_state;    //state    parameter         REG_SETUP             = 3'd0;    parameter        SAVE_BEGIN           = 3'd1;//    parameter        SAVE_BEGIN_ready   = 3'd5;    parameter        SAVE_FINISH        = 3'd2;    parameter        READ_BEGIN           = 3'd3;    parameter        FINISH               = 3'd4;//state controlalways@(posedge clk or negedge rst_n)    begin        if(!rst_n) begin            now_state  <= 3'd0;//            next_state <= 3'd0;            end        else             now_state <= next_state;    endalways@(*)    begin        case(now_state)            REG_SETUP:begin                wrst       <= 1'd1;                next_state <= SAVE_BEGIN;                end            SAVE_BEGIN:begin                if(vsync_sig)                    wen           <=  ~  wen ;                    oe_n       <=  1'd1;//                    wrst       <=  1'd1;                    next_state <= SAVE_FINISH;                end            SAVE_FINISH:begin                if(vsync_sig)                    wen        <=  ~  wen;                    rrst       <=  1'd1;                    next_state <= READ_BEGIN;                end            READ_BEGIN:begin                oe_n       <= 1'd0;                next_state <= FINISH;                end            FINISH:begin                if(vga_vsync_sig) begin                    oe_n       <= 1'd0;                    next_state <= SAVE_BEGIN;                    end                end        endcase    endendmodule 


原创粉丝点击