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

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

FPGAの部屋

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

MegaWizard Plug-In Manager で作った同期FIFOの動作を確かめる2(シミュレーション)

遅くなってしまったが、”MegaWizard Plug-In Manager で作った同期FIFOの動作を確かめる1”の続き。

今度はテストベンチを作る。XilinxのISEだとテストベンチのテンプレートを生成してくれる機能があるが、Quartus II では見つからなかったので、全部自分で書いた。即興で書いてみたテストベンチを下に示す。

// SFIFO_test_tb.v

`default_nettype none
`timescale 1ns / 1ps

module SFIFO_test_tb;
    reg        clk;
    reg        [16:0] data;
    reg        rdreq;
    reg        wrreq;
    wire    empty;
    wire    full;
    wire    [16:0] q;
    wire    [3:0] usedw;
    integer i;
    
    parameter    CLK_PERIOD = 40;
    parameter    DELAY_TIME = 10;
    
    SFIFO_test SFIFO_test_inst (
        .clock(clk),
        .data(data),
        .rdreq(rdreq),
        .wrreq(wrreq),
        .empty(empty),
        .full(full),
        .q(q),
        .usedw(usedw)
    );
    
    always begin
       #(CLK_PERIOD/2)    clk = 1'b1 ;
       #(CLK_PERIOD/2)    clk = 1'b0 ;
    end

    initial begin
        data = 17'd0;
        rdreq = 1'b0;
        wrreq = 1'b0;
        #(DELAY_TIME*2);
        
        @(posedge clk);
        #DELAY_TIME;
        
        for (i=0; i<9; i=i+1) begin
            @(posedge clk);
            #DELAY_TIME;
            data = data + 17'd1;
            wrreq = 1'b1;
        end
        
        @(posedge clk);
        #DELAY_TIME;
        wrreq = 1'b0;
        
        @(posedge clk);
        #DELAY_TIME;
        
        for (i=0; i<9; i=i+1) begin
            @(posedge clk);
            #DELAY_TIME;
            rdreq = 1'b1;
        end
        
        @(posedge clk);
        #DELAY_TIME;
        rdreq = 1'b0;

        @(posedge clk);
        #DELAY_TIME;
        @(posedge clk);
        #DELAY_TIME;
        $stop;
    end
endmodule


これをModelSim AE 6.5eでシミュレーションしようとして起動したら、ライセンス・エラーになってしまった。
SFIFO_test_13_100930.png

何ででしょう?ModelSim AE 6.5bは問題なく起動するだけど?ネットで検索してもわからなかった。
(2010/10/01:追記) インストールしたModelSim AE 6.5eは購入バージョンでFreeバージョンではありませんでした。ダウンロード・センターから種別を選んでダウンロードすると、購入版になってしまいます。Quartus II ウェブ・エディション ソフトウェアから、Windows 用 ModelSim-Altera Starter Edition v10.0 のサービスパック 1 (541 MB)のリンクをクリックすると、ModelSim-Altera Starter Editionの6.5eがダウンロードできました。インストールすると問題なく立ち上がりました。アプロさん、ありがとうございました。

しょうがないので、ModelSim AE 6.5bを起動して、シミュレーションすることにした。ModelSimを家で起動するのは久しぶりだ。しかもVerilog HDL で、Altera では”無償ツールで実践する「ハード・ソフト協調検証」をやってみる”以来だと思う。
さて、ModelSim AE 6.5bを起動して、プロジェクトを作り、Verilog HDLファイルをADDして、コンパイルした。Simulationをスタートさせようとしたのだが、scfifoがないと怒られてしまった。
SFIFO_test_14_100930.png

あれ?これはどのライブラリをADDすればよいのだったか?良くわからないので、ライブラリが付け易いVeritakでやってみることにした。
alteraのライブラリを下のように選択したところ、シミュレーションが成功した。
SFIFO_test_15_100930.png

シミュレーション波形を下に示す。
SFIFO_test_16_100930.png

emptyが0になった時に、qに00001が出ているので、Show-ahead synchronous FIFO mode となっているのがわかった。
ModelSim AE 6.5bに戻って、SimulateメニューからStart Simulation...を選択して、Start Simulationダイアログを出す。libraries タグから220model_verとaltera_mf_verを選択した。
SFIFO_test_17_100930.png

これでOKボタンをクリックしところシミュレーションをスタートすることができた。Transcriptウインドウでrun -all コマンドを実行すると、シミュレーションを実行することができた。(当然、信号はWaveウインドウにいれました)
SFIFO_test_18_100930.png

次に、fullが1になるのを見るために、16回データを書き込むようにしてみた。(for (i=0; i<16; i=i+1) begin)
これで、ModelSim AE 6.5bでシミュレーションしてみた結果が下の図だ。
SFIFO_test_19_101001.png

やはり、usedwが0、fullが1になっているのがわかった。
  1. 2010年09月30日 05:43 |
  2. QuartusⅡ
  3. | トラックバック:0
  4. | コメント:4

イノベーション・ジャパン2010

今日は、イノベーション・ジャパン2010に展示説明員(先生のお手伝いです)として行きます。もし来られる方がいらっしゃったら、よろしくお願いします。イノベーション・ジャパン2010は3日間やっていますが、私が行くのは29日だけです。後は残念ながら、忙しくて行けません。
展示はI-9ブースで、13時からです。”超高速動画像符号化・解析技術の提案とそのFPGA部分実装”という題で、私はFPGAに依る部分実装を担当しています。この前の画像センシングシンポジウムと同じ内容になります。実はもっと進んだ実装を作っていまして、だいぶ出来てきたのですが、いろいろ忙しく、間に合いませんでした。

(追記)
昨日のイノベーション・ジャパン2010では、いろいろな人に来ていただいて、一生懸命に説明させていただきました。柱があって場所的にはあまり良いところでは無かったので、人は少なめでしたが、熱心に聞いていただいた方が多かったです。
山猿さんに来ていただきました。いろいろ、お話が出来て、楽しかったです。また、Makeでお会いいたしましょう。よろしくお願いします。
  1. 2010年09月29日 21:17 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

Spartan-3A Starter KitでCMOSカメラ・ディスプレイ回路29(シミュレーション方法)

Spartan-3A Starter KitでCMOSカメラ・ディスプレイ回路28(プロジェクトの公開)”のシミュレーション方法を説明する。OVL(Open Verification Library)も入っているので、かなりハードルが高いと思う。
(注:シミュレーションを行う場合は、2010/9/28 午前5時27分以降にダウンロードしたプロジェクトをお使いください。ファイルを修正しました。)

最初に、”コマンドプロンプトからISimが起動できない”を参照して、自分のXILINX環境変数などを修正しておく。
次に、512Mb DDR2 Verilog ModelをMicron社のWebサイトからダウンロードする。解凍すると下のファイルが見えると思う。
CamDisp_DDR2_3_100928.png

Spartan-3A Starter KitでCMOSカメラ・ディスプレイ回路28(プロジェクトの公開)”で公開したフォルダのうちのDDR2_SDRAM_cont_266フォルダの下のSimulationフォルダに、512Mb_ddr2フォルダを新規作成する。その下に512Mb DDR2 Verilog Modelのすべてのファイルをコピーする。
CamDisp_DDR2_4_100928.png

次に、OVL(Open Verification Library)の準備をする。
1. ここからOVL Version 2.5を手に入れる。std_ovl_v2p5_July232010.tgz.tarがダウンロードされるので、適当なフォルダに解凍する。
2. ”ISimでOVLのVHDL, Verilog混在シミュレーション(OVLライブラリのコンパイルと登録)”を参照して、accellera_ovl_vlog, accellera_ovl_vhdlライブラリを生成して登録する。
3. std_ovlをインストールしたフォルダに合わせて、CamDispCntrler_DDR2_Capt_SCCB\Simulation\ISimフォルダの下のCamDispCntrler_DDR2_tb.batファイルを編集する。ピンクの四角で囲った部分のパスを修正する。
CamDisp_DDR2_5_100928.png

これで準備は終了した。次に、ISimを起動してシミュレーションを行う。
1. CamDispCntrler_DDR2_Capt_SCCB\Simulation\ISimフォルダの下のCamDispCntrler_DDR2_tb.batファイルをダブルクリックで起動すると、ISimが起動する。
2. FileメニューからOpenを選択して、出てきたダイアログからCamDispCntrler_DDR2_tb.wcfg を選んで開くと、波形ウインドウに信号名が表示される。
3. Consoleウインドウで"run all"とタイプしてリターンキーを押すとシミュレーションが開始し、自動的にSTOPする。
4. CamDispCntrler_DDR2_tb.vの$stopコマンドで止まったとの表示が出る。
CamDisp_DDR2_6_100928.png

5. 波形ウインドウのタブからCamDispCntrler_DDR2_tb.wcfg を選択し、Zoom to Full Viewアイコンをクリックすると下の図になる。
CamDisp_DDR2_7_100928.png

結構、面倒だと自分でも思ったが、これでシミュレーションをすることができる。
  1. 2010年09月28日 05:42 |
  2. 画像処理
  3. | トラックバック:0
  4. | コメント:0

Spartan-3A Starter KitでCMOSカメラ・ディスプレイ回路28(プロジェクトの公開)

今まで作ってきたSpartan-3A Starter KitでCMOSカメラ・ディスプレイ回路をダウンロード公開しようと思います。
いつものように保証はないので、自己責任でお使いください。原則転載禁止(転載したい方はメールでお知らせください)とします。
ここにSpartan-3A Starter KitでCMOSカメラ・ディスプレイ回路のプロジェクトを置いておくので、興味のある方はダウンロードして下さい。

今回は、CMOSカメラを購入したり、変換基板を作成しないとCMOSカメラがSpartan-3A Starter Kitのつながらないので、その説明をする。
CMOSカメラはaitendo カメラモジュール(OV7670)[CAMERA30W-OV7670] を使用している。
これをSpartan-3A Starter Kitに接続するために、ユニバーサル基板を使って、変換基板を作成した。使用した基板は秋月電子の両面スルーホールガラス・ユニバーサル基板 Cタイプ めっき仕上げ (72x48mm)P-03231で、これを必要な大きさに切って使っている。変換基板とCMOSカメラを結ぶソケットは秋月電子のピンソケット(メス) 2×8 (16P)C-02761、変換基板とSpartan-3A Starter KitのJ2を結ぶソケットは秋月電子のピンソケット(メス) 2×20 (40P) C-000085を使用した。変換基板とSpartan-3A Starter KitのJ2を結ぶソケットは40ピンだが、J2は36ピンなので、40ピンソケットの端の4ピン分はセロハンテープを2重に貼って、ヘッダが入らないようにしている。
下に、配線表を示す。
CamDispCntrler_DDR2_49_100927.png

SCCBのクロックとデータはJ2では端子数が足らなかったので、aitendo のピンヘッダ用接続ケーブ[CB-PH10P-250] を購入して、2ピン分だけ引き裂いて使用した。(なお、変換基板を作らなくても、aitendo のピンヘッダ用接続ケーブ[CB-PH10P-250] を2つ購入して、CMOSカメラとSpartan-3A Starter Kitを結んで、コードにアルミフォイルを巻けば、もしかしたら、いけるかもしれない?ただし、ノイズは多いものと思われる。”Spartan-3A Starter KitでCMOSカメラ・ディスプレイ回路12(ノイズ?)”参照)
下に変換基板の表側の写真を示す。配線表でcam_sio_cとcam_sio_dはJ2の端子が足りないため、J15に接続するように
、写真の左下のヘッダに配線されている。左下のヘッダからaitendo のピンヘッダ用接続ケーブ[CB-PH10P-250] でJ15に配線した。
CamDisp_DDR2_pict_50_100927.jpg

次に変換基板の裏側の写真を示す。
CamDisp_DDR2_pict_51_100927.jpg

実際に変換基板をSpartan-3A Starter KitのJ2に挿入して、J15の 5, 6番ピンに配線したのが下の写真だ。
CamDisp_DDR2_pict_52_100927.jpg

CMOSカメラをつけると下の写真のようになる。
CamDisp_DDR2_pict_53_100927.jpg

