diff options
Diffstat (limited to 'student_files_2015/student_files_2015/prj2/quartus_proj/DE0_CAMERA/V/I2C_CCD_Config.v')
-rw-r--r-- | student_files_2015/student_files_2015/prj2/quartus_proj/DE0_CAMERA/V/I2C_CCD_Config.v | 287 |
1 files changed, 287 insertions, 0 deletions
diff --git a/student_files_2015/student_files_2015/prj2/quartus_proj/DE0_CAMERA/V/I2C_CCD_Config.v b/student_files_2015/student_files_2015/prj2/quartus_proj/DE0_CAMERA/V/I2C_CCD_Config.v new file mode 100644 index 0000000..11d3a70 --- /dev/null +++ b/student_files_2015/student_files_2015/prj2/quartus_proj/DE0_CAMERA/V/I2C_CCD_Config.v @@ -0,0 +1,287 @@ +// -------------------------------------------------------------------- +// Copyright (c) 2007 by Terasic Technologies Inc. +// -------------------------------------------------------------------- +// +// Permission: +// +// Terasic grants permission to use and modify this code for use +// in synthesis for all Terasic Development Boards and Altera Development +// Kits made by Terasic. Other use of this code, including the selling +// ,duplication, or modification of any portion is strictly prohibited. +// +// Disclaimer: +// +// This VHDL/Verilog or C/C++ source code is intended as a design reference +// which illustrates how these types of functions can be implemented. +// It is the user's responsibility to verify their design for +// consistency and functionality through the use of formal +// verification methods. Terasic provides no warranty regarding the use +// or functionality of this code. +// +// -------------------------------------------------------------------- +// +// Terasic Technologies Inc +// 356 Fu-Shin E. Rd Sec. 1. JhuBei City, +// HsinChu County, Taiwan +// 302 +// +// web: http://www.terasic.com/ +// email: support@terasic.com +// +// -------------------------------------------------------------------- +// +// Major Functions: I2C_CCD_Config +// +// -------------------------------------------------------------------- +// +// Revision History : +// -------------------------------------------------------------------- +// Ver :| Author :| Mod. Date :| Changes Made: +// V1.0 :| Johnny FAN :| 07/07/09 :| Initial Revision +// V2.0 :| Rui Duarte :| 16/03/14 :| CCD config, spelling +// -------------------------------------------------------------------- + +module I2C_CCD_Config ( // Host Side + iCLK, + iRST_N, + iUART_CTRL, + iZOOM_MODE_SW, + iEXPOSURE_ADJ, + iEXPOSURE_DEC_p, + // I2C Side + I2C_SCLK, + I2C_SDAT + ); + +// Host Side +input iCLK; +input iRST_N; +input iUART_CTRL; +input iZOOM_MODE_SW; + +// I2C Side +output I2C_SCLK; +inout I2C_SDAT; + +// Internal Registers/Wires +reg [15:0] mI2C_CLK_DIV; +reg [31:0] mI2C_DATA; +reg mI2C_CTRL_CLK; +reg mI2C_GO; +wire mI2C_END; +wire mI2C_ACK; +reg [23:0] LUT_DATA; +reg [5:0] LUT_INDEX; +reg [3:0] mSetup_ST; + +////////////// CMOS sensor registers setting ////////////////////// + +input iEXPOSURE_ADJ; +input iEXPOSURE_DEC_p; + +parameter default_exposure = 16'h07c0; +parameter exposure_change_value = 16'd200; + + +// `define ENABLE_TEST_PATTERN 1 + + +reg [24:0] combo_cnt; +wire combo_pulse; + +reg [1:0] izoom_mode_sw_delay; + +reg [3:0] iexposure_adj_delay; +wire exposure_adj_set; +wire exposure_adj_reset; +reg [15:0] sensor_exposure; + +wire [23:0] sensor_start_row; +wire [23:0] sensor_start_column; +wire [23:0] sensor_row_size; +wire [23:0] sensor_column_size; +wire [23:0] sensor_row_mode; +wire [23:0] sensor_column_mode; + +assign sensor_start_row = iZOOM_MODE_SW ? 24'h010036 : 24'h010000; +assign sensor_start_column = iZOOM_MODE_SW ? 24'h020010 : 24'h020000; +assign sensor_row_size = iZOOM_MODE_SW ? 24'h0303BF : 24'h03077F; +assign sensor_column_size = iZOOM_MODE_SW ? 24'h0404FF : 24'h0409FF; +assign sensor_row_mode = iZOOM_MODE_SW ? 24'h220000 : 24'h220011; +assign sensor_column_mode = iZOOM_MODE_SW ? 24'h230000 : 24'h230011; + + +always@(posedge iCLK or negedge iRST_N) + begin + if (!iRST_N) + begin + iexposure_adj_delay <= 0; + end + else + begin + iexposure_adj_delay <= {iexposure_adj_delay[2:0],iEXPOSURE_ADJ}; + end + end + +assign exposure_adj_set = ({iexposure_adj_delay[0],iEXPOSURE_ADJ}==2'b10) ? 1 : 0 ; +assign exposure_adj_reset = ({iexposure_adj_delay[3:2]}==2'b10) ? 1 : 0 ; + +always@(posedge iCLK or negedge iRST_N) + begin + if (!iRST_N) + sensor_exposure <= default_exposure; + else if (exposure_adj_set|combo_pulse) + begin + if (iEXPOSURE_DEC_p) + begin + if ((sensor_exposure < exposure_change_value)|| + (sensor_exposure == 16'h0)) + sensor_exposure <= 0; + else + sensor_exposure <= sensor_exposure - exposure_change_value; + end + else + begin + if (((16'hffff -sensor_exposure) <exposure_change_value)|| + (sensor_exposure == 16'hffff)) + sensor_exposure <= 16'hffff; + else + sensor_exposure <= sensor_exposure + exposure_change_value; + end + end + end + + +always@(posedge iCLK or negedge iRST_N) + begin + if (!iRST_N) + combo_cnt <= 0; + else if (!iexposure_adj_delay[3]) + combo_cnt <= combo_cnt + 1; + else + combo_cnt <= 0; + end + +assign combo_pulse = (combo_cnt == 25'h1fffff) ? 1 : 0; + +wire i2c_reset; + +assign i2c_reset = iRST_N & ~exposure_adj_reset & ~combo_pulse ; + +///////////////////////////////////////////////////////////////////// + +// Clock Setting +parameter CLK_Freq = 50000000; // 50 MHz +parameter I2C_Freq = 20000; // 20 KHz +// LUT Data Number +parameter LUT_SIZE = 25; + +///////////////////// I2C Control Clock //////////////////////// +always@(posedge iCLK or negedge i2c_reset) +begin + if(!i2c_reset) + begin + mI2C_CTRL_CLK <= 0; + mI2C_CLK_DIV <= 0; + end + else + begin + if( mI2C_CLK_DIV < (CLK_Freq/I2C_Freq) ) + mI2C_CLK_DIV <= mI2C_CLK_DIV+1; + else + begin + mI2C_CLK_DIV <= 0; + mI2C_CTRL_CLK <= ~mI2C_CTRL_CLK; + end + end +end +//////////////////////////////////////////////////////////////////// +I2C_Controller u0 ( .CLOCK(mI2C_CTRL_CLK), // Controller Work Clock + .I2C_SCLK(I2C_SCLK), // I2C CLOCK + .I2C_SDAT(I2C_SDAT), // I2C DATA + .I2C_DATA(mI2C_DATA), // DATA:[SLAVE_ADDR,SUB_ADDR,DATA] + .GO(mI2C_GO), // GO transfor + .END(mI2C_END), // END transfor + .ACK(mI2C_ACK), // ACK + .RESET(i2c_reset) + ); +//////////////////////////////////////////////////////////////////// +////////////////////// Config Control //////////////////////////// +//always@(posedge mI2C_CTRL_CLK or negedge iRST_N) +always@(posedge mI2C_CTRL_CLK or negedge i2c_reset) +begin + if(!i2c_reset) + begin + LUT_INDEX <= 0; + mSetup_ST <= 0; + mI2C_GO <= 0; + + end + + else if(LUT_INDEX<LUT_SIZE) + begin + case(mSetup_ST) + 0: begin + mI2C_DATA <= {8'hBA,LUT_DATA}; + mI2C_GO <= 1; + mSetup_ST <= 1; + end + 1: begin + if(mI2C_END) + begin + if(!mI2C_ACK) + mSetup_ST <= 2; + else + mSetup_ST <= 0; + mI2C_GO <= 0; + end + end + 2: begin + LUT_INDEX <= LUT_INDEX+1; + mSetup_ST <= 0; + end + endcase + end +end +//////////////////////////////////////////////////////////////////// +///////////////////// Config Data LUT ////////////////////////// +always +begin + case(LUT_INDEX) + 0 : LUT_DATA <= 24'h000000; + 1 : LUT_DATA <= 24'h20c000; // Mirror Row and Columns + 2 : LUT_DATA <= {8'h09,sensor_exposure};// Exposure + 3 : LUT_DATA <= 24'h050000; // H_Blanking + 4 : LUT_DATA <= 24'h060019; // V_Blanking + 5 : LUT_DATA <= 24'h0A8000; // change latch + 6 : LUT_DATA <= 24'h2B000b; // Green 1 Gain + 7 : LUT_DATA <= 24'h2C000f; // Blue Gain + 8 : LUT_DATA <= 24'h2D000f; // Red Gain + 9 : LUT_DATA <= 24'h2E000b; // Green 2 Gain + 10 : LUT_DATA <= 24'h100051; // set up PLL power on + 11 : LUT_DATA <= 24'h111807; // PLL_m_Factor<<8+PLL_n_Divider + 12 : LUT_DATA <= 24'h120002; // PLL_p1_Divider + 13 : LUT_DATA <= 24'h100053; // set USE PLL + 14 : LUT_DATA <= 24'h980000; // disble calibration +`ifdef ENABLE_TEST_PATTERN + 15 : LUT_DATA <= 24'hA00001; // Test pattern control + 16 : LUT_DATA <= 24'hA10123; // Test green pattern value + 17 : LUT_DATA <= 24'hA20456; // Test red pattern value +`else + 15 : LUT_DATA <= 24'hA00000; // Test pattern control + 16 : LUT_DATA <= 24'hA10000; // Test green pattern value + 17 : LUT_DATA <= 24'hA20FFF; // Test red pattern value +`endif + 18 : LUT_DATA <= sensor_start_row ; // set start row + 19 : LUT_DATA <= sensor_start_column ; // set start column + + 20 : LUT_DATA <= sensor_row_size; // set row size + 21 : LUT_DATA <= sensor_column_size; // set column size + 22 : LUT_DATA <= sensor_row_mode; // set row mode in bin mode + 23 : LUT_DATA <= sensor_column_mode; // set column mode in bin mode + 24 : LUT_DATA <= 24'h4901A8; // row black target + default:LUT_DATA <= 24'h000000; + endcase +end + +endmodule
\ No newline at end of file |