【转】FPGA配置OV5640摄像头及RGB图像数据采集

RK3588使用OV5695摄像头 环境:RK3588、Ubuntu20.04、Python3.8、OpenCV3.4.16。在itop开发板上,根据文档连接好摄像头,摄像头对准缺口方向连接好,默认是J1接口。前几个video被其他媒体设备占用了,内核自动分配的。查看各相机支持的分辨率、帧率、像素格式等参数。2023-04-21记录。 阅读详情


这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

`timescale 1ns / 1ps
module sccb_interface(
    input clk,
    input rst_n,

    input wr_en,
    input rd_en,
    input [8-1:0] id_addr,
    input [16-1:0] reg_addr,
    input [8-1:0] wr_data,
    output reg [8-1:0] rd_data,
    output reg rd_vld,
    output rdy,

    output reg sio_c,
    output reg sio_out_en,
    output reg sio_out,
    input sio_in
    );

    parameter CYC = 500;


localparam  IDLE = 0 ;
localparam  START = 1 ;
localparam  WRI_ID = 2 ;
localparam  WRI_REG = 3 ;
localparam  WRI_DATA = 4;
localparam  RD_DATA = 5;
localparam  STOP = 6 ;

//计数器
reg [ (9-1):0]  div_cnt     ;
wire        add_div_cnt ;
wire        end_div_cnt ;
reg [ (5-1):0]  bit_cnt     ;
wire        add_bit_cnt ;
wire        end_bit_cnt ;
reg [5-1:0] N;
(*DONT_TOUCH = "TRUE"*)reg [7-1:0] state_c,state_n;
wire idle2start,start2wri_id,wri_id2wri_reg,wri_id2rd_data, wri_reg2wri_data,wri_reg2stop,wri_data2stop,rd_data2stop,stop2start,stop2idle;
wire [18-1:0] regaddr;
reg [16-1:0] reg_addr_tmp;
reg [8-1:0] wr_data_tmp;
wire [9-1:0] idaddr_nc;
reg [8-1:0] id_addr_tmp;
reg rd_oper,rd_flag;
wire [9-1:0] wdata_nc;
wire [8-1:0] id_rwCtrl;


assign rdy = state_c == IDLE && !wr_en && !rd_en;

always @(posedge clk or negedge rst_n) begin 
    if (rst_n==0) begin
        div_cnt <= 0; 
    end
    else if(add_div_cnt) begin
        if(end_div_cnt)
            div_cnt <= 0; 
        else
            div_cnt <= div_cnt+1 ;
   end
end
assign add_div_cnt = (state_c != IDLE);
assign end_div_cnt = add_div_cnt  && div_cnt == (CYC)-1 ;//5000ns,200KHZ

always @(posedge clk or negedge rst_n) begin 
    if (rst_n==0) begin
        bit_cnt <= 0; 
    end
    else if(add_bit_cnt) begin
        if(end_bit_cnt)
            bit_cnt <= 0; 
        else
            bit_cnt <= bit_cnt+1 ;
   end
end
assign add_bit_cnt = (end_div_cnt);
assign end_bit_cnt = add_bit_cnt  && bit_cnt == (N)-1 ;

always@(*)begin
    case(state_c)
        START:                  N = 1;
        WRI_REG:                N = 18; //(8+1)*2 = 18
        WRI_ID,WRI_DATA,RD_DATA:N = 9;//8+1
        STOP:                   N = 2;
        default:;
    endcase
end

//FSM:IDLE START WRI_ID WRI_REG STOP
always @(posedge clk or negedge rst_n) begin 
    if (rst_n==0) begin
        state_c <= IDLE ;
    end
    else begin
        state_c <= state_n;
   end
end
//write:IDLE START WRI_ID WRI_REG WRI_DATA STOP IDLE...
//read: IDLE START WRI_ID WRI_REG STOP      START WRI_ID RD_DATA STOP IDLE...

always @(*) begin 
    case(state_c)  
        IDLE :begin                             //0
            if(idle2start) 
                state_n = START ;
            else 
                state_n = state_c ;
        end
        START :begin                            //1
            if(start2wri_id) 
                state_n = WRI_ID ;
            else 
                state_n = state_c ;
        end
        WRI_ID :begin                           //2
            if(wri_id2wri_reg) 
                state_n = WRI_REG ;
            else if(wri_id2rd_data)
                state_n = RD_DATA;
            else 
                state_n = state_c ;
        end
        WRI_REG :begin                          //3
            if(wri_reg2wri_data)
                state_n = WRI_DATA;
            else if(wri_reg2stop) 
                state_n = STOP ;
            else 
                state_n = state_c ;
        end
        WRI_DATA:begin                          //4
            if(wri_data2stop)
                state_n = STOP;
            else 
                state_n = state_c;
        end 
        RD_DATA:begin                           //5
            if(rd_data2stop)
                state_n = STOP;
            else
                state_n = state_c;
        end
        STOP :begin                             //6
            if(stop2start)
                state_n = START;
            else if(stop2idle) 
                state_n = IDLE ;
            else 
                state_n = state_c ;
        end
        default : state_n = IDLE ;
    endcase
end

assign idle2start           = state_c==IDLE         && (wr_en || rd_en);
assign start2wri_id         = state_c==START        && (end_bit_cnt);
assign wri_id2wri_reg       = state_c==WRI_ID       && (end_bit_cnt && !rd_oper);
assign wri_id2rd_data       = state_c==WRI_ID       && (end_bit_cnt && rd_oper);
assign wri_reg2wri_data     = state_c==WRI_REG      && (end_bit_cnt && !rd_flag);
assign wri_reg2stop         = state_c==WRI_REG      && (end_bit_cnt && rd_flag);
assign wri_data2stop        = state_c==WRI_DATA     && (end_bit_cnt);
assign rd_data2stop         = state_c==RD_DATA      && (end_bit_cnt);
assign stop2start           = state_c==STOP         && (end_bit_cnt && rd_flag && !rd_oper);
assign stop2idle            = state_c==STOP         && (end_bit_cnt && (!rd_flag || rd_oper));

always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        rd_oper <= 0;
    end
    else if(stop2start)begin
        rd_oper <= 1;
    end
    else if(rd_oper && stop2idle)
        rd_oper <= 0;
end

always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        rd_flag <= 0;
    end
    else if(idle2start && rd_en)begin
        rd_flag <= 1;
    end
    else if(stop2idle)
        rd_flag <= 0;
end

//SCCB时钟
always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)
        sio_c <= 1'b1;
    else if(add_div_cnt && div_cnt == CYC/4-1)
        sio_c <= 1;
    else if(add_div_cnt && div_cnt == CYC/4+CYC/2-1)
        sio_c <= 0;
    else if(state_c == IDLE)
        sio_c <= 1;//空闲状态sioc为1
end

always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        sio_out <= 1;
    end
    else if(state_c == START && div_cnt == CYC/2-1)
        sio_out <= 0;//开始条件
    else if(state_c == WRI_ID)
        sio_out <= idaddr_nc[9-1-bit_cnt];
    else if(wri_reg2stop || wri_data2stop || rd_data2stop)
        sio_out <= 0;
    else if(state_c == WRI_REG)
        sio_out <= regaddr[18-1-bit_cnt];
    else if(state_c == WRI_DATA)
        sio_out <= wdata_nc[9-1-bit_cnt];
    else if(state_c == RD_DATA && bit_cnt == 9-1)
        sio_out <= 1;//NACK
    else if(state_c == STOP && div_cnt == CYC/2-1 && bit_cnt == 0)
        sio_out <= 1;//结束条件
end

assign idaddr_nc = {id_rwCtrl,1'b1};
assign regaddr = {reg_addr_tmp[15:8],1'b1,reg_addr_tmp[7:0],1'b1};
assign wdata_nc = {wr_data_tmp,1'b1};

assign id_rwCtrl = rd_oper ? {id_addr[7:1],1'b1} : id_addr;

always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        reg_addr_tmp <= 0;
        wr_data_tmp <= 0;
    end
    else if(wr_en || rd_en)begin
        reg_addr_tmp <= reg_addr;
        wr_data_tmp <= wr_data;
    end
end


always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        sio_out_en <= 0;
    end
    else begin
        case(state_c)
            START,STOP:begin
                sio_out_en <= 1;
            end
            WRI_ID,WRI_DATA:begin
                if(bit_cnt != 9-1)
                    sio_out_en <= 1;
                else
                    sio_out_en <= 0;
            end
            WRI_REG:begin
                if(bit_cnt != 9-1 && bit_cnt != 18-1)
                    sio_out_en <= 1;
                else
                    sio_out_en <= 0;
            end
            RD_DATA:begin
                if(bit_cnt == 9-1)
                    sio_out_en <= 1;
                else
                    sio_out_en <= 0;
            end 
            default:sio_out_en <= 0;
        endcase
    end
end

//read data
always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        rd_data <= 0;
    end
    else if(state_c == RD_DATA && bit_cnt != 9-1 && div_cnt == CYC/2-1)begin
        rd_data[8-1-bit_cnt] <= sio_in;
    end
end

always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        rd_vld <= 0;
    end
    else if(rd_data2stop)begin
        rd_vld <= 1;
    end
    else 
        rd_vld <= 0;
end


endmodule

sccb_interface 
  • 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
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
寄存器配置模块:
  • 1
  • 2
`timescale 1ns / 1ps
module reg_config(
    input           clk,
    input           rst_n,

    input           en,
    output          finish,

    inout           sio_d,
    output          sio_c
    );