上の写真で操作の説明をすると、ピンクの四角はDDR2 SDRAMの上位アドレスを決めるスライドスイッチで、これを変更するとDDR2 SDRAMバッファのアドレスが変わるので、値を変えると違う画面になる。そして、黄色のスライドスイッチをONにすると、キャプチャ開始、つまり画像が表示される。黄色のスライドスイッチをOFFにすると、キャプチャ終了。つまり、直前の静止画になる。
これで、変換基板とCMOSカメラのつけ方は終了とする。

次に、プロジェクトの使い方を説明する。Spartan-3A Starter KitでCMOSカメラ・ディスプレイ回路のプロジェクトを解凍すると、2つのフォルダが見えると思う。CamDispCntrler_DDR2_Capt_SCCBとDDR2_SDRAM_cont_266だ。DDR2_SDRAM_cont_266は、実際はDDR2-250のDDR2 SDRAMコントローラで、つまり125MHz動作になっている。これは、DDR2 SDRAMコントローラのVerilog-HDLソースだけで、Simulationフォルダは空になっている。ここには、後で、Micron社からダウンロードした512MbitのDDR2 SDRAMのモデルを入れる予定だ。
CamDispCntrler_DDR2_Capt_SCCBの下に、Simulation、Soureces、Synth121フォルダがある。SimulationフォルダにはシミュレーションのテストベンチやISim用のバッチファイル等が置いてある。Sourecesフォルダには、CCMOSカメラ・ディスプレイ回路のソースが入っている。こっちはVerilog-HDLとVHDLの混在となっている。最後のSynth121ファルダは、ISE12.1のプロジェクトが置いてあるフォルダだ。ISE12.2でもプロジェクトを読み込んでそのままインプリメントすることができる。
それでは、ISE12.1を立ち上げて、CamDispCntrler_DDR2_Capt_SCCB\Synth121のCamDisp_Cntrler_DDR2.xise プロジェクトを読み込もう。下がプロジェクトを読み込んだISE12.1だ。
CamDisp_DDR2_1_100927.png

例によって、Generate Programming Fileをダブルクリックすると、論理合成が始まって、bitファイルが生成される。
CamDisp_DDR2_2_100927.png

bitファイルが生成されたので、iMPACTでコンフィギュレーションすれば、画像が写るはずだ。その前に、液晶ディスプレイをVGA端子に接続すればだが。。。

実際に動作させてみた方は、コメント欄等でお知らせ下さい。よろしくお願いします。
  1. 2010年09月27日 05:58 |
  2. 画像処理
  3. | トラックバック:0
  4. | コメント:0

コマンドプロンプトからISimが起動できない

