FC2カウンター FPGAの部屋 SP605でキャラクタ・ディスプレイ・コントローラ4(CH7301C用のラッパー・ソースファイル)
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

SP605でキャラクタ・ディスプレイ・コントローラ4(CH7301C用のラッパー・ソースファイル)

一応、”SP605でキャラクタ・ディスプレイ・コントローラ3(実機でテスト)”の続き。
Yahooグループの方でリクエストがあったので、SP605でキャラクタ・ディスプレイ・コントローラのCH7301C用のラッパー・ソースファイルを貼っておく。

Clocking WizardのDCM_CLKGEN_S6は、下のように差動入力に設定して、200MHzから25MHzに落としてクロックとして、使っている。CLK_OUT2はCLK_OUT1より位相を90度ずらしている。
SP605_DVI_7_100623.png

SP605_DVI_9_100713.png

CharDispCtrlerTestは、”キャラクタ・ディスプレイ・コントローラのまとめ”からDCMを除いて、25MHzクロックで動作するようにしたものだ。display_enableは画像表示期間を示す信号だ。2つ下の階層のCharDispCtrler.vから、下のように引き出している。

assign display_enable = display_on_d2;


それ以外に変更はしていない(はず)。

CH7301Cのマニュアルを読むと分かるのだが、I2Cをいじらないデフォルト状態ではDouble Data Rateでデータを入れてやれば良い。DVIデジタルでも表示出来ている。

なお、いつも通りに、ソースファイルについて、一切の保証はしないので、ご承知おきください。

// CharDispCtrlerTest_SP605.v
// CharDispCtrlerTest.vのSP605用のラッパー、CH7301Cを使用する
//
// 2012/07/26 : ODDR2 のDDR_ALIGNMENTとSRTYPEを修正
//

