FC2カウンター FPGAの部屋 SMM

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

FPGAの部屋

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

SMMのシミュレーション(NetGenとData2MEMを使用する)

The Simple MicroBlaze Microcontroller 6(シミュレーション)”で”SMMの問題点はシミュレーションができないことだと思う。実機デバックはできるが、シミュレーションは出来ない。”と書いたが、ひでみさんのブログや”AQUAXIS TECHNOLOGY”を見ていたら、ヒントがあったので、自分でやってみた。

The Simple MicroBlaze Microcontroller 6(シミュレーション)”のシミュレーション環境を使って、もう一度やり直してみた。

1.Simple_MicroBlaze_xapp1141\SMM_Ref\S3A_LCD_Ref\Work フォルダにsimulationフォルダを作成した。
SMM_sim_1_110626.png

2.コマンドプロンプトを起動して、ISEのインストールフォルダ(Xilinx\13.1\ISE_DS)のsettings32.bat(64ビット版の方はsettings64.bat?)を実行して、環境関数をセットする。

3.Simple_MicroBlaze_xapp1141\SMM_Ref\S3A_LCD_Ref\simulationに移動する。

4.まずは、NetGenコマンドでsmm.ngc をVerilogファイルに変換する。コマンドプロンプトで

%XILINX%\bin\nt\netgen -sim -ofmt verilog -mhf -w ..\ise\smm.ngc


を実行する。
SMM_sim_3_110626.png

5.smm.v、lmb_bram_wrapper_sim.v、lmb_bram_elaborate_sim.vが生成された。Verilogで書かれたネットリストだ。
SMM_sim_4_110626.png

6.次にData2MEMで命令ROM用の初期化データ、つまりソフトウェアが入った初期化データを生成する。コマンドプロンプトで

%XILINX%\bin\nt\data2mem -bm ..\ise\smm_bd.bmm -bd ..\sdk\empty_application_0\Debug\empty_application_0.elf -bx ./


を実行する。”-bx”オプションを付けるとmemファイルが生成される。
SMM_sim_5_110628.png

7.4つのmemファイルが生成された。そのうちのlmb_bram_combined_0.mem の一部を下に示す。このファイルは、lmb_bram_elaborate_sim.v のRAMB16BWEに書かれている

.INIT_FILE ( "lmb_bram_combined_0.mem" ),


に従って、RAMB16BWEプリミティブの初期化データとして読み込まれる。

@00000014
    31 30 30 B9 80 B9 30 B8 E0 30 BE F9 B8 E9 F8 99 80 E8 E8 BE 30 B0 30 BC 30 99 80 30 F0 E9 B6 30


8.次にISimのプロジェクトファイル (lcd_ref_tb.prj) を作る。プロジェクトに入るHDLソースファイルとしては、lcd_ref.vhd、SMM、lcd_ctlr.vhd、timer.vhdとテストベンチのlcd_red_tb.vhd、そして先ほど生成したVerilogソースファイルだ。
SMM_sim_2_110626.png

verilog work smm.v
verilog work lmb_bram_wrapper_sim.v
verilog work lmb_bram_elaborate_sim.v
verilog work lcd_test_rom_init.v
vhdl work ../src/timer.vhd
vhdl work ../src/lcd_ctlr.vhd
vhdl work ../src/lcd_ref.vhd
vhdl work ../Work/src/Simulation/lcd_ref_tb.vhd
verilog work glbl.v


9.fuseコマンドでコンパイルを行う。下にコマンドを示す。

%XILINX%\bin\nt\fuse work.lcd_ref_tb work.glbl -L unisims_ver=K:\HDL\Xilinx\13.1\ISE_DS\ISE\verilog\hdp\nt\unisims_ver -L unisim=K:\HDL\Xilinx\13.1\ISE_DS\ISE\vhdl\hdp\nt\unisim -o lcd_ref_tb.exe -prj lcd_ref_tb.prj


10.コンパイルが正常終了したら、出来上がったlcd_ref_tb.exeを-guiモードで起動する。

lcd_ref_tb.exe -gui


SMM_sim_6_110628.png

11.ISimが立ち上がる。適当に信号を入れてみてみると、動いているようだ。下にMicroBlazeのデコード部の波形を示す。openMSP430の様にアセンブラを表示したいと思った。
SMM_sim_7_110628.png