以前、ISimを起動するのにfuseコマンドで生成したISimの実行ファイルをGUIモードで起動すると、何の動作もしないという現象で悩んだことがある。(Spartan-3A Starter KitでCMOSカメラ・ディスプレイ回路のSCCB回路追加時のシミュレーション
今回やっていてまた、はまってしまった。ちなみにGUIモードを外すとアプリが落ちてしまう。環境変数を設定するための .bat ファイルsetting32.batを起動すれば問題なくISimがGUIモードで立ち上がるが、コマンドプロンプトを立ち上げたときに毎回setting32.batを起動するのは面倒だ。そこで、setting32.batの中身を見ると、単に正しいパスをXILINX環境変数とXILINX_DSP環境変数に代入して、パスに%XILINX%\bin\nt;%XILINX%\lib\ntを加えているだけだ。
そこで、根本的に修正するには環境変数を書き換えればいいじゃね?ということで、書き換えることにした。
Windows XPではシステムのプロパティから詳細設定タブを選んで、左下の環境変数ボタンをクリックすると、システム環境変数のしたの方に、XILINX環境変数とXILINX_DSP環境変数がいるので、ついでにXILINX_EDKも書き換えておく。最初の値を下の図に示す。(%XILINX%\bin\nt;%XILINX%\lib\ntは、すでにパスに書いてあった。)
ISim_Setting_1_100926.png

これを実際のパスに書き換えた。下の図。
ISim_Setting_2_100926.png

これで、問題なくISimがGUIモードで起動するようになった。

# しかし、ISEをインストールするときに、自分のパスを環境変数に設定するのをミスっているとは、相当、間が抜けている気がする。。。
  1. 2010年09月26日 05:14 |
  2. ISim
  3. | トラックバック:0
  4. | コメント:1

Micron社のFBGAパッケージのMarking Decoder

前にも書いたが、Micron社のFBGAパッケージのDDR2 SDRAMは型番が直接書いていない。
Marking Decoderのページのリンクが変わってしまったので、書いておく。
例えば、Spartan-3A Starter KitのDDR2 SDRAMのマーキングはD9GMG なので、FBGA Code:にD9GMG を入力して、Searchボタンをクリックすると、Part NumberがMT47H32M16BN-3:D と表示される。

Micron_FBGA_100925.png
  1. 2010年09月25日 16:14 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

MegaWizard Plug-In Manager で作った同期FIFOの動作を確かめる1

Xilinx用に作ったSDR SDRAMコントローラには、FIFOモジュールがあって、それは分散RAM(ルックアップテーブルを使用したRAM)を使用している。Altera のAN307では、MLABという小さい容量のメモリがあったので、それを使おうと思っていたら、どうやらCycloneシリーズにはMLABはないようだ。仕方がないので、勿体無いがM9K Memory Blockを使うしかない。
それだったら、Altera の同期FIFOの動作を見たことがなかったので、MegaWizard Plug-In Manager で生成してシミュレーションを行うことにした。
Quartus II のバージョンは10.0SP1。最初にQuartus II のToolsメニューからMegaWizard Plug-In Manager を選択する。そうするとMegaWizard Plug-In Manager ダイアログが開く。Next >をクリックする。
SFIFO_test_1_100924.png

次のダイアログで、左のペインのMemory Compilerを展開して、FIFOを選択する。Verilogを使うので、Verilog HDLのラジオボタンをクリックする。FIFOのファイル名を書く。Next >をクリックする。
SFIFO_test_2_100924.png

FIFOのダイアログが開く。FIFOの幅と深度を設定する。同期FIFOなので、ReadもWriteも同じクロックを選択する。Next >をクリックする。
SFIFO_test_3_100924.png

次は、fullやempty, usedwなどの設定だ。デフォルトのままNext >をクリックする。
SFIFO_test_4_100925.png

Show-ahead synchronous FIFO modeに設定する。Next >をクリックする。
SFIFO_test_5_100925.png

次はどれをクリックしてもResource Usageは変わらなかったし、デフォルトとする。Next >をクリックする。
SFIFO_test_6_100925.png

次もデフォルトのままとする。Next >をクリックする。
SFIFO_test_7_100925.png

Verilog HDL black-box file(SFIFO_module_bb.v)にはすでにチェックが入っているので、Instantiation template file(SFIFO_module_inst.v) ファイルにもチェックを入れて、Finishボタンをクリックする。
SFIFO_test_8_100925.png

なぜか?今生成したIPを自分のデザインに加えても良いか?というダイアログが出てきた。これは、自分のデザインに加えたくてIPを生成しているので、Automatically add Quartus II IP Files to all projects にチェックを入れてYseボタンをクリックした。
SFIFO_test_9_100925.png

これでSFIFO_moduleが生成された。SFIFO_module_bb.vの中身を下に示す。その他はコメントがいっぱいだが、実際のコードはこれだけだ。

module SFIFO_module (
    clock,
    data,
    rdreq,
    wrreq,
    empty,
    full,
    q,
    usedw);

    input      clock;
    input    [16:0]  data;
    input      rdreq;
    input      wrreq;
    output      empty;
    output      full;
    output    [16:0]  q;
    output    [3:0]  usedw;

endmodule


Instantiation template fileのSFIFO_module_inst.vを下に示す。

SFIFO_module    SFIFO_module_inst (
    .clock ( clock_sig ),
    .data ( data_sig ),
    .rdreq ( rdreq_sig ),
    .wrreq ( wrreq_sig ),
    .empty ( empty_sig ),
    .full ( full_sig ),
    .q ( q_sig ),
    .usedw ( usedw_sig )
    );


さて、トップファイルのSFIFO_test.vファイルを作って、プロジェクトに入れた。下にSFIFO_test.vファイルを示す。

// SFIFO_test.v 

`default_nettype none

module SFIFO_test(
    input    wire    clock,
    input    wire [16:0]    data,
    input    wire    rdreq,
    input    wire    wrreq,
    output    wire    empty,
    output    wire    full,
    output    wire [16:0]    q,
    output    wire [3:0]    usedw
);
    
SFIFO_module    SFIFO_module_inst (
    .clock ( clock ),
    .data ( data ),
    .rdreq ( rdreq ),
    .wrreq ( wrreq ),
    .empty ( empty ),
    .full ( full ),
    .q ( q ),
    .usedw ( usedw )
    );
endmodule


これで、一旦コンパイルしてみたところ、正常に終了した。
SFIFO_test_10_100925.png

Chip Plannerを立ち上げて、どのようにCyclone III の素子が使われているかを見てみた。
SFIFO_test_11_100925.png

ピンクの四角の中に、ちょっとだけだが使われている。この部分を拡大すると。
SFIFO_test_12_100925.png

M9K Memory Blockが使われているのがわかる。

今回はこの辺で。次はテストベンチを作って、シミュレーションをしてみるが、Quartus II ではテストベンチのテンプレートを生成してくれる方法はないのかな?
  1. 2010年09月24日 06:06 |
  2. QuartusⅡ
  3. | トラックバック:0
  4. | コメント:4

引き戸の製作(赤松集成材を縦切り)

今日は、涼しくなったので、久しぶりに木工を再開しました。今回は家で使う引き戸を作ります。家の引き戸は、台所と中廊下の間をしきっていますが、全部板で出来ているため廊下が暗いので、明かり取りというか、ほとんどアクリル板を入れる予定です。その桟を赤松集成材で作ります。下には戸車を入れる溝をトリマーで掘ります。
2100X400X25の赤松集成材をまずは70mm幅と85mm幅に丸のこで縦切りしました。
hikido_1_100923.jpg

上の写真は、もう1つの板をガイドにして、縦切りしたところです。これではどうも滑りが悪いので、買ってあったT字のガイドを丸のこに付けて縦切りにしました。この方が滑りやすく、切りやすかったです。
hikido_2_100923.jpg

大体切れました。次は、横桟を切って、トリマーで4mmのアクリル板を入れる溝を掘ります。
  1. 2010年09月23日 19:41 |
  2. 木工
  3. | トラックバック:0
  4. | コメント:0

XilinxのROMをAlteraのROMへ変換する

なひたふさんが、OV7670を使って1日でカラー画像をUSB経由でホストPCに表示するようにしたそうです。その記事は”OV7670のカラー表示”です。凄い技術力とバイタリティーですね。尊敬します。設定をUSB経由でGUIでいじれるようにしたのが素敵ですね。Spartan-3A Starter Kitでは、内部プロセッサでロータリーエンコーダーを使って、いじれるようにすれば良さそうですね。液晶画面に表示して。
それはそのうち、やることにして、DE0でCMOSカメラの出力をディスプレイに表示する回路を進めています。
現在はSCCBインターフェース回路をVHDLからVerilogに変換するところです。大体、変換は終了しました。

SCCB_reg_values_ROM.vhdはXilinx独自の記述でROMを生成しているが、Alteraでも生成できるのか?確かめてみることにした。VHDLからVerilogのXilinxのXST用ROM生成、初期化データロードファイルを作って、Quartus II 10.0SP1でコンパイルしてみることにした。
バグの修正が完了してコンパイルできたが、RAMの初期化データを見る方法がわからない。Chip Plannerでも初期化データを見ることは出来ないみたい?下がChip Plannerの画面。
CamDisp_DE0_2_100921.png

SCCB_reg_values_ROM.vで使用しているM9K Embedded Memory BlockをChip Planner上からダブルクリックすると、Resource Property Editor が起動した。
CamDisp_DE0_3_100921.png

これでも、初期化データは見れる気配がない。どうやって初期化データを見るのか?
ちなみに、書き換えたSCCB_reg_values_ROM.vを下に示す。

// SCCB_reg_valuse_ROM.v
// ROM生成、初期化データロード

`default_nettype none

module SCCB_reg_values_ROM (
    input    wire    clk,
    input    wire [7:0]     address,
    output    reg [15:0]    dout
);

    reg    [15:0] ram [0:255];
    
    initial begin
        $readmemh("SCCB_reg_values.data", ram, 0, 255);
    end
    
    always @(posedge clk) begin
        dout <= ram[address];
    end
endmodule

`default_nettype wire


初期化がうまく入っているのか?それとも無視されているのか?はQuartus IIのMessageウインドウを見ていたのではわからなかった。
CamDisp_DE0_4_100921.png

結局、Memory Blockが初期化されているか?いないかが良くわからないので、どうやって初期化するか、調べてみた。そうしたら、7. Quartus II インテグレーテッド・シンセシスの48ページに、ram_init_file 属性を適用する例が載っていた。下に引用する。

例7–35. Verilog-2001 例:ram_init_file 属性を適用
(* ram_init_file = "my_init_file.mif" *) reg [7:0] mem[0:255];


やはり、MIFファイルを作る必要がありそうだ。MIFファイルは前回、”QuartusⅡでSignalTapⅡを試してみるまでの準備3(キャラジェネROMデータをMIFに変換)”で、Rubyを使って、キャラジェネデータをMIFファイルに変換しているので、今回も変換するRubyスクリプトを作ることにする。

でも、MIFファイルでMemory Blockを初期化しても、本当に初期化されているかツールで見えないと困りますよね?どうやってみるんでしょうか?

(2010/9/23:追記)
FPGA BBSでくりさんに教えていただいたのですが、コンパイル時に、Memory Blockにどのファイルを読み込んだかは、Compilation ReportのFitter->Resource Section->RAM Summaryで確かめることができるそうです。くりさん、いつもありがとうございます。
早速確かめてみました。RAM Summaryを見ると、CamDisp_SDRAM.ram0_SCCB_reg_values_ROM_c9d0e141.hdl.mifという名前のMIFファイルが指定されていました。
CamDisp_DE0_5_100923.png

CamDisp_SDRAM.ram0_SCCB_reg_values_ROM_c9d0e141.hdl.mifの内容を見てみると、$readmemh("SCCB_reg_values.data", ram, 0, 255);で指定したファイルのデータが入っていました。
SCCB_reg_values.dataの内容に一部を下に示します。

1713
1801
32B6
1902
1A7A
030A
73F0
7A20
7B10
7C1E


下に、CamDisp_SDRAM.ram0_SCCB_reg_values_ROM_c9d0e141.hdl.mifの内容の一部を示します。

-- begin_signature
-- SCCB_reg_values_ROM
-- end_signature
WIDTH=16;
DEPTH=256;

ADDRESS_RADIX=UNS;
DATA_RADIX=BIN;

CONTENT BEGIN

..... 省略 ......

    10 :    0111110100110101;
    9 :    0111110000011110;
    8 :    0111101100010000;
    7 :    0111101000100000;
    6 :    0111001111110000;
    5 :    0000001100001010;
    4 :    0001101001111010;
    3 :    0001100100000010;
    2 :    0011001010110110;
    1 :    0001100000000001;
    0 :    0001011100010011;
END;


同じ内容になっている。ということはXilinxと同じ方法でMemory Blockの初期化ができることがわかりました。Quartus II のバージョンは10.0SP1です。
  1. 2010年09月21日 05:58 |
  2. QuartusⅡ
  3. | トラックバック:0
  4. | コメント:0

小学校の運動会

だいぶ書くのが遅れてしまいましたが、土曜日(18日)には、小学校の運動会がありました。
快晴の天気のもと、暑かったです。ビーチパラソルがいっぱいです。タープ、テントを持ち込んでいる人もいました。
undokai_1_100920.jpg

小6の娘の午前中の出し物は、徒競走、騎馬戦、ソーラン節、全校踊りでした。
待ちに待ったお弁当です。メニューは娘が好きなサンドイッチとおにぎり、おいなりさん、おかずはエビフライ、チキンボーン?、お漬物、デザートは梨、りんご、ぶどうです。豪華です。
undokai_2_100920.jpg

さて、午後は鼓笛隊、私も一緒に親子障害走に出ました。親子障害走は、子供の三輪車で始まって、大きなパンツに親子で入って走り、二人三脚でゴールです。
undokai_3_100920.jpg

暑い一日でした。
  1. 2010年09月20日 08:01 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

Spartan-3A Starter KitでCMOSカメラ・ディスプレイ回路27(VIOで8ビットのデータを取得)

昨日、Spartan-3A Starter KitでCMOSカメラ・ディスプレイ回路をFPGA-CAFEに持って行って、デモしてきた。画質は悪いが、ある程度、評価はしてもらえたかと思う。更には、Make Tokyou Meeting 06でデモ出来れば?と思っている。

現在は、DE0用にSCCBインターフェース回路をVerilogに変換中だが、Spartan-3A Starter KitでCMOSカメラ・ディスプレイ回路でも、現在は4ビット品質の画像しかディスプレイに出力していないので、8ビットの品質を見るためにVIOでYUVのデータを取得して、BMPファイルに変換して、画質を見てみた。(”Spartan-3A Starter KitでCMOSカメラ・ディスプレイ回路22(ソフトでYUV-RGB変換)”参照)
前回のChipScopeのVIOを追加したプロジェクトを改造して、SCCBインターフェース回路を入れた。そして、tclのデータ収集スクリプトを動かして、YUVのデータを取得した。それを、YUV-RGB変換、BMPフォーマット変換ソフトにかけて、BMPファイルにした。そうしたところ、黒のところに緑が出てしまうことがあって、おかしかった。そういえば、前回も黒の縁に緑が出ていた。
CamDispCntrler_DDR2_pict_14_100903.jpg

前回のソフトウェアをよく見てみたところ、YUV-RGB変換のところで値がマイナスになった時のアンダーフロー対応と256よりも値が大きくなった時の飽和処理がなかった事に気がついた。これを修正したCコードを下に示す。

        for (j=0; j<4; j++){
            r_int = (Y[j]<<8) + V[j]*359 - 45952;
            g_int = (Y[j]<<8) - V[j]*183 - U[j]*88 + 34688;
            b_int = (Y[j]<<8) + U[j]*454 - 58112;
            if (r_int <0)
                red = 0;
            else if (((r_int)>>8)>=256)
                red = 0xff;
            else
                red = (r_int)>>8;

            if (g_int<0)
                green = 0;
            else if (((g_int)>>8)>=256)
                green = 0xff;
            else
                green = (g_int)>>8;

            if (b_int<0)
                blue = 0;
            else if (((b_int)>>8)>=256)
                blue = 0xff;
            else
                blue = (b_int)>>8;

            cam_red[(int)(i/640)][(int)((i%640)+j)] = red;
            cam_green[(int)(i/640)][(int)((i%640)+j)]  = green;
            cam_blue[(int)(i/640)][(int)((i%640)+j)] = blue;
        }


これで、再度、以前の取得画像をBMPファイルに変換した。
CamDispCntrler_DDR2_pict_22_100920.jpg

黒のエッジに入っている緑色は無くなった。やはりアンダーフローだったのではないか?と思う。
次に今回取得した画像をBMPファイルに変換した。
CamDispCntrler_DDR2_pict_23_100920.jpg

やはり色は綺麗に見えている。だが、右下のフローリングの模様がブロックノイズぽい。実際に画面に出力してみないとわからないと思う。やはり、DACかDVIトランスミッタのICを付けてみたい。。。

  1. 2010年09月20日 04:14 |
  2. 画像処理
  3. | トラックバック:0
  4. | コメント:9

DE0にCMOSカメラを搭載2(概要2)

使用するQuartus IIは10.0SP1を使いたかったが、外部エディタの設定が無くなってしまったようだし、日本語も表示すると化けるので、9.1SP2を外部エディタにNotepad++を設定して、使うことにした。
現在は、SCCBインターフェース回路(CMOSカメラの設定レジスタを設定するI2C)をVHDLからVerilogへ変換中だ。
更に、”AN 307: Xilinx ユーザー向けのアルテラのデザイン・フロー”を読みながら、XilinxデザインからAlteraのデザインへ変換する必要がある。(勉強中です)
そうか、タイミング制約のファイル・フォーマットはSDCで、ツールはTimeQuest タイミング・アナライザ。これは前回使った。(”QuartusⅡでSignalTapⅡを試してみるまでの準備6(入力、出力ピンの制約とタイミング制約2)”)
Quartus II Assignment Editorでも、デザインのタイミングおよびデザイン配置の制約を割り当てることができるのか?レガシーなツールなのかな?これは前回使っていない。
しかし、自分のブログを見ると課題の解決方法が書いてあって、とてもためになる。SCCB用のROM記述をどうやって変換しようと思っていたが、前回はRubyでMIFファイルに変換したのだった。自分がやっていることの過程を書いておくと、後でとても便利だ。見返せる。忘れやすいので、とても助かる。

Quartus II 10.0SP1で、外部エディタを使う方法がわかったので、やはりQuartus IIは10.0SP1を使うことにした。設定は、Toolメニュー -> Option -> perferred Text Editorを選ぶとダイアログが開く。Alternate text editorを選んで、 Notepad++.exe とオプションを設定した。
CamDisp_DE0_1_100917.png

これで、エラー箇所をダブルクリックすると、エディタに表示されたエラー行がハイライトされた。

Quartus II におけるKEEP制約のかけ方。

( * keep = 1 *) wire my_wire;

AN 307: Xilinx ユーザー向けのアルテラのデザイン・フロー”に載っているデザイン例を後でやってみたい。
  1. 2010年09月17日 05:14 |
  2. Altera DE0ボード
  3. | トラックバック:0
  4. | コメント:0

DE0にCMOSカメラを搭載1(概要1)

”Spartan-3A Starter KitでCMOSカメラ・ディスプレイ回路”が完成した。やはり、RGB 4ビットだと特に単色の壁を写すと、階調が出てきて残念なことになる。色が派手なところを写す分には見栄えが良い。RGB 8ビットの場合の画像をVIO+TCLで引っ張ってきて、BMPファーマットに変換してみてみる必要がある。それをやれば、Spartan-3A Starter KitでCMOSカメラ・ディスプレイ回路は終了としようとおもう。(いろいろアイディアはあるんだが、mico32を載せて、LANを使って監視カメラにしたいとか、エッジを検出して顔認証してみたいとか?)
本当は、DACかDVIのICを載せて、RGB 8ビットで出せるようにしたいな!と思っている。後で、出来ればプロジェクトごとダウンロード出来るようにしたいと思っていが、いろいろな関係上まだ未定だ。

今回は、IntelのAtom E600で話題のAlteraのDE0にCMOSカメラを搭載して、DE0のVGAコネクタから画像を出力したいと思う。DE0のVGAはSpartan-3A Starter Kit同様、抵抗ラダーのRGB 4ビットなので、表示品質としては、今と変わりがないと思う。
DE0はSDR SDRAMが搭載されているので、それを画像バッファとして使用する。SDR SDRAMコントローラの動作周波数は100MHzとして、CAS Latency=2とする。SOPC BuilderでのAvalon MMマスタ接続で回路を構築して、SOPC Builder付属のSDR SDRAMコントローラを使おうかとも思ったが、FPGA技術の次の号でO氏が記事を書かれるとの噂があるので、かぶるし、それをみてからSOPC BuilderでのAvalon MMマスタ接続に挑戦しても良いので、今回は自作のSDR SDRAMコントローラで行くことにする。実は、DDR2 SDRAMコントローラを改造して、SDR SDRAM用にしたものが殆どできている。インターフェースがあっているので、”Spartan-3A Starter KitでCMOSカメラ・ディスプレイ回路”を少し手直しすれば使えると思う。
SDR SDRAMは16ビットで100MHz動作なので、200Mbytes/sec。CMOSカメラの書き込むスピードは8ビットで25MHz動作なので、25Mbytes/sec。8倍の速度差があるので、いけると思う。FIFOの部分はXilinxのRAM1X16Dプリミティブを使用しているので、その部分はAlteraのMegaWizard Plug-In Managerを使用して、FIFOをShow-ahead synchronous FIFO modeで生成して使おうと思っている。
問題はSCCBインターフェース回路だが、これは現在VHDLで書いてある。それにXilinx独自のROM記述をしているので、こっちも修正が必要だ。VHDLだと、その他がVerilogで書いてあるため、Quartus IIでコンパイル出来ても、ModelSimでシミュレーションが出来ない。どうしようか?やはり、このさいVerilogで書きなおそうかな?

CMOSカメラは、”Spartan-3A Starter KitでCMOSカメラ・ディスプレイ回路”の様に変換基板に搭載する。それ様のヘッダとユニバーサル基板も購入済みだ。DE0のコネクタは外側の方の40ピンコネクタGPIO1 (J5) を使おうと思う。ここに変換基板を挿して、CMOSカメラを搭載する。
  1. 2010年09月16日 05:34 |
  2. Altera DE0ボード
  3. | トラックバック:0
  4. | コメント:0

Spartan-3A Starter KitでCMOSカメラ・ディスプレイ回路26(YUV-RGB変換も写った)

Spartan-3A Starter KitでCMOSカメラ・ディスプレイ回路25(カラー画像が見えた)”ではRGB444フォーマットでCMOSカメラから出力されたデータをディスプレイに表示した。
以前からやっている、CMOSカメラからYUV422で出力されたデータをYUV-RGB変換回路を通して、ディスプレイに出力する回路をやってみた。LinuxのOV7670のドライバを参考にRGB444の設定部分をYUV422フォーマットの物に入れ替えた。そうして、インプリメントして表示してみると、今度はYUV422の方もディスプレイに表示することができた。良かった~。
でも、よく見ると、YUV422の方がRGB444よりもフレームごとに画素の値がすこし違っている感じがする。RGB444の方が画像がきれいだ。やはり、RGB444で行くことにする。
現在は4ビットだが、8ビットで表示するとどうなるんだろう?データをパソコンに送ることを考えると、データが8ビット長のモードを実験しておいたほうが良いと思う。

なお、DDR2 SDRAMはメモリがたくさんあるので、スライドスイッチの切り替えで8画面保存して置けるように回路を変更した。ディスプレイをみんなで見ながらキャプチャするのも楽しい。。。
  1. 2010年09月14日 05:44 |
  2. 画像処理
  3. | トラックバック:0
  4. | コメント:0

ジブリ美術館に行ってきた

昨日はジブリ美術館に行ってきました。12時からの入場なので、(入場時間が決まっていてWebページから予約します)9時ころ家を出て、三鷹まで行きました。メンバーはいつもの小6の娘と奥さんと私です。上の子供は付いてきません。
最初に昼食を食べました。私はパスタやさんでトマトとモッツァレラチーズのパスタを頼みました。冷たいパスタで美味しかったです。
さて、バス停に行きバスに乗りました。ジブリ美術館専用バスが走っています。
ghibli_1_100913.jpg

乗って7分くらいで到着。いました。あのラピュタのロボット。
ghibli_2_100913.jpg

ジブリ美術館の中に入りました。中は撮影禁止です。1階の最初は映画というか動画技術のいろいろです。連続した動作の絵を円盤に書いてあって、それをステッピングモーターで駆動して1瞬止めながら回して動画にする技術、連続した動作の模型を並べて、連続ストロボ発光して動画にする技術、フィルムの映画の展示がありました。普通のアニメも繰り返し上映していました。ちなみに、そこで使っていたアンプはオール真空管でした。300Bの2パラやALTECのアンプ、暗かったので良い雰囲気でした。良いですね。真空管アンプ欲しくなりました。
ミニ映画館があって、ショートアニメが上映されていたので、見てきました。タイトルは星をかった日。面白かったです。これを見ただけでも来て良かったです。
3階まで登るとネコバスがあって、小さい子供が乗って遊んでいました。そこから外に出るといました。ラピュタのロボット、大きいです。
ghibli_3_100913.jpg
ghibli_4_100913.jpg

横の小道の奥には、あのラピュタの箱がありました。
ghibli_5_100913.jpg

さて、もう一度中に入って2階へ。ここでは、映画の製作風景の机が置いてあったり、スケッチやラフスケッチが壁に貼ってあったり、そのような雰囲気が楽しめます。それから、ミニ映画館土星座の映画も紹介されていました。ショップもありました。買い物をしたのですが、ここで欲しかったのが、キツネリス(ナウシカの肩にいるやつです)の丸いステンドガラスです。欲しかったのですが、4万円を超えていました。これを買うくらいなら、なひたふさんのところのSpartan-6ボードを買います。仕方ないのでやめました。大体展示は見たので、カフェで休憩。
ghibli_6_100913.jpg

私は麦茶。奥さんはビール、娘はアイスを注文。ビールは特製の風の谷ビールでした。ピルスナータイプでいつも第3のビールを飲んでいる舌では、苦かったようです。ビールの後ろは購入したお土産の袋です。紅の豚の空賊ですね。
ghibli_7_100913.jpg

さて、もう少しうろうろしてから、帰りました。帰りは玉川上水を15分ほど歩いて行きました。いい街ですね。暑くなければ良い散歩道だと思います。
三鷹の駅に着くと、お祭りで神輿が出ていました。2基も出ていましたよ。大きい方は何トンもありそうな巨大神輿です。
ghibli_8_100913.jpg

とても暑かったですが、(35度)充実した一日でした。
  1. 2010年09月13日 05:18 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

ウッドテラスがスイカに占領された

去年作ったウッドテラスがスイカに占有されています。
発端は、スイカを食べたときにウッドテラスに種を飛ばしました。その種が発芽したようです。こんな風に占有されています。
suika_1_100912.jpg

このようにスイカが生育しています。
suika_2_100912.jpg

一番大きいのを、割ってみました。中は赤かったです。白いかも?と思っていました。
suika_3_100912.jpg

食べやすい大きさに切って食べてみました。甘い~。本当に美味しいです。意外でした。。。肥料も何も無いのに、こんなに甘くなるなんて。。。やはり、今年の猛暑のせいなんでしょうね?
早く実をすべて収穫して、ウッドテラスを占有されている状態から抜け出したいです。スイカを大事にしろと奥さんの厳命が出ています。ですが、邪魔ですよ。。。
  1. 2010年09月12日 22:37 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

Spartan-3A Starter KitでCMOSカメラ・ディスプレイ回路25(カラー画像が見えた)

前回、RGB444モードにしたが、やはり、ピンクぽい色は解消されず、また色もあまり出ていないようだった。OV7670でいろいろ検索しているとLinuxのOV7670のドライバを発見した。(くりさんにもコメントで教えていただきました。ありがとうございました。)
ov7670.cのregval_list ov7670_default_regs[]を見たところ強烈に多い設定がされていた。こんなに設定する必要があるの!!!ということで、しょうがないので、がんばって、SCCBレジスタ設定用のデータファイル (SCCB_reg_values.data) に変換した。(全部で、128個のレジスタに値を書き込みました)
最初に全部くらい入れるとディスプレイ画面が真っ暗になってしまう。おかしいということで、1/2法で1/2ずつにしていって原因を特定した。そうしたら、PLLの設定がされているのが原因だということがわかった。input clockX4倍とかになっていたので、バイパスに設定した。これで画面が出るようになった。
今度は少しずつ戻していって、画面の色の様子を確かめた。途中で画像が青くなってしまった。なぜ~?と思って、いろいろなところを写してみたが、どうやら、青が赤と入れ替わっているようだった。そこで、VGA_Display_Controller でRとBのビットフィールドを入れ替えたら、ちゃんと色が出るようになった。やったー!!!うれしいです。苦労しただけに。。。下に画像を示す。
CamDispCntrler_DDR2_pict_18_100912.jpg

家のちらかっているリビングです。まあまあの色が出ていると思います。壁をみるとRGB各4ビットということがわかると思う。その他はまあまあの写りになっているのではないでしょうか?

しかし、まだ疑問が残る。。。OV7670のマニュアルでは、8ビット幅のデータ出力から、4ビットずつxR,GBと出てくるはずなのに、どうもxB,GRと出ているように見える。そこで、赤と青の物を写して、OV7670から出てくる信号がどう変化するかを、ChipScope Proで観測してみることにした。
まずは青いものとして、青い表紙のクリアファイルを写してみた。直接写すと、照明が写って白飛びする。ファイルの表紙が半透明なので、透過させて写すと良い感じになった。(下の写真)
CamDispCntrler_DDR2_pict_19_100912.jpg

これを、CMOSカメラのフレームの最初の部分にトリガをかけてChipScope Proで見た。それを下の図に示す。
CamDispCntrler_DDR2_46_100911.png

上の図でmaster_syncがCMOSカメラのフレームの最初の部分を示す同期信号だ。cam_href_2dが1の時にcam_data_2dに有効なデータが出ている。その8ビットデータは、cam_cont_afifo/dinで16ビットに変換されて、wr_enが1の時に有効な16ビットデータとなって非同期FIFOに書かれている。これを見ると、最初のcam_cont_afifo/dinの有効なデータは4943であるので、xRGB (各4ビット) とすれば、青いものを写しているのに、Rの方がBより値が大きくなっている。やはり、xBGRの順のようだ。やはり、データーシートが間違っているのか?
次に、VGA_Display_Controllerでも見てみた。これは、CMOSカメラで見た時と異なった時間の値を取っているので、値が異なる。
CamDispCntrler_DDR2_47_100911.png

h_v_is_zero_node が1の時にVGA_Display_Controllerのフレームがスタートする。(h_count, v_count = 0) rd_enが1の時にcamd_afifo_inst_doutに画像データが出てくる。最初のデータは3933だ。当然ながら、ここでもxBGRの順番になっているようだ。

次に青だけでは評価できないので、赤もやってみた。なかなか良いのが無かったが、赤っぽいクリアファイルがあったのでやってみた。下に写真を示す。
CamDispCntrler_DDR2_pict_20_100912.jpg

VGA_Display_Controllerで見た時のChipScope Proの波形を下に示す。
CamDispCntrler_DDR2_48_100911.png

最初のデータは7879となっていて、やはり、xBGRを示しているようだ。
ということで、やはり、データーシートがおかしいという結論になった。
応援していただいた皆様、twitterでもいろいろアドバスをいただいて、本当にありがとうございました。下に現在のSpartan3 Starter Kitの様子の写真を示す。
CamDispCntrler_DDR2_pict_21_100912.jpg

SCCBインターフェースへの配線は変換基板のヘッダから接続コードでSpartan3 Starter KitのTXヘッダに接続されている。SCCBインターフェースの動作周波数は100KHzなので、動作に問題はないようだ。

次は、YUV-RGB変換をもう一度試してみるのと、DDR2 SDRAMコントローラにOVLアサーションを入れてみたい。論理合成できるはずなので、それも試してみたい。
DE0に移植してみたい。SOPC Builderのマスタデバイスは、長船さんとかぶるので、次のFPGA技術がでた後の課題として残しておいて、自作のSDR SDRAMコントローラで試してみたい。VHDLでもシミュレーション、インプリメントができることが実証されたので、VHDLでも良いよね?(しまった。これはAlteraの話でしたね。AlteraもコンパイルはVHDL, Verilog混在環境で行けるのでしょうか?ModelSim AEは混在環境だめですよね?)
変換基板をCADで設計してみたいな。需要はあるのだろうか?

ともかく今日は、こんどこそ、ジブリ美術館に奥さんと娘と行ってきます。(8月に一度行こうとしたのだが、娘の具合が悪くなって、飯田橋駅で引き返してきた。。。)
  1. 2010年09月12日 04:38 |
  2. 画像処理
  3. | トラックバック:0
  4. | コメント:0

Spartan-3A Starter KitでCMOSカメラ・ディスプレイ回路24(RGB444モード)

いままで、デフォルトのYUVモードでYUV-RGB変換回路を通して、RGB4ビット分をSpartan-3A Starter KitのVGAポートから出力していた。今回は、SCCBインターフェース回路を付けて、CMOSカメラを制御できるようになった。そこで、CMOSカメラをRGB444モード(RGBが4ビットずつのデータとして出力されるモード)に設定して、そのRGBをそのままSpartan-3A Starter KitのVGAポートから出力することにした。
やってみた結果は、やはり、ピンクぽかった。おかしいのは、赤を見ると緑に見える。
CamDispCntrler_DDR2_pict_15_100910.jpg

いろいろその他の設定をしてみたが、あまり変化がなかった。ちなみに元の色はこんな色だ。
CamDispCntrler_DDR2_pict_16_100910.jpg

赤と緑を取り替えると、緑がかっているが、すこしはそれらしい色になる。少し色がおかしいが、これが一番まともだな?
CamDispCntrler_DDR2_pict_17_100910.jpg

どうしようかな?やはり、CMOSカメラがおかしいのだろうか?設定がおかしいとしても、BやRのゲインをいじったつもりでもあまり変化がない?AGCやAWB、AECを切ってみたのだが、やはり、あまり変化がないんだよな~???

aitendoのもう1つのカメラモジュール、カメラモジュール(OV9655)[CAMERA130W-OV9655]にしてみようかな?これだと、ピン配置が違うので、もう1度変換基板を作る必要があるな。。。それにモジュール回路図を見るとCMOSカメラのDVDDの1.8Vがどうなっているか書いていない!!! aitendoに問い合わせ中。

そういえばディスプレイがおかしいということはないかな?RGBはパソコンからつないで使ったことないし、DVIのみだしね。他にディスプレイで確かめてみようか?でも、白黒がうまく出ているから、おかしくないよな?白黒はRGB同じ値を入れているんだから、RGBどれかがおかしくても白黒にならないはず。。。
  1. 2010年09月10日 05:09 |
  2. 画像処理
  3. | トラックバック:0
  4. | コメント:5

Xilinx用のダウンロードケーブル

日昇テクノロジーから、今メールが着ていまして、それにはXILINX USBダウンロードケーブルの宣伝が書いてありました。
製品概要を引用します。

製品概要
  ■ Platform Cable USBの互換品
  ■USBインタフェース、USB1.1 とUSB2.0両方サポートする。
    Hot plug and playをサポートする。
    Full-SpeedとHi-Speedをサポートする
  ■USBで給電、外部電源要らない
  ■ターゲットボードによって自動認識して1.5V~5Vの電源を提供する
    (5V (TTL), 3.3V(LVCMOS), 2.5V, 1.8V and 1.5V)
  ■iMPACT とChipScopeをサポートする
  ■JTAG Boundary Scan、Slave Serial、
    Serial Peripheral Interface SPIモードをサポートする
  ■JサポートするOS
    ――Microsoft Windows XP Professional
    ――Microsoft Windows Vista
    ――Windows 2000
    ――Red Hat Enterprise Linux
    ――SUSE Linux Enterprise
  ■USB-IF認証、CEとFCC規格を満たす


XILINX USBダウンロードケーブルのWebページをみると、Xilinxと書いてありますね???
本当ならば安いですね。iMPACTでもChipScopeも使えるそうですし。。。でも、対応FPGAリストにVirtex-6とSpartan-6がないですね。。。
日昇テクノロジーには、Lattice、Altera、Xilinxのダウンロードケーブルが売っています。私は、ここのAlteraのダウンロードケーブルを持っています。日昇テクノロジーのボードしかもっていませんが、問題なくダウンロード出来ています。
しかし、どうして、Xilinxが一番高いんでしょうか???
  1. 2010年09月10日 03:57 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

Cyclone III のお勉強2

今日はQuartusII 10.0 SP1のWebインストールを試みたが、1%から進まない。そこで、個別にダウンロードしたらダウンロードできた。今からインストールする。今のところiTunesアップデートとiPhoneのOS4.1のインストールをしているので、終了したら、やってみようと思っている。

さて、だいぶ間があいてしまったが、”Cyclone III のお勉強1”の続き。
さて、M9Kメモリ・ブロックはXilinxで言うとBlock RAMか?Spartan3用のブロックRAMは18Kビットなので、半分の粒度だな。256X36ビットまでいけるらしい。ROM、RAMはあたりまえだが、FIFOとしてもコンフィギュレーションできるのか?
エンベデッド・マルチプライヤも持っているみたい。9X9、2個か18X18、1個として使えるようだ。
I/O機能はLVTTLやLVCMOS,SSTL,LVDSなどなどを選ぶことができるみたいだ。
クロック・ネットワークおよびPLL、20個のグローバル・ネットワークを持っている。これは、Xilinxみたいにリージョンはないのだろうか?PLLは4個持っている。AlteraはDLLは無しで、PLLのみ。
DDR2 SDRAM メモリ・インタフェースは、最大400 Mbps のデータ・レートをサポートするそうだ。これはSpartan-3Aよりも転送レートが高い。(333Mbps)

QuartusII 10.0 SP1とModelSim AE, Nios2もインストールできた。
  1. 2010年09月09日 05:57 |
  2. AlteraのFPGA
  3. | トラックバック:0
  4. | コメント:0

Spartan-3A Starter KitでCMOSカメラ・ディスプレイ回路のSCCB回路追加時のシミュレーション

SCCBインターフェース回路を追加した時のSpartan-3A Starter KitでCMOSカメラ・ディスプレイ回路シミュレーションをISimでやってみた。今回は、ISimの話題が主なので、カテゴリはISimとする。
だいぶ試行錯誤したが、やっとISimの画面が出てきた。

前回の”ISim単体でシミュレーション”では、vhpcompでコンパイルして、fuseでリンクして、できたISimの実行形式ファイルを実行した。今回は、ISimのvlogcompやvhpcompを使用しないで、(と行っても内部では使っていると思うが。。。)fuseコマンドのみでコンパイルを試みる。それにはプロジェクトを作成する。作成したCamDispCntrler_DDR2_Capt_SCCB_tb.prjを下に示す。

verilog work ../../../DDR2_SDRAM_cont_266/Sources/ddr2_sdram_cont/addr_fifo.v
verilog work ../../../DDR2_SDRAM_cont_266/Sources/ddr2_sdram_cont/async_fifo_fall.v
verilog work ../../../DDR2_SDRAM_cont_266/Sources/ddr2_sdram_cont/async_fifo_rise.v
verilog work ../../../DDR2_SDRAM_cont_266/Sources/ddr2_sdram_cont/controller.v
verilog work ../../../DDR2_SDRAM_cont_266/Sources/ddr2_sdram_cont/dcm_module.v
verilog work ../../../DDR2_SDRAM_cont_266/Sources/ddr2_sdram_cont/ddr2_cont_iob.v
verilog work ../../../DDR2_SDRAM_cont_266/Sources/ddr2_sdram_cont/dm_io_pad.v
verilog work ../../../DDR2_SDRAM_cont_266/Sources/ddr2_sdram_cont/dq_io_pad.v
verilog work ../../../DDR2_SDRAM_cont_266/Sources/ddr2_sdram_cont/dqs_io_pad.v
verilog work ../../../DDR2_SDRAM_cont_266/Sources/ddr2_sdram_cont/dqsb_io_pad.v
verilog work ../../../DDR2_SDRAM_cont_266/Sources/ddr2_sdram_cont/rddata_afifo.v
verilog work ../../../DDR2_SDRAM_cont_266/Sources/ddr2_sdram_cont/read_write_io.v
verilog work ../../../DDR2_SDRAM_cont_266/Sources/ddr2_sdram_cont/REFREQSM.v
verilog work ../../../DDR2_SDRAM_cont_266/Sources/ddr2_sdram_cont/wrdata_fifo.v
verilog work ../../../DDR2_SDRAM_cont_266/Sources/ddr2_sdram_cont/ddr2_sdram_cont.v
verilog work "../../Synth122/ipcore_dir/cam_cont_afifo.v"
verilog work "../../Synth122/ipcore_dir/cam_data_afifo.v"
verilog work ../../Sources/SWDiv.v
verilog work ../../Sources/SW_Controller.v
verilog work ../../Sources/VGA_Display_Controller.v
verilog work ../../Sources/Arbiter.v
verilog work ../../Sources/Camera_Controller.v
verilog work ../../Sources/dcm_CAM_DDR2_clk.v
verilog work ../../Sources/synchronizer.v
vhdl work ../../Sources/freqdiv.vhd
vhdl work ../../Sources/One_Transaction_SCCB.vhd
vhdl work ../../Sources/SCCB_Reg_Controller.vhd
vhdl work ../../Sources/SCCB_reg_values_ROM.vhd
verilog work ../../Sources/CamDisp_Cntrler_DDR2.v
verilog work ../OV7670_Model.v
verilog work H:\HDL\FndtnISEWork\Spartan3A_starter_kit\DDR2_SDRAM_cont_266\Simulation\256Mb_ddr2\ddr2.v
verilog work ../CamDispCntrler_DDR2_tb.v
verilog work H:\HDL\Xilinx\12.2\ISE_DS\ISE\verilog\src\glbl.v


プロジェクトを読み込んで、コンパイルとリンクするfuseコマンドは下のようになった。

H:\HDL\Xilinx\12.2\ISE_DS\ISE\bin\nt\fuse work.CamDispCntrler_DDR2_tb work.glbl -incremental -d OVL_VERLOG -i ..\ -i H:\HDL\OVL\std_ovl -d OVL_ASSERT_ON -d OVL_FINISH_OFF -L unisims_ver=H:\HDL\Xilinx\12.2\ISE_DS\ISE\verilog\hdp\nt\unisims_ver -L unimacro_ver=H:\HDL\Xilinx\12.2\ISE_DS\ISE\verilog\hdp\nt\unimacro_ver -L XilinxCoreLib_ver=H:\HDL\Xilinx\12.2\ISE_DS\ISE\verilog\hdp\nt\xilinxcorelib_ver -L accellera_ovl_vlog=H:\HDL\Xilinx\12.2\ISE_DS\ISE\verilog\hdp\nt\accellera_ovl_vlog -o CamDispCntrler_DDR2_tb.exe -prj CamDispCntrler_DDR2_Capt_SCCB_tb.prj


ライブラリへのリンク "-L" は、ライブラリへのパスを指定しないと駄目だった。(ここでFIFOジェネレータのインスタンスがないと言われて、だいぶ試行錯誤しました)
これで、下のようにISimの実行形式をGUIで起動すれば良いはずだったが、起動しなかった。(肩透かしを食らった気分。。。)

CamDispCntrler_DDR2_tb.exe -gui


(注:fuse.exeの実行とISimの実行形式の起動は、CamDispCntrler_DDR2_tb.batというバッチファイルに書いて実行しています)

電気回路/HDL/ISim 事始めのバッチモードでの起動”を見ると、”環境変数を設定するための .bat ファイルがC:\Xilinx\12.2\ISE_DS\ISE\settings32.bat にあったので、それを実行したらうまくいきました。”と書いてあったので、やってみたらISimが起動した。(やったー。。。武内さん、ありがとうございます) (2010/9/28追記:もっとうまい方法が見つかったので、”コマンドプロンプトからISimが起動できない”に書いた)
起動した時のログを下に示す。

Running: H:\HDL\Xilinx\12.2\ISE_DS\ISE\bin\nt\unwrapped\fuse.exe work.CamDispCnt
rler_DDR2_tb work.glbl -incremental -d OVL_VERLOG -i ..\ -i H:\HDL\OVL\std_ovl -
d OVL_ASSERT_ON -d OVL_FINISH_OFF -L unisims_ver=H:\HDL\Xilinx\12.2\ISE_DS\ISE\v
erilog\hdp\nt\unisims_ver -L unimacro_ver=H:\HDL\Xilinx\12.2\ISE_DS\ISE\verilog\
hdp\nt\unimacro_ver -L XilinxCoreLib_ver=H:\HDL\Xilinx\12.2\ISE_DS\ISE\verilog\h
dp\nt\xilinxcorelib_ver -L accellera_ovl_vlog=H:\HDL\Xilinx\12.2\ISE_DS\ISE\veri
log\hdp\nt\accellera_ovl_vlog -o CamDispCntrler_DDR2_tb.exe -prj CamDispCntrler_
DDR2_Capt_SCCB_tb.prj
ISim M.63c (signature 0xb869381d)
Number of CPUs detected in this system: 2
Turning on mult-threading, number of parallel sub-compilation jobs: 4
Determining compilation order of HDL files
WARNING:Simulator:1010 - One or more environment variables have been detected wh
ich affect the operation of the C compiler. These are typically not set in stand
ard installations and are not tested by Xilinx, however they may be appropriate
for your system, so the flow will attempt to continue. If errors occur, try run
ning fuse with the "-mt off -v 1" switches to see more information from the C co
mpiler. The following environment variables have been detected:
C_INCLUDE_PATH
LIBRARY_PATH
Analyzing Verilog file \"../../../DDR2_SDRAM_cont_266/Sources/ddr2_sdram_cont/ad
dr_fifo.v\" into library work
Analyzing Verilog file \"../../../DDR2_SDRAM_cont_266/Sources/ddr2_sdram_cont/as
ync_fifo_fall.v\" into library work
Analyzing Verilog file \"../../../DDR2_SDRAM_cont_266/Sources/ddr2_sdram_cont/as
ync_fifo_rise.v\" into library work
Analyzing Verilog file \"../../../DDR2_SDRAM_cont_266/Sources/ddr2_sdram_cont/co
ntroller.v\" into library work
Analyzing Verilog file \"../../../DDR2_SDRAM_cont_266/Sources/ddr2_sdram_cont/dc
m_module.v\" into library work
Analyzing Verilog file \"../../../DDR2_SDRAM_cont_266/Sources/ddr2_sdram_cont/dd
r2_cont_iob.v\" into library work
Analyzing Verilog file \"../../../DDR2_SDRAM_cont_266/Sources/ddr2_sdram_cont/dm
_io_pad.v\" into library work
Analyzing Verilog file \"../../../DDR2_SDRAM_cont_266/Sources/ddr2_sdram_cont/dq
_io_pad.v\" into library work
Analyzing Verilog file \"../../../DDR2_SDRAM_cont_266/Sources/ddr2_sdram_cont/dq
s_io_pad.v\" into library work
Analyzing Verilog file \"../../../DDR2_SDRAM_cont_266/Sources/ddr2_sdram_cont/dq
sb_io_pad.v\" into library work
Analyzing Verilog file \"../../../DDR2_SDRAM_cont_266/Sources/ddr2_sdram_cont/rd
data_afifo.v\" into library work
Analyzing Verilog file \"../../../DDR2_SDRAM_cont_266/Sources/ddr2_sdram_cont/re
ad_write_io.v\" into library work
Analyzing Verilog file \"../../../DDR2_SDRAM_cont_266/Sources/ddr2_sdram_cont/RE
FREQSM.v\" into library work
Analyzing Verilog file \"../../../DDR2_SDRAM_cont_266/Sources/ddr2_sdram_cont/wr
data_fifo.v\" into library work
Analyzing Verilog file \"../../../DDR2_SDRAM_cont_266/Sources/ddr2_sdram_cont/dd
r2_sdram_cont.v\" into library work
Analyzing Verilog file \"../../Synth122/ipcore_dir/cam_cont_afifo.v\" into libra
ry work
Analyzing Verilog file \"../../Synth122/ipcore_dir/cam_data_afifo.v\" into libra
ry work
Analyzing Verilog file \"../../Sources/SWDiv.v\" into library work
Analyzing Verilog file \"../../Sources/SW_Controller.v\" into library work
Analyzing Verilog file \"../../Sources/VGA_Display_Controller.v\" into library w
ork
Analyzing Verilog file \"../../Sources/Arbiter.v\" into library work
Analyzing Verilog file \"../../Sources/Camera_Controller.v\" into library work
Analyzing Verilog file \"../../Sources/dcm_CAM_DDR2_clk.v\" into library work
Analyzing Verilog file \"../../Sources/synchronizer.v\" into library work
Analyzing Verilog file \"../../Sources/CamDisp_Cntrler_DDR2.v\" into library wor
k
Analyzing Verilog file \"../OV7670_Model.v\" into library work
Analyzing Verilog file \"H:\HDL\FndtnISEWork\Spartan3A_starter_kit\DDR2_SDRAM_co
nt_266\Simulation\256Mb_ddr2\ddr2.v\" into library work
Analyzing Verilog file \"../CamDispCntrler_DDR2_tb.v\" into library work
Analyzing Verilog file \"H:\HDL\Xilinx\12.2\ISE_DS\ISE\verilog\src\glbl.v\" into
library work
Parsing VHDL file "../../Sources/freqdiv.vhd" into library work
Parsing VHDL file "../../Sources/One_Transaction_SCCB.vhd" into library work
Parsing VHDL file "../../Sources/SCCB_Reg_Controller.vhd" into library work
Parsing VHDL file "../../Sources/SCCB_reg_values_ROM.vhd" into library work
Starting static elaboration
WARNING:HDLCompiler:1016 - "../CamDispCntrler_DDR2_tb.v" Line 65: Port addr_is_z
ero is not connected to this instance
Completed static elaboration
Fuse Memory Usage: 69056 KB
Fuse CPU Usage: 530 ms
Using precompiled package standard from library std
Using precompiled package std_logic_1164 from library ieee
Using precompiled package std_logic_arith from library ieee
Using precompiled package std_logic_unsigned from library ieee
Using precompiled package textio from library std
Using precompiled package std_logic_textio from library ieee
Compiling module dcm_clock_divide_by_2
Compiling module dcm_maximum_period_check(clock_n...
Compiling module dcm_maximum_period_check(clock_n...
Compiling module dcm_clock_lost
Compiling module DCM(CLKDV_DIVIDE=2.0,CLKFX_DIVID...
Compiling module BUFG
Compiling module dcm_CAM_DDR2_clk_default
Compiling module ODDR2_default
Compiling module DCM(CLKDV_DIVIDE=16.0,CLKIN_PERI...
Compiling module dcm_module_default
Compiling module refreqsm
Compiling module controller_default
Compiling module ODDR2(SRTYPE="ASYNC")
Compiling module IOBUF
Compiling module dq_io_pad
Compiling module dqs_io_pad
Compiling module dqsb_io_pad
Compiling module OBUF
Compiling module dm_io_pad
Compiling module ddr2_cont_iob_default
Compiling module RAM16X1D
Compiling module async_fifo_rise
Compiling module async_fifo_fall
Compiling module rddata_afifo_default
Compiling module read_write_io_default
Compiling module addr_fifo_default
Compiling module wrdata_fifo_default
Compiling module ddr2_sdram_cont_default
Compiling module fifo_generator_v6_1_bhv_ver_as(C...
Compiling module fifo_generator_v6_1_bhv_ver_prel...
Compiling module FIFO_GENERATOR_V6_1(C_DATA_COUNT...
Compiling module cam_cont_afifo
Compiling module Camera_Controller
Compiling module fifo_generator_v6_1_bhv_ver_as(C...
Compiling module fifo_generator_v6_1_bhv_ver_prel...
Compiling module FIFO_GENERATOR_V6_1(C_DATA_COUNT...
Compiling module cam_data_afifo
Compiling module VGA_Display_Controller(VGA_CON_S...
Compiling module Arbiter_default
Compiling module synchronizer
Compiling module SWDiv(clk_frequency=25000)
Compiling module SW_Controller
Compiling module CamDisp_Cntrler_DDR2_default
Compiling module ddr2_default
Compiling module OV7670_Model(H_ACTIVE_VIDEO=20,H...
Compiling module CamDispCntrler_DDR2_tb
Compiling module glbl
Compiling package vcomponents
Compiling architecture rtl of entity freqdiv [\FreqDiv(125)\]
Compiling architecture rtl of entity sccb_reg_values_rom [sccb_reg_values_rom_de
fault]
Compiling architecture rtl of entity one_transaction_sccb [one_transaction_sccb_
default]
Compiling architecture rtl of entity sccb_reg_controller [sccb_reg_controller_de
fault]
Time Resolution for simulation is 1ps.
Waiting for 1 sub-compilation(s) to finish...
Compiled 15 VHDL Units
Compiled 48 Verilog Units
Built simulation executable CamDispCntrler_DDR2_tb.exe
Fuse Memory Usage: 87812 KB
Fuse CPU Usage: 1734 ms


ISimが起動したので、信号を波形ウインドウに入れて、コンソールからrun allを入力して、0usecから500usecまでシミュレーションを行った。下にISimの波形を示す。
CamDispCntrler_DDR2_45_100908.png

cam_sio_cとcam_sio_dがSCCBの入出力だ。クロック周波数は100KHzになっている。これで、ISimによるVerilog、VHDL混在シミュレーションは終了とする。

後はRGB444のSCCBの設定とRGB444を受ける回路に書き換える。
  1. 2010年09月08日 06:01 |
  2. ISim
  3. | トラックバック:0
  4. | コメント:0

Spartan-3A Starter KitでCMOSカメラ・ディスプレイ回路23(SCCBインタフェース回路)

Spartan-3A Starter KitでCMOSカメラ・ディスプレイ回路22(ソフトでYUV-RGB変換)”でVIOで取り込んだデータをBMPファイルにしてみたが、やはり、色がおかしかった。そこで、CMOSカメラの設定を行うSCCBインタフェース回路を実装することになった。SCCBインタフェース回路は、”SCCBインタフェース回路の実装1(タイミングチャート)”からの実装で、もうすでに出来上がっている。これを使えばOKのはず。。。ということで実装しようとしたら、VHDLで書いてあるのだった。よしそれでは、Verilogに変換しようと思ったが、面倒だ。そうだ、もしかしてISimにすれば、以前混在シミュレーションもできた(”ISimでOVLのVHDL, Verilog混在シミュレーション(ISimでシミュレーション)”)ので、大丈夫なはず。。。
それにISEもVHDL, Verilog混在環境で行けたはずということで、やってみることにした。
Project NavigatorのDesignウインドウのHierarchyにNew Source...からSCCBインターフェース回路をプロジェクトに追加した。
CamDispCntrler_DDR2_42_100907.png

プロジェクトに入れることができた。これで論理合成、インプリメントをすると問題なく、パスした。
CamDispCntrler_DDR2_43_100907.png

FPGA Editorでコンポーネントがあるかどうか見てみたが問題ない様だった。下の図に、FPGA Editorのリストウインドウを示す。
CamDispCntrler_DDR2_44_100907.png

次は、ISimでシミュレーションしてみる。
  1. 2010年09月07日 05:40 |
  2. 画像処理
  3. | トラックバック:0
  4. | コメント:0

ArbiterのアサーションをOVLに変更

昨日、FPGA-CAFEでSCCBの配線をハンダ付けしてきたので、SCCBを追加するつもりなのだけれど、その前に、以前に”Spartan-3A Starter KitでCMOSカメラ・ディスプレイ回路6(シミュレーション2)”で書いたArbiterのVerilogアサーションをOVLにしてみた。

アドレスが4増加しているアサーションにovl_transitionを使おうと思ったのだが、どうもうまく行かなかった。結局、enableに条件を入れて、ovl_alwaysを使うことにした。なかなかいろいろなアサーションのうちどれを使うかが難しい。次は、DDR2 SDRAMコントローラにアサーションを入れる予定なので、その時にはいろいろなOVLアサーションを使えると期待している。
下に、ArbiterのOVLアサーションを示す。

    // アサーション
    // synthesis translate_off
    always @ (posedge clk_ddr2) begin
        if (reset_ddr2) begin
            camc_addr_1d <= 0;
            vgadc_addr_1d <= 0;
            addr_assertion_valid <= 1'b0;
        end else begin
            if (ddr2_addr_we) begin
                camc_addr_1d <= camc_addr;
            end
            if (vgadc_addr_we) begin
                vgadc_addr_1d <= vgadc_addr;
            end
            if (ddr2_addr_we || vgadc_addr_we) begin
                addr_assertion_valid <= 1'b1;
            end
        end
    end
    
    // Camera_Controller が有効の時にVGA_Display_Controller がライトしないことをチェックするOVLアサーション
    ovl_never #(`OVL_ERROR, `OVL_ASSERT, "ERROR : Camera_Controller が有効の時にVGA_Display_Controller がライトした", `OVL_COVER_DEFAULT, `OVL_POSEDGE, `OVL_ACTIVE_HIGH, `OVL_GATE_CLOCK) camc_vga_we_assertion (clk_ddr2, reset_ddr2, 1'b1, (cs_abt==CAMC_Grant || cs_abt==VGADC_Wait) && vgadc_addr_we, fire_camc_vgac);
    
    // 現在のCamera_Controller からのWrite Addressが以前のWrite Addressの+4かどうかをチェックするOVLアサーション
    ovl_always #(`OVL_ERROR, `OVL_ASSERT, "ERROR : 以前のcamc_addr から+4されていない", `OVL_COVER_ALL, `OVL_POSEDGE, `OVL_ACTIVE_HIGH, `OVL_GATE_CLOCK) camc_addr_assertion (clk_ddr2, reset_ddr2, camc_addr>=4 && (cs_abt==CAMC_Grant || cs_abt==VGADC_Wait) && ddr2_addr_we , camc_addr_1d+4==camc_addr, fire_camc_addr);
    
    // VGA_Display_Controller が有効の時にCamera_Controller がライトしないことをチェックするOVLアサーション
    ovl_never #(`OVL_ERROR, `OVL_ASSERT, "ERROR : VGA_Display_Controller が有効の時に、camc_addr_ena, camc_data_ena が1になった", `OVL_COVER_DEFAULT, `OVL_POSEDGE, `OVL_ACTIVE_HIGH, `OVL_GATE_CLOCK) vgac_camc_we_assertion (clk_ddr2, reset_ddr2, 1'b1, (cs_abt==VGADC_Grant || cs_abt==CAMC_Wait) && (ddr2_addr_we || ddr2_addr_we), fire_vgac_camc);
    
    // 現在のVGA_Display_Controller からのRead Addressが以前のRead Addressの+4かどうかをチェックするOVLアサーション
    ovl_always #(`OVL_ERROR, `OVL_ASSERT, "ERROR : 以前のvgadc_addr から+4されていない", `OVL_COVER_ALL, `OVL_POSEDGE, `OVL_ACTIVE_HIGH, `OVL_GATE_CLOCK) vgadc_addr_assertion (clk_ddr2, reset_ddr2, vgadc_addr>=4 && (cs_abt==CAMC_Grant || cs_abt==VGADC_Wait) && ddr2_addr_we , vgadc_addr_1d+4==vgadc_addr, fire_vgac_addr);
    
    // Camera_Controller がFIFOがフルの時に書き込んでいるか?をチェックするアサーション
    ovl_never #(`OVL_ERROR, `OVL_ASSERT, "ERROR : アドレスFIFOがフルの時にCamera_Controller が書き込んだ", `OVL_COVER_DEFAULT, `OVL_POSEDGE, `OVL_ACTIVE_HIGH, `OVL_GATE_CLOCK) camc_addr_full_we_assertion (clk_ddr2, reset_ddr2, 1'b1, ddr2_addr_we && ddr2_addr_fifo_full, fire_camc_addr_overflow);
    ovl_never #(`OVL_ERROR, `OVL_ASSERT, "ERROR : データFIFOがフルの時にCamera_Controller が書き込んだ", `OVL_COVER_DEFAULT, `OVL_POSEDGE, `OVL_ACTIVE_HIGH, `OVL_GATE_CLOCK) camc_data_full_we_assertion (clk_ddr2, reset_ddr2, 1'b1, ddr2_data_we && ddr2_wrdata_fifo_full, fire_camc_data_overflow);
    
    // VGA_Display_Controller がFIFOがフルの時に書き込んでいるか?をチェックするアサーション 
    ovl_never #(`OVL_ERROR, `OVL_ASSERT, "ERROR : アドレスFIFOがフルの時にVGA_Display_Controller が書き込んだ", `OVL_COVER_DEFAULT, `OVL_POSEDGE, `OVL_ACTIVE_HIGH, `OVL_GATE_CLOCK) vgadc_data_full_we_assertion (clk_ddr2, reset_ddr2, 1'b1, vgadc_addr_we && ddr2_addr_fifo_full, fire_vgadc_addr_overflow);
    // synthesis translate_on


残念ながら、全部OVLアサーションではできなくて、camc_addr_1dとvgadc_addr_1dをVerilogで作っている。
OVL_assertion_1_100906.png

fire...信号がすべて0でアサーションが発火していないことを示す。
ここで、2番目のovl_alwaysアサーションの camc_addr_1d+4==camc_addr を camc_addr_1d+3==camc_addr に変更して、もう一度シミュレーションを行った。シミュレーション結果を下に示す。
OVL_assertion_2_100906.png

fire_camc_addr が途中で1になったのがわかる。その部分を拡大してみる。
OVL_assertion_3_100906.png

camc_addrが0から4になる時が、アサーションエラーだ。わざとアサーションエラーを出した。うまく動いているようだ。
  1. 2010年09月06日 04:56 |
  2. アサーション事始め
  3. | トラックバック:0
  4. | コメント:0

初めて作ったCのソフト

初めて作ったCのソフトは、多分、昭和60年 (1985年) 位に作ったプロッタ制御ソフトでした。
VME10という68010とMMUが載ったUNIXマシンからX,Yデータをプロッタにプロットするソフトでした。今思えば、カーニハン&リッチーのC言語の本を読みながら作ったっけ。。。データをスケーリングして、プロッタ制御コマンドを出力して書くようにしました。
その頃は、UNIXのソースコードがあったので、クロスリファレンスを作って、輪講で読みましたね。signalの実装が難しくて、読むのに苦労した覚えがあります。MMUのバスエラーでスワップインする機構も面白かったですね。MMUの空ソケットがあったと思いますが、増やすと性能が上がるコードだったと思います。

その後は、しばらく作っていなかったと思いますが、マッキントッシュのお世話を仰せつかったので、マック使いになりました。カーボンはもっと後でしたか?APIを高い本を買って勉強して、GUIのソフトを作ってみました。その当時、WebSTARというマック用のWebサーバーソフトが有ったのですが、これが、Webページごとにアクセス制限が無かったので、それをGUIで設定できるように作りました。イベントドリブンモデルの勉強になりました。

その後、どのくらい経ってからでしょうか?HPのOSF/MotifでKueChip2のサイクルベースシミュレーターを作りましたね。サイクルベースシミュレーターなので、内部信号線も正確に?見ることができたと思います。ボタンの上に値を表示しました。コールバックルーチンとリソースの使い方を覚えました。

後はWin32 APIとかで、MIPSのアセンブラとかを作りました。これは、未だにバグありです。C++は勉強しましたが、まともにアプリは作ったことがないです。

最近は、もっぱらRubyで作っています。Rubyで面倒なのはCで作っています。今回はヘッダが見つかったので、Cで作りました。
  1. 2010年09月05日 10:33 |
  2. パソコン関連
  3. | トラックバック:0
  4. | コメント:0

BECK(映画)を見てきました

今日はBECKを見てきました。
高3の娘も見たいということで、3時に高校に迎えに行って、大急ぎでイーアスへ。3時30分から上映です。車がめちゃ混みで焦りましたが、なんとか時間ギリギリセーフで入れました。席は予めネットからチケット購入しておいたので、真ん中の一番いい席でした。
実はBECKのコミックを全巻持っていまして、楽しみにしていました。それ何に思い入れもあったので、内心不安でしたが、イメージとのギャップがどうなるか???
千葉は、イメージぴったりの感じでしたね。。。千葉良かった。。。
映画は、だいぶ原作とは違っていました。最初から小雪、サクが高校生でしたし、やはり、原作は、34巻もありますからしょうがないですね。ハリー・ポッターのようなもんです。

しかし、最後まで、あれとは期待を裏切られました。最後のグレートフルサウンドでは、そうしてくれると良かったと思うのですが。。。(ネタバレなので、コメントに顛末を書いておきます)
  1. 2010年09月04日 20:21 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:5

Spartan-3A Starter KitでCMOSカメラ・ディスプレイ回路22(ソフトでYUV-RGB変換)

Spartan-3A Starter KitでCMOSカメラ・ディスプレイ回路21(VIO、tcl)”で取得したYUVの値を使って、ソフトウェアでRGBに変換し、BMPフォーマットに直して、パソコンで見てみた。
使った言語はCで、ツールはVisual Studio 2010だった。久しぶりに、しかも新しいバージョンのVisual Studio使ったので戸惑ってしまった。下図のように開発している。
CamDispCntrler_DDR2_40_100903.png

YUV-RGB変換式は下図のものを使用している。

red = (char)((int)(((Y[j]<<8) + V[j]*359 - 45952)>>8)&0xff);
green = (char)(((int)((Y[j]<<8) - V[j]*183 - U[j]*88 + 34688)>>8)&0xff);
blue = (char)((int)(((Y[j]<<8) + U[j]*454 - 58112)>>8)&0xff);


まだスタック関係でバグっているが、取り敢えずBMPファイルが出力できたので良しとする。(どこがバグっているか、わかったら教えてください)
CamDispCntrler_DDR2_41_100903.png

下にCのプログラムを示す。(追記:エラーが出ないように修正しました。武内さん、ありがとうございました

// Camera_Capture.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#pragma warning(disable:4996)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <cstring>

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
    char cam_file[100];
    char **cam_red, **cam_green, **cam_blue; // 640*480ピクセル
    BITMAPFILEHEADER bmpfh; // BMPファイルのファイルヘッダ
    BITMAPINFOHEADER bmpih; // BMPファイルのINFOヘッダ
    BMP24FORMAT **bmp_data; // 24ビットのBMPファイルのデータ 640*480
    FILE *fcam, *fbmp;
    int i, j, k;
    char temp_buf[100], temp_buf2[100];
    int U[4], V[4], Y[4];
    char *str;
    unsigned int UVY[8];
    char red, green, blue;

    // 引数の処理
    if (argc == 1) { // 引数なし
        strcpy_s(cam_file, "camera_capture_data.txt");
    } else if (argc == 2){ // 
        strcpy_s(cam_file, (const char *)argv[1]);
    } else {
        fprintf(stderr, "Camera2BMP <camera_capture_data.txt>\n");
        exit(1);
    }

    // メモリをアロケートする
    if ((cam_red =(char **)malloc(sizeof(char *) * 480)) == NULL){
        fprintf(stderr, "cam_redの1次元目480のメモリを確保できません\n");
        exit(1);
    }
    if ((cam_green =(char **)malloc(sizeof(char *) * 480)) == NULL){
        fprintf(stderr, "cam_greenの1次元目480のメモリを確保できません\n");
        exit(1);
    }
    if ((cam_blue =(char **)malloc(sizeof(char *) * 480)) == NULL){
        fprintf(stderr, "cam_blueの1次元目480のメモリを確保できません\n");
        exit(1);
    }
    for (i=0; i<480; i++){
        if ((cam_red[i]=(char *)malloc(sizeof(char) * 640)) == NULL){
            fprintf(stderr, "cam_redの2次元目の%d番目のメモリが確保できません\n", i);
            exit(1);
        }
    }
    for (i=0; i<480; i++){
        if ((cam_green[i]=(char *)malloc(sizeof(char) * 640)) == NULL){
            fprintf(stderr, "cam_greenの2次元目の%d番目のメモリが確保できません\n", i);
            exit(1);
        }
    }
    for (i=0; i<480; i++){
        if ((cam_blue[i]=(char *)malloc(sizeof(char) * 640)) == NULL){
            fprintf(stderr, "cam_blueの2次元目の%d番目のメモリが確保できません\n", i);
            exit(1);
        }
    }
    if ((bmp_data=(BMP24FORMAT **)malloc(sizeof(BMP24FORMAT *)*480)) == NULL){
        fprintf(stderr, "bmp_dataの1次元目の480のメモリを確保できません\n");
        exit(1);
    }
    for (i=0; i<480; i++){
        if ((bmp_data[i]=(BMP24FORMAT *)malloc(sizeof(BMP24FORMAT) * 640)) == NULL){
            fprintf(stderr, "bmp_dataの2次元目の%d番目のメモリが確保できません\n", i);
            exit(1);
        }
    }

    // cam_fileをtext readモードでオープン
    if ((fcam = fopen(cam_file, "rt")) == NULL) {
            fprintf(stderr, "Can't Open %s\n", cam_file);
            exit(1);
    }
    // cam_fileの読み込み
    for (i=0; i<307200; i=i+4){
        if ((k=fscanf(fcam,"%s\n", temp_buf)) == EOF){
            fprintf(stderr, "%s のデータが足りない。%d\n", cam_file, i);
            exit(1);
        } else if (k == 0){
            fprintf(stderr, "%s のデータフォーマットがエラー\n", cam_file);
            exit(1);
        }

        for (str=temp_buf, j=0; j<8; str+=2, j++){
            strncpy(temp_buf2, str, 2); // 2文字コピー
            temp_buf2[2] = '\n';
            sscanf(temp_buf2, "%x\n", &UVY[j]);
        }
        U[0]=UVY[0];
        Y[0]=UVY[1];
        V[0]=UVY[2];
        Y[1]=UVY[3];
        U[2]=UVY[4];
        Y[2]=UVY[5];
        V[2]=UVY[6];
        Y[3]=UVY[7];

        U[1] = U[0]; V[1] = V[0];
        U[3] = U[2]; V[3] = V[2];
        for (j=0; j<4; j++){
            red = (char)((int)(((Y[j]<<8) + V[j]*359 - 45952)>>8)&0xff);
            green = (char)(((int)((Y[j]<<8) - V[j]*183 - U[j]*88 + 34688)>>8)&0xff);
            blue = (char)((int)(((Y[j]<<8) + U[j]*454 - 58112)>>8)&0xff);
            cam_red[(int)(i/640)][(int)((i%640)+j)] = red;
            cam_green[(int)(i/640)][(int)((i%640)+j)]  = green;
            cam_blue[(int)(i/640)][(int)((i%640)+j)] = blue;
        }
    }
    // cam_dataに読み込んだカメラのカラーデータをbmp_dataにをコピー(その際にBMPのデータは左下から始まる)
    for (i=0; i<480; i++){
        for (j=0; j<640; j++){
            bmp_data[479-i][j].red = cam_red[i][j];
            bmp_data[479-i][j].green = cam_green[i][j];
            bmp_data[479-i][j].blue = cam_blue[i][j];
        }
    }
    fclose(fcam);

    // BMPファイルのファイルヘッダに値を代入
    bmpfh.bfType = 0x4d42;
    bmpfh.bfSize = 640*480*3+54;
    bmpfh.bfReserved1 = 0;
    bmpfh.bfReserved2 = 0;
    bmpfh.bfOffBits = 0x36;
    // BMPファイルのINFOヘッダに値を代入
    bmpih.biSize = 0x28;
    bmpih.biWidth = 640;
    bmpih.biHeight = 480;
    bmpih.biPlanes = 0x1;
    bmpih.biBitCount = 24;
    bmpih.biCompression = 0;
    bmpih.biSizeImage = 0;
    bmpih.biXPixPerMeter = 3779;
    bmpih.biYPixPerMeter = 3779;
    bmpih.biClrUsed = 0;
    bmpih.biClrImporant = 0;
    
    // bmpファイルに書き出す
    if ((fbmp=fopen("cam_bmp_file.bmp""wb")) == NULL){
        fprintf(stderr, "cam_bmp_file.bmpがバイナリライトモードで開けません\n");
        exit(1);
    }
    // BMPファイルヘッダの書き込み
    fwrite(&bmpfh.bfType, sizeof(char), 2, fbmp);
    fwrite(&bmpfh.bfSize, sizeof(long), 1, fbmp);
    fwrite(&bmpfh.bfReserved1, sizeof(short), 1, fbmp);
    fwrite(&bmpfh.bfReserved2, sizeof(short), 1, fbmp);
    fwrite(&bmpfh.bfOffBits, sizeof(long), 1, fbmp);
    // BMPファイルのINFOヘッダの書き込み
    fwrite(&bmpih, sizeof(BITMAPINFOHEADER), 1, fbmp);
    // bmp_dataの書き込み
    for (i=0; i<480; i++) {
        for (j=0; j<640; j++) {
            fputc((int)bmp_data[i][j].blue, fbmp);
            fputc((int)bmp_data[i][j].green, fbmp);
            fputc((int)bmp_data[i][j].red, fbmp);
        }
    }
    fclose(fbmp);
    for(i=0; i<480; i++){
        free(cam_red[i]);
        free(cam_green[i]);
        free(cam_blue[i]);
        free(bmp_data[i]);
    }
    free(cam_red);
    free(cam_green);
    free(cam_blue);
    free(bmp_data);
    
    return 0;
}



BMP用のヘッダは、”BMP ファイルフォーマット”さんから頂いてきたもので、下に示すようなヘッダとなっている。

// stdafx.h : 標準のシステム インクルード ファイルのインクルード ファイル、または
// 参照回数が多く、かつあまり変更されない、プロジェクト専用のインクルード ファイル
// を記述します。
//

#pragma once

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>



// TODO: プログラムに必要な追加ヘッダーをここで参照してください。
// BITMAPFILEHEADER 14bytes
typedef struct tagBITMAPFILEHEADER {
  unsigned short bfType;
  unsigned long  bfSize;
  unsigned short bfReserved1;
  unsigned short bfReserved2;
  unsigned long  bfOffBits;
} BITMAPFILEHEADER;

// BITMAPINFOHEADER 40bytes
typedef struct tagBITMAPINFOHEADER{
    unsigned long  biSize;
    long           biWidth;
    long           biHeight;
    unsigned short biPlanes;
    unsigned short biBitCount;
    unsigned long  biCompression;
    unsigned long  biSizeImage;
    long           biXPixPerMeter;
    long           biYPixPerMeter;
    unsigned long  biClrUsed;
    unsigned long  biClrImporant;
} BITMAPINFOHEADER;

typedef struct BMP24bitsFORMAT {
    unsigned char blue;
    unsigned char green;
    unsigned char red;
} BMP24FORMAT;


これで、(エラーがまだ出ているが)変換したBMPファイルを下に示す。(大きいので、JPEGに変換してあります)
CamDispCntrler_DDR2_pict_14_100903.jpg

やはり色がおかしいようだ。全体にピンクぽくなっている。
次は、SCCBを接続して、RGB444モードにしてデータを取り込んでみよう。
  1. 2010年09月03日 05:56 |
  2. 画像処理
  3. | トラックバック:0
  4. | コメント:19

Spartan-3A Starter KitでCMOSカメラ・ディスプレイ回路21(VIO、tcl)

Spartan-3A Starter KitでCMOSカメラ・ディスプレイ回路にChipScope ProのVIOを入れて、tclでデータを取得してみることにした。
最初に、回路を変更して、VIOのIPを挿入した。sw0, sw1の2つのスイッチを使用して、sw0が1の時に連続的にCMOSカメラからの画像を取り込むが、sw0が0の時は、CMOSカメラからの画像を取り込まない。結果として、最後のCMOSカメラの画像をずっと表示することになる。つまりデジカメ機能をつけた訳だ。(前回説明済み)次に、DDR2 SDRAMのアドレス入力をVGAコントローラとVIOのSYNC_INに切り替えるスイッチを付けた。それがsw1だ。通常は0で、VGAコントローラのアドレスをDDR2 SDRAMに入力する。これで正常にディスプレイに画像が表示される。次に1にすると、VIOのSYNC_INのアドレスをDDR2 SDRAMに入力する。このモードは、VIOからアドレスを入力して、画像データを取得する場合に使用する。
使用方法としては、sw0を1、sw1を0にしておいて、画像データをディスプレイに表示して、良さそうな画像になったら、sw0を0にして、画像データを取得する。これで静止画が取れたので、sw1を1にして、VIOのSYNC_INからDDR2 SDRAMにアドレスを与える。
SRAMと違って、DDR2 SDRAMは、アドレスを与えるだけではデータは出てこないので、SYNC_INから与えるアドレスデータが違っていたら、DDR2 SDRAMコントローラにアドレスのライト・イネーブルパルスを送るようにしている。出てきたデータはラッチされて、VIOのSYNC_OUTに出てくるので、VIOコンソールに出力するか、tclでファイルに落とす。
下に変更したVerilog ソースを示す。VIOについては、前回のリンクを参照。

    SW_Controller #(
        .frequency_KHz(25000))
    SW_CONT_inst(
        .clk(clk_cam),
        .reset(reset_cam),
        .sw0(sw0),
        .sw1(sw1),
        .sw0_out(capture_ena),
        .sw1_out(vio_on)
    );
    
    CamCaptICON CamCaptICON_inst (
        .CONTROL0(control0) // INOUT BUS [35:0]
    );
    CamCaptVIO CamCaptVIO_inst (
        .CONTROL(control0), // INOUT BUS [35:0]
        .CLK(clk_ddr2), // IN
        .SYNC_IN(sync_in), // IN BUS [63:0]
        .SYNC_OUT(sync_out) // OUT BUS [24:0]
    );

    // sync_outの変化を検知してvio_addr_we を出力する
    always @(posedge clk_ddr2) begin
        if (reset_ddr2) begin
            sync_out_reg1 <= 25'd0;
            sync_out_reg2 <= 25'd0;
        end else begin
            sync_out_reg1 <= sync_out;
            sync_out_reg2 <= sync_out_reg1;
        end
    end
    always @* begin
        if (sync_out_reg1 != sync_out_reg2) // 以前の値と異なるとき
            vio_addr_we <= 1'b1;
        else
            vio_addr_we <= 1'b0;
    end
    
    // first_dword VIOの最初の32ビット
    always @(posedge clk_ddr2) begin
        if (reset_ddr2)
            first_dword <= 1'b1;
        else begin
            if (vio_on && ddr2_rddata_valid)
                first_dword <= 1'b0;
            else
                first_dword <= 1'b1;
        end
    end
    // sync_in 処理
    always @(posedge clk_ddr2) begin
        if (reset_ddr2)
            sync_in <= 64'd0;
        else begin
            if (vio_on & first_dword && ddr2_rddata_valid) begin
                sync_in[63:32] <= ddr2_output_data;
            end
            if (vio_on & ~first_dword && ddr2_rddata_valid) begin
                sync_in[31:0] <= ddr2_output_data;
            end
        end
    end


これで、ChipScope ProのAnalyzerを立ち上げて、VIOコンソールを見た。その様子を下図に示す。
CamDispCntrler_DDR2_36_100831.png

アドレスが0 (SYNC_IN) の時のデータ (SYNC_OUT) が表示されている。これをSYNC_IN(アドレス)を4に変更すると、アドレス4のデータがSYNC_OUTに表示される。
CamDispCntrler_DDR2_37_100831.png

ちなみにSYNC_OUTのデータは4画素分となる。8ビットずつUVVYUVVYと入っているはずだ。これはDDR2 SDRAMのデータ幅16ビットと粒度4で決まってしまう。

つぎにtclスクリプトを書いて、データを取得してみた。試しに34個のデータを取得した。下にコマンド・プロンプトの画面を示す。
CamDispCntrler_DDR2_38_100901.png

アドレス00000と00004の値が上のVIOコンソールに表示された値と同じ値になっているのがわかると思う。これで、同時にcamera_capture_data.txtという名前のファイルに値が書かれる。
CamDispCntrler_DDR2_39_100901.png

これで、UYまたはVYの16ビットデータを307200個取れれば、画像データをすべて取得できる。

(追記)画像データの取得が終わりました。21分程度かかりました。
  1. 2010年09月01日 05:23 |
  2. 画像処理
  3. | トラックバック:0
  4. | コメント:0