基于FPGA的OV7670摄像头实时检测

article/2025/11/7 6:32:16

目录

前言:整体系统框图

一、OV7670摄像头简介

二、OV7670 SCCB协议简介

三、OV7670初始化寄存器配置

四、OV7670初始化代码编写

 五、什么是DVP?

六、摄像头写数据请求

七、顶层文件编写

八、效果


前言:整体系统框图

 如图所示,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摄像头简介

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协议简介

      对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初始化寄存器配置

     OV7670摄像头共201个寄存器,需要配置的有一百六十几个,这个具体看数据手册吧,下边代码中会有配置寄存器的数据。

四、OV7670初始化代码编写

`timescale 1 ns / 1 ns
module system_ctrl
(input 		clk,		//50MHzinput 		rst_n,		//global resetoutput 		sys_rst_n,	//system resetoutput 		clk_c0,		output 		clk_c1,output		clk_c2,	//-75degoutput		clk_c3	//-75deg
);//----------------------------------------------
//rst_n synchronism, is controlled by the input clk
reg     rst_nr1,rst_nr2;
always @(posedge clk or negedge rst_n)
beginif(!rst_n)beginrst_nr1 <= 1'b0;rst_nr2 <= 1'b0;endelsebeginrst_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 clkwire	sysrst_nr0 = rst_nr2 & locked & delay_done;  
reg 	sysrst_nr1, sysrst_nr2; 
always @(posedge clk_c1 or negedge sysrst_nr0)
beginif(!sysrst_nr0) beginsysrst_nr1 <= 1'b0;sysrst_nr2 <= 1'b0;end        else beginsysrst_nr1 <= 1'b1;sysrst_nr2 <= sysrst_nr1;end
end
assign sys_rst_n = sysrst_nr2;	//active Lowendmodule//################################################//
//################################################//module system_delay
(input	clk,		//50MHzinput	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)
beginif(!rst_n)cnt <= 0;elsebeginif(cnt < DELAY_CNT) //1mscnt <= cnt + 1'b1;elsecnt <= 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 Clockinput				iCLK,			//25MHzinput				iRST_N,//I2C Initilize Doneinput				Init_Done,		//Init Done//Sensor Interfaceoutput				CMOS_RST_N,		//cmos work state(5ms delay for sccb config)output				CMOS_PWDN,      //cmos power on	output				CMOS_XCLK,		//25MHzinput				CMOS_PCLK,		//25MHzinput	[7:0]		CMOS_iDATA,		//CMOS Datainput				CMOS_VSYNC,		//L: Vaildinput				CMOS_HREF,		//H: Vaild//Ouput Sensor Dataoutput	reg			CMOS_oCLK,		//1/2 PCLKoutput	reg	[15:0]	CMOS_oDATA,		//16Bits RGB		output	reg			CMOS_VALID,		//Data Enableoutput	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)
beginif(!iRST_N)mCMOS_HREF <= 0;elsemCMOS_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)
beginif(!iRST_N)mCMOS_VSYNC <= 1;elsemCMOS_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)
beginif(!iRST_N)X_Cont <= 0;else if(~CMOS_VSYNC & CMOS_HREF)			//场信号有效X_Cont <= (byte_state == 1'b1) ?  X_Cont + 1'b1 : X_Cont;elseX_Cont <= 0;
endalways@(posedge CMOS_PCLK or negedge iRST_N)
beginif(!iRST_N)Y_Cont <= 0;else if(CMOS_VSYNC == 1'b0)beginif(CMOS_HREF_over == 1'b1)		//HREF下降沿 一行结束Y_Cont <= Y_Cont + 1'b1;endelseY_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)
beginif(!iRST_N)beginbyte_state <= 0;Pre_CMOS_iDATA <= 8'd0;CMOS_oDATA <= 16'd0;endelsebeginif(~CMOS_VSYNC & CMOS_HREF)			//行场有效,{first_byte, second_byte} beginbyte_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]};endcaseendelsebeginbyte_state <= 0;Pre_CMOS_iDATA <= 8'd0;CMOS_oDATA <= CMOS_oDATA;endend
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)
beginif(!iRST_N)beginFrame_Cont <= 0;Frame_valid <= 0;endelse if(Init_Done)					//CMOS I2C初始化完毕beginif(CMOS_VSYNC_over == 1'b1)		//VS上升沿,1帧写入完毕beginif(Frame_Cont < 12)beginFrame_Cont	<=	Frame_Cont + 1'b1;Frame_valid <= 1'b0;endelsebeginFrame_Cont	<=	Frame_Cont;Frame_valid <= 1'b1;		//数据输出有效endendend
end//-----------------------------------------------------
//CMOS_DATA数据同步输出使能时钟
always@(posedge CMOS_PCLK or negedge iRST_N)
beginif(!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;elseCMOS_oCLK <= 0;
end//----------------------------------------------------
//数据输出有效CMOS_VALID
always@(posedge CMOS_PCLK or negedge iRST_N)
beginif(!iRST_N)CMOS_VALID <= 0;else if(Frame_valid == 1'b1)CMOS_VALID <= ~CMOS_VSYNC;elseCMOS_VALID <= 0;
end/************************************************************Caculate Frame Rate per second
*************************************************************/
//-----------------------------------------------------
//	2s 延时函数
reg	[25:0]	delay_cnt;	//25_000000 * 2
always@(posedge iCLK or negedge iRST_N)
beginif(!iRST_N)delay_cnt <= 0;else if(Frame_valid)beginif(delay_cnt < 26'd50_000000)delay_cnt <= delay_cnt + 1'b1;elsedelay_cnt <= 0;endelsedelay_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)
beginif(!iRST_N)beginfps_data <= 0;fps_state <= 0;CMOS_FPS_DATA <= 0;endelse if(Frame_valid)begincase(fps_state)0:	beginCMOS_FPS_DATA <= CMOS_FPS_DATA;if(delay_2s == 0)beginfps_state <= 0;if(CMOS_VSYNC_over == 1'b1)		//VS上升沿,1帧写入完毕fps_data <= fps_data + 1'b1;endelsefps_state <= 1;end1:	beginfps_state <= 0;fps_data <= 0;CMOS_FPS_DATA <= fps_data >>1;endendcaseendelsebeginfps_data <= 0;fps_state <= 0;CMOS_FPS_DATA <= 0;end
endendmodule

摄像头开机定时要求

//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)
beginif(reset_n==1'b0) begincnt1<=0;camera_pwnd_reg<=1'b1;  endelse if(cnt1<18'h40000) begincnt1<=cnt1+1'b1;camera_pwnd_reg<=1'b1;endelsecamera_pwnd_reg<=1'b0;         
end//1.3ms, delay from pwdn low to resetb pull up
always@(posedge clk_50M)
beginif(camera_pwnd_reg==1)  begincnt2<=0;camera_rstn_reg<=1'b0;  endelse if(cnt2<16'hffff) begincnt2<=cnt2+1'b1;camera_rstn_reg<=1'b0;endelsecamera_rstn_reg<=1'b1;         
end//21ms, delay from resetb pul high to SCCB initialization
always@(posedge clk_50M)
beginif(camera_rstn_reg==0) begincnt3<=0;initial_en<=1'b0;endelse if(cnt3<20'hfffff) begincnt3<=cnt3+1'b1;initial_en<=1'b0;endelseinitial_en<=1'b1;    
endendmodule

sdram_vga_top 

module sdram_vga_top
(//global clockinput			clk_vga,		//vga clockinput			clk_ref,		//sdram ctrl clockinput			clk_refout,		//sdram clock outputinput			rst_n,			//global reset//sdram controloutput			sdram_clk,		//sdram clockoutput			sdram_cke,		//sdram clock enableoutput			sdram_cs_n,		//sdram chip selectoutput			sdram_we_n,		//sdram write enableoutput			sdram_cas_n,	//sdram column address strobeoutput			sdram_ras_n,	//sdram row address strobeoutput			sdram_udqm,		//sdram data enable (H:8)output			sdram_ldqm,		//sdram data enable (L:8)output	[1:0]	sdram_ba,		//sdram bank addressoutput	[11:0]	sdram_addr,		//sdram addressinout	[15:0]	sdram_data,		//sdram data//lcd portoutput			lcd_dclk,		//lcd pixel clock			output			lcd_hs,			//lcd horizontal sync output			lcd_vs,			//lcd vertical syncoutput			lcd_sync,		//lcd syncoutput			lcd_blank,		//lcd blank(L:blank)output	[4:0]	lcd_red,		//lcd red dataoutput	[5:0]	lcd_green,		//lcd green dataoutput	[4:0]	lcd_blue,		//lcd blue data//user interfaceinput			clk_write,		//fifo write clockinput			sys_we,			//fifo write enableinput	[15:0]	sys_data_in,	//fifo data inputoutput			sdram_init_done,//sdram init doneinput			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?

       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)
beginpdata_i_d0 <= pdata_i;
endalways@(posedge pclk or posedge rst)
beginif(rst)x_cnt <= 12'd0;else if(de_i)x_cnt <= x_cnt + 12'd1;elsex_cnt <= 12'd0;
endalways@(posedge pclk or posedge rst)
beginif(rst)de_o <= 1'b0;else if(de_i && x_cnt[0])de_o <= 1'b1;elsede_o <= 1'b0;
endalways@(posedge pclk or posedge rst)
beginif(rst)hblank <= 1'b0;elsehblank <= de_i;
endalways@(posedge pclk or posedge rst)
beginif(rst)pdata_o <= 16'd0;else if(de_i && x_cnt[0])pdata_o <= {pdata_i_d0,pdata_i};elsepdata_o <= 16'd0;
endendmodule 

六、摄像头写数据请求

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)
beginif(rst == 1'b1)begincmos_vsync_d0 <= 1'b0;cmos_vsync_d1 <= 1'b0;endelsebegincmos_vsync_d0 <= cmos_vsync;cmos_vsync_d1 <= cmos_vsync_d0;end
end
always@(posedge pclk or posedge rst)
beginif(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)
beginif(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;
endalways@(posedge pclk or posedge rst)
beginif(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,			//27MHzinput			CLOCK,	//input			rst_n,			//global reset//sdram controloutput			S_CLK,		//sdram clockoutput			S_CKE,		//sdram clock enableoutput			S_NCS,		//sdram chip selectoutput			S_NWE,		//sdram write enableoutput			S_NCAS,	//sdram column address strobeoutput			S_NRAS,	//sdram row address strobeoutput[1:0] 	S_DQM,		//sdram data enable output	[1:0]	S_BA,		//sdram bank addressoutput	[12:0]	S_A,		//sdram addressinout	[15:0]	S_DB,		//sdram data//VGA port			output			VGA_HSYNC,			//horizontal sync output			VGA_VSYNC,			//vertical syncoutput	[15:0]	VGAD,		//VGA data//cmos interfaceoutput			CMOS_SCLK,		//cmos i2c clockinout			CMOS_SDAT,		//cmos i2c datainput			CMOS_VSYNC,		//cmos vsyncinput			CMOS_HREF,		//cmos hsync refrenceinput			CMOS_PCLK,		//cmos pxiel clockoutput			CMOS_XCLK,		//cmos externl clockinput	[7:0]	CMOS_DB,		//cmos data
//	output			cmos_rst_n,		//cmos reset
//	output			cmos_pwdn,		//cmos pwer downoutput	[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

八、效果


http://chatgpt.dhexx.cn/article/9a98jobJ.shtml

相关文章

摄像头质量检测

文章目录 项目场景&#xff1a;一、色偏&#xff1a;二、清晰度&#xff1a;三、两张图片的特征点对比&#xff1a;四、亮度&#xff1a;总结&#xff1a; 项目场景&#xff1a; 我们项目中使用的摄像头&#xff0c;在部署之后&#xff0c;有可能会遇到被人为遮挡、破坏&#x…

谷歌再失华裔高管,AI 中国中心总裁李佳离职;树莓派新品发布

(给技术最前线加星标&#xff0c;每天看技术热点) 转自&#xff1a;开源中国、solidot、cnBeta、腾讯科技、快科技等 【技术资讯】 0、李飞飞之后谷歌再失华裔高管&#xff0c;谷歌 AI 中国中心总裁李佳离职创业 李飞飞离职50天后&#xff0c;另一位知名的谷歌AI华裔高管&#…

Visio2019 安装教程

Visio2019 32/64位可以帮助小伙伴们通过直观方式来轻松绘制出各种流程图&#xff0c;包括流程图、网络图、工程设计、组织结构图等&#xff0c;还可与他人协作实现无缝操作&#xff0c;友好的操作界面&#xff0c;专业化的设计工具&#xff0c;是您进行流程图设计的首选 Visio …

【安装教程】 【Visio2019】(附带安装包下载)

&#xff08;注意&#xff01;&#xff01;&#xff01; 安装完成之后&#xff0c;会覆盖原版的office&#xff01;&#xff01;&#xff01;&#xff09; https://pan.baidu.com/s/1uOcHz-fTEMsQhwU_yP6j71Q 一、Visio2019安装步骤 1.解压【Visio2019.rar】压缩包。&#xff…

Visio 2003软件安装教程

安装步骤&#xff1a; 1.解压安装包 2.打开解压后的文件夹&#xff0c;如图示&#xff1a; 3.密钥输入内容&#xff1a;GWH28-DGCMP-P6RC4-6J4MT-3HFDY &#xff0c;执行下一步 4.填写用户名和缩写&#xff0c;随便填写&#xff0c;下一步 5.如图&#xff1a;执行下一步 6.选择…

Visio科学图形包下载以及安装详细教程

Visio科学图形包&#xff0c;2013版本及以上可用&#xff0c;其中含有立体几何、解析几何、各种统计图表、三角函数、实验装置等。安装主要包含解压与导入模板两个步骤。以下安装教程不需要cmd中操作&#xff0c;简单方便&#xff0c;直接下载解压后的文件&#xff0c;导入即可…

Microsoft visio2010下载安装步骤图文教程

目录 概要 配置安装 总结 概要 应小伙伴们的要求&#xff0c;特畅谈Visio 2010iTunes地址&#xff0c;及Anantnag的装设教程如下★Microsoft Office Visio★ Office Visio 是office软件全系列中的负责绘制流程图和示意图的软件&#xff0c;是几款适于IT和商务人员就非…

Visio 安装与操作小结

&#x1f935; Author &#xff1a;Horizon Max ✨ 编程技巧篇&#xff1a;各种操作小结 &#x1f387; 机器视觉篇&#xff1a;会变魔术 OpenCV &#x1f4a5; 深度学习篇&#xff1a;简单入门 PyTorch &#x1f3c6; 神经网络篇&#xff1a;经典网络模型 &#x1f4bb; …

Visio2019安装

1.安装前查看系统多少位&#xff0c;根据系统下载相应的软件&#xff1b; 2.右键&#xff0c;管理员身份运行&#xff1b; 3.接下来等待下载完成&#xff1b; 4.完成后打开visio&#xff0c;点击“账户”查看是否激活&#xff1b; 5.激活成功安装结束。 6.若未激活可输入已有…

Visio 2019 专业版安装教程

参考 Visio 2019 Pro 激活方法 - 爱码网 (likecs.com) 在记事本中输入下面内容&#xff0c;保存为“.bat”文件&#xff0c;名字随意 echo off title Activate Microsoft Visio 2019&cls&echo &echo #Visio: Activating Microsoft software products for FREE wi…

visio2007安装教程_电脑安装Visio 2007的详细方法

电脑安装Visio 2007的详细方法 Microsoft Office Visio 2007是Office2007中的一部分&#xff0c;不过很多时候我们在windows系统电脑安装office的时候这一部分是没有默认安装的。很多人喜欢用Visio来画流程图&#xff0c;因为它便利快捷。那么电脑如何安装Visio Viewer 2007&am…

Visio2016 安装教程

Visio是office软件系列中的负责绘制流程图和示意图的软件&#xff0c;是一款便于IT和商务人员就复杂信息、系统和流程进行可视化处理、分析和交流的软件。使用具有专业外观的 Office Visio 图表&#xff0c;可以促进对系统和流程的了解&#xff0c;深入了解复杂信息并利用这些知…

visio2019安装教程

安装前先关闭杀毒软件和360卫士&#xff0c;注意安装路径不能有中文&#xff0c;安装包路径也不要有中文。 1.选中【Visio2019】压缩包&#xff0c;鼠标右击选择【解压到Visio2019】。 2.双击打开【Visio2019】文件夹。 3&#xff0e;双击打开【VisioPro2019Retail】镜像文件…

Visio2003安装教程

目录 一、软件下载 二、软件安装 一、软件下载 我放到我的百度网盘里啦~可以直接去里面下载&#xff0c;提取码为&#xff1a;5200。 请点击me、me、me&#xff01;&#xff01;&#xff01; 二、软件安装 1、根据上面的链接下载好 Visio2003_SP3.exe 文件后&#xff0c;双…

Office+Visio安装教程

OfficeProjectVisio安装教程 1&#xff0c;安装office Tool Plus&#xff08;这是一个方便的工具箱&#xff09; Office Tools Plus 官网下载地址&#xff1a; https://otp.landian.vip/zh-cn/ 下载下来以后解压 然后他会等待三秒左右打开以下窗口 2&#xff0c;卸载以…

Visio2013安装教程

资料下载&#xff1a; 下载安装包的链接如下&#xff0c;csdn上也有很多&#xff0c;也可以自己搜 链接&#xff1a;https://pan.baidu.com/s/15spASs91UlMnwkdCFB34jg?pwd7ahN 提取码&#xff1a;7ahN 一、下载visio2013源文件并进行安装 1.下载得到压缩包 2.解压第一步文件…

visio安装教程

1.安装包分享&#xff1a; 链接地址&#xff1a;点击此处 提取码&#xff1a;miao 文件解压&#xff1a; 3.解压后为&#xff1a; !在这里插入图片描述 点击setup !在这里插入图片描述 我接受此协议的条款&#xff0c;继续 5.选择自定义或者立即安装 一般选择立即安装…

visio如何安装-示例教程

目录 简介 安装过程 总结 简介 Visio是一款专业、流程图和图表软件。它可以通过图形化的方式帮助用户展示和分析各种流程和数据。Visio的功能非常强大&#xff0c;因此它广泛应用于各种领域&#xff0c;包括商业、工业和科技等。 首先&#xff0c;Visio拥有各种图表模板和元…

Office Visio 2019安装教程

哈喽&#xff0c;大家好。今天一起学习的是Visio 2019的安装&#xff0c;这是一个绘制流程图的软件&#xff0c;用有效的绘图表达信息&#xff0c;比任何文字都更加形象和直观。Office Visio 是office软件系列中负责绘制流程图和示意图的软件&#xff0c;便于IT和商务人员就复杂…

visio2021专业版安装包下载及教程 《流程图工具》

目录 简介 安装配置过程 总结 visio2021专业版简介 其 特色主要包含以下几个各方面&#xff1a; 规范化&#xff1a;Visio是这款专业人才的时序应用软件&#xff0c;其内建了大量的时序形和模版&#xff0c;囊括了各种相同种类的程序和非政府结构。使用者能透过Visio轻松地…