`default_nettype none

module CharDispCtrlerTest_SP605 (
    input    wire            sysclk_p, sysclk_n,
    input    wire            reset_sw,
    output    wire            dvi_xclk_p, dvi_xclk_n,
    output    reg                dvi_de, dvi_h, dvi_v,
    output    wire    [11:0]    dvi_d,
    output    wire            dvi_reset_b,
    output    wire            dvi_sda,
    output    wire            dvi_scl
);
    wire clk, clkb;
    wire clk90, clk90b;
    wire clkdv;
    wire reset;
    wire locked;
    wire vga_red, vga_green, vga_blue;
    wire vga_hsync, vga_vsync;
    wire display_enable;
    
    DCM_CLKGEN_S6 clk200_DCM (
        .CLK_IN1_P          (sysclk_p),    // IN
        .CLK_IN1_N          (sysclk_n),    // IN
        // Clock out ports
        .CLK_OUT1           (clk),     // OUT
        .CLK_OUT2           (clk90),     // OUT
        // Status and control signals
        .RESET              (reset_sw),        // IN
        .LOCKED             (locked)      // OUT
    );
    assign reset = !locked;
    assign clkb = !clk;
    assign clk90b = !clk90;
//    assign dvi_reset_b = locked;
    assign dvi_reset_b = 1'b1;
    
    CharDispCtrlerTest CharDispCtrlerTest_inst (
        .clk(clk),
        .reset(reset),
        .VGA_RED(vga_red),
        .VGA_GREEN(vga_green),
        .VGA_BLUE(vga_blue),
        .VGA_HSYNC(vga_hsync),
        .VGA_VSYNC(vga_vsync),
        .display_enable(display_enable)
    );
    
    always @(posedge clk) begin
        if (reset) begin
            dvi_de <= 1'b0;
            dvi_h <= 1'b1;
            dvi_v <= 1'b1;
        end else begin
            dvi_de <= display_enable;
            dvi_h <= vga_hsync;
            dvi_v <= vga_vsync;
        end
    end
    
    // dvi_xclk_p : clkbと同位相
    ODDR2  #(
        .DDR_ALIGNMENT("C0"),    //  Sets  output  alignment  to  "NONE",  "C0"  or  "C1"
        .INIT(1'b0),            //  Sets  initial  state  of  the  Q  output  to  1’b0  or  1’b1
        .SRTYPE("ASYNC")            //  Specifies  "SYNC"  or  "ASYNC"  set/reset
    )  ODDR2_xclk_p  (
        .Q(dvi_xclk_p),            //  1-bit  DDR  output  data
        .C0(clk90),                //  1-bit  clock  input
        .C1(clk90b),                //  1-bit  clock  input
        .CE(1'b1),                //  1-bit  clock  enable  input
        .D0(1'b1),                //  1-bit  data  input  (associated  with  C0)    
        .D1(1'b0),                //  1-bit  data  input  (associated  with  C1)
        .R(reset),                //  1-bit  reset  input
        .S(1'b0)                //  1-bit  set  input
    );    
    
    // dvi_xclk_n : clkと同位相
    ODDR2  #(
        .DDR_ALIGNMENT("C0"),    //  Sets  output  alignment  to  "NONE",  "C0"  or  "C1"
        .INIT(1'b1),            //  Sets  initial  state  of  the  Q  output  to  1’b0  or  1’b1
        .SRTYPE("ASYNC")            //  Specifies  "SYNC"  or  "ASYNC"  set/reset
    )  ODDR2_xclk_n  (
        .Q(dvi_xclk_n),            //  1-bit  DDR  output  data
        .C0(clk90),                //  1-bit  clock  input
        .C1(clk90b),                //  1-bit  clock  input
        .CE(1'b1),                //  1-bit  clock  enable  input
        .D0(1'b0),                //  1-bit  data  input  (associated  with  C0)    
        .D1(1'b1),                //  1-bit  data  input  (associated  with  C1)
        .R(reset),                //  1-bit  reset  input
        .S(1'b0)                //  1-bit  set  input
    );    
    
    // DVI_D// DVI_D[0]
    ODDR2  #( 
        .DDR_ALIGNMENT("C0"),    //  Sets  output  alignment  to  "NONE",  "C0"  or  "C1"
        .INIT(1'b0),            //  Sets  initial  state  of  the  Q  output  to  1’b0  or  1’b1
        .SRTYPE("ASYNC")            //  Specifies  "SYNC"  or  "ASYNC"  set/reset
    )  ODDR2_D0  (
        .Q(dvi_d[0]),            //  1-bit  DDR  output  data
        .C0(clk),                //  1-bit  clock  input
        .C1(clkb),                //  1-bit  clock  input
        .CE(1'b1),                //  1-bit  clock  enable  input
        .D0(vga_blue),            //  B0[0], 1-bit  data  input  (associated  with  C0)    
        .D1(vga_green),            //  G0[4], 1-bit  data  input  (associated  with  C1)
        .R(reset),                //  1-bit  reset  input
        .S(1'b0)                //  1-bit  set  input
    );    
    
    ODDR2  #( // DVI_D[1]
        .DDR_ALIGNMENT("C0"),    //  Sets  output  alignment  to  "NONE",  "C0"  or  "C1"
        .INIT(1'b0),            //  Sets  initial  state  of  the  Q  output  to  1’b0  or  1’b1
        .SRTYPE("ASYNC")            //  Specifies  "SYNC"  or  "ASYNC"  set/reset
    )  ODDR2_D1  (
        .Q(dvi_d[1]),            //  1-bit  DDR  output  data
        .C0(clk),                //  1-bit  clock  input
        .C1(clkb),                //  1-bit  clock  input
        .CE(1'b1),                //  1-bit  clock  enable  input
        .D0(vga_blue),            //  B0[1], 1-bit  data  input  (associated  with  C0)    
        .D1(vga_green),            //  G0[5], 1-bit  data  input  (associated  with  C1)
        .R(reset),                //  1-bit  reset  input
        .S(1'b0)                //  1-bit  set  input
    );    
    
    ODDR2  #( // DVI_D[2]
        .DDR_ALIGNMENT("C0"),    //  Sets  output  alignment  to  "NONE",  "C0"  or  "C1"
        .INIT(1'b0),            //  Sets  initial  state  of  the  Q  output  to  1’b0  or  1’b1
        .SRTYPE("ASYNC")            //  Specifies  "SYNC"  or  "ASYNC"  set/reset
    )  ODDR2_D2  (
        .Q(dvi_d[2]),            //  1-bit  DDR  output  data
        .C0(clk),                //  1-bit  clock  input
        .C1(clkb),                //  1-bit  clock  input
        .CE(1'b1),                //  1-bit  clock  enable  input
        .D0(vga_blue),            //  B0[2], 1-bit  data  input  (associated  with  C0)    
        .D1(vga_green),            //  G0[6], 1-bit  data  input  (associated  with  C1)
        .R(reset),                //  1-bit  reset  input
        .S(1'b0)                //  1-bit  set  input
    );    
    
    ODDR2  #( // DVI_D[3]
        .DDR_ALIGNMENT("C0"),    //  Sets  output  alignment  to  "NONE",  "C0"  or  "C1"
        .INIT(1'b0),            //  Sets  initial  state  of  the  Q  output  to  1’b0  or  1’b1
        .SRTYPE("ASYNC")            //  Specifies  "SYNC"  or  "ASYNC"  set/reset
    )  ODDR2_D3  (
        .Q(dvi_d[3]),            //  1-bit  DDR  output  data
        .C0(clk),                //  1-bit  clock  input
        .C1(clkb),                //  1-bit  clock  input
        .CE(1'b1),                //  1-bit  clock  enable  input
        .D0(vga_blue),            //  B0[3], 1-bit  data  input  (associated  with  C0)    
        .D1(vga_green),            //  G0[7], 1-bit  data  input  (associated  with  C1)
        .R(reset),                //  1-bit  reset  input
        .S(1'b0)                //  1-bit  set  input
    );    
    
    ODDR2  #( // DVI_D[4]
        .DDR_ALIGNMENT("C0"),    //  Sets  output  alignment  to  "NONE",  "C0"  or  "C1"
        .INIT(1'b0),            //  Sets  initial  state  of  the  Q  output  to  1’b0  or  1’b1
        .SRTYPE("ASYNC")            //  Specifies  "SYNC"  or  "ASYNC"  set/reset
    )  ODDR2_D4  (
        .Q(dvi_d[4]),            //  1-bit  DDR  output  data
        .C0(clk),                //  1-bit  clock  input
        .C1(clkb),                //  1-bit  clock  input
        .CE(1'b1),                //  1-bit  clock  enable  input
        .D0(vga_blue),            //  B0[4], 1-bit  data  input  (associated  with  C0)    
        .D1(vga_red),            //  R0[0], 1-bit  data  input  (associated  with  C1)
        .R(reset),                //  1-bit  reset  input
        .S(1'b0)                //  1-bit  set  input
    );    
    
    ODDR2  #( // DVI_D[5]
        .DDR_ALIGNMENT("C0"),    //  Sets  output  alignment  to  "NONE",  "C0"  or  "C1"
        .INIT(1'b0),            //  Sets  initial  state  of  the  Q  output  to  1’b0  or  1’b1
        .SRTYPE("ASYNC")            //  Specifies  "SYNC"  or  "ASYNC"  set/reset
    )  ODDR2_D5  (
        .Q(dvi_d[5]),            //  1-bit  DDR  output  data
        .C0(clk),                //  1-bit  clock  input
        .C1(clkb),                //  1-bit  clock  input
        .CE(1'b1),                //  1-bit  clock  enable  input
        .D0(vga_blue),            //  B0[5], 1-bit  data  input  (associated  with  C0)    
        .D1(vga_red),            //  R0[1], 1-bit  data  input  (associated  with  C1)
        .R(reset),                //  1-bit  reset  input
        .S(1'b0)                //  1-bit  set  input
    );    
    
    ODDR2  #( // DVI_D[6]
        .DDR_ALIGNMENT("C0"),    //  Sets  output  alignment  to  "NONE",  "C0"  or  "C1"
        .INIT(1'b0),            //  Sets  initial  state  of  the  Q  output  to  1’b0  or  1’b1
        .SRTYPE("ASYNC")            //  Specifies  "SYNC"  or  "ASYNC"  set/reset
    )  ODDR2_D6  (
        .Q(dvi_d[6]),            //  1-bit  DDR  output  data
        .C0(clk),                //  1-bit  clock  input
        .C1(clkb),                //  1-bit  clock  input
        .CE(1'b1),                //  1-bit  clock  enable  input
        .D0(vga_blue),            //  B0[6], 1-bit  data  input  (associated  with  C0)    
        .D1(vga_red),            //  R0[2], 1-bit  data  input  (associated  with  C1)
        .R(reset),                //  1-bit  reset  input
        .S(1'b0)                //  1-bit  set  input
    );    
    
    ODDR2  #( // DVI_D[7]
        .DDR_ALIGNMENT("C0"),    //  Sets  output  alignment  to  "NONE",  "C0"  or  "C1"
        .INIT(1'b0),            //  Sets  initial  state  of  the  Q  output  to  1’b0  or  1’b1
        .SRTYPE("ASYNC")            //  Specifies  "SYNC"  or  "ASYNC"  set/reset
    )  ODDR2_D7  (
        .Q(dvi_d[7]),            //  1-bit  DDR  output  data
        .C0(clk),                //  1-bit  clock  input
        .C1(clkb),                //  1-bit  clock  input
        .CE(1'b1),                //  1-bit  clock  enable  input
        .D0(vga_blue),            //  B0[7], 1-bit  data  input  (associated  with  C0)    
        .D1(vga_red),            //  R0[3], 1-bit  data  input  (associated  with  C1)
        .R(reset),                //  1-bit  reset  input
        .S(1'b0)                //  1-bit  set  input
    );    
    
    ODDR2  #( // DVI_D[8]
        .DDR_ALIGNMENT("C0"),    //  Sets  output  alignment  to  "NONE",  "C0"  or  "C1"
        .INIT(1'b0),            //  Sets  initial  state  of  the  Q  output  to  1’b0  or  1’b1
        .SRTYPE("ASYNC")            //  Specifies  "SYNC"  or  "ASYNC"  set/reset
    )  ODDR2_D8  (
        .Q(dvi_d[8]),            //  1-bit  DDR  output  data
        .C0(clk),                //  1-bit  clock  input
        .C1(clkb),                //  1-bit  clock  input
        .CE(1'b1),                //  1-bit  clock  enable  input
        .D0(vga_green),            //  G0[0], 1-bit  data  input  (associated  with  C0)    
        .D1(vga_red),            //  R0[4], 1-bit  data  input  (associated  with  C1)
        .R(reset),                //  1-bit  reset  input
        .S(1'b0)                //  1-bit  set  input
    );    
    
    ODDR2  #( // DVI_D[9]
        .DDR_ALIGNMENT("C0"),    //  Sets  output  alignment  to  "NONE",  "C0"  or  "C1"
        .INIT(1'b0),            //  Sets  initial  state  of  the  Q  output  to  1’b0  or  1’b1
        .SRTYPE("ASYNC")            //  Specifies  "SYNC"  or  "ASYNC"  set/reset
    )  ODDR2_D9  (
        .Q(dvi_d[9]),            //  1-bit  DDR  output  data
        .C0(clk),                //  1-bit  clock  input
        .C1(clkb),                //  1-bit  clock  input
        .CE(1'b1),                //  1-bit  clock  enable  input
        .D0(vga_green),            //  G0[1], 1-bit  data  input  (associated  with  C0)    
        .D1(vga_red),            //  R0[5], 1-bit  data  input  (associated  with  C1)
        .R(reset),                //  1-bit  reset  input
        .S(1'b0)                //  1-bit  set  input
    );    
    
    ODDR2  #( // DVI_D[10]
        .DDR_ALIGNMENT("C0"),    //  Sets  output  alignment  to  "NONE",  "C0"  or  "C1"
        .INIT(1'b0),            //  Sets  initial  state  of  the  Q  output  to  1’b0  or  1’b1
        .SRTYPE("ASYNC")            //  Specifies  "SYNC"  or  "ASYNC"  set/reset
    )  ODDR2_D10  (
        .Q(dvi_d[10]),            //  1-bit  DDR  output  data
        .C0(clk),                //  1-bit  clock  input
        .C1(clkb),                //  1-bit  clock  input
        .CE(1'b1),                //  1-bit  clock  enable  input
        .D0(vga_green),            //  G0[2], 1-bit  data  input  (associated  with  C0)    
        .D1(vga_red),            //  R0[6], 1-bit  data  input  (associated  with  C1)
        .R(reset),                //  1-bit  reset  input
        .S(1'b0)                //  1-bit  set  input
    );    
    
    ODDR2  #( // DVI_D[11]
        .DDR_ALIGNMENT("C0"),    //  Sets  output  alignment  to  "NONE",  "C0"  or  "C1"
        .INIT(1'b0),            //  Sets  initial  state  of  the  Q  output  to  1’b0  or  1’b1
        .SRTYPE("ASYNC")            //  Specifies  "SYNC"  or  "ASYNC"  set/reset
    )  ODDR2_D11  (
        .Q(dvi_d[11]),            //  1-bit  DDR  output  data
        .C0(clk),                //  1-bit  clock  input
        .C1(clkb),                //  1-bit  clock  input
        .CE(1'b1),                //  1-bit  clock  enable  input
        .D0(vga_green),            //  G0[3], 1-bit  data  input  (associated  with  C0)    
        .D1(vga_red),            //  R0[7], 1-bit  data  input  (associated  with  C1)
        .R(reset),                //  1-bit  reset  input
        .S(1'b0)                //  1-bit  set  input
    );
    
    SCCB_Reg_Controller I2C_Setting_inst (
        .clk(clk),
        .reset(reset),
        .SCL(dvi_scl),
        .SDA(dvi_sda)
    );
    
endmodule    


(2012/07/26:Verilogソースを修正)
ただし、Virtex-6では、ODDR2プリミティブではなく、ODDRプリミティブだったはずだ。

(2011/04/25:追記)
SP605では、CH7301Cの設定レジスタがコンフィグROMで初期化されていたようです。初期化されていないXUPV5-LX110Tでは、CH7301Cの設定レジスタを設定しないとディスプレイに表示できなかったです。
CH7301Cの設定レジスタを設定する必要があります。

(2011/04/26:追記)
現在使用しているCH7301Cの設定レジスタの設定値は、”XPS Thin Film Transistor(TFT) Controller (v2.00a)”の6ページの”Table 2: Chrontel CH-7301 Configuration Register Description”と同一の設定値を使用している。Table 2: Chrontel CH-7301 Configuration Register Descriptionを下に引用する。
XUPV5-LX110T_CDispC_1_110426.png

CH7301Cの設定レジスタを設定する回路は、OV7670のSCCB設定レジスタの設定回路のID_ADDRESSを0xECに変更して使用した。
SCCB設定レジスタ設定回路の資料。
SCCBインタフェース回路の実装1(タイミングチャート)
SCCBインタフェース回路の実装2(ブロック図の作成)
SCCBインタフェース回路の実装3(シミュレーション)
SCCBインターフェース回路の説明1(SCCB_Reg_Controller.vhd)
SCCBインターフェース回路の説明2(freqdiv.vhd、SCCB_reg_values_ROM.vhd)
SCCBインターフェース回路の説明3(One_Transaction_SCCB.vhd)

更に、OV9655のID_ADDRESSに書き換えたときの参考資料がここにある。

(2011/06/02:追記)
dvi_de, dvi_h, dvi_v の出力用FFがIOBにマップされないと画面が表示されないので、Verilogソースに(* IOB = "FORCE" *)制約を追加した。
  1. 2010年07月13日 20:45 |
  2. Spartan-6 FPGA SP605 評価キット
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog.fc2.com/tb.php/1525-48c024ee
この記事にトラックバックする(FC2ブログユーザー)