カメラモジュール

取り合えず記述は完了したので、タイミングをシュミレーションをするためにverilogでテストベンチをこれから書く。
仕様はざっくり、カメラICからの信号をピクセル単位のデータ(YUV422だと2pixel分)を現在ピクセル位置と一緒に流すという感じ、微妙にいらない所も入ってるかもしれないし、カウントのタイミングがちゃんとなってるかはこれから検証。

ソースは12:27時点でエラー箇所訂正済み。ただしタイミングはずれてるので使えない。

//
// TCM8230MD.v
// camera signal interface 
// Rev00:2008/11/28 ippei-r new
//


`timescale 1ns / 10ps


//TOSHIBA TCM8230MD interface module
module TCM8230MD_IF (
	
	//module reset 
	SI_nRST,

	//カメラの出力クロックはカメラより出力されてDCMに入れる
	//DCMよりモジュールに入力する
	//external input → DCM → This module
	DCMO_CAMCLK,
	
	//external input FPGA外部入力
	EI_CAMVSYNC,	//camera vertical syncronization pulse input
	EI_CAMHSYNC,	//camera holizontal syncronization pulse inuput
	EI_CAMDAT,		//camera data output (8bit)
//	EO_CAMRST,		//camera input rest
	
	//external output FPGA外部出力
//	EO_CAMRST,	//camera input rest

	//module output 
	MO_CAMLINECNT,	    //camera line counter
	MO_CAMPIXELCNT,	    //camera pixel counter
	MO_CAMDATVALID,	    //camera output data valid
	MO_CAMDAT,	    //camera output data

	//module input
	MI_CAMDATFMT	    //cameta picture data format
    );

//system input
input SI_nRST;
input DCMO_CAMCLK;	    //DCMから出力されるカメラのデータクロック

//exetnal input
input EI_CAMVSYNC;	    //カメラのvertical 端子
input EI_CAMHSYNC;	    //カメラのholizontanl 端子
input [7:0] EI_CAMDAT;   //カメラのデータ出力端子
//input EI_CAMRST;	    //カメラのリセット
//カメラのデータ出力クロックは最上位のmoduleで入力してDCMへ

//extenal output
//output EO_CAMRST;

//module output
output [9:0] MO_CAMLINECNT;	    //1frame最大507line
output [9:0] MO_CAMPIXELCNT;	    //1line最大640pixel
output MO_CAMDATVALID;		    //
output [31:0]MO_CAMDAT;		    
//RGBの場合は1pixel2byte,YUV422は2pixelで4byte

//module input
input MI_CAMDATFMT;		    //0:YUV422,1:RGB565

//////////////////////////////////////////////////////////////////
//reg
reg vsync;
reg [2:0] datcnt;
reg [9:0] vercnt;
reg [9:0] holcnt;
reg datvld;

reg [31:0] pixeldat;


reg hsync;

//parameter
parameter YUV422 = 0;
parameter RGB565 = 1;

parameter HOLVALIDMAX = 640;	//最大有効水平値(水平方向pixel)
parameter VERVALIDMAX = 480;	//最大有効垂直値(最大有効line数)

parameter HOLMAX = HOLVALIDMAX + 140;
parameter VERMAX = VERVALIDMAX + 27 + 18;

/////////////////////////////////////////////////////////////////////
//data valid 
//////////////////////////////////////////////////////////////////////

always @(posedge DCMO_CAMCLK) begin
	if(!SI_nRST) begin
		vsync <= 0;
		hsync <= 0;
	end else begin
		vsync <= EI_CAMVSYNC;
		if(vsync)	hsync <= EI_CAMHSYNC;
	end
end

always @(posedge DCMO_CAMCLK) begin
	if(!SI_nRST) begin		
		datcnt <= 0;
		datvld <= 0;
	end else if(EI_CAMHSYNC) begin
		if(!MI_CAMDATFMT) begin
			//YUV422
			if(datcnt == 3'h011) begin	
				datcnt <= 0;
				datvld <= 1;
			end else begin
				datcnt <= datcnt + 1;
				datvld <= 0;
			end
		end else begin
			//RGB565
			if(datcnt == 3'h001) begin 
				datcnt <= 0;
				datvld <= 1;
			end else begin		
				datcnt <= datcnt + 1;
				datvld <= 0;
			end
		end
	end else begin
		datcnt <= 0;
		datvld <= 0;
	end
end

///////////////////////////////////////////////////////////////////////////
//counter
///////////////////////////////////////////////////////////////////////////

always @(posedge DCMO_CAMCLK) begin
	if(!SI_nRST) 
		begin
			vercnt <= 0;
			holcnt <= 0;
		end 
	else if(vsync) 
		begin
			if(EI_CAMHSYNC) begin
				//水平カウント期間
				if(!MI_CAMDATFMT) begin
					if(datvld)					holcnt <= holcnt + 2;
				end  else begin
					if(datvld)					holcnt <= holcnt + 1;
				end
			end else begin
				//垂直カウント
				if(holcnt == HOLVALIDMAX) begin
					vercnt <= vercnt + 1;
					holcnt <= 0;
				end
			end
		end 
	else 
		begin
			//フレーム終わり
			if(vercnt == VERVALIDMAX)			vercnt <= 0;
		end
end

//////////////////////////////////////////////////////////////////////////
//pixel get
//////////////////////////////////////////////////////////////////////////

always @(posedge DCMO_CAMCLK) begin
	if(!SI_nRST)			pixeldat[31:0] <= 0;
	else					pixeldat[31:0] <= {pixeldat[23:0],EI_CAMDAT[7:0]};
end

///////////////////////////////////////////////////////////////////////////
//moudule output signal
///////////////////////////////////////////////////////////////////////////
assign MO_CAMLINECNT 					= vercnt;
assign MO_CAMPIXELCNT					= holcnt;
assign MO_CAMDATVALID					= datvld;
assign MO_CAMDAT[31:0]					= pixeldat[31:0];						


endmodule