動いていると思う。タイマーとかがあるとシミュレーション時間も長くなるし、バスモデルだけのシミュレーションの方が良い場合も多いと思う。それをクリアしたら、SDKでソフトウェアの実機デバックをする。Spartan-6、Virtex-5、Virtex-6だと、一緒にChipscope Proも使用できるので、更にデバック効率が上がることだろうと思う。

#やっとSMMのシミュレーションが物になりました。結構、いろいろなマニュアルを読んだりして、大変だったが勉強になりました。
  1. 2011年06月28日 19:56 |
  2. SMM
  3. | トラックバック:0
  4. | コメント:0

SMMのSDKデバックとChipscope Pro Inserter を同時に使用する

SMM(the Simple Microblaze Microcontroller)を使用すると、FPGA内のBSCANユニットが使用されて、Chipscope Proで信号を観測することができなかった。

Virtex-5やSpartan-6では、複数個のBSCANユニットが入っているので、SDKデバックしながら、Chipscope Inserterが使用できるのでは?と考えられるので、試してみることにした。(多分、Virtex-6も同様だろう)
(SMMについては、”The Simple MicroBlaze Microcontroller 2 (概要)”を参照のこと。SMM(The Simple MicroBlaze Microcontroller)も参照ください)

SMMのVirtex-6のリファレンス・デザイン(SMM_Ref\ML605_LCD_Ref)をXUPV5-LX110T用に変更した。具体的には、66MHzクロックを使用するようになっていたので、100MHzのクロックからDCMで66MHzに変換した。後は当然ながら制約ファイルを書き換えた。
サンプルプロジェクトでやることは、”The Simple MicroBlaze Microcontroller 4(リファレンスデザイン2)”と同様に、ボタンを押すとLCDに”Thank You!”と表示することだ。
Chipscope Inserterコアを入れて、インプリメントしたらインプリメントができた。
SMM_SDK_1_110616.png

FPGA Editorで見ると、Chipscope用とSMMのMDM用のBSCANユニットが2つ入っていた。
SMM_SDK_2_110616.png

1.SDKを立ち上げて、SDKのProgram FPGAダイアログから、FPGAボードにビットファイル(download.bit)をダウンロードした。(”The Simple MicroBlaze Microcontroller 4(リファレンスデザイン2)”参照)
2.Chipscope AnalyzerをProject Navigatorから立ち上げて、sdk\SMM_noDBG_noUART_hw_platform\download.bitを指定して、もう一度、FPGAボードにダウンロードした。
3.SDKをデバッグモードにした。スイッチを押したときのタイマーイベントでChipscopeのトリガをかけた。

うまくSDKデバックとChipscopeの波形観測の両方を行うことができた。
SMM_SDK_3_110616.png

SMM_SDK_4_110616.png

これで、Virtex-5以上では心置きなくSMMを使うことができる。(ただし、BSCANが2つ以上あることが前提)
ISEからEDKをIPとして使用して、Chipscope Inserterを使うこともできると思う。
なお、Virtex-4は試していない。
  1. 2011年06月16日 17:21 |
  2. SMM
  3. | トラックバック:0
  4. | コメント:0

MicroBlazeクロスコンパイラを試す3(自分のソフトウェアで試した)

(FC2ブログに画像を貼れないので、後で貼ります)

自分で作ったSpartan-3A Starter KitのCMOSカメラの設定を制御するソフトウェアをMicroBlazeクロスコンパイラでコンパイルしてみることにした。

ソフトウェアのlcd_rot_cont.c とlcd_rot_cont.hをWindowsから、Fedora14のSpa3SKit_Cam_SMMディレクトリに持ってきた。
MB_CCompiler_7_110401.png

SDKで作ってあるので、インクルードファイルをWindowsから、Fedora14のSpa3SKit_Cam_SMM/SDK_Includesディレクトリに持ってきた。
MB_CCompiler_8_110401.png

Spa3SKit_Cam_SMMディレクトリのMakefileのファイル名を変更した。-I ./SDK_Includes -include lcd_rot_cont.h を追加した。
makeすると、lcd_rot_cont.oはできたがmicroblaze_register_handler とmicroblaze_enable_interrupts がないと言われた。
MB_CCompiler_9_110401.png

