目录
如图所示,FPGA中主要模块包含:时钟模块、OV7670初始化模块、DVP协议数据流模块、写FIFO模块、写FIFO控制模块、SDRAM控制模块、读FIFO模块、读FIFO控制模块、VGA控制模块。
其整体流程为:启动时先对摄像头进行初始化设置,初始化完成后,FPGA从摄像头获取一帧一帧的图像数据,根据数据手册将ov7670数据流转换成我们需要的RGB565数据流,随后存入写FIFO模块;(写控制模块)当写FIFO模块中存储的数据大于等于8时,发出SDRAM写请求,SDRAM写请求通过后,读取FIFO数据存储起来;(读FIFO模块)当读FIFO数据小于等于8时,读取SDRAM中的数据经过读FIFO缓存后送入VGA显示模块进行显示。同时写控制模块和读控制模块控制SDRAM读写地址的增加。
1、时钟模块
这里使用PLL的IP核,以50MHz时钟生成25MHz和100MHz时钟,其中摄像头初始化模块和VGA控制模块使用的是25MHz,SDRAM控制模块、写FIFO控制模块和读FIFO控制模块使用的是100MHz,写FIFO和读FIFO模块都是异步FIFO,使用25MHz和100MHz时钟。
OV7670/OV7171 图像传感器,体积小、工作电压低,提供单片VGA摄像头和影像处理器的所有功能。通过SCCB 总线控制,可以输出整帧、子采样、取窗口等方式的各种分辨率8位影响数据。该产品VGA图像最高达到30帧/秒。用户可以完全控制图像质量、数据格式和传输方式。所有图像处理功能过程包括伽玛曲线、白平衡、饱和度、色度等都可以通过SCCB接口编程。OmmiVision 图像传感器应用独有的传感器技术,通过减少或消除光学或电子缺陷如固定图案噪声、托尾、浮散等,提高图像质量,得到清晰的稳定的彩色图像。
主要引出的信号引脚如下:
3.3V--输入电源电压(推荐使用3.3V,5V也可,但不推荐)
GND
SCL(SIOC):SCCB时钟口(注意:部分单片机需要上拉控制,和I2C接口类似)
SDA(SIOD):SCCB数据口(注意:部分单片机需要上拉控制,和I2C接口类似)
VSYNC:场同步(帧同步)信号(输出信号)
HREF:行同步信号(输出信号,一般可以不使用,特殊情况使用)
PCLK:像素时钟
XCLK:系统时钟输入
D0-D7:数据位(输出信号)
RESET:初始化所有寄存器到默认值 0:RESET 模式 1:一般模式
PWDN:POWER DOWN模式选择 0:工作 1:POWER DOWN
其中,对OV7670初始化配置只使用SCL和SDA两个信号线。
所用模块如图:
对OV7670初始化使用的是SCCB协议,由数据线SDA和时钟线SCL组成,SCCB协议和I2C协议基本一样,是简化的I2C协议,前面博客中已经讲过I2C协议,需要可以去看看。
SCCB(SeriaI Camera ControlBus)是简化的I2C协议,SIO-l是串行时钟输入线,SIO-O是串行双向数据线,分别相当于I2C协议的SCL和SDA。SCCB的总线时序与I2C基本相同,它的响应信号ACK被称为一个传输单元的第9位,分为Don’t care和NA。Don’t care位由从机产生;NA位由主机产生,由于SCCB不支持多字节的读写,NA位必须为高电平。另外,SCCB没有重复起始的概念,因此在SCCB的读周期中,当主机发送完片内寄存器地址后,必须发送总线停止条件。不然在发送读命令时,从机将不能产生Don’t care响应信号。
这里采用的是100KHz的SCL。
OV7670摄像头共201个寄存器,需要配置的有一百六十几个,这个具体看数据手册吧,下边代码中会有配置寄存器的数据。
- `timescale 1 ns / 1 ns
- module system_ctrl
- (
- input clk, //50MHz
- input rst_n, //global reset
-
- output sys_rst_n, //system reset
- output clk_c0,
- output clk_c1,
- output clk_c2, //-75deg
- output clk_c3 //-75deg
- );
-
- //----------------------------------------------
- //rst_n synchronism, is controlled by the input clk
- reg rst_nr1,rst_nr2;
- always @(posedge clk or negedge rst_n)
- begin
- if(!rst_n)
- begin
- rst_nr1 <= 1'b0;
- rst_nr2 <= 1'b0;
- end
- else
- begin
- rst_nr1 <= 1'b1;
- rst_nr2 <= rst_nr1;
- end
- end
- //----------------------------------
- //component instantiation for system_delay
- wire delay_done;
- system_delay u_system_delay
- (
- .clk (clk),
- .rst_n (rst_nr2),
- .delay_done (delay_done)
- );
- wire pll_rst = ~rst_nr2 & ~delay_done; //active High
- //----------------------------------------------
- //Component instantiation
- wire locked;
- sdram_pll u_sdram_pll
- (
- .inclk0 (clk),
- .areset (pll_rst),
- .locked (locked),
-
- .c0 (clk_c0),
- .c1 (clk_c1),
- .c2 (clk_c2),
- .c3 (clk_c3)
- );
- //----------------------------------------------
- //sys_rst_n synchronism, is control by the highest output clk
-
- wire sysrst_nr0 = rst_nr2 & locked & delay_done;
- reg sysrst_nr1, sysrst_nr2;
- always @(posedge clk_c1 or negedge sysrst_nr0)
- begin
- if(!sysrst_nr0)
- begin
- sysrst_nr1 <= 1'b0;
- sysrst_nr2 <= 1'b0;
- end
- else
- begin
- sysrst_nr1 <= 1'b1;
- sysrst_nr2 <= sysrst_nr1;
- end
- end
- assign sys_rst_n = sysrst_nr2; //active Low
-
- endmodule
-
- //################################################//
- //################################################//
-
- module system_delay
- (
- input clk, //50MHz
- input rst_n,
- output delay_done
- );
-
- //------------------------------------------
- // Delay 100ms for steady state
- localparam DELAY_CNT = 23'd100_0000; //50ms
- reg [22:0] cnt;
- always@(posedge clk or negedge rst_n)
- begin
- if(!rst_n)
- cnt <= 0;
- else
- begin
- if(cnt < DELAY_CNT) //1ms
- cnt <= cnt + 1'b1;
- else
- cnt <= cnt;
- end
- end
-
- //------------------------------------------
- //sys_rst_n synchronism
- assign delay_done = (cnt == DELAY_CNT)? 1'b1 : 1'b0;
-
- endmodule
摄像头检测代码
- `timescale 1ns/1ns
- module CMOS_Capture
- (
- //Global Clock
- input iCLK, //25MHz
- input iRST_N,
-
- //I2C Initilize Done
- input Init_Done, //Init Done
-
- //Sensor Interface
- output CMOS_RST_N, //cmos work state(5ms delay for sccb config)
- output CMOS_PWDN, //cmos power on
- output CMOS_XCLK, //25MHz
- input CMOS_PCLK, //25MHz
- input [7:0] CMOS_iDATA, //CMOS Data
- input CMOS_VSYNC, //L: Vaild
- input CMOS_HREF, //H: Vaild
-
- //Ouput Sensor Data
- output reg CMOS_oCLK, //1/2 PCLK
- output reg [15:0] CMOS_oDATA, //16Bits RGB
- output reg CMOS_VALID, //Data Enable
- output reg [7:0] CMOS_FPS_DATA //cmos fps
- );
- assign CMOS_RST_N = 1'b1; //cmos work state(5ms delay for sccb config)
- assign CMOS_PWDN = 1'b0; //cmos power on
- assign CMOS_XCLK = iCLK; //25MHz XCLK
-
-
- //-----------------------------------------------------
- //同步输入//Sensor HS & VS Vaild Capture
- /**************************************************
- ________ ________
- VS |_________________________________|
- HS _______ _______
- _____________| |__...___| |____________
- **************************************************/
-
- /*
- //----------------------------------------------
- reg mCMOS_HREF; //行同步:高电平有效
- always@(posedge CMOS_PCLK or negedge iRST_N)
- begin
- if(!iRST_N)
- mCMOS_HREF <= 0;
- else
- mCMOS_HREF <= CMOS_HREF;
- end
- wire CMOS_HREF_over = ({mCMOS_HREF,CMOS_HREF} == 2'b10) ? 1'b1 : 1'b0; //HREF 下降沿结束
- */
- //----------------------------------------------
- reg mCMOS_VSYNC;
- always@(posedge CMOS_PCLK or negedge iRST_N)
- begin
- if(!iRST_N)
- mCMOS_VSYNC <= 1;
- else
- mCMOS_VSYNC <= CMOS_VSYNC; //场同步:低电平有效
- end
- wire CMOS_VSYNC_over = ({mCMOS_VSYNC,CMOS_VSYNC} == 2'b01) ? 1'b1 : 1'b0; //VSYNC上升沿结束
-
-
- /*
- //--------------------------------------------
- //Counter the HS & VS Pixel
- localparam H_DISP = 12'd640;
- localparam V_DISP = 12'd480;
- reg [11:0] X_Cont; //640
- reg [11:0] Y_Cont; //480
- always@(posedge CMOS_PCLK or negedge iRST_N)
- begin
- if(!iRST_N)
- X_Cont <= 0;
- else if(~CMOS_VSYNC & CMOS_HREF) //场信号有效
- X_Cont <= (byte_state == 1'b1) ? X_Cont + 1'b1 : X_Cont;
- else
- X_Cont <= 0;
- end
-
- always@(posedge CMOS_PCLK or negedge iRST_N)
- begin
- if(!iRST_N)
- Y_Cont <= 0;
- else if(CMOS_VSYNC == 1'b0)
- begin
- if(CMOS_HREF_over == 1'b1) //HREF下降沿 一行结束
- Y_Cont <= Y_Cont + 1'b1;
- end
- else
- Y_Cont <= 0;
- end
- */
- //-----------------------------------------------------
- //Change the sensor data from 8 bits to 16 bits.
- reg byte_state; //byte state count
- reg [7:0] Pre_CMOS_iDATA;
- always@(posedge CMOS_PCLK or negedge iRST_N)
- begin
- if(!iRST_N)
- begin
- byte_state <= 0;
- Pre_CMOS_iDATA <= 8'd0;
- CMOS_oDATA <= 16'd0;
- end
- else
- begin
- if(~CMOS_VSYNC & CMOS_HREF) //行场有效,{first_byte, second_byte}
- begin
- byte_state <= byte_state + 1'b1; //(RGB565 = {first_byte, second_byte})
- case(byte_state)
- 1'b0 : Pre_CMOS_iDATA[7:0] <= CMOS_iDATA;
- 1'b1 : CMOS_oDATA[15:0] <= {Pre_CMOS_iDATA[7:0], CMOS_iDATA[7:0]};
- endcase
- end
- else
- begin
- byte_state <= 0;
- Pre_CMOS_iDATA <= 8'd0;
- CMOS_oDATA <= CMOS_oDATA;
- end
- end
- end
- //--------------------------------------------
- //Wait for Sensor output Data valid, 10 Franme
- reg [3:0] Frame_Cont;
- reg Frame_valid;
- always@(posedge CMOS_PCLK or negedge iRST_N)
- begin
- if(!iRST_N)
- begin
- Frame_Cont <= 0;
- Frame_valid <= 0;
- end
- else if(Init_Done) //CMOS I2C初始化完毕
- begin
- if(CMOS_VSYNC_over == 1'b1) //VS上升沿,1帧写入完毕
- begin
- if(Frame_Cont < 12)
- begin
- Frame_Cont <= Frame_Cont + 1'b1;
- Frame_valid <= 1'b0;
- end
- else
- begin
- Frame_Cont <= Frame_Cont;
- Frame_valid <= 1'b1; //数据输出有效
- end
- end
- end
- end
- //-----------------------------------------------------
- //CMOS_DATA数据同步输出使能时钟
- always@(posedge CMOS_PCLK or negedge iRST_N)
- begin
- if(!iRST_N)
- CMOS_oCLK <= 0;
- else if(Frame_valid == 1'b1 && byte_state)//(X_Cont >= 12'd1 && X_Cont <= H_DISP))
- CMOS_oCLK <= ~CMOS_oCLK;
- else
- CMOS_oCLK <= 0;
- end
- //----------------------------------------------------
- //数据输出有效CMOS_VALID
- always@(posedge CMOS_PCLK or negedge iRST_N)
- begin
- if(!iRST_N)
- CMOS_VALID <= 0;
- else if(Frame_valid == 1'b1)
- CMOS_VALID <= ~CMOS_VSYNC;
- else
- CMOS_VALID <= 0;
- end
-
-
- /************************************************************
- Caculate Frame Rate per second
- *************************************************************/
- //-----------------------------------------------------
- // 2s 延时函数
- reg [25:0] delay_cnt; //25_000000 * 2
- always@(posedge iCLK or negedge iRST_N)
- begin
- if(!iRST_N)
- delay_cnt <= 0;
- else if(Frame_valid)
- begin
- if(delay_cnt < 26'd50_000000)
- delay_cnt <= delay_cnt + 1'b1;
- else
- delay_cnt <= 0;
- end
- else
- delay_cnt <= 0;
- end
- wire delay_2s = (delay_cnt == 26'd50_000000) ? 1'b1 : 1'b0;
- //-------------------------------------------
- //帧率采样计算
- reg fps_state;
- reg [7:0] fps_data;
- always@(posedge iCLK or negedge iRST_N)
- begin
- if(!iRST_N)
- begin
- fps_data <= 0;
- fps_state <= 0;
- CMOS_FPS_DATA <= 0;
- end
- else if(Frame_valid)
- begin
- case(fps_state)
- 0: begin
- CMOS_FPS_DATA <= CMOS_FPS_DATA;
- if(delay_2s == 0)
- begin
- fps_state <= 0;
- if(CMOS_VSYNC_over == 1'b1) //VS上升沿,1帧写入完毕
- fps_data <= fps_data + 1'b1;
- end
- else
- fps_state <= 1;
- end
- 1: begin
- fps_state <= 0;
- fps_data <= 0;
- CMOS_FPS_DATA <= fps_data >>1;
- end
- endcase
- end
- else
- begin
- fps_data <= 0;
- fps_state <= 0;
- CMOS_FPS_DATA <= 0;
- end
- end
- endmodule
摄像头开机定时要求
- //camera power on timing requirement
- module power_on_delay(clk_50M,reset_n,camera_rstn,camera_pwnd,initial_en);
- input clk_50M;
- input reset_n;
- output camera_rstn;
- output camera_pwnd;
- output initial_en;
- reg [18:0]cnt1;
- reg [15:0]cnt2;
- reg [19:0]cnt3;
- reg initial_en;
- reg camera_rstn_reg;
- reg camera_pwnd_reg;
-
- assign camera_rstn=camera_rstn_reg;
- assign camera_pwnd=camera_pwnd_reg;
-
- //5ms, delay from sensor power up stable to Pwdn pull down
- always@(posedge clk_50M)
- begin
- if(reset_n==1'b0) begin
- cnt1<=0;
- camera_pwnd_reg<=1'b1;
- end
- else if(cnt1<18'h40000) begin
- cnt1<=cnt1+1'b1;
- camera_pwnd_reg<=1'b1;
- end
- else
- camera_pwnd_reg<=1'b0;
- end
-
- //1.3ms, delay from pwdn low to resetb pull up
- always@(posedge clk_50M)
- begin
- if(camera_pwnd_reg==1) begin
- cnt2<=0;
- camera_rstn_reg<=1'b0;
- end
- else if(cnt2<16'hffff) begin
- cnt2<=cnt2+1'b1;
- camera_rstn_reg<=1'b0;
- end
- else
- camera_rstn_reg<=1'b1;
- end
- //21ms, delay from resetb pul high to SCCB initialization
- always@(posedge clk_50M)
- begin
- if(camera_rstn_reg==0) begin
- cnt3<=0;
- initial_en<=1'b0;
- end
- else if(cnt3<20'hfffff) begin
- cnt3<=cnt3+1'b1;
- initial_en<=1'b0;
- end
- else
- initial_en<=1'b1;
- end
-
- endmodule
sdram_vga_top
- module sdram_vga_top
- (
- //global clock
- input clk_vga, //vga clock
- input clk_ref, //sdram ctrl clock
- input clk_refout, //sdram clock output
- input rst_n, //global reset
-
- //sdram control
- output sdram_clk, //sdram clock
- output sdram_cke, //sdram clock enable
- output sdram_cs_n, //sdram chip select
- output sdram_we_n, //sdram write enable
- output sdram_cas_n, //sdram column address strobe
- output sdram_ras_n, //sdram row address strobe
- output sdram_udqm, //sdram data enable (H:8)
- output sdram_ldqm, //sdram data enable (L:8)
- output [1:0] sdram_ba, //sdram bank address
- output [11:0] sdram_addr, //sdram address
- inout [15:0] sdram_data, //sdram data
-
- //lcd port
- output lcd_dclk, //lcd pixel clock
- output lcd_hs, //lcd horizontal sync
- output lcd_vs, //lcd vertical sync
- output lcd_sync, //lcd sync
- output lcd_blank, //lcd blank(L:blank)
- output [4:0] lcd_red, //lcd red data
- output [5:0] lcd_green, //lcd green data
- output [4:0] lcd_blue, //lcd blue data
-
- //user interface
- input clk_write, //fifo write clock
- input sys_we, //fifo write enable
- input [15:0] sys_data_in, //fifo data input
- output sdram_init_done,//sdram init done
- input frame_valid //frame valid
- );
-
-
- //----------------------------------------------
- wire sys_rd; //fifo read enable
- wire [15:0] sys_data_out; //fifo data output
- wire lcd_framesync; //lcd frame sync
- wire frame_write_done; //sdram write frame done
- wire frame_read_done; //sdram read frame done
- wire [1:0] wr_bank; //sdram write bank
- wire [1:0] rd_bank; //sdram read bank
- wire wr_load; //sdram write address reset
- wire rd_load; //sdram read address reset
- sdram_2fifo_top u_sdram_2fifo_top
- (
- //global clock
- .clk_ref (clk_ref), //sdram reference clock
- .clk_refout (clk_refout), //sdram clk input
- .clk_write (clk_write), //fifo data write clock
- .clk_read (clk_vga), //fifo data read clock
- .rst_n (rst_n), //global reset
-
- //sdram interface
- .sdram_clk (sdram_clk), //sdram clock
- .sdram_cke (sdram_cke), //sdram clock enable
- .sdram_cs_n (sdram_cs_n), //sdram chip select
- .sdram_we_n (sdram_we_n), //sdram write enable
- .sdram_ras_n (sdram_ras_n), //sdram column address strobe
- .sdram_cas_n (sdram_cas_n), //sdram row address strobe
- .sdram_ba (sdram_ba), //sdram data enable (H:8)
- .sdram_addr (sdram_addr), //sdram data enable (L:8)
- .sdram_data (sdram_data), //sdram bank address
- .sdram_udqm (sdram_udqm), //sdram address
- .sdram_ldqm (sdram_ldqm), //sdram data
-
- //user interface
- //burst and addr
- .wr_length (9'd256), //sdram write burst length
- .rd_length (9'd256), //sdram read burst length
- .wr_addr ({wr_bank,20'd0}), //sdram start write address
- .wr_max_addr ({wr_bank,20'd307200}), //sdram max write address
- .wr_load (wr_load), //sdram write address reset
- .rd_addr ({rd_bank,20'd0}), //sdram start read address
- .rd_max_addr ({rd_bank,20'd307200}), //sdram max read address
- .rd_load (rd_load), //sdram read address reset
-
- //dcfifo interface
- .sdram_init_done (sdram_init_done), //sdram init done
- .frame_write_done (frame_write_done), //sdram write one frame
- .frame_read_done (frame_read_done), //sdram read one frame
- .sys_we (sys_we), //fifo write enable
- .sys_data_in (sys_data_in), //fifo data input
- .sys_rd (sys_rd), //fifo read enable
- .sys_data_out (sys_data_out), //fifo data output
- .data_valid (lcd_framesync) //system data output enable
- );
-
- //-----------------------------
- sdbank_switch u_sdbank_switch
- (
- .clk (clk_write),
- .rst_n (rst_n),
-
- .bank_valid (frame_valid),
- .frame_write_done (frame_write_done),
- .frame_read_done (frame_read_done),
-
- .wr_bank (wr_bank),
- .rd_bank (rd_bank),
- .wr_load (wr_load),
- .rd_load (rd_load)
- );
-
- //---------------------------------
- //display on lcd
- wire [10:0] lcd_xpos;
- wire [10:0] lcd_ypos;
- wire [15:0] lcd_data;
- assign lcd_data = sys_data_out;
- /*
- lcd_display U_lcd_display
- (
- .clk (clk_vga),
- .rst_n (rst_n),
-
- .alpha_data (9'hC8),
- .lcd_xpos (lcd_xpos),
- .lcd_ypos (lcd_ypos),
- .lcd_data_in (sys_data_out),
- .lcd_data (lcd_data)
- );
- */
- //-----------------------------
- //lcd driver top module
- lcd_top u_lcd_top
- (
- //global clock
- .clk (clk_vga),
- .rst_n (rst_n),
- //lcd interface
- .lcd_blank (lcd_blank),
- .lcd_sync (lcd_sync),
- .lcd_dclk (lcd_dclk),
- .lcd_hs (lcd_hs),
- .lcd_vs (lcd_vs),
- .lcd_en (),
- .lcd_rgb ({lcd_red, lcd_green ,lcd_blue}),
- //user interface
- .lcd_request (sys_rd),
- .lcd_framesync (lcd_framesync),
- .lcd_data (lcd_data),
- .lcd_xpos (lcd_xpos),
- .lcd_ypos (lcd_ypos)
- );
- endmodule
DVP(Digital Video Port) 是传统的sensor输出接口,采用并行输出方式,d数据位宽有8bit、10bit、12bit、16bit,是CMOS电平信号(重点是非差分信号),PCLK最大速率为96MHz,接口如下图:
DVP协议是摄像头中常用的协议,除了DVP协议摄像头中还有其他常用的协议如:MIPI、LVDS等协议,以实现标准图像数据流转换,其中摄像头8位数据转16位代码如下
- module cmos_8_16bit(
- input rst,
- input pclk,
- input [7:0] pdata_i,
- input de_i,
- output reg[15:0] pdata_o,//转换成16位RGB565图像数据
- output reg hblank,
- output reg de_o
- );
- reg[7:0] pdata_i_d0;
- reg[11:0] x_cnt;
- always@(posedge pclk)
- begin
- pdata_i_d0 <= pdata_i;
- end
-
- always@(posedge pclk or posedge rst)
- begin
- if(rst)
- x_cnt <= 12'd0;
- else if(de_i)
- x_cnt <= x_cnt + 12'd1;
- else
- x_cnt <= 12'd0;
- end
- always@(posedge pclk or posedge rst)
- begin
- if(rst)
- de_o <= 1'b0;
- else if(de_i && x_cnt[0])
- de_o <= 1'b1;
- else
- de_o <= 1'b0;
- end
-
- always@(posedge pclk or posedge rst)
- begin
- if(rst)
- hblank <= 1'b0;
- else
- hblank <= de_i;
- end
- always@(posedge pclk or posedge rst)
- begin
- if(rst)
- pdata_o <= 16'd0;
- else if(de_i && x_cnt[0])
- pdata_o <= {pdata_i_d0,pdata_i};
- else
- pdata_o <= 16'd0;
- end
- endmodule
- module cmos_write_req_gen(
- input rst,
- input pclk,
- input cmos_vsync,
- output reg write_req,
- output reg[1:0] write_addr_index,
- output reg[1:0] read_addr_index,
- input write_req_ack
- );
- reg cmos_vsync_d0;
- reg cmos_vsync_d1;
- always@(posedge pclk or posedge rst)
- begin
- if(rst == 1'b1)
- begin
- cmos_vsync_d0 <= 1'b0;
- cmos_vsync_d1 <= 1'b0;
- end
- else
- begin
- cmos_vsync_d0 <= cmos_vsync;
- cmos_vsync_d1 <= cmos_vsync_d0;
- end
- end
- always@(posedge pclk or posedge rst)
- begin
- if(rst == 1'b1)
- write_req <= 1'b0;
- else if(cmos_vsync_d0 == 1'b1 && cmos_vsync_d1 == 1'b0)
- write_req <= 1'b1;
- else if(write_req_ack == 1'b1)
- write_req <= 1'b0;
- end
- always@(posedge pclk or posedge rst)
- begin
- if(rst == 1'b1)
- write_addr_index <= 2'b0;
- else if(cmos_vsync_d0 == 1'b1 && cmos_vsync_d1 == 1'b0)
- write_addr_index <= write_addr_index + 2'd1;
- end
- always@(posedge pclk or posedge rst)
- begin
- if(rst == 1'b1)
- read_addr_index <= 2'b0;
- else if(cmos_vsync_d0 == 1'b1 && cmos_vsync_d1 == 1'b0)
- read_addr_index <= write_addr_index;
- end
- endmodule
- `timescale 1ns / 1ps
- module sdram_ov7670_vga
- (
- //global clock 50MHz
- //input clk_27, //27MHz
- input CLOCK,
- //input rst_n, //global reset
-
- //sdram control
- output S_CLK, //sdram clock
- output S_CKE, //sdram clock enable
- output S_NCS, //sdram chip select
- output S_NWE, //sdram write enable
- output S_NCAS, //sdram column address strobe
- output S_NRAS, //sdram row address strobe
- output[1:0] S_DQM, //sdram data enable
- output [1:0] S_BA, //sdram bank address
- output [12:0] S_A, //sdram address
- inout [15:0] S_DB, //sdram data
-
- //VGA port
- output VGA_HSYNC, //horizontal sync
- output VGA_VSYNC, //vertical sync
- output [15:0] VGAD, //VGA data
-
- //cmos interface
- output CMOS_SCLK, //cmos i2c clock
- inout CMOS_SDAT, //cmos i2c data
- input CMOS_VSYNC, //cmos vsync
- input CMOS_HREF, //cmos hsync refrence
- input CMOS_PCLK, //cmos pxiel clock
- output CMOS_XCLK, //cmos externl clock
- input [7:0] CMOS_DB, //cmos data
- // output cmos_rst_n, //cmos reset
- // output cmos_pwdn, //cmos pwer down
-
- output [3:0] LED //led data input
- );
- assign rst_n = 1'b1;
- //---------------------------------------------
- wire clk_camera;
- wire clk_vga; //vga clock
- wire clk_ref; //sdram ctrl clock
- wire clk_refout; //sdram clock output
- wire sys_rst_n; //global reset
- system_ctrl u_system_ctrl
- (
- .clk (CLOCK), //global clock 50MHZ
- .rst_n (rst_n), //external reset
-
- .sys_rst_n (sys_rst_n), //global reset
- .clk_c0 (clk_camera), //13MHz
- .clk_c1 (clk_vga), //25MHz
- .clk_c2 (clk_ref), //100MHz
- .clk_c3 (clk_refout) //100MHz
- );
-
-
- //-----------------------------
- wire [7:0] I2C_RDATA; //i2c register data
- wire [7:0] LUT_INDEX; //lut index
- wire Config_Done; //I2C config done
- I2C_AV_Config u_I2C_AV_Config
- (
- //Global clock
- .iCLK (clk_vga), //25MHz
- .iRST_N (sys_rst_n), //Global Reset
-
- //I2C Side
- .I2C_SCLK (CMOS_SCLK), //I2C CLOCK
- .I2C_SDAT (CMOS_SDAT), //I2C DATA
-
- //CMOS Signal
- .Config_Done (Config_Done), //I2C Config done
- .I2C_RDATA (I2C_RDATA), //CMOS ID
- .LUT_INDEX ()//(LUT_INDEX) //ID Index
- );
- assign led_data = I2C_RDATA; //diaplay I2C_RDATA
- //-----------------------------------------------
- //Seg7_lut u5 ( LUT_INDEX[7:4], oSEG5 );
- //Seg7_lut u4 ( LUT_INDEX[3:0], oSEG4 );
- //Seg7_lut u1 ( I2C_RDATA[7:4], oSEG1 );
- //Seg7_lut u0 ( I2C_RDATA[3:0], oSEG0 );
-
- //-----------------------------------------------
- wire frame_valid; //data valid, or address restart
- wire [7:0] cmos_fps_data; //cmos frame rate
- CMOS_Capture u_CMOS_Capture
- (
- //Global Clock
- .iCLK (clk_camera), //24MHz
- .iRST_N (sys_rst_n), //global reset
-
- //I2C Initilize Done
- .Init_Done (Config_Done & sdram_init_done), //Init Done
-
- //Sensor Interface
- .CMOS_RST_N (),//(cmos_rst_n), //cmos work state
- .CMOS_PWDN (),//(cmos_pwdn), //cmos power on
- .CMOS_XCLK (CMOS_XCLK), //cmos
- .CMOS_PCLK (CMOS_PCLK), //25MHz
- .CMOS_iDATA (CMOS_DB), //CMOS Data
- .CMOS_VSYNC (CMOS_VSYNC), //L: Vaild
- .CMOS_HREF (CMOS_HREF), //H: Vaild
-
- //Ouput Sensor Data
- .CMOS_oCLK (sys_we), //Data PCLK
- .CMOS_oDATA (sys_data_in), //16Bits RGB
- .CMOS_VALID (frame_valid), //Data Enable
- .CMOS_FPS_DATA ()//(cmos_fps_data) //cmos frame rate
- );
-
- //Seg7_lut u7 ( cmos_fps_data[7:4], oSEG7 ); //fsp rate
- //Seg7_lut u6 ( cmos_fps_data[3:0], oSEG6 ); //fps rate
-
-
- //wire [8:0] alpha_data; //alpha adjust data
- //assign led_data = alpha_data; //diaplay alpha data
- //alpha_control u_alpha_control
- //(
- // .clk (clk_vga), //vga clock
- // .rst_n (sys_rst_n), //global reset
- //
- // .key_data (key_data), //key data
- // .alpha_data (alpha_data) //aplha adjust data
- //);
-
- //-------------------------------------
- //sdram vga ctrl system
- wire sys_we; //system data write enable
- wire [15:0] sys_data_in; //system data input
- wire sdram_init_done; //sdram init done
- sdram_vga_top u_sdram_vga_top
- (
- //global clock
- .clk_vga (clk_vga), //vga clock
- .clk_ref (clk_ref), //sdram ctrl clock
- .clk_refout (clk_refout), //sdram clock output
- .rst_n (sys_rst_n), //global reset
-
- //sdram control
- .sdram_clk (S_CLK), //sdram clock
- .sdram_cke (S_CKE), //sdram clock enable
- .sdram_cs_n (S_NCS), //sdram chip select
- .sdram_we_n (S_NWE), //sdram write enable
- .sdram_cas_n (S_NCAS), //sdram column address strobe
- .sdram_ras_n (S_NRAS), //sdram row address strobe
- .sdram_udqm (S_DQM[1]), //sdram data enable (H:8)
- .sdram_ldqm (S_DQM[0]), //sdram data enable (L:8)
- .sdram_ba (S_BA), //sdram bank address
- .sdram_addr (S_A), //sdram address
- .sdram_data (S_DB), //sdram data
-
- //lcd port
- .lcd_dclk (), //lcd pixel clock
- .lcd_hs (VGA_HSYNC), //lcd horizontal sync
- .lcd_vs (VGA_VSYNC), //lcd vertical sync
- .lcd_sync (),//(lcd_sync), //lcd sync
- .lcd_blank (), //lcd blank(L:blank)
- .lcd_red (VGAD[15:11]), //lcd red data
- .lcd_green (VGAD[10:5]), //lcd green data
- .lcd_blue (VGAD[4:0]), //lcd blue data
-
- //user interface
- .clk_write (CMOS_PCLK), //fifo write clock
- .sys_we (sys_we), //fifo write enable
- .sys_data_in (sys_data_in), //fifo data input
- .sdram_init_done (sdram_init_done), //sdram init done
- .frame_valid (frame_valid) //frame valid
- );
-
-
- endmodule