localparam WR_ID = 8'h78;
localparam RW_CTRL = 2'b11;//读
wire sio_out_en;
wire sio_out;
wire sio_in;
reg [9-1:0] reg_cnt;
wire add_reg_cnt,end_reg_cnt;
reg config_flag;
reg [26-1:0] op_reg_data;
wire rdy;
reg wr_en;
reg [16-1:0] reg_addr;
reg [8-1:0] wr_data;
reg config_done;
reg [ (2-1):0]  rw_cnt     ;
wire        add_rw_cnt ;
wire        end_rw_cnt ;
reg rd_en;
(*DONT_TOUCH = "TRUE"*)wire [8-1:0] rd_data;
(*DONT_TOUCH = "TRUE"*)wire rd_vld;

sccb_interface sccb_interface(
    .clk    (clk) ,
    .rst_n     (rst_n) ,
    .wr_en     (wr_en) ,
    .rd_en     (rd_en),
    .id_addr   (WR_ID) ,
    .reg_addr  (reg_addr) ,
    .wr_data   (wr_data) ,
    .rd_data   (rd_data),
    .rd_vld    (rd_vld),
    .rdy       (rdy) ,
    .sio_c     (sio_c) ,
    .sio_out_en(sio_out_en) ,
    .sio_out   (sio_out) ,
    .sio_in    (sio_in) 
    );

    assign sio_d = sio_out_en ? sio_out : 1'bz;
    assign sio_in = sio_d;

    always @(posedge clk or negedge rst_n) begin 
        if (rst_n==0) begin
            rw_cnt <= 0; 
        end
        else if(add_rw_cnt) begin
            if(end_rw_cnt)
                rw_cnt <= 0; 
            else
                rw_cnt <= rw_cnt+1 ;
        end
    end
    assign add_rw_cnt = (config_flag && rdy);
    assign end_rw_cnt = add_rw_cnt  && rw_cnt == (2)-1 ;//0 write 1 read

    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            reg_cnt <= 0;
        end
        else if(add_reg_cnt)begin
            if(end_reg_cnt)
                reg_cnt <= 0;
            else
                reg_cnt <= reg_cnt + 1;
        end
    end

    assign add_reg_cnt = end_rw_cnt;       
    assign end_reg_cnt = add_reg_cnt && reg_cnt == 261-1;   

    //配置指令
    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            wr_en <= 0;
            reg_addr <= 0;
            wr_data <= 0;
        end
        else if(add_rw_cnt && rw_cnt == 0)begin
            wr_en    <= op_reg_data[25];
            reg_addr <= op_reg_data[23:8];
            wr_data  <= op_reg_data[7:0];
        end
        else if(end_rw_cnt)begin
            rd_en     <= op_reg_data[24];
            reg_addr  <= op_reg_data[23:8];
        end
        else begin
            wr_en <= 0;
            rd_en <= 0;
        end
    end

    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            config_flag <= 0;
        end
        else if(en && !config_flag && !config_done)begin
            config_flag <= 1;
        end
        else if(end_reg_cnt)
            config_flag <= 0;
    end

    always  @(posedge clk or negedge rst_n)begin
        if(rst_n==1'b0)begin
            config_done <= 0;
        end
        else if(end_reg_cnt)begin
            config_done <= 1;
        end
    end

    assign finish = config_done && rdy;

always@(*)   
 begin//op_reg_data [25] wr     [24] rd     [23:8] reg_addr     [7:0] wr_data     
    case(reg_cnt)
     //15fps VGA YUV output  // 24MHz input clock, 24MHz PCLK
     0:op_reg_data=   {RW_CTRL, 24'h310311};// system clock from pad, bit[1]
     1:op_reg_data=   {RW_CTRL, 24'h300882};// software reset, bit[7]// delay 5ms 
     2:op_reg_data=   {RW_CTRL, 24'h300842};// software power down, bit[6]
     3:op_reg_data=   {RW_CTRL, 24'h310303};// system clock from PLL, bit[1]
     4:op_reg_data=   {RW_CTRL, 24'h3017ff};// FREX, Vsync, HREF, PCLK, D[9:6] output enable
     5:op_reg_data=   {RW_CTRL, 24'h3018ff};// D[5:0], GPIO[1:0] output enable
     6:op_reg_data=   {RW_CTRL, 24'h30341A};// MIPI 10-bit
     7:op_reg_data=   {RW_CTRL, 24'h303713};// PLL root divider, bit[4], PLL pre-divider, bit[3:0]
     8:op_reg_data=   {RW_CTRL, 24'h310801};// PCLK root divider, bit[5:4], SCLK2x root divider, bit[3:2] // SCLK root divider, bit[1:0] 
     9:op_reg_data=   {RW_CTRL, 24'h363036};
     10:op_reg_data=  {RW_CTRL, 24'h36310e};
     11:op_reg_data=  {RW_CTRL, 24'h3632e2};
     12:op_reg_data=  {RW_CTRL, 24'h363312};
     13:op_reg_data=  {RW_CTRL, 24'h3621e0};
     14:op_reg_data=  {RW_CTRL, 24'h3704a0};
     15:op_reg_data=  {RW_CTRL, 24'h37035a};
     16:op_reg_data=  {RW_CTRL, 24'h371578};
     17:op_reg_data=  {RW_CTRL, 24'h371701};
     18:op_reg_data=  {RW_CTRL, 24'h370b60};
     19:op_reg_data=  {RW_CTRL, 24'h37051a};
     20:op_reg_data=  {RW_CTRL, 24'h390502};
     21:op_reg_data=  {RW_CTRL, 24'h390610};
     22:op_reg_data=  {RW_CTRL, 24'h39010a};
     23:op_reg_data=  {RW_CTRL, 24'h373112};
     24:op_reg_data=  {RW_CTRL, 24'h360008};// VCM control
     25:op_reg_data=  {RW_CTRL, 24'h360133};// VCM control
     26:op_reg_data=  {RW_CTRL, 24'h302d60};// system control
     27:op_reg_data=  {RW_CTRL, 24'h362052};
     28:op_reg_data=  {RW_CTRL, 24'h371b20};
     29:op_reg_data=  {RW_CTRL, 24'h471c50};
     30:op_reg_data=  {RW_CTRL, 24'h3a1343};// pre-gain = 1.047x
     31:op_reg_data=  {RW_CTRL, 24'h3a1800};// gain ceiling
     32:op_reg_data=  {RW_CTRL, 24'h3a19f8};// gain ceiling = 15.5x
     33:op_reg_data=  {RW_CTRL, 24'h363513};
     34:op_reg_data=  {RW_CTRL, 24'h363603};
     35:op_reg_data=  {RW_CTRL, 24'h363440};
     36:op_reg_data=  {RW_CTRL, 24'h362201}; // 50/60Hz detection     50/60Hz 灯光条纹过滤
     37:op_reg_data=  {RW_CTRL, 24'h3c0134};// Band auto, bit[7]
     38:op_reg_data=  {RW_CTRL, 24'h3c0428};// threshold low sum     
     39:op_reg_data=  {RW_CTRL, 24'h3c0598};// threshold high sum
     40:op_reg_data=  {RW_CTRL, 24'h3c0600};// light meter 1 threshold[15:8]
     41:op_reg_data=  {RW_CTRL, 24'h3c0708};// light meter 1 threshold[7:0]
     42:op_reg_data=  {RW_CTRL, 24'h3c0800};// light meter 2 threshold[15:8]
     43:op_reg_data=  {RW_CTRL, 24'h3c091c};// light meter 2 threshold[7:0]
     44:op_reg_data=  {RW_CTRL, 24'h3c0a9c};// sample number[15:8]
     45:op_reg_data=  {RW_CTRL, 24'h3c0b40};// sample number[7:0]
     46:op_reg_data=  {RW_CTRL, 24'h381000};// Timing Hoffset[11:8]
     47:op_reg_data=  {RW_CTRL, 24'h381110};// Timing Hoffset[7:0]
     48:op_reg_data=  {RW_CTRL, 24'h381200};// Timing Voffset[10:8] 
     49:op_reg_data=  {RW_CTRL, 24'h370864};
     50:op_reg_data=  {RW_CTRL, 24'h400102};// BLC start from line 2
     51:op_reg_data=  {RW_CTRL, 24'h40051a};// BLC always update
     52:op_reg_data=  {RW_CTRL, 24'h300000};// enable blocks
     53:op_reg_data=  {RW_CTRL, 24'h3004ff};// enable clocks 
     54:op_reg_data=  {RW_CTRL, 24'h300e58};// MIPI power down, DVP enable
     55:op_reg_data=  {RW_CTRL, 24'h302e00};
     56:op_reg_data=  {RW_CTRL, 24'h430060};// RGB565
     57:op_reg_data=  {RW_CTRL, 24'h501f01};// ISP RGB 
     58:op_reg_data=  {RW_CTRL, 24'h440e00};
     59:op_reg_data=  {RW_CTRL, 24'h5000a7}; // Lenc on, raw gamma on, BPC on, WPC on, CIP on // AEC target    自动曝光控制
     60:op_reg_data=  {RW_CTRL, 24'h3a0f30};// stable range in high
     61:op_reg_data=  {RW_CTRL, 24'h3a1028};// stable range in low
     62:op_reg_data=  {RW_CTRL, 24'h3a1b30};// stable range out high
     63:op_reg_data=  {RW_CTRL, 24'h3a1e26};// stable range out low
     64:op_reg_data=  {RW_CTRL, 24'h3a1160};// fast zone high
     65:op_reg_data=  {RW_CTRL, 24'h3a1f14};// fast zone low// Lens correction for ?   镜头补偿
     66:op_reg_data=  {RW_CTRL, 24'h580023};
     67:op_reg_data=  {RW_CTRL, 24'h580114};
     68:op_reg_data=  {RW_CTRL, 24'h58020f};
     69:op_reg_data=  {RW_CTRL, 24'h58030f};
     70:op_reg_data=  {RW_CTRL, 24'h580412};
     71:op_reg_data=  {RW_CTRL, 24'h580526};
     72:op_reg_data=  {RW_CTRL, 24'h58060c};
     73:op_reg_data=  {RW_CTRL, 24'h580708};
     74:op_reg_data=  {RW_CTRL, 24'h580805};
     75:op_reg_data=  {RW_CTRL, 24'h580905};
     76:op_reg_data=  {RW_CTRL, 24'h580a08};
     77:op_reg_data=  {RW_CTRL, 24'h580b0d};
     78:op_reg_data=  {RW_CTRL, 24'h580c08};
     79:op_reg_data=  {RW_CTRL, 24'h580d03};
     80:op_reg_data=  {RW_CTRL, 24'h580e00};
     81:op_reg_data=  {RW_CTRL, 24'h580f00};
     82:op_reg_data=  {RW_CTRL, 24'h581003};
     83:op_reg_data=  {RW_CTRL, 24'h581109};
     84:op_reg_data=  {RW_CTRL, 24'h581207};
     85:op_reg_data=  {RW_CTRL, 24'h581303};
     86:op_reg_data=  {RW_CTRL, 24'h581400};
     87:op_reg_data=  {RW_CTRL, 24'h581501};
     88:op_reg_data=  {RW_CTRL, 24'h581603};
     89:op_reg_data=  {RW_CTRL, 24'h581708};
     90:op_reg_data=  {RW_CTRL, 24'h58180d};
     91:op_reg_data=  {RW_CTRL, 24'h581908};
     92:op_reg_data=  {RW_CTRL, 24'h581a05};
     93:op_reg_data=  {RW_CTRL, 24'h581b06};
     94:op_reg_data=  {RW_CTRL, 24'h581c08};
     95:op_reg_data=  {RW_CTRL, 24'h581d0e};
     96:op_reg_data=  {RW_CTRL, 24'h581e29};
     97:op_reg_data=  {RW_CTRL, 24'h581f17};
     98:op_reg_data=  {RW_CTRL, 24'h582011};
     99:op_reg_data=  {RW_CTRL, 24'h582111};
     100:op_reg_data= {RW_CTRL, 24'h582215};
     101:op_reg_data= {RW_CTRL, 24'h582328};
     102:op_reg_data= {RW_CTRL, 24'h582446};
     103:op_reg_data= {RW_CTRL, 24'h582526};
     104:op_reg_data= {RW_CTRL, 24'h582608};
     105:op_reg_data= {RW_CTRL, 24'h582726};
     106:op_reg_data= {RW_CTRL, 24'h582864};
     107:op_reg_data= {RW_CTRL, 24'h582926};
     108:op_reg_data= {RW_CTRL, 24'h582a24};
     109:op_reg_data= {RW_CTRL, 24'h582b22};
     110:op_reg_data= {RW_CTRL, 24'h582c24};
     111:op_reg_data= {RW_CTRL, 24'h582d24};
     112:op_reg_data= {RW_CTRL, 24'h582e06};
     113:op_reg_data= {RW_CTRL, 24'h582f22};
     114:op_reg_data= {RW_CTRL, 24'h583040};
     115:op_reg_data= {RW_CTRL, 24'h583142};
     116:op_reg_data= {RW_CTRL, 24'h583224};
     117:op_reg_data= {RW_CTRL, 24'h583326};
     118:op_reg_data= {RW_CTRL, 24'h583424};
     119:op_reg_data= {RW_CTRL, 24'h583522};
     120:op_reg_data= {RW_CTRL, 24'h583622};
     121:op_reg_data= {RW_CTRL, 24'h583726};
     122:op_reg_data= {RW_CTRL, 24'h583844};
     123:op_reg_data= {RW_CTRL, 24'h583924};
     124:op_reg_data= {RW_CTRL, 24'h583a26};
     125:op_reg_data= {RW_CTRL, 24'h583b28};
     126:op_reg_data= {RW_CTRL, 24'h583c42};
     127:op_reg_data= {RW_CTRL, 24'h583dce};// lenc BR offset // AWB   自动白平衡
     128:op_reg_data= {RW_CTRL, 24'h5180ff};// AWB B block
     129:op_reg_data= {RW_CTRL, 24'h5181f2};// AWB control 
     130:op_reg_data= {RW_CTRL, 24'h518200};// [7:4] max local counter, [3:0] max fast counter
     131:op_reg_data= {RW_CTRL, 24'h518314};// AWB advanced 
     132:op_reg_data= {RW_CTRL, 24'h518425};
     133:op_reg_data= {RW_CTRL, 24'h518524};
     134:op_reg_data= {RW_CTRL, 24'h518609};
     135:op_reg_data= {RW_CTRL, 24'h518709};
     136:op_reg_data= {RW_CTRL, 24'h518809};
     137:op_reg_data= {RW_CTRL, 24'h518975};
     138:op_reg_data= {RW_CTRL, 24'h518a54};
     139:op_reg_data= {RW_CTRL, 24'h518be0};
     140:op_reg_data= {RW_CTRL, 24'h518cb2};
     141:op_reg_data= {RW_CTRL, 24'h518d42};
     142:op_reg_data= {RW_CTRL, 24'h518e3d};
     143:op_reg_data= {RW_CTRL, 24'h518f56};
     144:op_reg_data= {RW_CTRL, 24'h519046};
     145:op_reg_data= {RW_CTRL, 24'h5191f8};// AWB top limit
     146:op_reg_data= {RW_CTRL, 24'h519204};// AWB bottom limit
     147:op_reg_data= {RW_CTRL, 24'h519370};// red limit
     148:op_reg_data= {RW_CTRL, 24'h5194f0};// green limit
     149:op_reg_data= {RW_CTRL, 24'h5195f0};// blue limit
     150:op_reg_data= {RW_CTRL, 24'h519603};// AWB control
     151:op_reg_data= {RW_CTRL, 24'h519701};// local limit 
     152:op_reg_data= {RW_CTRL, 24'h519804};
     153:op_reg_data= {RW_CTRL, 24'h519912};
     154:op_reg_data= {RW_CTRL, 24'h519a04};
     155:op_reg_data= {RW_CTRL, 24'h519b00};
     156:op_reg_data= {RW_CTRL, 24'h519c06};
     157:op_reg_data= {RW_CTRL, 24'h519d82};
     158:op_reg_data= {RW_CTRL, 24'h519e38};// AWB control // Gamma    伽玛曲线
     159:op_reg_data= {RW_CTRL, 24'h548001};// Gamma bias plus on, bit[0] 
     160:op_reg_data= {RW_CTRL, 24'h548108};
     161:op_reg_data= {RW_CTRL, 24'h548214};
     162:op_reg_data= {RW_CTRL, 24'h548328};
     163:op_reg_data= {RW_CTRL, 24'h548451};
     164:op_reg_data= {RW_CTRL, 24'h548565};
     165:op_reg_data= {RW_CTRL, 24'h548671};
     166:op_reg_data= {RW_CTRL, 24'h54877d};
     167:op_reg_data= {RW_CTRL, 24'h548887};
     168:op_reg_data= {RW_CTRL, 24'h548991};
     169:op_reg_data= {RW_CTRL, 24'h548a9a};
     170:op_reg_data= {RW_CTRL, 24'h548baa};
     171:op_reg_data= {RW_CTRL, 24'h548cb8};
     172:op_reg_data= {RW_CTRL, 24'h548dcd};
     173:op_reg_data= {RW_CTRL, 24'h548edd};
     174:op_reg_data= {RW_CTRL, 24'h548fea};
     175:op_reg_data= {RW_CTRL, 24'h54901d};// color matrix   色彩矩阵
     176:op_reg_data= {RW_CTRL, 24'h53811e};// CMX1 for Y
     177:op_reg_data= {RW_CTRL, 24'h53825b};// CMX2 for Y
     178:op_reg_data= {RW_CTRL, 24'h538308};// CMX3 for Y
     179:op_reg_data= {RW_CTRL, 24'h53840a};// CMX4 for U
     180:op_reg_data= {RW_CTRL, 24'h53857e};// CMX5 for U
     181:op_reg_data= {RW_CTRL, 24'h538688};// CMX6 for U
     182:op_reg_data= {RW_CTRL, 24'h53877c};// CMX7 for V
     183:op_reg_data= {RW_CTRL, 24'h53886c};// CMX8 for V
     184:op_reg_data= {RW_CTRL, 24'h538910};// CMX9 for V
     185:op_reg_data= {RW_CTRL, 24'h538a01};// sign[9]
     186:op_reg_data= {RW_CTRL, 24'h538b98}; // sign[8:1] // UV adjust   UV色彩饱和度调整
     187:op_reg_data= {RW_CTRL, 24'h558006};// saturation on, bit[1]
     188:op_reg_data= {RW_CTRL, 24'h558340};
     189:op_reg_data= {RW_CTRL, 24'h558410};
     190:op_reg_data= {RW_CTRL, 24'h558910};
     191:op_reg_data= {RW_CTRL, 24'h558a00};
     192:op_reg_data= {RW_CTRL, 24'h558bf8};
     193:op_reg_data= {RW_CTRL, 24'h501d40};// enable manual offset of contrast// CIP  锐化和降噪 
     194:op_reg_data= {RW_CTRL, 24'h530008};// CIP sharpen MT threshold 1
     195:op_reg_data= {RW_CTRL, 24'h530130};// CIP sharpen MT threshold 2
     196:op_reg_data= {RW_CTRL, 24'h530210};// CIP sharpen MT offset 1
     197:op_reg_data= {RW_CTRL, 24'h530300};// CIP sharpen MT offset 2
     198:op_reg_data= {RW_CTRL, 24'h530408};// CIP DNS threshold 1
     199:op_reg_data= {RW_CTRL, 24'h530530};// CIP DNS threshold 2
     200:op_reg_data= {RW_CTRL, 24'h530608};// CIP DNS offset 1
     201:op_reg_data= {RW_CTRL, 24'h530716};// CIP DNS offset 2 
     202:op_reg_data= {RW_CTRL, 24'h530908};// CIP sharpen TH threshold 1
     203:op_reg_data= {RW_CTRL, 24'h530a30};// CIP sharpen TH threshold 2
     204:op_reg_data= {RW_CTRL, 24'h530b04};// CIP sharpen TH offset 1
     205:op_reg_data= {RW_CTRL, 24'h530c06};// CIP sharpen TH offset 2
     206:op_reg_data= {RW_CTRL, 24'h502500};
     207:op_reg_data= {RW_CTRL, 24'h300802}; // wake up from standby, bit[6]

     //set OV5640 to video mode 720p 
     208:op_reg_data=  {RW_CTRL, 24'h303521};// PLL     input clock =24Mhz, PCLK =84Mhz
     209:op_reg_data=  {RW_CTRL, 24'h303669};// PLL
     210:op_reg_data=  {RW_CTRL, 24'h3c0707}; // lightmeter 1 threshold[7:0]
     211:op_reg_data=  {RW_CTRL, 24'h382047}; // flip
     212:op_reg_data=  {RW_CTRL, 24'h382100}; // mirror
     213:op_reg_data=  {RW_CTRL, 24'h381431}; // timing X inc
     214:op_reg_data=  {RW_CTRL, 24'h381531}; // timing Y inc
     215:op_reg_data=  {RW_CTRL, 24'h380000}; // HS
     216:op_reg_data=  {RW_CTRL, 24'h380100}; // HS
     217:op_reg_data=  {RW_CTRL, 24'h380200}; // VS
     218:op_reg_data=  {RW_CTRL, 24'h3803fa}; // VS
     219:op_reg_data=  {RW_CTRL, 24'h38040a}; // HW (HE)
     220:op_reg_data=  {RW_CTRL, 24'h38053f}; // HW (HE)
     221:op_reg_data=  {RW_CTRL, 24'h380606}; // VH (VE)
     222:op_reg_data=  {RW_CTRL, 24'h3807a9}; // VH (VE)
     223:op_reg_data=  {RW_CTRL, 24'h380805}; // DVPHO     (1280)
     224:op_reg_data=  {RW_CTRL, 24'h380900}; // DVPHO     (1280)
     225:op_reg_data=  {RW_CTRL, 24'h380a02}; // DVPVO     (720)->
     226:op_reg_data=  {RW_CTRL, 24'h380bd0}; // DVPVO     (720)->
     227:op_reg_data=  {RW_CTRL, 24'h380c07}; // HTS
     228:op_reg_data=  {RW_CTRL, 24'h380d64}; // HTS
     229:op_reg_data=  {RW_CTRL, 24'h380e02}; // VTS
     230:op_reg_data=  {RW_CTRL, 24'h380fe4}; // VTS
     231:op_reg_data=  {RW_CTRL, 24'h381304}; // timing V offset
     232:op_reg_data=  {RW_CTRL, 24'h361800};
     233:op_reg_data=  {RW_CTRL, 24'h361229};
     234:op_reg_data=  {RW_CTRL, 24'h370952};
     235:op_reg_data=  {RW_CTRL, 24'h370c03};
     236:op_reg_data=  {RW_CTRL, 24'h3a0202}; // 60Hz max exposure
     237:op_reg_data=  {RW_CTRL, 24'h3a03e0}; // 60Hz max exposure
     238:op_reg_data=  {RW_CTRL, 24'h3a0800}; // B50 step
     239:op_reg_data=  {RW_CTRL, 24'h3a096f}; // B50 step
     240:op_reg_data=  {RW_CTRL, 24'h3a0a00}; // B60 step
     241:op_reg_data=  {RW_CTRL, 24'h3a0b5c}; // B60 step
     242:op_reg_data=  {RW_CTRL, 24'h3a0e06}; // 50Hz max band
     243:op_reg_data=  {RW_CTRL, 24'h3a0d08}; // 60Hz max band
     244:op_reg_data=  {RW_CTRL, 24'h3a1402}; // 50Hz max exposure
     245:op_reg_data=  {RW_CTRL, 24'h3a15e0}; // 50Hz max exposure
     246:op_reg_data=  {RW_CTRL, 24'h400402}; // BLC line number
     247:op_reg_data=  {RW_CTRL, 24'h30021c}; // reset JFIFO, SFIFO, JPG
     248:op_reg_data=  {RW_CTRL, 24'h3006c3}; // disable clock of JPEG2x, JPEG
     249:op_reg_data=  {RW_CTRL, 24'h471303}; // JPEG mode 3
     250:op_reg_data=  {RW_CTRL, 24'h440704}; // Quantization sacle
     251:op_reg_data=  {RW_CTRL, 24'h460b37};
     252:op_reg_data=  {RW_CTRL, 24'h460c20};
     253:op_reg_data=  {RW_CTRL, 24'h483716}; // MIPI global timing
     254:op_reg_data=  {RW_CTRL, 24'h382404}; // PCLK manual divider
     255:op_reg_data=  {RW_CTRL, 24'h5001a3}; // SDE on, CMX on, AWB on, scale on
     256:op_reg_data=  {RW_CTRL, 24'h350300}; // AEC/AGC on 
     257:op_reg_data=  {RW_CTRL, 24'h301602}; //Strobe output enable
     258:op_reg_data=  {RW_CTRL, 24'h3b070a}; //FREX strobe mode1    
     //strobe flash and frame exposure      
     259:op_reg_data={RW_CTRL, 24'h3b0083};              //STROBE CTRL: strobe request ON, Strobe mode: LED3 
     260:op_reg_data={RW_CTRL, 24'h3b0000};              //STROBE CTRL: strobe request OFF 

     default:op_reg_data={RW_CTRL, 24'h000000};
    endcase      
end     

endmodule

reg_config 
上电时序模块:
`timescale 1ns / 1ps


module setup(
    input clk,//50MHZ
    input rst_n,
    output reg init_en,

    output reg ov_pwdn1,
    output reg ov_rst_n1,
    output reg ov_pwdn2,
    output reg ov_rst_n2
    );

parameter MS_CYC = 50_000;

reg [16-1:0] ms_cnt;
wire add_ms_cnt;
wire end_ms_cnt;
reg [ (5-1):0]  wait_cnt     ;
wire        add_wait_cnt ;
wire        end_wait_cnt ;
reg [5-1:0] N;
reg [ (2-1):0]  phase_cnt     ;
wire        add_phase_cnt ;
wire        end_phase_cnt ;
reg setup_done;


    //ms计数
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        ms_cnt <= 0;
    end
    else if(add_ms_cnt)begin
        if(end_ms_cnt)
            ms_cnt <= 0;
        else
            ms_cnt <= ms_cnt + 1;
    end
end

assign add_ms_cnt = !setup_done;       
assign end_ms_cnt = add_ms_cnt && ms_cnt== MS_CYC-1; //1_000_000/20 = 50_000  

always @(posedge clk or negedge rst_n) begin 
    if (rst_n==0) begin
        wait_cnt <= 0; 
    end
    else if(add_wait_cnt) begin
        if(end_wait_cnt)
            wait_cnt <= 0; 
        else
            wait_cnt <= wait_cnt+1 ;
   end
end
assign add_wait_cnt = (end_ms_cnt);
assign end_wait_cnt = add_wait_cnt  && wait_cnt == (N)-1 ;

always @(posedge clk or negedge rst_n) begin 
    if (rst_n==0) begin
        phase_cnt <= 0; 
    end
    else if(add_phase_cnt) begin
        if(end_phase_cnt)
            phase_cnt <= 0; 
        else
            phase_cnt <= phase_cnt+1 ;
   end
end
assign add_phase_cnt = (end_wait_cnt);
assign end_phase_cnt = add_phase_cnt  && phase_cnt == (3)-1 ;

always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        setup_done <= 0;
    end
    else if(end_phase_cnt)begin
        setup_done <= 1;
    end
end


always@(*)begin
    case(phase_cnt)
        0:N = 5;
        1:N = 2;
        2:N = 21;
        default:;
    endcase
end

//信号逻辑
always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        ov_pwdn1 <= 1;
        ov_pwdn2 <= 1;
    end
    else if(add_phase_cnt && phase_cnt == 0)begin
        ov_pwdn1 <= 0;
        ov_pwdn2 <= 0;
    end
end

always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        ov_rst_n1 <= 0;
        ov_rst_n2 <= 0;
    end
    else if(add_phase_cnt && phase_cnt == 1)begin
        ov_rst_n1 <= 1;
        ov_rst_n2 <= 1;
    end
end

always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        init_en <= 0;
    end
    else if(end_phase_cnt)begin
        init_en <= 1;
    end
end
endmodule

setup
  • 这里写图片描述

 


 

 


这里写图片描述
这里写图片描述
这里写图片描述



这里写图片描述

这里写图片描述

 

基于 OV5640 摄像头理论知识讲解-典型工作模式配置 基于 OV5640 摄像头理论知识讲解-典型工作模式配置。 阅读详情

相关推荐

基于FPGA的ov5640摄像头简易图像采集装置详解

本文介绍一种基于FPGA的,通过流模式DDR实现OV5640摄像头数据采集并显示的方法。

qq_42230252的博客 1万+

基于FPGA实现OV5640摄像头的视频图像采集及VGA显示

基于FPGA实现OV5640摄像头的视频图像采集及VGA显示 0. 背景 最近有些空闲时间,就想着去尝试实现视频图像采集及显示系统,因为以前涉及的数据采集传输系统主要是采集一维物理量,如最常见的就是实时采集各种单一维度的传感器信号,如温度,压力,光通量,加速度等。图像信号虽然采用水平像素和...

CAOXUN_FPGA的博客 4万+

基于FPGA的OV5640摄像头图像采集

OV5640的寄存器较多,对于其它寄存器的描述可以参OV5640的数据手册。但是,OV5640的数据手册并没有提供全部的寄存器描述, 而大多数必要的寄存器配置在OV5640的软件应用手册(《OV5640 Camera Module Software Application Notes》)中可以找到,其中还有相关初始化例程。这里我们只介绍几个关键的寄存器配置。输出模式设置如下图所示,可以通过配置0x4300这个寄存器控制输出的像素模式包括REG565YUV422等常用模式。设置输出模式为。

qq_69315815的博客 9948

-00-开始【OV5640】

最近做了一块转接板,把OV5640模块接入了FPGA开发板,昨天终于能够正常显示,没有问题了。 后面搞一板稳定的代码,然后把RGB565改成YUV试试显示效果有没有提升。

vacajk的博客 5707

图像采集——OV5640摄像头简介、硬件电路及上电控制的Verilog代码实现并进行modelsim仿真

OV5640摄像头简介、硬件电路及上电控制的Verilog代码实现 modelsim仿真

H19981118的博客 2万+

基于ZYNQ的OV5640图像采集+LCD显示测试

在实际开发中,我们会经常使用到LCD屏,LCD屏的种类有很多种,对应的使用方法也有所不同,但是,在ZYNQ图像传输开发中,思路大体类似,下面介绍在ZYNQ中,使用LCD显示OV5640图像方法。 1.1概述 下面向大家介绍了在ZYNQ开发板上实现OV5640数据采集在...

chenwanzui2526的博客 6804

【FPGA】基于OV5640的 图像边沿检测

目录 一 项目结构 1.1 设计思路 1.2 设计流程 二 接口设计 2.1 摄像头配置模块 2.2 IIC_master 模块 之后就进行数据采集 2.3 采集数据模块 2.4 灰度转化 2.5 高斯滤波 2.7 二值化 2.8 Sobel边缘检测 2.9 SDRAM乒乓缓存 2.10 VGA显示 三 代码设计.........

qq_52445967的博客 1万+

基于OV2640/ OV5640 的图像采集显示系统

本节将在实验“基于 DDR3 的串口传图帧缓存系统设计”实现一个图像采集显示应用系统,来设计 OV2640OV5640应用系统中所需的基本应用逻辑电路。

小王在努力...的博客 4422

【FPGA】摄像头模块OV5640

OV5640是OV(OMNIVISION)公司设计的一款CMOS图像传感器,本次实验采用正点原子的OV5640摄像头模块,尝试通过该模块使用FPGA获取到图像数据。

电子德彪西的博客 1万+

基于FPGA的verilog源代码数字CMOS摄像机图像采集

基于FPGA的verilog源代码数字CMOS摄像机图像采集

ov5640摄像头图像采集显示系统

基于ov5640 500万像素自动对焦摄像头 FPGA图像采集缓冲和显示 是学习FPGA图像视频处理的基础 内附ov5640使用手册

基于FPGA的图像边缘检测(OV5640)

边缘主要存在于图像中目标与目标之间,目标与背景之间,区域与区域之间。边缘检测的目的就是找到图像中亮度变化剧烈的像素点构成的集合,表现出来往往是轮廓。如果图像中边缘能够精确的测量和定位,那么,就意味着实际的物体能够被定位和测量,包括物体的面积,物体的直径,物体的形状等就能被测量。基于此,边缘检测技术在许多场景下被应用,如:车牌检测与提取,物体识别等。数字图像处理是指将图像信号转换成数字信号并利用计算机对其进行处理的过程。

weixin_56481118的博客 4536

从零到一:YT8512C PHY芯片在STM32F407上的LWIP移植实战与避坑指南

本文详细介绍了YT8512C PHY芯片在STM32F407平台上基于LWIP协议栈的移植实战,涵盖硬件连接、CubeMX配置、寄存器定制和调试技巧。重点解析了与主流PHY芯片的差异,提供了完整的避坑指南和优化建议,帮助开发者快速实现稳定可靠的嵌入式网络连接。

uber9的博客 538

OV5640 摄像头图像显示

OV5640 是一款 1/4 英寸单芯片图像传感器,其感光阵列达到 25921944(即 500W 像素),能实现最快 15fps QSXVGA(25921944)或者 90fps VGA(640*480)分辨率的图像采集。传感器采用 OmniVision 推出的 OmniBSI(背面照度)技术,使传感器达到更高的性能,如高灵敏度、低串扰和低噪声。传感器内 部集成了图像处理的功能,包括自动曝光控制(AEC)、自动白平衡(AWB)等。

weixin_43431185的博客 6429

周志华《机器学习》课程系列笔记——目录导航页

最近自学机器学习课程,注意到了南京大学周志华老师的课程。我是在学堂在线平台观看的,注意到b站上也有相应视频,但b站上并未获得授权,随时有消失的可能。周志华老师的网络教学视频中,与其西瓜书相比确实少了一些内容。但幸运的是,缺失的内容实际上对于初学者来说并不会产生太大影响。目前这一笔记也遵循视频内容,相比西瓜书中也会有一些缺失,敬请谅解。可能以后如果有机会和时间,我会再阅读周志华老师的书籍将缺失内容补全。一切内容敬请关注我的个人Page页面。

Sinocifengs的博客 1688

从零到一:如何用YOLOv8和PyQt5打造你的第一个花卉识别桌面应用

本文详细介绍了如何使用YOLOv8和PyQt5从零开始构建一个花卉识别桌面应用。涵盖环境搭建、数据准备、模型训练、界面设计、模型集成与性能优化等全流程,帮助开发者快速掌握深度学习目标识别技术的实际应用。

weixin_29048775的博客 455

【紫光同创国产FPGA教程】【第十五章】OV5640摄像头显示例程

本原创教程由芯驿电子科技(上海)有限公司(ALINX)创作,版权归本公司所有,如需转载,需授权并注明出处(http://www.alinx.com)。 1. 实验简介 本实验将采用500万像素的OV5640摄像头模组(模块型号:AN5640)为大家显示更高分辨率的视频画面。OV5640摄像头模组最大支持QSXGA (2592x1944)的拍照功能,支持1080P、720P、VGA、QVGA视频图像输出。本实验将OV5640配置为RGB565输出,先将视频数据写入外部存储器,再从外部存储器读取送到VGA、

ALINX技术博客 6946

RAGFlow系列(06):从0.20.0版本升级到最新版的完整指南

本文提供了从RAGFlow 0.20.0版本升级到最新版的完整指南。升级前务必进行数据、配置和状态的三层备份,尤其是智能体配置因版本间存在不兼容风险。指南详细说明了如何优雅停止服务、拉取新代码、检查并调整配置文件(如端口、环境变量),以及最终部署验证的步骤,确保升级过程平滑安全。

weixin_29243279的博客 465

【正点原子FPGA连载】第四十一章OV5640摄像头RGB-LCD显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-300792-1-1.html 3)对正点原子FPGA感兴趣的同学可以加群讨论:994244016 4)关注正点原子公众号,获取最新资料更新 第四十一章OV5640摄像头RGB-LCD显示实验 OV5640同OV7725一样,都是OmniVision(豪

weixin_55796564的博客 9350

使用GDScript(godot)生成仿杀戮尖塔地图

使用GDScript(godot)生成仿杀戮尖塔地图 extends Node2D export (PackedScene) var Ball var 被连接数 = {} # 每个怪物被下层怪物连接的数量 最多为2 var 连接1 = {} # 第一次连接的上层怪物位置 var 连接2 = {} # 第二次连接的上层怪物位置 var 怪物数量 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0] # 每层怪物的数量 var 总层数 =8 # 总层数 var 怪物坐标行 = {} #

weixin_45038716的博客 3011

[医学图像分割综述] Medical Image Segmentation Using Deep Learning: A Survey

本综述有两个独创之处,首先,与传统的调查方法直接将医学图像分割的文献划分为多个组,并对每个组详细介绍文献的方法相比,我们将目前流行的文献按照从粗到细的多层次结构进行分类。其次,本文重点研究了监督学习和弱监督学习方法,但未包括无监督方法,这种方法目前在医学图像领域并不流行。对于监督学习方法,我们从骨干网络的选择、网络块的设计和损失函数的改进三个方面对文献进行了分析。对于弱监督学习方法,我们分别根据数据增强,迁移学习和交互式分割研究文献。与已有的调查相比,本次调查的文献分类与以往有很大的不同,更便于读者了解相关

qq_38932073的博客 4万+

ZYNQ的VDMA采集OV5640视频数据通过HDMI接口显示

在ZYNQ上调试OV5640并用HDMI显示出来这个实验简直就是一部血泪史啊!!有木有!!一个小小的摄像头,调了4天。因此我准备把这次痛苦的经历和全部经验、细节写出来,以供记录学习ZYNQ的心酸历程。 在百度上输入ZYNQ VDMA OV5640等关键字,搜索的大部分是来自米联客的教程。在此特别地向米联客、ALINX、正点原子等等诸如此类的公司和机构表示感谢和深深的敬意,原因是他们向广大刚刚走进ZYNQ世界的新手提供了免费的教程。前辈们的博客对VDMA,VTC,Video ...

a133760的博客 1万+

全球SAR卫星大盘点与回波数据处理专栏目录

本专栏将详细介绍各国各地区的SAR卫星的特点和性能,以及SAR回波数据的处理方法和技巧。主要介绍民用和商用SAR卫星,帮助你了解商业SAR卫星的最新动态和技术,MATLAB代码将全部开源。以下是专栏目录,持续更新中。

3166
上一篇: 开发者怎样提升技术水平?
下一篇: 关于美国保健品婕斯的白藜芦醇广告
sherryyang1234
博客等级 码龄10年 13粉丝 118原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值