Quartus兇SignalTap兇鮖遒靴討澆襪泙任僚猗2(BRAMを書き換える) 

Quartus兇SignalTap兇鮖遒靴討澆襪泙任僚猗1(テキストエディタの日本語表示)”の続き。
キャラクタ・ディスプレイ・コントローラはframe_buffer.v とchar_gen_rom.v にBRAMを使用しているので、これをAltera用に書き換える必要がある。
まずは、frame_buffer.v から書き換えることにする。これは、Dual-Port Memoryをインスタンシエーションしている。frame_buffer.v のBRAM部分を下に示す。

    generate
    genvar i;
        for (i=4; i>=0; i=i-1) begin : FRAME_BUFFER_GEN
            RAMB16_S2_S2 FRAME_BUFFER (
                .DOA(processor_dout[i*2+1 : i*2]),
                .DOB(display_dout[i*2+1 : i*2]),
                .ADDRA(processor_addr),
                .ADDRB(display_addr),
                .CLKA(clk),
                .CLKB(clk),
                .DIA(processor_din[i*2+1 : i*2]),
                .DIB(2'b00),
                .ENA(1'b1),
                .ENB(1'b1),
                .SSRA(reset),
                .SSRB(reset),
                .WEA(processor_we),
                .WEB(1'b0)
            );
        end
    endgenerate


Alteraのプリミティブは知らないので、一番簡単な方法と思える MegaWizard Plug-In Manager でRAM: 2-PORTを使用することにする。
Quartus2_signaltap2_5_090702.png

RAMの後ろのFFは1クロックずれると思って削除してみた。これで大丈夫だと思うが、シミュレーションしてみてだめだったら調整する。
frame_buffer.v ではRAM: 2-PORTをインスタンシエーションした。

    frame_buffer_altera    frame_buffer_altera_inst (
        .clock ( clk ),
        .data ( din ),
        .rdaddress ( display_addr ),
        .wraddress ( processor_addr ),
        .wren ( processor_we ),
        .q ( display_dout )
    );


これで、frame_buffer.v は大丈夫かな?シミュレーションしてみればよいか悪いかわかるはず。
今度はchar_gen_rom.v だが、初期化データをどうしようか?Rubyか何かでフィルタを作って、Altera のMIFファイルに変換しようと思う。いまRubyの勉強中だ。

 Veritak3.69C以降におけるModelSimのVHDLシミュレーションとChipScopeの協調検証 

今まではVeritakがVerilogのシミュレータだったので、VerilogのシミュレーションとChipScope波形を比べていたが、VeritakがVersion 3.69Cから2つのVCD波形を比べられるようになったので、比べてみた。
プロジェクトはこのブログでは訳があって公開していないキャラクタ・ディスプレイ・コントローラのVHDL版。ModelSimでシミュレーションして、”ModelSimでVHDLのプロジェクトからVCDファイルを出力する方法(覚書)”を使って、disp_timingモジュールだけのVCD波形を20ms分取り出してある。取り出した波形をVeritakで表示したのが下の図。
VHDL_ChipScope_comp_1_090702.png

ISE11.2のプロジェクトにChipScopeのファイルを入れてインプリメント。
VHDL_ChipScope_comp_2_090702.png

Spartan3 Starter Kitにつないで、ChipScopeのAnalyzerで波形をサンプルし、VCDファイルにExportする。
VHDL_ChipScope_comp_3_090702.png

ChipScopeのVCDファイルとModelSimから出力したVCDファイルを両方Veritakのプロジェクトに入れる。その際、ChipScopeのVCDファイルをプロジェクトの最初のファイルとする。Veritak 3.69C以降は最初に入れたVCDファイルのスケールとオフセットを変更することができる。
Waveform ViewerにChipScopeの波形を入れて、その下にModelSimから出力したVCDファイルの相当する波形を入れる。その場合に、ModelSimから出力したVCDファイルの波形を見ると、LSBからになっているので、Waveform Viewer入れてから逆順に並べ替える。
VHDL_ChipScope_comp_4_090702.png

並べおわたら、右クリックのグループ化から名前付作成を選択する。
VHDL_ChipScope_comp_5_090702.png

名前を付ける。
VHDL_ChipScope_comp_6_090702.png

出来たv_point[10:0] をChipScopeの波形の下に持っていく。それを繰り返してModelSimから出力したVCDファイルの波形をChipScopeの波形の下に入れていく。そして、”Veritak3.69B以降とChipScopeによる協調検証”を参考にVCD Timestart Shift Dialogを設定すると、ModelSimから出力したVCDファイルの波形とChipScopeの波形を比べることができる。
VHDL_ChipScope_comp_7_090702.png

波形全体を表示すると、真っ赤です。
VHDL_ChipScope_comp_8_090702.png

20ms間シミュレーションを行っているので、ChipScopeで取れた波形はほんの一部分です。
なお、ModelSimのシミュレーションのレゾリューションはps なので、VCD Timestart Shift DialogのScaleには40000 を入れています。

 ISE11.2iでのSpartan-3とSpartan-6の速度差 

@eleでぐらろさんがSpartan-6はSpratan-2Eの2倍速いと書いておられたので、私もSpartan-3とSpartan-6でやってみた。比較する回路は、DDR2 SDRAMコントローラなどは、そのFPGAに固有のプリミティブを使っていたりするのでだめ。なので、ちょっとしょぼいがキャラクタ・ディスプレイ・コントローラでやってみることにした。使用したバージョンはISE11.2i。
これは本当は50MHzのクロックを入れて、それをDCMで1/2の25MHzに落として動作する。今回はDCMを取り除いて、入力したクロックで直接動作するように変更した。この入力周波数をを200MHz、周期5nsで動作するようにUCFを書き換え、入出力パッドの制約をコメントアウトした。

#PACE: Start of Constraints generated by PACE
#PACE: Start of PACE I/O Pin Assignments
#NET "clk" LOC = "T9";
#NET "reset" LOC = "L14";
#NET "VGA_BLUE" LOC = "R11" | DRIVE = 8 | SLEW = FAST ;
#NET "VGA_GREEN" LOC = "T12" | DRIVE = 8 | SLEW = FAST ;
#NET "VGA_HSYNC" LOC = "R9" | DRIVE = 8 | SLEW = FAST ;
#NET "VGA_RED" LOC = "R12" | DRIVE = 8 | SLEW = FAST ;
#NET "VGA_VSYNC" LOC = "T10" | DRIVE = 8 | SLEW = FAST ;
#PACE: Start of PACE Area Constraints
#PACE: Start of PACE Prohibit Constraints
#PACE: End of Constraints generated by PACE
NET "clk" TNM_NET = "clk";
TIMESPEC "TS_clk" = PERIOD "clk" 5 ns HIGH 50 %;


これでSpartan-3 (xc3s200-4ft256) で、ISEの設定をデフォルトの状態でインプリメントした。
PARのタイミングレポートを下に示す。

----------------------------------------------------------------------------------------------------------
  Constraint                                |    Check    | Worst Case |  Best Case | Timing |   Timing   
                                            |             |    Slack   | Achievable | Errors |    Score   
----------------------------------------------------------------------------------------------------------
* TS_clk = PERIOD TIMEGRP "clk" 5 ns HIGH 5 | SETUP       |    -1.829ns|     6.829ns|      35|       20907
  0%                                        | HOLD        |     0.806ns|            |       0|           0
------------------------------------------------------------------------------------------------------


クリティカルパスが6.829ns、146MHzと結構、頑張っている。
使用したロジックを下に示す。
spartan3_chardisp_ISE112_090701.png

次にSpartan-6 (xc6slx9-2csg225) に変更して、同じ条件でインプリメントしてみる。

----------------------------------------------------------------------------------------------------------
  Constraint                                |    Check    | Worst Case |  Best Case | Timing |   Timing   
                                            |             |    Slack   | Achievable | Errors |    Score   
----------------------------------------------------------------------------------------------------------
* TS_clk = PERIOD TIMEGRP "clk" 5 ns HIGH 5 | SETUP       |    -0.638ns|     5.638ns|      43|       12140
  0%                                        | HOLD        |     0.776ns|            |       0|           0
------------------------------------------------------------------------------------------------------


上のように通っていないが、5.638ns、177MHz動作となった。Spartan-3よりも速い。
使用したロジックを下に示す。
spartan6_chardisp_ISE112_090701.png

まだまだ、表示しきれないほどロジックがある。ISERDESやOSERDESなども見えた。
使用したLUT数はSpartan-3は129で、Spartan-6は88だった。
Spartan-6は楽しみなFPGAだと思う。FPGA Editorで見るといろいろ入っているようだ。

2009/07/04 追加:
Virtex-4, xc4vlx15-10sf363 で同様にやると、制約5nsパス、制約4nsもパス。制約を3nsにしたら、さすがに3.615ns、277MHzとなりました。
Virtex-5, xc5vlx30-1ff324 では、3.440ns、291MHz
Virtex-6, xc6vlx75-1ff484 では、3.330ns、300MHz
でした。
さすがにVirtexシリーズは速いようです。やはり配線の数が違うのでしょうか?

 ModelSimでVHDLのプロジェクトからVCDファイルを出力する方法(覚書) 

ModelSim SE 6.1eでVHDLのプロジェクトからVCDファイルを出力する方法の覚書。
最初にModelSimのコマンドwlf2vcd.exe でwlfファイル(シミュレーションデータが保存されているファイル)からVCDファイルを生成しようとした。デフォルトで出来ているvsim.wlfからは、ファイルがないと言われて生成できない。dataset snapshotを使って、wlfファイルを作ると変換は出来たがエラーが出力され、出来たVCDファイルはVeritakで読めなかった。(どうやら、ちゃんとVCDファイルが出来ていないようだ)
というわけでwlf2vcd.exeを使うのをあきらめて、ModelSimのVCDコマンドを使うことにする。

ModelSim® Reference Manualの194ページあたりから記述がある (vcd add)。
leon_sparcのyahooグループにもやり方が載っていた。
やり方を下に示す。キーボード・キャラクタ・ディスプレイのプロジェクトとする。 ModelSimのTranscriptの部分に記述する。(コマンド)

1.ModelSimのプロジェクトを読み込んで、シミュレーションをスタート ( vsim -t ps work.keyboard_chard_25mhz_tb )
2.vcdファイルのファイル名を指定 ( vcd file char_disp_sim.vcd )
3.vcdファイルに書き出す信号を記述、(-r :下位階層までの信号とポートを追加) ( vcd add -r /* )
  * 下の階層の信号を入れる場合には階層までのパスを設定する ( vcd add -r /keyboard_chard_25mhz_tb/chardispctrler_inst/* )
4.RUN ( run -all, または run 10 us など)
5.ModelSimを終了、終了しないとvcdファイルに書き込まれない ( quit -f )


これでchar_disp_sim.vcd が作成された。17ms程度シミュレーションして、char_disp_sim.vcd のサイズは77.3MB。

これをVeritakのプロジェクトを作って読み込ませる。Veritakチュートリアル2.4.1.2 VCDプロジェクトを参照。
Scope Tree Viewの右側のペインで右クリックして”個別信号をグループ化してWaveform Viewerに追加”を選択。
Veritak_vcd_view_1_090701.png

これでバスの信号がWaveform Viewerに追加されたので、個別の信号を選択して、Waveform Viewer に追加すると、vcdファイルをVeritakで見ることができる。
Veritak_vcd_view_2_090701.png

 Quartus兇SignalTap兇鮖遒靴討澆襪泙任僚猗1(テキストエディタの日本語表示) 

VeritakでChipScopeとの協調検証を試してみたが、AlteraのQuartus兇SignalTap兇任眛瑛佑VCDファイルを出力できるようなので、試してみることにした。それにSignalTap兇Web版でも使えるそうだ。
Quartus兇倭阿忙箸辰燭海箸あるが、もう忘れてしまっている。Quartus兇SignalTap兇料犧遒魍个┐覆ら進めていくことにする。
まずは、SignalTap兇埜‐擇垢襪里砲佞気錣靴げ麩だが、電子サイコロは人が見ることを前提にしているため、動作がゆっくりなので向かない。やはり、キャラクタ・ディスプレイ・コントローラが良いかと思う。
だが、キャラクタ・ディスプレイ・コントローラはDCMやBRAMなど、Xilinx専用のプリミティブを使っているので、その部分をAltera用に書き換える必要がある。
まずは、DCMの代わりにMegaWizard Plug-In Manager でALTPLL を生成した。これで入力周波数50MHzから25MHzに落とす。
Quartus2_signaltap2_1_090630.png

次にVerilog ソースを修正しようとしたら、日本語が化けている。
Quartus2_signaltap2_2_090630.png

ToolsメニューのOptions...からOptionsダイアログを表示して、Text EditorのFontsの項目のFontをMSゴシックに変更する。
Quartus2_signaltap2_3_090630.png

すると日本語を表示することができました。
Quartus2_signaltap2_4_090630.png

これで、XilinxのBRAM用の記述も変更してみることにする。