FC2カウンター FPGAの部屋 2009年12月09日
fc2ブログ

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

FPGAの部屋

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

YUV-RGB変換6(やったー、うまく行きました)

YUV-RGB変換5(インプリメントして基板にコンフィグ)”の続き。
25MHzのクロックを半分にして、12.5MHzをCMOSカメラに供給するために、DCM_module_25MHz.vhd のDCM1/2の分周比を2から4に変更した。つまり50MHzの2分周を4分周の12.5MHzに変更した。このクロックをコネクタに出力して、オシロで見てみた。
YUV_RGB_conv_11_091209.jpg

12.5MHzが出力されている。これでHSYNC, VSYNCとも正常に戻ったはず。とりあえず、ディスプレイにつないでみた。
その結果、画像は出たが、あれ~、なんか色がおかしい。なんか青が無い。。。
YUV_RGB_conv_12_091209.jpg

上の写真で青いうちわを写したら、ディスプレイでは黒くなってしまった。どこかがおかしい。早速、VHDLコードを点検。そうすると、下の図のピンクで囲った部分を見てみると、blue に sat_conv_r を代入している。
YUV_RGB_conv_13_091209.png

これはバグなので、blure <= sat_conv_b; に変更して、インプリメントし、ボードにダウンロードした。
そうしたところ、正常に色が出て、YUV-RGB変換が完成した。うれしい~。
YUV_RGB_conv_14_091209.jpg

非常に綺麗に色が出ている。思ったより画質が良いみたいだ。
ご助言いただいたみなさん。ありがとうございました。
  1. 2009年12月09日 21:11 |
  2. 画像処理
  3. | トラックバック:0
  4. | コメント:2

YUV-RGB変換5(インプリメントして基板にコンフィグ)

YUV-RGB変換4(シミュレーション)”の続き。
前回、シミュレーションが終了したので、インプリメントするためにUCFに2つ目のSRAMのIOパッドを加えてインプリメントした。何回かやって成功した。
次は基板にコンフィグして動作するかどうか確かめる。うまく行けばYUV-RGB変換したあとのカラーの画像が見れるはず。。。
これから基板にダウンロードする。下が基板の写真。
YUV_RGB_conv_6_091209.jpg

ダウンロードケーブルを接続して、iMPACTからダウンロードした。液晶ディスプレイを見ると、同期範囲外で同期が外れている。いかにもおかしい、ということでオシロで同期信号を見てみることにした。
まずは HSYNCから。HSYNCの出力波形を下に示す。
YUV_RGB_conv_7_091209.jpg

VGAの信号フォーマットを下に示すが、32usec のはずが出力されているのは16usec で、半分の周期、倍の周波数だった。これじゃ、同期範囲外ですね。
#私もオシロを使っているので、HDLコード屋からハード屋さんに昇格かな?
YUV_RGB_conv_3_091128.png

念のために VSYNCも波形を見てみた。
YUV_RGB_conv_8_091209.jpg

やはり、8.32msec で半分の周期。これは同期が取れない。
次にどこで2倍の周波数になっているのかを検証してみることにした。
クロック関係のブロック図を下に示す。
Camera_Disp_6_090921.png

次にクロック関係のVHDLコードを下に示す。

    DCM_module_25MHz_inst : DCM_module_25MHz port map(
        clk50MHz_in => clk,
        clk50_out => clk50,
        cam_clk_out => cam_clk_node,
        pclk_in => cam_pclk,
        mclk_out => mclk,
        cam_clk_locked => cam_clk_locked,
        mclk_locked => mclk_locked
    );
    reset <= not mclk_locked;
    
    -- CMOSカメラ用クロックの生成
    n_cam_clk_node <= not cam_clk_node;
    cam_clk_reset <= not cam_clk_locked;
    ODDR2_for_cam_clk : ODDR2 generic map(
        SRTYPE => "ASYNC"
    ) port map(
        Q => cam_clk,
        C0 => cam_clk_node,
        C1 => n_cam_clk_node,
        CE => '1',
        D0 => '1',
        D1 => '0',
        R => cam_clk_reset,
        S => '0'
    );



上の図のDCM1/2 の24MHzクロック出力が cam_clk_nodeだ。これはODDR2_for_cam_clk のODDR2で クロッキングされてcam_clk としてCMOSカメラに供給されている。CMOSカメラからはPCLKが出力され、それが DCM_module_25MHz_instのpclk_in (図で言うとDCM1/1)に入って、mclk_out から mclkとして出力され、すべてのモジュールに供給されている。
まずは、mclkをコネクタに出力して、オシロで見てみることにした。その波形を下に示す。
YUV_RGB_conv_9_091209.jpg

ひえ~、50MHzでした。これじゃ当たり前。予定の2倍の周波数です。念のために、cam_clk_nodeをコネクタに出力して見てみた。(下図参照)
YUV_RGB_conv_10_091209.jpg

これは正常。するとCMOSカメラでクロックが2倍になっているんだな?
そこで、もう一度、OV7725のデータシートを確認。なんだ、デフォルト値が書いてあるんじゃないですか。。。見落としていました。申し訳ない。。。
気を取り直して、デフォルト値でどこか悪いというか、そういう設定になっているかを検証。
そうすると、アドレス11の CLKRCのデフォルト値が 80だった。bit6が外部クロックをダイレクトに使用するというビットでこれは立っていない。bit5 - 0 が内部クロック・プリスケーラで、内部クロック = 入力クロック/(bit5-0 + 1)/2 だそうだ。/2 がどこにかかるか分からないが、入力クロック/((bit5-0 + 1)/2) だとしたら、現在の現象と合っている。
解決策としては、今まで入れていた25MHzのクロックを半分にして、12.5MHzをCMOSカメラに供給することにした。

しかし、やはりSCCBレジスタを設定するI2Cのモジュールを作成することにしたい。YUV-RGB変換が終了したら作ろうと思う。それでもわからないフォーマットがあるんだけど。。。
  1. 2009年12月09日 05:44 |
  2. 画像処理
  3. | トラックバック:0
  4. | コメント:6