カメラモジュール
取り合えず記述は完了したので、タイミングをシュミレーションをするために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