[FPGA] 单鱼眼全景相机FPGA源码

[复制链接]
 楼主| feihufuture 发表于 2020-8-27 08:58 | 显示全部楼层 |阅读模式
  1. `timescale 1ns / 1ps

  2. module single_fish_top(
  3.                         input               sys_clk_i    ,                    
  4.                         
  5.                         //input               inclk        , //share input
  6.                         //input               csi          , //share input
  7.                         //input               sck          , //share input  
  8.                         //input               sdi          , //share input  
  9.                                                          
  10.                         //his interface                  
  11.                         output              his_sdo      , //输出到海思的SDO;
  12.                         output              his_hsync    , //输出的HSYNC到海思
  13.                         output              his_vsync    , //输出的VSYNC到海思  
  14.                         output  [11:0]      his_v_data   , //视频数据
  15.                         output              his_dclk     , //输出到海思的数据时钟
  16.                         
  17.                         //sensor 1 interface
  18.                         input               sen_1_sdo    , //输出到海思的SDO;
  19.                         input               sen_1_hsync  , //输出的HSYNC到海思
  20.                         input               sen_1_vsync  , //输出的VSYNC到海思  
  21.                         input   [11:0]      sen_1_v_data , //视频数据
  22.                         input               sen_1_dclk   , //输出到海思的数据时钟
  23.                         
  24.                         //sram interface
  25.                         output  [19:0]      sram_address_1 , //
  26.                         output  reg  [19:0] sram_address_2 , //
  27.                         inout   [11:0]      sram_io_1    , //SRAM1 U6数据
  28.                         inout   [15:0]      sram_io_2    , //SRAM2 U7数据
  29.                         output              we_1         , //SRAM1 U6 we
  30.                         output  reg         we_2         , //SRAM2 U7 we
  31.                         output              oe_1         , //SRAM1 U6 oe
  32.                         output  reg         oe_2         , //SRAM2 U7 oe   
  33.                         
  34.                         //SERIAL FLASH INTERFACE
  35.                         output              sf_sck ,
  36.                         output              sf_cs  ,
  37.                         output              sf_sdi ,
  38.                         input               sf_sdo ,
  39.                         
  40.                         output  [15:0]      dummy_out
  41.                       );


  42. wire               sen_1_dclk_ibufg ;
  43. wire               pll_sen_locked ;
  44. wire               pll_sys_locked ;
  45. wire               clk_66m ;
  46. wire               clk_66m_pin_out ;
  47.                   
  48. wire   [11:0]      his_gen_vdata_out ;
  49. wire               his_gen_vsync_out ;
  50. wire               his_gen_hsync_out ;


  51. wire               power_up_rst ;
  52.       
  53. wire               dummy_hsync , dummy_vsync ;
  54. wire   [11:0]      dummy_vdata ;

  55. wire               sen_1_wren_0 , sen_1_wren_1 , sen_1_valid_data_period ;                  
  56. wire               sen_1_hsync_fil , sen_1_vsync_fil ;

  57.       
  58. wire   [15:0]      valid_dot_cnt_sen_1 ;
  59. wire   [2:0]       push_static_sen_1 ;
  60. wire   [2:0]       push_static_sen_2 ;
  61.                  
  62. wire               line_valid_static_error_1 , line_valid_static_error_2 ;
  63. wire   [15:0]      dot_cnt_1 ;
  64. wire   [15:0]      dot_cnt_2 ;
  65. wire   [23:0]      dot_cnt_total_1 ;
  66. wire   [23:0]      dot_cnt_total_2 ;
  67. wire   [2 :0]      image_save_index_1 , image_save_index_2 ;
  68. wire               read_request_1 , read_request_2 ;
  69.      
  70. wire               spi_init_done ;
  71.                   
  72. wire               read_request_image ;
  73. wire   [29:0]      read_request_address_image ;

  74. reg    [11:0]      sen_1_v_data_d ;         

  75. wire   [15:0]      sram_wdata_2 ;
  76. reg    [15:0]      sram_wdata_2_d ;
  77. wire   [19:0]      sram_waddr_2 ;
  78. wire   [19:0]      sram_raddr_2 ;
  79. wire               sram_wren_2  ;
  80. wire               sram_rden_2 ;

  81. wire               vsync_in_his_out      ;
  82. wire               hsync_in_his_out      ;
  83. wire   [11:0]      video_data_in_his_out ;

  84. assign sram_io_2 = spi_init_done ? 16'bzzzzzzzzzzzzzzzz : sram_wdata_2_d ;

  85. always @(posedge clk_66m)
  86. begin
  87.   sram_wdata_2_d <= sram_wdata_2 ;
  88.   we_2 <= spi_init_done ? 1'b1 : sram_wren_2 ;
  89.   oe_2 <= spi_init_done ? sram_rden_2 : 1'b1 ;
  90.   sram_address_2 <= spi_init_done ? sram_raddr_2 : sram_waddr_2 ;
  91. end

  92. wire  his_clk_source_org ;
  93. wire  his_clk_source ;

  94.    BUFGCE BUFGCE_inst (
  95.       .O(his_clk_source),   // 1-bit output: Clock buffer output
  96.       .CE(1'b1), // 1-bit input: Clock buffer select
  97.       .I(his_clk_source_org)    // 1-bit input: Clock buffer input (S=0)
  98.    );

  99. IBUFG BUFG_inst_sen_dclk (.O(sen_1_dclk_ibufg), .I(sen_1_dclk));
  100. pll_sen_clk pll_sen_clk(.clk_in(sen_1_dclk_ibufg) , .clk_out(his_clk_source_org), .pll_locked(pll_sen_locked));
  101. assign sen_1_dclk_buf = sen_1_dclk_ibufg ;
  102. pll_sys_clk pll_sys_clk(.clk_in(sys_clk_i) , .clk_out(clk_66m), .pll_locked(pll_sys_locked), .clk_66m_pin_out(clk_66m_pin_out));

  103. always @(posedge sen_1_dclk_buf)
  104.   sen_1_v_data_d <= sen_1_v_data ;

  105. rst_ctrl  RST_CTRL(
  106.                    .rst_i(1'b1),
  107.                    .isp_rst(1'b1) ,
  108.                    .clk(clk_66m),
  109.                    .power_up_rst(power_up_rst) ,
  110.                    .rst_o()
  111.                   );

  112.    
  113. filter filter_sen_1_hsync(.clk(sen_1_dclk_buf), .pin_in(sen_1_hsync), .filtered_out(sen_1_hsync_fil));
  114. filter filter_sen_1_vsync(.clk(sen_1_dclk_buf), .pin_in(sen_1_vsync), .filtered_out(sen_1_vsync_fil));

  115. spi_flash_mover spi_flash_mover(
  116.                                  .clk_sys (clk_66m) ,
  117.                                  .rst_n   (power_up_rst) ,                                                   

  118.                                  .spi_cs  (sf_cs) ,
  119.                                  .spi_clk (sf_sck) ,
  120.                                  .spi_di  (sf_sdi) ,
  121.                                  .spi_do  (sf_sdo) ,

  122.                                  .sram_wdata_2 (sram_wdata_2) ,
  123.                                  .sram_waddr_2 (sram_waddr_2) ,
  124.                                  .sram_wren_2  (sram_wren_2) ,

  125.                                  .spi_init_done (spi_init_done)
  126.                                );

  127. sensor_proc sensor_proc_sen1(
  128.                               .sen_sdo           (), //输出到海思的SDO;
  129.                               .sen_hsync         (sen_1_hsync_fil ), //输出的HSYNC到海思
  130.                               .sen_vsync         (sen_1_vsync_fil ), //输出的VSYNC到海思  
  131.                               .sen_v_data        (sen_1_v_data_d), //视频数据
  132.                               .sen_dclk          (sen_1_dclk_buf  ), //输出到海思的数据时钟     
  133.                               .valid_data_period (sen_1_valid_data_period),
  134.                               .wren_0            (sen_1_wren_0),
  135.                               .wren_1            (sen_1_wren_1),
  136.                               .valid_dot_cnt     (valid_dot_cnt_sen_1),
  137.                               .line_valid_static_error (line_valid_static_error_1),
  138.                               .dot_cnt           (dot_cnt_1),
  139.                               .dot_cnt_total     (dot_cnt_total_1),
  140.                               .spi_init_done     (spi_init_done)
  141.                             );                                                                        
  142.                  
  143. sram_controller sram_controller(
  144.                                  .sen_1_hsync             (sen_1_hsync_fil ),                                    
  145.                                  .sen_1_vsync             (sen_1_vsync_fil ),                                    
  146.                                  .sen_1_v_data            (sen_1_v_data)    ,                                    
  147.                                  .sen_1_dclk              (sen_1_dclk_buf  ),     
  148.                                                                      
  149.                                  .valid_data_period_sen_1 (sen_1_valid_data_period),
  150.                                  .valid_dot_cnt_sen_1     (valid_dot_cnt_sen_1),
  151.                                                            
  152.                                  .spi_init_done_sen_1     (spi_init_done),                        

  153.                                  .clk_sys       (clk_66m) ,
  154.                                  .rst_n         (power_up_rst) ,
  155.                                  
  156.                                  .sram_addr      (sram_address_1) ,
  157.                                  .sram_io_1      (sram_io_1) ,   
  158.                                  .sram_wen_1     (we_1) ,               
  159.                                  .sram_oen_1     (oe_1) ,
  160.                                  
  161.                                  .sram_rden_2    (sram_rden_2) ,
  162.                                  .sram_raddr_2   (sram_raddr_2) ,
  163.                                  .sram_din_2     (sram_io_2) ,            
  164.                                  
  165.                                  .vsync_out      (vsync_in_his_out     ) ,      
  166.                                  .hsync_out      (hsync_in_his_out     ) ,      
  167.                                  .video_data_out (video_data_in_his_out) ,
  168.                                  .dummy_out      (dummy_out)                                    
  169.                                );

  170. reg                  vsync_in_d ;
  171. reg                  hsync_in_d ;
  172. reg    [11:0]        video_data_in_d ;
  173. reg    [15:0]        sram_din_2_d ;

  174. always @(posedge clk_66m)
  175.   sram_din_2_d <= sram_io_2 ;
  176.   
  177. //assign dummy_out = sram_io_2 ; //|sram_din_2_d ;

  178. always @(posedge sen_1_dclk_buf)
  179. begin
  180.   vsync_in_d      <= sen_1_vsync  ;     
  181.   hsync_in_d      <= sen_1_hsync  ;     
  182.   video_data_in_d <= sen_1_v_data ;
  183. end

  184. assign his_sdo    = sen_1_sdo    ;
  185. assign his_dclk   = his_clk_source ; //clk_66m_pin_out ; //sen_1_dclk_buf ;  

  186. //assign his_hsync  = sen_1_hsync      ;
  187. //assign his_vsync  = sen_1_vsync      ;
  188. //assign his_v_data = sen_1_v_data ;
  189.        
  190. assign his_hsync  = hsync_in_his_out      ;
  191. assign his_vsync  = vsync_in_his_out      ;
  192. assign his_v_data = video_data_in_his_out ;
  193.        
  194. endmodule
  1. module sensor_proc(
  2.                     sen_sdo    , //输出到海思的SDO;
  3.                     sen_hsync  , //输出的HSYNC到海思
  4.                     sen_vsync  , //输出的VSYNC到海思  
  5.                     sen_v_data , //视频数据
  6.                     sen_dclk,    //输出到海思的数据时钟     
  7.                     valid_data_period ,
  8.                     wren_0 ,
  9.                     wren_1 ,
  10.                     valid_dot_cnt ,
  11.                     line_valid_static_error ,
  12.                     dot_cnt ,
  13.                     dot_cnt_total ,
  14.                     spi_init_done                             
  15.                   );

  16. input               sen_sdo    ; //输出到海思的SDO;
  17. input               sen_hsync  ; //输出的HSYNC到海思
  18. input               sen_vsync  ; //输出的VSYNC到海思  
  19. input   [11:0]      sen_v_data ; //视频数据
  20. input               sen_dclk   ; //输出到海思的数据时钟      
  21. output              valid_data_period ;
  22. output              wren_0 , wren_1 ;
  23. output  [15:0]      valid_dot_cnt ;
  24. output              line_valid_static_error ;
  25. output  [15:0]      dot_cnt ;
  26. output  [23:0]      dot_cnt_total ;
  27. input               spi_init_done ;

  28. parameter           INEFFECTIVE_OB_LEN    = 16 ;        
  29. parameter           IGNORED_AREA_LEN      = 24 ;        
  30. parameter           COLOR_PROCESS_LEH     = 8 ;        
  31. parameter           IMAGE_WIDTH           = 1920 ;        
  32. parameter           FRONT_INVALID_LEN     = INEFFECTIVE_OB_LEN + IGNORED_AREA_LEN + COLOR_PROCESS_LEH ;

  33. reg     [11:0]      sen_v_data_d1 ;
  34. reg     [11:0]      sen_v_data_d2 ;
  35. reg     [11:0]      sen_v_data_d3 ;
  36. reg     [11:0]      sen_v_data_d4 ;
  37. reg     [11:0]      sen_v_data_d5 ;
  38. reg     [11:0]      sen_v_data_d6 ;
  39. reg     [11:0]      sen_v_data_d7 ;
  40. reg                 active_data_period ; //SAV和EAV之间的区域
  41. reg                 valid_data_period  ; //真正有效的数据区域,不包括前后的INEFFECTIVE区域

  42. reg     [15:0]      line_cnt ;
  43. reg     [15:0]      dot_cnt ;
  44. reg     [15:0]      valid_dot_cnt ;
  45. reg                 sensor_valid_frame ; //表示一帧中开始有数据了

  46. reg                 sen_hsync_d1 , sen_hsync_d2 ;
  47. reg                 sen_vsync_d1 , sen_vsync_d2 ;

  48. wire                hsync_r = sen_hsync_d1 & (~sen_hsync_d2) ;
  49. wire                hsync_f = sen_hsync_d2 & (~sen_hsync_d1) ;

  50. wire                vsync_r = sen_vsync_d1 & (~sen_vsync_d2) ;
  51. wire                vsync_f = sen_vsync_d2 & (~sen_vsync_d1) ;
  52. reg                 wren_0 , wren_1 ;
  53. reg                 active_data_period_d ;
  54. wire                active_data_period_r = active_data_period & (~active_data_period_d) ;
  55. reg     [15:0]      active_line_cnt ; //统计SAV有效的行数计数器。

  56. reg     [7:0]       sen_hsync_cnt ;
  57. reg                 line_valid_static_error ;

  58. reg     [23:0]      dot_cnt_total ;

  59. always @(posedge sen_dclk)
  60. line_valid_static_error <= (sen_hsync_cnt == 20) & (dot_cnt > 100) & (dot_cnt != 2004) ;

  61. always @(posedge sen_dclk)
  62. if (~sen_hsync)
  63.   sen_hsync_cnt <= 16'd0 ;
  64. else if (sen_hsync_cnt != 150)
  65.   sen_hsync_cnt <= sen_hsync_cnt + 16'd1 ;  


  66. always @(posedge sen_dclk)  
  67. if (sen_hsync_cnt == 8'd60)
  68.   valid_dot_cnt <= 16'd0 ;
  69. else if (valid_data_period)
  70. begin
  71.   if (valid_dot_cnt != (IMAGE_WIDTH - 1))
  72.     valid_dot_cnt <= valid_dot_cnt + 16'd1 ;
  73. end

  74. always @(posedge sen_dclk)  
  75. if ((~sen_vsync)|(sen_hsync_cnt == 8'd60))
  76.   wren_0 <= 1'b0 ;
  77. else if (dot_cnt == (FRONT_INVALID_LEN - 1))
  78.   wren_0 <= 1'b1 ;
  79. else if (dot_cnt == (FRONT_INVALID_LEN - 1 + 480))
  80.   wren_0 <= 1'b0 ;
  81. else if (dot_cnt == (FRONT_INVALID_LEN - 1 + 960))
  82.   wren_0 <= 1'b1 ;
  83. else if (dot_cnt == (FRONT_INVALID_LEN - 1 + 1440))
  84.   wren_0 <= 1'b0 ;

  85. always @(posedge sen_dclk)  
  86. if ((~sen_vsync)|(sen_hsync_cnt == 8'd60))
  87.   wren_1 <= 1'b0 ;
  88. else if (dot_cnt == (FRONT_INVALID_LEN - 1 + 480))
  89.   wren_1 <= 1'b1 ;
  90. else if (dot_cnt == (FRONT_INVALID_LEN - 1 + 960))
  91.   wren_1 <= 1'b0 ;
  92. else if (dot_cnt == (FRONT_INVALID_LEN - 1 + 1440))
  93.   wren_1 <= 1'b1 ;
  94. else if (dot_cnt == (FRONT_INVALID_LEN - 1 + 1920))
  95.   wren_1 <= 1'b0 ;

  96. always @(posedge sen_dclk)  
  97. if ((~sen_vsync)|(sen_hsync_cnt == 8'd60)|(~spi_init_done))
  98.   valid_data_period <= 1'b0 ;
  99. else if ((dot_cnt == (FRONT_INVALID_LEN - 1))&(active_line_cnt > 16'd25)&(active_line_cnt <= 16'd25 + 1080) & spi_init_done)
  100.   valid_data_period <= 1'b1 ;
  101. else if(valid_dot_cnt == (IMAGE_WIDTH - 1))
  102.   valid_data_period <= 1'b0 ;

  103. always @(posedge sen_dclk)  
  104. begin
  105.   sen_vsync_d2 <= sen_vsync_d1 ;
  106.   sen_vsync_d1 <= sen_vsync ;
  107.   sen_hsync_d2 <= sen_hsync_d1 ;
  108.   sen_hsync_d1 <= sen_hsync ;
  109. end

  110. always @(posedge sen_dclk)  
  111. if (~sen_vsync)
  112.   line_cnt <= 16'd0 ;
  113. else if (sensor_valid_frame & hsync_f)
  114.   line_cnt <= line_cnt + 16'd1 ;

  115. always @(posedge sen_dclk)  
  116. if (~sen_vsync)
  117.   sensor_valid_frame <= 1'b0 ;
  118. else if (active_data_period)
  119.   sensor_valid_frame <= 1'b1 ;

  120. always @(posedge sen_dclk)  
  121. if(~sen_vsync_d2)
  122.   dot_cnt_total <= 24'd0 ;
  123. else  if(sen_hsync_cnt == 8'd60)
  124.   dot_cnt_total <= dot_cnt_total + dot_cnt ;

  125. always @(posedge sen_dclk)  
  126. if(sen_hsync_cnt == 8'd60)
  127.   dot_cnt <= 16'd0 ;
  128. else if (active_data_period)
  129.   dot_cnt <= dot_cnt + 16'd1 ;

  130. wire [3:0] sen_v_data_d7_sum = sen_v_data_d7[11]+sen_v_data_d7[10]+sen_v_data_d7[9]+sen_v_data_d7[8]+sen_v_data_d7[7]+sen_v_data_d7[6]+sen_v_data_d7[5]+sen_v_data_d7[4]+sen_v_data_d7[3]+sen_v_data_d7[2]+sen_v_data_d7[1]+sen_v_data_d7[0];
  131. wire [3:0] sen_v_data_d6_sum = sen_v_data_d6[11]+sen_v_data_d6[10]+sen_v_data_d6[9]+sen_v_data_d6[8]+sen_v_data_d6[7]+sen_v_data_d6[6]+sen_v_data_d6[5]+sen_v_data_d6[4]+sen_v_data_d6[3]+sen_v_data_d6[2]+sen_v_data_d6[1]+sen_v_data_d6[0];
  132. wire [3:0] sen_v_data_d5_sum = sen_v_data_d5[11]+sen_v_data_d5[10]+sen_v_data_d5[9]+sen_v_data_d5[8]+sen_v_data_d5[7]+sen_v_data_d5[6]+sen_v_data_d5[5]+sen_v_data_d5[4]+sen_v_data_d5[3]+sen_v_data_d5[2]+sen_v_data_d5[1]+sen_v_data_d5[0];
  133. wire [3:0] sen_v_data_d4_sum = sen_v_data_d4[11]+sen_v_data_d4[10]+sen_v_data_d4[9]+sen_v_data_d4[8]+sen_v_data_d4[7]+sen_v_data_d4[6]+sen_v_data_d4[5]+sen_v_data_d4[4]+sen_v_data_d4[3]+sen_v_data_d4[2]+sen_v_data_d4[1]+sen_v_data_d4[0];
  134. wire [3:0] sen_v_data_d3_sum = sen_v_data_d3[11]+sen_v_data_d3[10]+sen_v_data_d3[9]+sen_v_data_d3[8]+sen_v_data_d3[7]+sen_v_data_d3[6]+sen_v_data_d3[5]+sen_v_data_d3[4]+sen_v_data_d3[3]+sen_v_data_d3[2]+sen_v_data_d3[1]+sen_v_data_d3[0];
  135. wire [3:0] sen_v_data_d2_sum = sen_v_data_d2[11]+sen_v_data_d2[10]+sen_v_data_d2[9]+sen_v_data_d2[8]+sen_v_data_d2[7]+sen_v_data_d2[6]+sen_v_data_d2[5]+sen_v_data_d2[4]+sen_v_data_d2[3]+sen_v_data_d2[2]+sen_v_data_d2[1]+sen_v_data_d2[0];
  136. wire [3:0] sen_v_data_d1_sum = sen_v_data_d1[11]+sen_v_data_d1[10]+sen_v_data_d1[9]+sen_v_data_d1[8]+sen_v_data_d1[7]+sen_v_data_d1[6]+sen_v_data_d1[5]+sen_v_data_d1[4]+sen_v_data_d1[3]+sen_v_data_d1[2]+sen_v_data_d1[1]+sen_v_data_d1[0];
  137. wire [3:0] sen_v_data_sum    = sen_v_data[11]+sen_v_data[10]+sen_v_data[9]+sen_v_data[8]+sen_v_data[7]+sen_v_data[6]+sen_v_data[5]+sen_v_data[4]+sen_v_data[3]+sen_v_data[2]+sen_v_data[1]+sen_v_data[0];

  138. always @(posedge sen_dclk)  
  139. if (~sen_vsync)
  140.   active_data_period <= 1'b0 ;
  141. //else if ((sen_v_data == 12'h800) & (sen_v_data_d1 == 12'h000) & (sen_v_data_d2 == 12'h000) & (sen_v_data_d3 == 12'hfff))
  142. else if ((sen_v_data_sum <= 4'd2) & (sen_v_data_d1_sum <= 4'd1) & (sen_v_data_d2_sum <= 4'd1) & (sen_v_data_d3_sum >= 4'd10) & (sen_v_data_d4_sum <= 4'd1) & (sen_v_data_d5_sum <= 4'd1))
  143.   active_data_period <= 1'b1 ;                                                               
  144. //else if ((sen_v_data == 12'h9d0) & (sen_v_data_d1 == 12'h000) & (sen_v_data_d2 == 12'h000) & (sen_v_data_d3 == 12'hfff))
  145. else if ((sen_v_data_d1_sum <= 4'd1) & (sen_v_data_d2_sum <= 4'd1) & (sen_v_data_d3_sum >= 4'd10))
  146.   active_data_period <= 1'b0 ;

  147. always @(posedge sen_dclk)  
  148.   active_data_period_d <= active_data_period ;

  149. always @(posedge sen_dclk)  
  150. if (~sen_vsync)
  151.   active_line_cnt <= 16'd0 ;
  152. else if (active_data_period_r)  
  153.   active_line_cnt <= active_line_cnt + 16'd1 ;
  154.   
  155. always @(posedge sen_dclk)  
  156. begin
  157.   sen_v_data_d7 <= sen_v_data_d6 ;
  158.   sen_v_data_d6 <= sen_v_data_d5 ;
  159.   sen_v_data_d5 <= sen_v_data_d4 ;
  160.   sen_v_data_d4 <= sen_v_data_d3 ;
  161.   sen_v_data_d3 <= sen_v_data_d2 ;
  162.   sen_v_data_d2 <= sen_v_data_d1 ;
  163.   sen_v_data_d1 <= sen_v_data ;
  164. end

  165.   
  166. endmodule


雷北城 发表于 2020-8-27 16:12 | 显示全部楼层
谢谢分享,学习了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:WX:feihu612 免费合作开发ECAT主从站

171

主题

1029

帖子

101

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:WX:feihu612 免费合作开发ECAT主从站

171

主题

1029

帖子

101

粉丝
快速回复 在线客服 返回列表 返回顶部