1. /*============================================================================
  2. *
  3. *  LOGIC CORE:          OV5640初始化寄存器表(RGB模式专用)
  4. *  MODULE NAME:         ov5640_init_table_rgb()
  5. *  COMPANY:             武汉芯路恒科技有限公司
  6. *                       http://xiaomeige.taobao.com
  7. *  author:                                小梅哥
  8. *  Website:                                www.corecourse.cn
  9. *  REVISION HISTORY:  
  10. *
  11. *  Revision:                         1.0  04/10/2019     
  12. *  Description:                 Initial Release.
  13. *
  14. *  FUNCTIONAL DESCRIPTION:
  15. ===========================================================================*/
  16. module ov5640_init_table_rgb(
  17.         addr,
  18.         clk,
  19.         q
  20. );       
  21.         parameter DATA_WIDTH=24;
  22.         parameter ADDR_WIDTH=8;
  23.         parameter IMAGE_WIDTH = 16'd640;
  24.         parameter IMAGE_HEIGHT = 16'd480;
  25.         parameter IMAGE_FLIP = 8'h40;
  26.         parameter IMAGE_MIRROR = 4'h7;
  27.         input clk;
  28.         input [(ADDR_WIDTH-1):0] addr;
  29.         output reg [(DATA_WIDTH-1):0] q;
  30.        
  31.         // Declare the ROM variable
  32.         reg [DATA_WIDTH-1:0] rom[2**ADDR_WIDTH-1:0];
  33.         initial begin
  34.                 rom[0 ] = 24'h3103_11; // system clock from pad, bit[1]
  35.                 rom[1 ] = 24'h3008_82; // software reset, bit[7]
  36.                 rom[2 ] = 24'h3008_42; // software power down, bit[6]
  37.                 rom[3 ] = 24'h3103_03; // system clock from PLL, bit[1]
  38.                 rom[4 ] = 24'h3017_ff; // FREX, Vsync, HREF, PCLK, D[9:6] output enable
  39.                 rom[5 ] = 24'h3018_ff; // D[5:0], GPIO[1:0] output enable
  40.                 rom[6 ] = 24'h3034_1a; // MIPI 10-bit
  41.                 rom[7 ] = 24'h3037_13; // PLL root divider, bit[4], PLL pre-divider, bit[3:0]
  42.                 rom[8 ] = 24'h3108_01; // PCLK root divider, bit[5:4], SCLK2x root divider, bit[3:2]
  43.                 rom[9 ] = 24'h3630_36; // SCLK root divider, bit[1:0]
  44.                 rom[10] = 24'h3631_0e;
  45.                 rom[11] = 24'h3632_e2;
  46.                 rom[12] = 24'h3633_12;
  47.                 rom[13] = 24'h3621_e0;
  48.                 rom[14] = 24'h3704_a0;
  49.                 rom[15] = 24'h3703_5a;
  50.                 rom[16] = 24'h3715_78;
  51.                 rom[17] = 24'h3717_01;
  52.                 rom[18] = 24'h370b_60;
  53.                 rom[19] = 24'h3705_1a;
  54.                 rom[20] = 24'h3905_02;
  55.                 rom[21] = 24'h3906_10;
  56.                 rom[22] = 24'h3901_0a;
  57.                 rom[23] = 24'h3731_12;
  58.                 rom[24] = 24'h3600_08; // VCM control
  59.                 rom[25] = 24'h3601_33; // VCM control
  60.                 rom[26] = 24'h302d_60; // system control
  61.                 rom[27] = 24'h3620_52;
  62.                 rom[28] = 24'h371b_20;
  63.                 rom[29] = 24'h471c_50;
  64.                 rom[30] = 24'h3a13_43; // pre-gain = 1.047x
  65.                 rom[31] = 24'h3a18_00; // gain ceiling
  66.                 rom[32] = 24'h3a19_f8; // gain ceiling = 15.5x
  67.                 rom[33] = 24'h3635_13;
  68.                 rom[34] = 24'h3636_03;
  69.                 rom[35] = 24'h3634_40;
  70.                 rom[36] = 24'h3622_01;
  71.                 // 50/60Hz detection 50/60Hz 灯光条纹过滤
  72.                 rom[37] = 24'h3c01_34; // Band auto, bit[7]
  73.                 rom[38] = 24'h3c04_28; // threshold low sum
  74.                 rom[39] = 24'h3c05_98; // threshold high sum
  75.                 rom[40] = 24'h3c06_00; // light meter 1 threshold[15:8]
  76.                 rom[41] = 24'h3c07_08; // light meter 1 threshold[7:0]
  77.                 rom[42] = 24'h3c08_00; // light meter 2 threshold[15:8]
  78.                 rom[43] = 24'h3c09_1c; // light meter 2 threshold[7:0]
  79.                 rom[44] = 24'h3c0a_9c; // sample number[15:8]
  80.                 rom[45] = 24'h3c0b_40; // sample number[7:0]
  81.                 rom[46] = 24'h3810_00; // Timing Hoffset[11:8]
  82.                 rom[47] = 24'h3811_10; // Timing Hoffset[7:0]
  83.                 rom[48] = 24'h3812_00; // Timing Voffset[10:8]
  84.                 rom[49] = 24'h3708_64;
  85.                 rom[50] = 24'h4001_02; // BLC start from line 2
  86.                 rom[51] = 24'h4005_1a; // BLC always update
  87.                 rom[52] = 24'h3000_00; // enable blocks
  88.                 rom[53] = 24'h3004_ff; // enable clocks
  89.                 rom[54] = 24'h300e_58; // MIPI power down, DVP enable
  90.                 rom[55] = 24'h302e_00;
  91.                 rom[56] = 24'h4300_61; // RGB565   //h4300_6f(千兆网模式)--------------------------------------------------------
  92.                 rom[57] = 24'h501f_01; // RGB565
  93.                 rom[58] = 24'h440e_00;
  94.                 rom[59] = 24'h5000_a7; // Lenc on, raw gamma on, BPC on, WPC on, CIP on
  95.                 // AEC target 自动曝光控制
  96.                 rom[60] = 24'h3a0f_30; // stable range in high
  97.                 rom[61] = 24'h3a10_28; // stable range in low
  98.                 rom[62] = 24'h3a1b_30; // stable range out high
  99.                 rom[63] = 24'h3a1e_26; // stable range out low
  100.                 rom[64] = 24'h3a11_60; // fast zone high
  101.                 rom[65] = 24'h3a1f_14; // fast zone low
  102.                 // Lens correction for ? 镜头补偿
  103.                 rom[66 ] = 24'h5800_23;
  104.                 rom[67 ] = 24'h5801_14;
  105.                 rom[68 ] = 24'h5802_0f;
  106.                 rom[69 ] = 24'h5803_0f;
  107.                 rom[70 ] = 24'h5804_12;
  108.                 rom[71 ] = 24'h5805_26;
  109.                 rom[72 ] = 24'h5806_0c;
  110.                 rom[73 ] = 24'h5807_08;
  111.                 rom[74 ] = 24'h5808_05;
  112.                 rom[75 ] = 24'h5809_05;
  113.                 rom[76 ] = 24'h580a_08;
  114.                 rom[77 ] = 24'h580b_0d;
  115.                 rom[78 ] = 24'h580c_08;
  116.                 rom[79 ] = 24'h580d_03;
  117.                 rom[80 ] = 24'h580e_00;
  118.                 rom[81 ] = 24'h580f_00;
  119.                 rom[82 ] = 24'h5810_03;
  120.                 rom[83 ] = 24'h5811_09;
  121.                 rom[84 ] = 24'h5812_07;
  122.                 rom[85 ] = 24'h5813_03;
  123.                 rom[86 ] = 24'h5814_00;
  124.                 rom[87 ] = 24'h5815_01;
  125.                 rom[88 ] = 24'h5816_03;
  126.                 rom[89 ] = 24'h5817_08;
  127.                 rom[90 ] = 24'h5818_0d;
  128.                 rom[91 ] = 24'h5819_08;
  129.                 rom[92 ] = 24'h581a_05;
  130.                 rom[93 ] = 24'h581b_06;
  131.                 rom[94 ] = 24'h581c_08;
  132.                 rom[95 ] = 24'h581d_0e;
  133.                 rom[96 ] = 24'h581e_29;
  134.                 rom[97 ] = 24'h581f_17;
  135.                 rom[98 ] = 24'h5820_11;
  136.                 rom[99 ] = 24'h5821_11;
  137.                 rom[100] = 24'h5822_15;
  138.                 rom[101] = 24'h5823_28;
  139.                 rom[102] = 24'h5824_46;
  140.                 rom[103] = 24'h5825_26;
  141.                 rom[104] = 24'h5826_08;
  142.                 rom[105] = 24'h5827_26;
  143.                 rom[106] = 24'h5828_64;
  144.                 rom[107] = 24'h5829_26;
  145.                 rom[108] = 24'h582a_24;
  146.                 rom[109] = 24'h582b_22;
  147.                 rom[110] = 24'h582c_24;
  148.                 rom[111] = 24'h582d_24;
  149.                 rom[112] = 24'h582e_06;
  150.                 rom[113] = 24'h582f_22;
  151.                 rom[114] = 24'h5830_40;
  152.                 rom[115] = 24'h5831_42;
  153.                 rom[116] = 24'h5832_24;
  154.                 rom[117] = 24'h5833_26;
  155.                 rom[118] = 24'h5834_24;
  156.                 rom[119] = 24'h5835_22;
  157.                 rom[120] = 24'h5836_22;
  158.                 rom[121] = 24'h5837_26;
  159.                 rom[122] = 24'h5838_44;
  160.                 rom[123] = 24'h5839_24;
  161.                 rom[124] = 24'h583a_26;
  162.                 rom[125] = 24'h583b_28;
  163.                 rom[126] = 24'h583c_42;
  164.                 rom[127] = 24'h583d_ce; // lenc BR offset
  165.                 // AWB 自动白平衡
  166.                 rom[128] = 24'h5180_ff; // AWB B block
  167.                 rom[129] = 24'h5181_f2; // AWB control
  168.                 rom[130] = 24'h5182_00; // [7:4] max local counter, [3:0] max fast counter
  169.                 rom[131] = 24'h5183_14; // AWB advanced
  170.                 rom[132] = 24'h5184_25;
  171.                 rom[133] = 24'h5185_24;
  172.                 rom[134] = 24'h5186_09;
  173.                 rom[135] = 24'h5187_09;
  174.                 rom[136] = 24'h5188_09;
  175.                 rom[137] = 24'h5189_75;
  176.                 rom[138] = 24'h518a_54;
  177.                 rom[139] = 24'h518b_e0;
  178.                 rom[140] = 24'h518c_b2;
  179.                 rom[141] = 24'h518d_42;
  180.                 rom[142] = 24'h518e_3d;
  181.                 rom[143] = 24'h518f_56;
  182.                 rom[144] = 24'h5190_46;
  183.                 rom[145] = 24'h5191_f8; // AWB top limit
  184.                 rom[146] = 24'h5192_04; // AWB bottom limit
  185.                 rom[147] = 24'h5193_70; // red limit
  186.                 rom[148] = 24'h5194_f0; // green limit
  187.                 rom[149] = 24'h5195_f0; // blue limit
  188.                 rom[150] = 24'h5196_03; // AWB control
  189.                 rom[151] = 24'h5197_01; // local limit
  190.                 rom[152] = 24'h5198_04;
  191.                 rom[153] = 24'h5199_12;
  192.                 rom[154] = 24'h519a_04;
  193.                 rom[155] = 24'h519b_00;
  194.                 rom[156] = 24'h519c_06;
  195.                 rom[157] = 24'h519d_82;
  196.                 rom[158] = 24'h519e_38; // AWB control
  197.                 // Gamma 伽玛曲线
  198.                 rom[159] = 24'h5480_01; // Gamma bias plus on, bit[0]
  199.                 rom[160] = 24'h5481_08;
  200.                 rom[161] = 24'h5482_14;
  201.                 rom[162] = 24'h5483_28;
  202.                 rom[163] = 24'h5484_51;
  203.                 rom[164] = 24'h5485_65;
  204.                 rom[165] = 24'h5486_71;
  205.                 rom[166] = 24'h5487_7d;
  206.                 rom[167] = 24'h5488_87;
  207.                 rom[168] = 24'h5489_91;
  208.                 rom[169] = 24'h548a_9a;
  209.                 rom[170] = 24'h548b_aa;
  210.                 rom[171] = 24'h548c_b8;
  211.                 rom[172] = 24'h548d_cd;
  212.                 rom[173] = 24'h548e_dd;
  213.                 rom[174] = 24'h548f_ea;
  214.                 rom[175] = 24'h5490_1d;
  215.                 // color matrix 色彩矩阵
  216.                 rom[176] = 24'h5381_1e; // CMX1 for Y
  217.                 rom[177] = 24'h5382_5b; // CMX2 for Y
  218.                 rom[178] = 24'h5383_08; // CMX3 for Y
  219.                 rom[179] = 24'h5384_0a; // CMX4 for U
  220.                 rom[180] = 24'h5385_7e; // CMX5 for U
  221.                 rom[181] = 24'h5386_88; // CMX6 for U
  222.                 rom[182] = 24'h5387_7c; // CMX7 for V
  223.                 rom[183] = 24'h5388_6c; // CMX8 for V
  224.                 rom[184] = 24'h5389_10; // CMX9 for V
  225.                 rom[185] = 24'h538a_01; // sign[9]
  226.                 rom[186] = 24'h538b_98; // sign[8:1]
  227.                 // UV adjust UV 色彩饱和度调整
  228.                 rom[187] = 24'h5580_06; // saturation on, bit[1]
  229.                 rom[188] = 24'h5583_40;
  230.                 rom[189] = 24'h5584_10;
  231.                 rom[190] = 24'h5589_10;
  232.                 rom[191] = 24'h558a_00;
  233.                 rom[192] = 24'h558b_f8;
  234.                 rom[193] = 24'h501d_40; // enable manual offset of contrast
  235.                 // CIP 锐化和降噪
  236.                 rom[194] = 24'h5300_08; // CIP sharpen MT threshold 1
  237.                 rom[195] = 24'h5301_30; // CIP sharpen MT threshold 2
  238.                 rom[196] = 24'h5302_10; // CIP sharpen MT offset 1
  239.                 rom[197] = 24'h5303_00; // CIP sharpen MT offset 2
  240.                 rom[198] = 24'h5304_08; // CIP DNS threshold 1
  241.                 rom[199] = 24'h5305_30; // CIP DNS threshold 2
  242.                 rom[200] = 24'h5306_08; // CIP DNS offset 1
  243.                 rom[201] = 24'h5307_16; // CIP DNS offset 2
  244.                 rom[202] = 24'h5309_08; // CIP sharpen TH threshold 1
  245.                 rom[203] = 24'h530a_30; // CIP sharpen TH threshold 2
  246.                 rom[204] = 24'h530b_04; // CIP sharpen TH offset 1
  247.                 rom[205] = 24'h530c_06; // CIP sharpen TH offset 2
  248.                 rom[206] = 24'h5025_00;
  249.                 rom[207] = 24'h3008_02; // wake up from standby, bit[6]
  250.                 // 12824'h720, 30fps
  251.                 // input clock 24Mhz, PCLK 42Mhz
  252.                 rom[208] = 24'h3035_21; // PLL        21:30fps  41:15fps        81:7.5fps
  253.                 rom[209] = 24'h3036_69; // PLL
  254.                 rom[210] = 24'h3c07_07; // lightmeter 1 threshold[7:0]
  255.                 rom[211] = {16'h3820, IMAGE_FLIP}; // flip
  256.                 rom[212] = {20'h38210, IMAGE_MIRROR}; // no mirror
  257.                 rom[213] = 24'h3814_31; // timing X inc
  258.                 rom[214] = 24'h3815_31; // timing Y inc
  259.                 rom[215] = 24'h3800_00; // HS
  260.                 rom[216] = 24'h3801_00; // HS
  261.                 rom[217] = 24'h3802_00; // VS
  262.                 rom[218] = 24'h3803_fa; // VS
  263.                 rom[219] = 24'h3804_0a; // HW SET_OV5640 +  HE}
  264.                 rom[220] = 24'h3805_3f; // HW SET_OV5640 +  HE}
  265.                 rom[221] = 24'h3806_06; // VH SET_OV5640 +  VE}
  266.                 rom[222] = 24'h3807_a9; // VH SET_OV5640 +  VE}
  267.                 rom[223] = {16'h3808, IMAGE_WIDTH[15:8]}; // DVPHO        (<1280>500) (<640>280)IMAGE_WIDTH
  268.                 rom[224] = {16'h3809, IMAGE_WIDTH[ 7:0]}; // DVPHO
  269.                 rom[225] = {16'h380a, IMAGE_HEIGHT[15:8]}; // DVPVO        (<720>2d0)  (<480>1e0)IMAGE_HEIGHT
  270.                 rom[226] = {16'h380b, IMAGE_HEIGHT[ 7:0]}; // DVPHO
  271.                 rom[227] = 24'h380c_07; // HTS
  272.                 rom[228] = 24'h380d_64; // HTS
  273.                 rom[229] = 24'h380e_02; // VTS
  274.                 rom[230] = 24'h380f_e4; // VTS
  275.                 rom[231] = 24'h3813_04; // timing V offset
  276.                 rom[232] = 24'h3618_00;
  277.                 rom[233] = 24'h3612_29;
  278.                 rom[234] = 24'h3709_52;
  279.                 rom[235] = 24'h370c_03;
  280.                 rom[236] = 24'h3a02_02; // 60Hz max exposure
  281.                 rom[237] = 24'h3a03_e0; // 60Hz max exposure
  282.                 rom[238] = 24'h3a14_02; // 50Hz max exposure
  283.                 rom[239] = 24'h3a15_e0; // 50Hz max exposure
  284.                 rom[240] = 24'h4004_02; // BLC line number
  285.                 rom[241] = 24'h3002_1c; // reset JFIFO, SFIFO, JPG
  286.                 rom[242] = 24'h3006_c3; // disable clock of JPEG2x, JPEG
  287.                 rom[243] = 24'h4713_03; // JPEG mode 3
  288.                 rom[244] = 24'h4407_04; // Quantization scale
  289.                 rom[245] = 24'h460b_37;
  290.                 rom[246] = 24'h460c_20;
  291.                 rom[247] = 24'h4837_16; // MIPI global timing
  292.                 rom[248] = 24'h3824_04; // PCLK manual divider
  293.                 rom[249] = 24'h5001_83; // SDE on, CMX on, AWB on
  294.                 rom[250] = 24'h3503_00; // AEC/AGC on               
  295.                 rom[251] = 24'h4740_20; // VS 1
  296.         end
  297.         always @ (posedge clk)
  298.         begin
  299.                 q <= rom[addr];
  300.         end
  301. endmodule