色々ライブラリの解決が面倒そうだ。ハードとソフトを修正すれば、使わないようにもできるが、とりあえずペンディングとする。lcd_rot_cont.oはできたので、使うことができると思う。
MB_CCompiler_10_110401.png

次は、SMMのシミュレーション方法について、勉強させていただこうと思う。
  1. 2011年04月01日 05:22 |
  2. SMM
  3. | トラックバック:0
  4. | コメント:0

The Simple MicroBlaze Microcontroller 19 (SCCB設定レジスタを設定できたが...)

シミュレーションも大丈夫のようなので、もう一度、実機で確かめてみた。やはり、SCCB設定レジスタに設定できない。もしかして?と思って、同じ設定レジスタにもう一度設定するようにしたら設定できた。。。

        // state check
        switch (setting_item) {
            case AGC_SET :
                if (current_state == SETTING_ITEM_ST){
                    if (rot_pulse == left_pulse)
                        setting_item = MIRROR_SET;
                    else if (rot_pulse == right_pulse)
                        setting_item = GAIN_LEVEL_SET;
                } else { // AGC ON -> OFF, OFF -> ON
                    if (rot_pulse != no_pulse){
                        if (agc_reg){
                            agc_reg = 0;
                            reg13 = AGC_OFF_2_SCCB13;
                        }else{
                            agc_reg = 1;
                            reg13 = AGC_ON_2_SCCB13;
                        }
                        while (XIo_In8(STATUS_ADDR) & 0x08) ; // SCCB_busy
                        *SCCB_Reg_Write = (((0x13)<<8) | reg13); // Dummy Write
                        while (XIo_In8(STATUS_ADDR) & 0x08) ; // SCCB_busy
                        *SCCB_Reg_Write = (((0x13)<<8) | reg13); // addr data
                    }
                }
                break;


*SCCB_Reg_Write = (((0x13)<<8) | reg13);を2回書いたら、AGCがON,OFFできた(必ずしも、同じアドレスに同じデータを2回ということではなく、1回どこのアドレスにでもWriteすれば後のWriteはOKのように見える)。
だが、初期化は出来ているはず?間をおくとだめなんだろうか?SCCBのデータはハイインピーダンスにしている。下のタイミングチャートのsdaの最後の頃が'Z'になっていると思う。
SMM_65_101228.png

だが、CMOSカメラモジュールでプルアップしているはず。。。
試しに、FPGAの内部プルアップを使用してみた。

NET "cam_sio_d" LOC = "AB2" | IOSTANDARD = LVTTL | PULLUP ;


やはり、変化がない。やはり、2度書きしないとだめだ。

それでは、初期化でも最初の設定はミスっているのか?それを調べるために、最初にAGC ON,OFFを決定するレジスタ0x13にAGC OFFの設定を書いてみた。

13EB


インプリメントして、やってみるとAGCはOFFで問題なかった。では、初期化では最初の設定も問題がないようだ。
ちょっと訳が分からなくなったが、sdaを'Z'にしないで1にドライブし続けようと思う。(やってみたが結果は変化なし)

操作について説明すると、LCDの1行目がSCCB設定レジスタを示す。下の写真ではAGCのゲインを設定する。今は000なので、下のステータス表示行のGの後に000と表示されている。ちなみにGはAGC ONを表す。Gが表示されない場合はAGC OFFだ。
SMM_66_101229.jpg

ロータリーエンコーダを押すと、1行目の最後に'E’が表示されて、ロータリーエンコーダを回すと値が増減できる。
SMM_67_101229.jpg
  1. 2010年12月29日 14:48 |
  2. SMM
  3. | トラックバック:0
  4. | コメント:2

The Simple MicroBlaze Microcontroller 18 (CMOSカメラ回路のシミュレーション)

SMMのシミュレーションをISE12.4のISimで行った。”The Simple MicroBlaze Microcontroller 6(シミュレーション)”を参考にして、SMMのシミュレーション用VHDLファイル、lcd_rot_cont_smm.vhdを作った。と言っても変更したのは、スティミュラスの部分だけで、とてもシンプルな変更だ。変更点を下に示す。

    process begin
        DOUT <= (others => '0');
        BE <= (others => '0');
        ADDR <= (others => '0');
        CS <= '0';
        
        wait for 100 ns;
        
        -- これから下のwaitまでの間にスティミュラスを書く
        
        -- SMM_WR_CYCLE(TIMER_ADDR, X"00000010", "1111", clk, rnw, cs, addr, dout, be); -- Timerへ書き込み、16クロックカウント
        
        -- wait until INTERRUPT_ACK_node'event and INTERRUPT_ACK_node='1'; -- INTERRUPT_ACK_node の立ち上がりまでwait
        -- wait for 1 ns;
        
        -- SMM_WR_CYCLE(LCD_ADDR, X"12340000", "1111", clk, rnw, cs, addr, dout, be); -- LCDへ書き込み
        
        -- -- ボタンの状況をrd_dataに読み出し
        -- SMM_RD_CYCLE(BUTTON_ADDR, "1111", rd_data, clk, rnw, cs, addr, din, be);
        
        wait for 460 us;
        
        SMM_WR_CYCLE(SCCB_REG_WR, X"12340000", "1111", clk, rnw, cs, addr, dout, be); -- OV7670の設定レジスタへ書き込み
        
        wait;
    end process;


CMOSカメラ回路(現在は、CMOSカメラ回路にSMMを組み込んでCMOSカメラの設定レジスタの設定をしようと思っている)のISimシミュレーション用のバッチファイル (CamDispCntrler_DDR2_tb.bat) を下に示す。

rm CamDispCntrler_DDR2_tb.exe
K:\HDL\Xilinx\12.4\ISE_DS\ISE\bin\nt\fuse work.CamDispCntrler_DDR2_tb work.glbl -incremental -d OVL_VERLOG -i ..\ -i ..\..\..\DDR2_SDRAM_cont_266\Simulation\512Mb_ddr2 -i H:\HDL\OVL\std_ovl -d sg3 -d x16 -d OVL_ASSERT_ON -d OVL_FINISH_OFF -L unisims_ver=%XILINX%\verilog\hdp\nt\unisims_ver -L unimacro_ver=%XILINX%\verilog\hdp\nt\unimacro_ver -L XilinxCoreLib_ver=%XILINX%\verilog\hdp\nt\xilinxcorelib_ver -L accellera_ovl_vlog=%XILINX%\verilog\hdp\nt\accellera_ovl_vlog -o CamDispCntrler_DDR2_tb.exe -prj CamDispCntrler_DDR2_Capt_SCCB_tb.prj
CamDispCntrler_DDR2_tb.exe -gui


CamDispCntrler_DDR2_tb.batを実行すると、CamDispCntrler_DDR2_Capt_SCCB_tb.prjのコンパイルを実行して、リンクし、CamDispCntrler_DDR2_tb.exeができるので、それを実行するとISimが走って、シミュレーションができる。
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
vhdl work ../../Sources/lcd_rot_cont.vhd
vhdl work ../SMM_noUART_sim_pack.vhd
vhdl work ../lcd_rot_cont_smm.vhd
vhdl work ../../Sources/lcd_ctlr.vhd
vhdl work ../../Sources/timer.vhd
vhdl work ../../Sources/rot_enc_cont.vhd
vhdl work ../../Sources/swdiv_rot.vhd
vhdl work ../../Sources/ROTSW_SM.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\512Mb_ddr2\ddr2.v
verilog work ../CamDispCntrler_DDR2_tb.v
verilog work H:\HDL\Xilinx\12.2\ISE_DS\ISE\verilog\src\glbl.v


VerilogとVHDLを混在でシミュレーションしている。Verilog、VHDL混在でシミュレーション出来るのはISimの大きな利点の一つだ。ModelSim SEだったら混在行けるけど、なかなか混在でシミュレーションできるシミュレーターは少ないし高価だ。
これでコンパイルしたら、エラーになってしまった。OVLアサーションを入れてあるので、OVLのライブラリが無かったのがエラーの原因だった。
ISimでOVLのVHDL, Verilog混在シミュレーション(OVLライブラリのコンパイルと登録)”を見ながら、ISE12.4でOVLをコンパイルしてライブラリ化した。(この記事が間違っていたで、修正しました。VHDLライブラリがコンパイル出来なかった)
OVLライブラリを生成してリンクしたら、コンパイルが通って、ISimが立ち上がった。
起動時にOV7670の設定レジスタをセットするが、それを1つにして、SMMから12番アドバイスに34というデータを書きこむスティミュラスを試してみた。この記事の一番上のリストがそれだ。
シミュレーション結果を下に示す。
SMM_65_101228.png

実線のカーソルが初期化時のSCCBインタフェースの波形(設定レジスタ書き込み)で、破線のカーソルがSMMから12番アドバイスに34というデータを書きこむ波形だ。
これを見る限り、上手くいっているようなんだが?なぜ設定がうまくいかないんだろう?初期化時には問題なく上手くいっているんだけど?もう一度SDKでデバックしてみよう。それで上手くいっているようであれば、オシロスコープで見てみたい。
  1. 2010年12月28日 09:15 |
  2. SMM
  3. | トラックバック:0
  4. | コメント:0

The Simple MicroBlaze Microcontroller 17 (ChipScope Proによるデバックの問題点)

The Simple MicroBlaze Microcontroller 16 (SDKのデバック)”でソフトウェアのデバックは終了したので、今度はハードウェアのデバックをするためにChipScope Pro(以下、ChipScope)を入れることにした。

SMM_Debug_cs.cdc を入れて、インプリメントしたところエラー発生。
SMM_62_101225.png

ERROR:Pack:2310 - Too many comps of type "BSCAN" found to fit this device.
ERROR:Pack:18 - The design is too large for the given device and package.
Please check the Design Summary section to see which resource requirement for
your design exceeds the resources available in the device.


結局、BSCANを2つ使っているとのことだった。ChipScopeでも使用するので、SMMで使用しているらしい。XPSで見るとDebug は有効になっていないのだが、BSCANが使われてしまうようだ。
SMM_63_101225.png

これを何とかしないと、ChipScopeが使えない。SMMから抜いてしまうのがベストなのだが、共用しても良い?方法を探ってみることにする。

どうやらSMMの状態でChipScopeを使う方法がわからないので、取り敢えずシミュレーションをすることにする。SMMでChipScopeを使えないとなると、使うのを考え直さなければならないかな?
このへんの情報を知っている方は教えてください。

(2010/12/25:追記)
SMM_noDBG_noUARTでやってみたが、なぜか?BSCANとMDM_coreが入っている?
SMM_64_101225.png
  1. 2010年12月25日 05:38 |
  2. SMM
  3. | トラックバック:0
  4. | コメント:0

The Simple MicroBlaze Microcontroller 16 (SDKのデバック)

前回、main()関数の”Could not find the frame base for "main".”を修正したが、他の関数でも同じエラーが出ている。
SMM_61_101220.png

もう一度、Xilinxのアンサーデータベースを調べると、”12.1 EDK - SDK Error: Could not find frame base for ""”がヒット。それによると、stackエリアを増やせとのこと。早速、lscript.ldの記述を下のように変更した。

/* _STACK_SIZE = DEFINED(_STACK_SIZE) ? _STACK_SIZE : 0x400; */
_STACK_SIZE = 0x1000;


これで、メモリの使用領域は、0x23c8から0x3010に増えた。

mb-size empty_application_0.elf  |tee "empty_application_0.elf.size"
   text       data        bss        dec        hex    filename
   6806        312       5186      12304       3010    empty_application_0.elf


これで、もう一度デバックモードにしてみたが同様にエラーが出る。
もうツールのデバックはいい加減にして、本来のCソースをデバックすることにした。大分いい感じで動いてはきてはいるのだが、まだおかしい。
SMM_62_101221.jpg

上のような表示になっていて、ロータリーエンコーダを右に回すと下の表示になる。
SMM_63_101221.jpg

ピンクで囲った0406の部分だが、本当は4060で上位桁、下位桁を間違っている。これはすぐ修正したが、他の状態遷移がまだおかしい。
#何をしているかというと、CMOSカメラの設定をLCDに表示して、ロータリーエンコーダで変更しようとしている。この辺を参照
  1. 2010年12月21日 05:01 |
  2. SMM
  3. | トラックバック:0
  4. | コメント:0
»