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

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

FPGAの部屋

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

宇宙へと20世紀少年を見てきました

今日は映画のハシゴをしてきました。
最初はまだ行ったのことのない土浦ジャスコの映画館で宇宙へを見てきました。初めて行くので迷ってしまいましたが、何とか到着しました。イーアスみたいに巨大なショッピングセンターですね。映画はNASAの秘蔵映像でアメリカの宇宙計画の初期からスペースシャトルまでを紹介したドキュメンタリーです。初期の映像が思ったよりきれいでした。やはりデジタル処理の成果でしょうか?ロケットの近くの映像がふんだんにありましたが、例の氷がロケットから落ちていく様子がよかったです。
午後からは、20世紀少年の最終章です。結果は書きませんが、あまり意外な結果じゃなかったです。最近映画を結構見ています。夫婦50割引きで夫婦で2000円というのもありますが、いろいろ面白そうな映画がやっていて観に行きたくなります。
帰ってきてから、選挙にもちゃんと行きましたよ。
  1. 2009年08月30日 18:31 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

まつりつくばに行ってきました

今日と明日、まつりつくばが行われているので、下の娘と一緒に行っていました。
エキスポセンターあたりの駐車場に止めてペデストリアンに出てみたら、露店がいっぱいです。
maturi_tukuba_1_090829.jpg

ビールの露店やいろいろなお店の屋台が出ていました。青いストライプの屋根のテントは、その辺のお店が露店を出しているようです。
maturi_tukuba_2_090829.jpg

ポニーの試乗もやっていました。
maturi_tukuba_3_090829.jpg

この辺は、地元の団体が店を出していて、儲け度外視らしく、かき氷が100円でした。綿あめが50円で、娘は食べたそうでしたが、ずーと並んでいるし、素人がやっているので、なかなかうまくいかないらしくあきらめました。私も綿あめ販売は保育園の運動会のバザーで担当しましたが、なかなか丸くならない、熱いなどで結構大変でした。プロの方の技量には頭が下がります。

iPhoneで写真を撮ったので、光学ズームがなくて取りませんでしたが、3つの会場?で大道芸をやっていました。1つを見てきましたが、男女でいろいろコミカルなことをやっていて面白かったです。もう少し見ていたかったですが、娘もいるので、ノバホールの方に行ってきました。いろいろなお店が出ているし、本当に人も多かったです。茨城県知事に立候補している競輪?銀メダルの人も団体でのぼりを立てて歩いていました。
雰囲気を楽しんで、1時間ちょっとで帰りました。娘はリンゴ飴とタピオカジュースを買っていました。いろいろ生ハムとか、ケイバブとかも売っていたし、暑くなかったら食べたかったです。
夜はねぶたが出ます。にぎわいますが、もう飽きたという感じです。実は地元のお神輿も出ます。来ないか?と誘われたのですが、神輿は担げないからと断りました。でも、祭り半纏を着て歩いているだけで良いんだよ。とのこと。でも、違う形で参加したい。。。
来年は家具作りサークルでもなんか出せば?と思いました。椅子やベンチをその場で製作販売とかどうでしょうか?
  1. 2009年08月29日 20:10 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

Avalon-MMスレーブペリフェラル3(Quartus2でのコンパイル)

Avalon-MMスレーブペリフェラル2(SOPC Builder)”の続き。KiCADもやりたいが、これも終わらせないと。。。
前回、SOPC Builderで7セグメントLEDのダイナミック点灯回路を追加して生成したので、今回はトップのVerilogファイルにダイナミック点灯7セグメントLEDの出力ポートを追加してコンパイルする。
まずは、前回のSOPC Builderのインスタンス時のポートは以下のようになった。

  nois_sdram nois_sdram_inst
    (
      .clk_0                                              (clk_0),
      .out_port_from_the_led_pio                          (out_port_from_the_led_pio),
      .reset_n                                            (reset_n),
      .seven_seg_a_from_the_AvalonMM_Slave_Dyna7seg_0     (seven_seg_a_from_the_AvalonMM_Slave_Dyna7seg_0),
      .seven_seg_b_from_the_AvalonMM_Slave_Dyna7seg_0     (seven_seg_b_from_the_AvalonMM_Slave_Dyna7seg_0),
      .seven_seg_c_from_the_AvalonMM_Slave_Dyna7seg_0     (seven_seg_c_from_the_AvalonMM_Slave_Dyna7seg_0),
      .seven_seg_d_from_the_AvalonMM_Slave_Dyna7seg_0     (seven_seg_d_from_the_AvalonMM_Slave_Dyna7seg_0),
      .seven_seg_digit_from_the_AvalonMM_Slave_Dyna7seg_0 (seven_seg_digit_from_the_AvalonMM_Slave_Dyna7seg_0),
      .seven_seg_dp_from_the_AvalonMM_Slave_Dyna7seg_0    (seven_seg_dp_from_the_AvalonMM_Slave_Dyna7seg_0),
      .seven_seg_e_from_the_AvalonMM_Slave_Dyna7seg_0     (seven_seg_e_from_the_AvalonMM_Slave_Dyna7seg_0),
      .seven_seg_f_from_the_AvalonMM_Slave_Dyna7seg_0     (seven_seg_f_from_the_AvalonMM_Slave_Dyna7seg_0),
      .seven_seg_g_from_the_AvalonMM_Slave_Dyna7seg_0     (seven_seg_g_from_the_AvalonMM_Slave_Dyna7seg_0),
      .zs_addr_from_the_sdram                             (zs_addr_from_the_sdram),
      .zs_ba_from_the_sdram                               (zs_ba_from_the_sdram),
      .zs_cas_n_from_the_sdram                            (zs_cas_n_from_the_sdram),
      .zs_cke_from_the_sdram                              (zs_cke_from_the_sdram),
      .zs_cs_n_from_the_sdram                             (zs_cs_n_from_the_sdram),
      .zs_dq_to_and_from_the_sdram                        (zs_dq_to_and_from_the_sdram),
      .zs_dqm_from_the_sdram                              (zs_dqm_from_the_sdram),
      .zs_ras_n_from_the_sdram                            (zs_ras_n_from_the_sdram),
      .zs_we_n_from_the_sdram                             (zs_we_n_from_the_sdram)
    );


AvalonMM_Slave_Dyna7seg_0の信号が増えている。これをトップのnios2_sdram_led.vに追加した。下に全ソースを示す。

// nois2_sdram_led

`default_nettype none

module nois2_sdram_led(
    input    wire         clk,
    input    wire        reset_n,
    output    wire [7:0]    led_pio, 
    output    wire        sdram_clk,
    output    wire [11:0]    SDRAM_A,
    output    wire [1:0]    SDRAM_BA,
    output    wire        SDRAM_nCAS,
    output    wire        SDRAM_CKE,
    output    wire        SDRAM_nCS,
    inout    wire [15:0]    SDRAM_D,
    output    wire [1:0]    SDRAM_DQM,
    output    wire        SDRAM_nRAS,
    output    wire        SDRAM_nWE,
    
    output    wire [7:0]    seven_seg_digit,
    output    wire        seven_seg_a,
    output    wire        seven_seg_b,
    output    wire        seven_seg_c,
    output    wire        seven_seg_d,
    output    wire        seven_seg_e,
    output    wire        seven_seg_f,
    output    wire        seven_seg_g,
    output    wire        seven_seg_dp
);
    
    wire clk_pll;
    wire pll_locked;
    reg        [10:0] count;
    wire reset_n_int_node, reset_n_int;

  nois_sdram nois_sdram_inst
    (
      .clk_0                             (clk_pll),
      .out_port_from_the_led_pio (led_pio),
      .reset_n                           (reset_n_int),
      .seven_seg_a_from_the_AvalonMM_Slave_Dyna7seg_0     (seven_seg_a),
      .seven_seg_b_from_the_AvalonMM_Slave_Dyna7seg_0     (seven_seg_b),
      .seven_seg_c_from_the_AvalonMM_Slave_Dyna7seg_0     (seven_seg_c),
      .seven_seg_d_from_the_AvalonMM_Slave_Dyna7seg_0     (seven_seg_d),
      .seven_seg_digit_from_the_AvalonMM_Slave_Dyna7seg_0 (seven_seg_digit),
      .seven_seg_dp_from_the_AvalonMM_Slave_Dyna7seg_0    (seven_seg_dp),
      .seven_seg_e_from_the_AvalonMM_Slave_Dyna7seg_0     (seven_seg_e),
      .seven_seg_f_from_the_AvalonMM_Slave_Dyna7seg_0     (seven_seg_f),
      .seven_seg_g_from_the_AvalonMM_Slave_Dyna7seg_0     (seven_seg_g),
      .zs_addr_from_the_sdram          (SDRAM_A),
      .zs_ba_from_the_sdram            (SDRAM_BA),
      .zs_cas_n_from_the_sdram         (SDRAM_nCAS),
      .zs_cke_from_the_sdram           (SDRAM_CKE),
      .zs_cs_n_from_the_sdram          (SDRAM_nCS),
      .zs_dq_to_and_from_the_sdram     (SDRAM_D),
      .zs_dqm_from_the_sdram           (SDRAM_DQM),
      .zs_ras_n_from_the_sdram         (SDRAM_nRAS),
      .zs_we_n_from_the_sdram          (SDRAM_nWE)
    );
    
    altpllpll altpllpll_inst(
        .inclk0 ( clk ),
        .c0 ( clk_pll ),
        .c1 ( sdram_clk ),
        .locked ( pll_locked )
    );
    
    always @(posedge clk) begin
        if (!reset_n)
            count <= 11'd0;
        else begin
            if (count[10]==1'b0)
                count <= count + 11'd1;
        end
    end
    assign reset_n_int_node = count[10];
    assign reset_n_int = reset_n_int_node & pll_locked;    
endmodule


Quartus?のAnalysis & Synthesisは通ったので、今度はPin Plannerでピンを設定した。下のPin Plannerの様子。
AvalonMMslave7seg_19_090829.png

これでQuartus2でデザインをコンパイルした。成功し、Total logic elementsは88%となった。
AvalonMMslave7seg_20_090829.png

現在の状態はNios2/s を実装し、SignalTap?を実装、おまけにEnable Burstビットをチェックしている状態。以前のダイナミック点灯7セグメントLED回路を入れる前の
Total logic elementsは85%なので、3%増えていることになる。下が以前のSummary。
Nios2_IDE_90_30_090819.png
  1. 2009年08月29日 05:47 |
  2. SOPC Builder
  3. | トラックバック:0
  4. | コメント:0

KiCADにオートルーターが付いた

ずっと前にKiCADのブログを書いたが、近頃(今年の2月にアップされているようなので、最近ではないかもしれないが。。。)のKiCADはオートルータも付いて、だいぶ進化しているようだ。(KiCADはオープンソース(GPL)の回路図CAD、プリント基板のアートワークツールです)
KiCADのホームページからダウンロードサイトに飛んで、KiCad-2009-02-16-final-WinXP_full_with_components_doc_autoinstall.zip をダウンロードしてインストールしてみた。
チュートリアルを探すと、Tutorials for KiCad - A Free Open Source Schematic and PCB Layout EditorMini tutorialが見つかった。このうちの前者を参考にもう一度、試してみることにした。私はあまり回路図CADやPCBCADを扱ったことがないので比較ができません。あらかじめお断りしておきます。
最初にチュートリアルを見ながら、EESchemaで簡単な回路図を入力した。
kicad_1_090828.png

ネットリストを吐きだして、それに合わせてCVpcbでパッケージを選択した。それをPCBnewに読み込んで、部品配置をした。白線はラッツネット。
kicad_2_090828.png

これをオートルーターでルートしたら一瞬で終わった。結果が下の図。
kicad_3_090828.png

3D Viewerで部品が載った様子もぐりぐりできる。
kicad_4_090828.png

どうやら、オートルーターはFreeRouting.netのものらしい。PCBnewのアイコンをクリックするとダイアログが出てくる。
kicad_5_090828.png

Launch FreeRouter via Java Web Startボタンをクリックすると、ダイアログが出てきてサンプルを起動すると、オートルーターのやっている様子が確認できる。下のラッツネットがあって、
kicad_6_090828.png

オートルートしている途中のが下の図。
kicad_7_090828.png

結構見ていると面白い。
皆さん、どうだろうか?KiCADは使い物になるだろうか?私は他のCADをほとんどやったことないので、教えてください。
私はもう少しいじってみようと思う。出来ればSpartan3の基板の設計をしてみようかな?
  1. 2009年08月28日 20:58 |
  2. CADツール
  3. | トラックバック:0
  4. | コメント:4

Avalon-MMスレーブペリフェラル2(SOPC Builder)

Avalon-MMスレーブペリフェラル1(ダイナミック点灯7セグLED)”の続き。
前回は8個のダイナミック点灯7セグメントLEDを制御するAvalon-MMスレーブペリフェラルのVerilogコードを作成したが、これをSOPC Builderに登録する。
これらの作業は、FPGA技術No.5の備州長船さんの第3章 THE AVALONM@STER(Avalon-MMスレーブペリフェラルの作成方法)を参考にさせていただいています。

さて、QuartusⅡからSOPC Builderを立ち上げる。SPOC Builder の内容は下のような感じ。PLLを外に追い出してあるので、PLLは入っていない。前回、作ったVerilogファイルを追加するためにNewボタンをクリックした。
AvalonMMslave7seg_2_090827.png

Component Editorが起動した。Next-> ボタンをクリックした。
AvalonMMslave7seg_3_090827.png

最初にAdd..ボタンをクリックして、トップモジュールのAvalonMM_Slave_Dyna7seg.vを追加した状態。Warningが出ている。
AvalonMMslave7seg_4_090827.png

次に、FreqDiv.vとB27segDec.vも追加した。Warningが出ているのはFPGA技術No.5によると問題ないそうなので、Next-> ボタンをクリックした。(ちなみにFPGA技術No.5には詳しい説明などがいろいろ書いてある)
AvalonMMslave7seg_5_090827.png

Signalsのタブに行くと、下のようになっていた。
AvalonMMslave7seg_6_090827.png

この信号のうち、seven_seg_digit, seven_seg_a, seven_seg_b, seven_seg_c, seven_seg_d, seven_seg_e, seven_seg_f, seven_seg_g, seven_seg_dp を外部信号として登録する。まずはseven_seg_digitのInterfaceをクリックして、New Conduit... を選択した。
AvalonMMslave7seg_7_090827.png

次にSignal Typeからexportを選択した。
AvalonMMslave7seg_8_090827.png

これで外部信号として認識されたそうだ。seven_seg_a, seven_seg_b, seven_seg_c, seven_seg_d, seven_seg_e, seven_seg_f, seven_seg_g, seven_seg_dp も続けてInterfaceをクリックしてconduit_endを選択し、Signal Typeからexportを選択した。Next-> ボタンをクリックした。
AvalonMMslave7seg_9_090827.png

Interfaceタブだが、凄い。。。いろいろなバスの設定などをGUIで出来るみたい。完成度が高そう?
AvalonMMslave7seg_10_090827.png

Signalタブで選択した外部信号もあったが、全部表示されていない。が大丈夫なんだろう?
AvalonMMslave7seg_11_090827.png

波形の下のDeprecatedを展開して、Slave addressing をNATIVEにした。これは、バイトアクセスを許可しないスレーブペリフェラルの場合は必ずNATIVEにする必要があるそうだ。
AvalonMMslave7seg_12_090827.png

次はWarningを消します。Remove Interface With No Signalsボタンをクリックすると、信号を持たないインターフェースが消えて、Warningが消えました。下の図はハイドされていますが、Warningがある時は正常の状態でした。
AvalonMMslave7seg_13_090827.png

Next-> ボタンをクリックしたら、次はComponent Wizardタブ。Group:をPeripheralsに指定した。これで終了なので、Finishボタンをクリックした。
AvalonMMslave7seg_14_090827.png

Save Changesダイアログが開くので、Yes,Saveボタンをクリックした。
AvalonMMslave7seg_15_090827.png

SOPC Builderに戻ると、System ContentsにAvalonMM_Slave_Dyna7segが登録されているので、それを選んでAdd...ボタンをクリックすると、AvalonMM_Slave_Dyna7segが登録された。
AvalonMMslave7seg_16_090827.png

アドレスを見ると0x20から0x3fまでの32バイトアサインされている。これは32ビットレジスタ8個分ということになって、Verilogファイルと合致している。これで終了なので、Finishボタンをクリックした。
Save Changes?ダイアログが出るので、Yesボタンをクリックした。
System generationが成功しました。良かったです。
AvalonMMslave7seg_17_090827.png

QuartusⅡに戻ってコンパイルした。コンパイル成功。
Entityを見ると、AvalonMM_Slave_Dyna7segが入っていた。Total logic elementsは 87% で以前に比べ 2% 増えていたが、まだSOPC Builderで作ったNiosⅡプロセッサのインスタンスに7セグメント関係の入出力が出ているはず。それをトップに接続する必要があるので、もっと増えると思う。次の回でそれらを行う。(2009/08/28 修正)
AvalonMMslave7seg_18_090827.png


FPGA技術No.5では、PCMコアの補足資料も付いています。上のAvalonMM_Slave_Dyna7seg はIRQを付けませんでしたが、IRQの接続方法も載っています。
  1. 2009年08月27日 21:03 |
  2. SOPC Builder
  3. | トラックバック:0
  4. | コメント:4

Avalon-MMスレーブペリフェラル1(ダイナミック点灯7セグLED)

FPGA技術No.5の備州長船さんの第3章 THE AVALONM@STER(Avalon-MMスレーブペリフェラルの作成方法)を参考に、ダイナミック7セグメントLED用のAvalon-MMスレーブペリフェラルを試しに作成中だ。
まずはVerilogファイルの作成をした。トップをAvalonMM_Slave_Dyna7seg.vとしてAvalonバスのRead、Writeを実装して、7セグメントLEDのダイナミック点灯回路も実装した。ダイナミック点灯の周波数は1KHz、これは以前から使用しているFreqdiv.vを使用した。7セグメントLEDのデコーダーには、これまた以前から使用しているB27segDec.vを使用した。それぞれのソースを示す。
まずは、AvalonMM_Slave_Dyna7seg.v

// Dynamic 7segment Display test
//    avs_s1_address = 0 : seven_value0(下位5ビットのみ使用)
//    avs_s1_address = 1 : seven_value1(下位5ビットのみ使用)
//    avs_s1_address = 2 : seven_value2(下位5ビットのみ使用)
//    avs_s1_address = 3 : seven_value3(下位5ビットのみ使用)
//    avs_s1_address = 4 : seven_value4(下位5ビットのみ使用)
//    avs_s1_address = 5 : seven_value5(下位5ビットのみ使用)
//    avs_s1_address = 6 : seven_value6(下位5ビットのみ使用)
//    avs_s1_address = 7 : seven_value7(下位5ビットのみ使用)
//  +16をするとDPが点灯


`default_nettype none

module AvalonMM_Slave_Dyna7seg(
    input    wire        csi_global_reset,    // リセット
    input    wire        csi_global_clk,        // クロック
    input    wire[2:0]    avs_s1_address,        // アバロンバス
    input    wire        avs_s1_read,        // アバロンバス
    output    reg[31:0]    avs_s1_readdata,    // アバロンバス
    input    wire        avs_s1_write,        // アバロンバス
    input    wire[31:0]    avs_s1_writedata,    // アバロンバス
    output    wire[7:0]    seven_seg_digit,    // 外部出力、7セグメントLEDデジット
    output    reg            seven_seg_a,        // 外部出力、7セグメントLEDセグメント
    output    reg            seven_seg_b,        // 外部出力、7セグメントLEDセグメント
    output    reg            seven_seg_c,        // 外部出力、7セグメントLEDセグメント
    output    reg            seven_seg_d,        // 外部出力、7セグメントLEDセグメント
    output    reg            seven_seg_e,        // 外部出力、7セグメントLEDセグメント
    output    reg            seven_seg_f,        // 外部出力、7セグメントLEDセグメント
    output    reg            seven_seg_g,        // 外部出力、7セグメントLEDセグメント
    output    reg            seven_seg_dp        // 外部出力、7セグメントLEDセグメント
);
    reg[7:0] seven_value [7:0]; // 7セグメントの表示
    reg[31:0] avs_s1_readdata_node;
    reg[7:0] drive_led; // 7セグLEDを指定するカウント
    wire disp_ena;
    reg[3:0] led_binary;
    wire[6:0] segdecout;
    
    
    // avalon bus write
    always @(posedge csi_global_clk, posedge csi_global_reset) begin : SEVEN_VALUE_PROCESS
        integer i; // ローカル変数iの宣言
        
        if (csi_global_reset) begin
            for (i=0; i<8 ; i=i+1) begin
                seven_value[i] <= 8'd0;
            end
        end else begin
            if (avs_s1_write) begin
                case(avs_s1_address)
                    3'b000 :
                        seven_value[0] <= avs_s1_writedata[7:0];
                    3'b001 :
                        seven_value[1] <= avs_s1_writedata[7:0];
                    3'b010 :
                        seven_value[2] <= avs_s1_writedata[7:0];
                    3'b011 :
                        seven_value[3] <= avs_s1_writedata[7:0];
                    3'b100 :
                        seven_value[4] <= avs_s1_writedata[7:0];
                    3'b101 :
                        seven_value[5] <= avs_s1_writedata[7:0];
                    3'b110 :
                        seven_value[6] <= avs_s1_writedata[7:0];
                    3'b111 :
                        seven_value[7] <= avs_s1_writedata[7:0];
                endcase
            end
        end
    end
    
    // avalon bus read
    always @* begin
        avs_s1_readdata[31:8] = 24'd0;
        case (avs_s1_address)
            3'b000 :
                avs_s1_readdata[7:0] <= seven_value[0];
            3'b001 :
                avs_s1_readdata[7:0] <= seven_value[1];
            3'b010 :
                avs_s1_readdata[7:0] <= seven_value[2];
            3'b011 :
                avs_s1_readdata[7:0] <= seven_value[3];
            3'b100 :
                avs_s1_readdata[7:0] <= seven_value[4];
            3'b101 :
                avs_s1_readdata[7:0] <= seven_value[5];
            3'b110 :
                avs_s1_readdata[7:0] <= seven_value[6];
            default : // 3'b111
                avs_s1_readdata[7:0] <= seven_value[7];
        endcase
    end
    
    // LED選択用シフトレジスタ
    always @(posedge csi_global_clk) begin
        if (csi_global_reset)
            drive_led <= 8'b1111_1110;
        else begin
            if (disp_ena) begin
                if (drive_led[7]==1'b0) // 最後の次はdrive_led[0]を0にする
                    drive_led <= 8'b1111_1110;
                else
                    drive_led <= {drive_led[6:0], 1'b1}; // 0を1ビットシフト
            end
        end
    end
    assign seven_seg_digit = drive_led;
    
    // LEDリフレッシュ周波数分周器
    FreqDiv FreqDiv_inst(
        .clk(csi_global_clk),
        .reset(csi_global_reset),
        .disp_ena(disp_ena)
    );
        
    // 7セグメント・デコーダ
    B27segDec B27segDec_inst(
        .binary(led_binary),
        .enable(1'b1),
        .segdecout(segdecout)
    );
    
    // 7セグメント・デコーダに入れるバイナリデータの選択と出力の選択
    always @(posedge csi_global_clk) begin : SELECTED_BINAREY_DATA
        integer i; // ローカル変数の宣言
        
        if (csi_global_reset) begin
            led_binary <= 4'd0;
            {seven_seg_dp, seven_seg_a, seven_seg_b, seven_seg_c, seven_seg_d, seven_seg_e, seven_seg_f, seven_seg_g} <= -1;
        end else begin
            for(i=0; i<8; i=i+1) begin
                if (drive_led[i]==1'b0) begin
                    led_binary <= seven_value[i];
                    {seven_seg_dp, seven_seg_a, seven_seg_b, seven_seg_c, seven_seg_d, seven_seg_e, seven_seg_f, seven_seg_g} <= {~seven_value[i][4], ~segdecout}; // 0で点灯なのでsegdecoutを反転する
                end
            end
        end
    end
endmodule


(2009/09/04 更新:AvalonMM_Slave_Dyna7seg.vのseven_seg_digit出力に信号がつながっていなかったので、追加しました。詳しくは”Avalon-MMスレーブペリフェラル4(Nios2 IDEで7セグLEDをテスト)”を参照ください)

次はFreqdiv.v

//入力クロックをダイナミック点灯時の周波数(1KHz)に分周する
// 1KHz clock
// マスタークロックを1KHzのdisp_enaに分周します。
// クロック周波数をclk_frequencyにKHz単位で設定してください。defaultで50MHzです。
// lcntが16ビットになっているので、clk_frequencyが65536以上の場合はビットを増やしてください。
// sync resetに変更

`default_nettype none
`timescale 1ns / 1ps

module FreqDiv(clk, reset, disp_ena);
    input clk, reset;
    output disp_ena;
    wire clk, reset;
    wire disp_ena;
    
    reg [20:0] lcnt;
    
    parameter clk_frequency = 50000;
    
    always @(posedge clk) begin
        if (reset)
            lcnt <= 0;
        else if (lcnt==clk_frequency)
            lcnt <= 0;
        else
            lcnt <= lcnt + 1;
    end
    
    assign disp_ena = (lcnt==clk_frequency);
endmodule


最後にB27segDec.v

// Frequncy Divider for Dynamic Lighting
// 1KHz clock
// マスタークロックを1KHzのdisp_enaに分周します。
// クロック周波数をclk_frequencyにKHz単位で設定してください。defaultで50MHzです。
// Binary to 7 segment LED Decoder
// バイナリデータを7セグメントLED用のデータに変換します。
// enableを0にすると消灯。
// 点灯するセグメントを1で表しているが、実際には0で点灯するので上のファイルで反転しています。


`default_nettype none
`timescale 1ns / 1ps

module B27segDec(binary, enable, segdecout);
    input [3:0] binary;
    input enable;
    output [6:0] segdecout;
    
    wire [3:0] binary;
    wire enable;
    reg [6:0] segdecout;
    
    always @* begin
        if (enable)
            case (binary)
                4'h0 :
                    segdecout = 7'b1111110;
                4'h1 :
                    segdecout = 7'b0110000;
                4'h2 :
                    segdecout = 7'b1101101;
                4'h3 :
                    segdecout = 7'b1111001;
                4'h4 :
                    segdecout = 7'b0110011;
                4'h5 :
                    segdecout = 7'b1011011;
                4'h6 :
                    segdecout = 7'b1011111;
                4'h7 :
                    segdecout = 7'b1110000;
                4'h8 :
                    segdecout = 7'b1111111;
                4'h9 :
                    segdecout = 7'b1111011;
                4'hA :
                    segdecout = 7'b1110111;
                4'hB :
                    segdecout = 7'b0011111;
                4'hC :
                    segdecout = 7'b1001110;
                4'hD :
                    segdecout = 7'b0111101;
                default : // F
                    segdecout = 7'b1000111;
            endcase
        else
            segdecout = 7'b1111111;
    end
endmodule


これらをシミュレーションするために、テストベンチAvalonMM_Slave_Dyna7seg_tb.vを作成してVeritakでシミュレーションしてみた。
テストベンチAvalonMM_Slave_Dyna7seg_tb.vを下に示す。

// AvalonMM_Slave_Dyna7seg_tb

`default_nettype none
`timescale 1ns / 1ps

module AvalonMM_Slave_Dyna7seg_tb;
    reg            csi_global_reset;    // リセット
    reg            csi_global_clk;        // クロック
    reg[2:0]    avs_s1_address;        // アバロンバス
    reg            avs_s1_read;        // アバロンバス
    wire[31:0]    avs_s1_readdata;    // アバロンバス
    reg         avs_s1_write;        // アバロンバス
    reg[31:0]    avs_s1_writedata;    // アバロンバス
    wire[7:0]    seven_seg_digit;    // 外部出力、7セグメントLEDデジット
    wire        seven_seg_a;        // 外部出力、7セグメントLEDセグメント
    wire        seven_seg_b;        // 外部出力、7セグメントLEDセグメント
    wire        seven_seg_c;        // 外部出力、7セグメントLEDセグメント
    wire        seven_seg_d;        // 外部出力、7セグメントLEDセグメント
    wire        seven_seg_e;        // 外部出力、7セグメントLEDセグメント
    wire        seven_seg_f;        // 外部出力、7セグメントLEDセグメント
    wire        seven_seg_g;        // 外部出力、7セグメントLEDセグメント
    wire        seven_seg_dp;        // 外部出力、7セグメントLEDセグメント

    parameter CLK_PERIOD = 20;
    
    defparam AvalonMM_Slave_Dyna7seg_inst.FreqDiv_inst.clk_frequency = 5; // シミュレーション用にカウント数を小さくする
    AvalonMM_Slave_Dyna7seg AvalonMM_Slave_Dyna7seg_inst(
        .csi_global_reset(csi_global_reset),
        .csi_global_clk(csi_global_clk),
        .avs_s1_address(avs_s1_address),
        .avs_s1_read(avs_s1_read),
        .avs_s1_readdata(avs_s1_readdata),
        .avs_s1_write(avs_s1_write),
        .avs_s1_writedata(avs_s1_writedata),
        .seven_seg_digit(seven_seg_digit),
        .seven_seg_a(seven_seg_a),
        .seven_seg_b(seven_seg_b),
        .seven_seg_c(seven_seg_c),
        .seven_seg_d(seven_seg_d),
        .seven_seg_e(seven_seg_e),
        .seven_seg_f(seven_seg_f),
        .seven_seg_g(seven_seg_g),
        .seven_seg_dp(seven_seg_dp)
    );
    
    initial begin
                csi_global_reset = 1'b1;
        #100    csi_global_reset = 1'b0;
    end
    
    always begin
       #(CLK_PERIOD/2)    csi_global_clk = 1'b1 ;
       #(CLK_PERIOD/2)    csi_global_clk = 1'b0 ;
    end
    
    task AVALON_BUS_WRITE;
        input[2:0]    write_address;
        input[31:0]    write_data;
        
        begin
            @(posedge csi_global_clk); // 次のクロックの立ち上がり
            #1;
            avs_s1_write = 1'b1; // Write
            avs_s1_address = write_address;
            avs_s1_writedata = write_data;
            @(posedge csi_global_clk); // 次のクロックの立ち上がり
            #1;
            avs_s1_write = 1'b0;
        end
    endtask
    
    task AVALON_BUS_READ;
        input[2:0]    read_address;
        
        begin
            @(posedge csi_global_clk); // 次のクロックの立ち上がり
            #1;
            avs_s1_address = read_address;
            @(posedge csi_global_clk); // 次のクロックの立ち上がり
            #1;
        end
    endtask
    
    initial begin
        avs_s1_address = 3'd0;
        avs_s1_read = 1'b0;
        avs_s1_write = 1'b0;
        avs_s1_writedata = 32'd0;
        
        #100;
        AVALON_BUS_WRITE(3'd0, 32'h0000_0001);
        AVALON_BUS_WRITE(3'd1, 32'h0000_0002);
        AVALON_BUS_WRITE(3'd2, 32'h0000_0003);
        AVALON_BUS_WRITE(3'd3, 32'h0000_0004);
        AVALON_BUS_WRITE(3'd4, 32'h0000_0005);
        AVALON_BUS_WRITE(3'd5, 32'h0000_0006);
        AVALON_BUS_WRITE(3'd6, 32'h0000_0007);
        AVALON_BUS_WRITE(3'd7, 32'h0000_0008);
        #100;
        AVALON_BUS_READ(3'd0);
        AVALON_BUS_READ(3'd1);
        AVALON_BUS_READ(3'd2);
        AVALON_BUS_READ(3'd3);
        AVALON_BUS_READ(3'd4);
        AVALON_BUS_READ(3'd5);
        AVALON_BUS_READ(3'd6);
        AVALON_BUS_READ(3'd7);
        #500;
        $stop;
    end
endmodule


シミュレーションした結果の波形を下に示す。
AvalonMMslave7seg_1_090826.png

次はSOPC Builderでコンポーネントの追加をする予定。
  1. 2009年08月26日 05:20 |
  2. SOPC Builder
  3. | トラックバック:0
  4. | コメント:0

MSDNのWindows7 RTM にISE11.2をインストール

MSDNのWindows7 RTM にISE11.2をインストールしてみました。問題なくインストールができて、Spartan3A Starter KitのDDR2 SDRAMコントローラのプロジェクトを読み込んで、インプリメントできました。動作は確認していませんが、Windows XPと同様のリポートだったので大丈夫でしょう?
W7_ISE_1_090820.png

ただ、PlanAheadを起動しようとすると、コンピュータにMSVCR71.dllがないため、プログラムを解しできないというダイアログが出て起動しません。もう一度、インストールしてもだめでした。
W7_ISE_3_090824.png

ネットで検索したところ、xrea.com のMSVCR71.dllというページがあったので、これをWindowsフォルダの下のSystem32フォルダに入れたところ、PlanAheadが起動しました。(私はそうでしたが、ほかのパソコンでどうなるかはわかりません)
W7_ISE_5_090825.png

ただ、どういうわけか起動したときに、ほかのエディタで編集してますよというウォーニングが出ます。このYesボタンをクリックしてますが、今のところ問題ないようです。(もしかしてセーブできないとかあるのかな?)
W7_ISE_4_090825.png
  1. 2009年08月25日 12:39 |
  2. Xilinx ISEについて
  3. | トラックバック:0
  4. | コメント:0

これからの予定(2009/08/25)

NiosⅡ9.0 IDEのboard_diagでは、7セグメントLEDのテストプログラムはあるのだが、ダイナミック点灯7セグメントLED用になっていない。そこで、FPGA技術No.5の備州長船さんの第3章 THE AVALONM@STER(Avalon-MMスレーブペリフェラルの作成方法)を参考に、ダイナミック7セグメントLED用のAvalon-MMスレーブペリフェラルを試しに作成中だ。今のところ、本体は出来ていて、シミュレーション用のテストベンチを作っている。
これが終わったらXilinxに戻って、もう少しSpartan-6のDDRコントローラのハードマクロ (Memory Controller Block) をやってみるか、Spartan3A Starter Kit で作成したDDR2 SDRAMコントローラを組み込んで、Spartan3A Starter Kit上でMico32プロセッサを動作させてみたい。
  1. 2009年08月25日 05:30 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

すすたわりさんのFPGA-CAFEに行ってきました

今日、すすたわりさんのFPGA-CAFEにお邪魔しました。
MIXIのいえながさんもいらっしゃることになっていたので、TXのつくば駅に迎えに行きました。いえながさんとお会いするのは初めてです。一緒に車ですすたわりさんのFPGA-CAFEに行きました。
いろいろな工具や面白いFPGAボードがありました。FPGAボードは今のところ秘密とのことですが、とても興味深いボードでした。
いえながさんのSpartan3を使用したロジックアナライザも見せていただきました。秋月300円液晶を使用してSRAMをLCDのフレームバッファに使用。Spartan3のPicoBlazeで制御しているそうです。良くできていました。(いえながさん、画像が載っているホームページがあったら教えてください)
カメラのインターバルリモコンも見せていただきました。マイコンを使ってシンプルな構成ですが、出来上がったビデオは非常に面白かったです。
いろいろ刺激を受けてきました。

(2009/08/24 追記)
すすたわりさんからFPGAボードの写真はブログに載せてもOKというメールをいただきました。FPGAボードの写真も添付されていたので、載せておきます。とても小さいFPGAボードです。裏にSpartan3?が載っています。
SUSUMOD1b.jpg

#すすたわりさんへのメールが帰ってきてしまったので、この場でお礼を言いたいと思います。ありがとうございました。
  1. 2009年08月23日 18:43 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:4

CQセミナに行ってきました

今日は東京の巣鴨に行って、”高性能デジタル回路設計の基礎と最新動向”というセミナを受けてきました。このセミナは、13,000円で安いです。CQ出版社のセミナは良心的だと思います。講師は”HDLによる高性能ディジタル回路設計”などを書かれているNEC研究所の森岡澄夫さんでした。
高度なことを聞けるのかな?と期待して行ったのですが、メインの対象はソフトウェア技術者でハードウェアを始めたい方のようです。回路の動作、Verilog記述、回路の構造が関連付けられるようにするという感じでした。
後半は回路は並列化できるとか、レイテンシやスループットの話、クリティカルパス、フォールスパス、マルチサイクルパスや、マルチクロックのメタステーブルなどでした。興味深い話も聞けたのですが、全体的に初級者用かな?という内容で、少しがっかりしました。もちろん、HDL初級者の人が聞けば、素晴らしい講義だったと思いますが、私には、少し物足りない内容でした。ただ、森岡さんの講義は面白かったです。もう少し突っ込んだ内容が聞きたかったです。
もっと、上流のモジュール分割の方法やコンセプト、注意する点など、(少しはそういう話もありました)を専門的に聞きたかったです。
なかなか、そういうセミナはなさそうですね。今のところ、メインの仕事では、モジュールが自立して動作して、データパスはクロスバーとなっていますが、Readの時はコマンドを投げて、データを出すモジュールがマスタとなるように作っています。(PCI-Xのスプリットトランザクションに似ています)結構、複雑な構造になっているのですが、他の方はそのような実装をどのように仕様を決定して、作っているのか知りたいと思っています。もしかすると、全部スクラッチから作っている方は少ないのかもしれませんね。

最後に今日の昼ごはんの一部。リトルマーメードのパンです。最初はマカダミアナッツ塩パン。マカダミアナッツの風味がとてもよかったです。(私はナッツが好きです)
LM_pan_1_090821.jpg

次はカマンベールチーズのパン。上の焦げが香ばしくておいしいです。
LM_pan_2_090821.jpg

しかし、巣鴨はいろいろお蕎麦屋さんや食堂、パン屋さん、コンビニとかそろっていて、本当にいいですね。新宿や新横浜より昼食が選べますね。下町の感じで、私には心地よいです。
  1. 2009年08月21日 20:43 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:9

Spartan3A Starter KitのDDR2 SDRAMコントローラのバーストテストのインプリメントエラー

Spartan3A Starter KitのDDR2 SDRAMコントローラのバーストテストのプロジェクト”で公開したSpartan3A Starter Kit のDDR2コントローラのバーストテストのプロジェクトをもう一度コンパイルしてみた。ChipScope Proが期限切れだったので、Removeしてインプリメントした。そうしたらPlace & Route でエラーとなってしまった。
Spa3A_StKit_DDR2Cont_1_090820.png

ISE11.2iにアップデートしたからおかしくなったのか?良くわからないが、エラーの全文を下に示す。

Place:1012 - A clock IOB / DCM component pair have been found that are not placed at an optimal clock IOB / DCM site pair. The clock component is placed at site . The clock IO/DCM site can be paired if they are placed/locked in the same quadrant. The IO component is placed at site . This will not allow the use of the fast path between the IO and the Clock buffer. If this sub optimal condition is acceptable for this design, you may use the CLOCK_DEDICATED_ROUTE constraint in the .ucf file to demote this message to a WARNING and allow your design to continue. However, the use of this override is highly discouraged as it may lead to very poor timing results. It is recommended that this error condition be corrected in the design. A list of all the COMP.PINs used in this clock placement rule is listed below. These examples can be used directly in the .ucf file to override this clock rule.
< NET "SYS_CLK" CLOCK_DEDICATED_ROUTE = FALSE; >
< PIN "dcm_DDR2_clk_inst/dcm_DDR2_clk_dcm/DCM_SP.CLKIN" CLOCK_DEDICATED_ROUTE = FALSE; >


結局、clock IO とDCMの位置は同じ1/4の領域においておかないとまずいということらしいが、DCMの位置は制約をかけていないのになぜ~?
検索をしてみると、”31462 - 10.1i Spartan-3A PAR - 「ERROR:Place:1012 - A clock IOB / DCM component pair have been found that are not placed at an optimal clock IOB / DCM site pair」というエラー メッセージが表示される”が引っ掛かった。
それによると、最新版の 10.1 サービス パックで修正されているということだったが、11.2で戻ってしまったのか?
しょうがないので、DCMの配置制約をかけることにした。ProcessペインのUser Constraints -> Floorplan Area/IO/Logic (PlanAhead) をダブルクリックしてPlabAheadを起動する。
Spa3A_StKit_DDR2Cont_2_090820.png

PlanAheadが起動したら、下のI/O Ports からSYS_CLK を選択した。
Spa3A_StKit_DDR2Cont_3_090820.png

右上のDevice で白く示されたところがSYS_CLK パッド。これから1/4領域のところにDCMを配置すれば良いはず。
まずは、DCMの位置を制約するために、Create Site Constraint Modeボタンをクリック し、サイ ト制約作成モードに切り替える。
Spa3A_StKit_DDR2Cont_5_090820.png

EditメニューからFind... を選択すると、Find ダイアログが表示される。一番右のリストボックスでDCMを選択してOKボタンをクリックする。
Spa3A_StKit_DDR2Cont_4_090820.png

そうすると、下のFind Results にDCMが表示される。そのうちのdcm_DDR2_inst/dcm_DDR2_clk_dcm がクロックからつながっているDCMなので、それを選択する。そのまま、それをDeviceペインにドラック&ドロップする。
Spa3A_StKit_DDR2Cont_6_090820.png

下のようにアサインできた。
Spa3A_StKit_DDR2Cont_7_090820.png

これでdcm_DDR2_inst/dcm_DDR2_clk_dcm の位置を固定できた。
FileメニューからSave Flooorplan を選択する。
Spa3A_StKit_DDR2Cont_8_090820.png

すると、UCFにDCMの位置固定制約が書かれた。

INST "dcm_DDR2_clk_inst/dcm_DDR2_clk_dcm" LOC = DCM_X2Y3;


これでDCMの位置が固定されたので、PlanAheadを終了し、もう一度ISE11.2iでインプリメントしたら、無事にPlace & Routeが通った。しかし、1つタイミング制約を満足でなかった。ほんの少しなので、Place & Route のプロパティからCost Table の値を変えて何回かインプリメントを行った。最初は1だったが5を入れてインプリメントすると、全部のタイミング制約が満足した。
Spa3A_StKit_DDR2Cont_9_090820.png

インプリメント後のFPGA Editor の内容を下に示す。
Spa3A_StKit_DDR2Cont_10_090820.png

指定の位置にDCMがアサインされている。
これで一度、Spartan3 Starter Kit にコンフィグして動作を見てみたが、問題なく動作した。
  1. 2009年08月21日 05:16 |
  2. Spartan3A Starter Kit
  3. | トラックバック:0
  4. | コメント:0

NiosⅡ 9.0 IDE を使ってみる6(NiosⅡの設定を変更してみる2)

NiosⅡ 9.0 IDE を使ってみる5(NiosⅡの設定を変更してみる)”でNiosⅡ/sとNiosⅡ/fの比較を行った。今度は最後に残った軽量コアNiosⅡ/eでやってみることにした。ついでにBoard_diagのREADME.txtに従ってexboard_led_pio というLEDの名前をデフォルトのled_pio に変更した。(”NiosⅡ 9.0 IDE を使ってみる4(インターフェースボードのLEDの点灯テスト)”も参照)

最初に、SOPC Builder でNiosⅡ/eに変更した。これはキャッシュを持たないので、Caches and Memory Interfaces のEnable Burst のチェックはハイドされて選択できない。
Nios2_IDE_90_31_090819.png

いままで、LEDのSOPC Builder での名称はexboard_led_pio としてきたが、Board_diagのREADME.txtに下のように書いてある。(一部抜粋)

* Requirements
* **************
* This program requires the following devices to be configured:
* an LED PIO named 'led_pio',


Board_diagを使用してLEDのテストプログラムを自動生成してもらうためにはLEDのPIOの名前はled_pio である必要があるようなので、名前を変更することにした。
SOPC Builder のSystem Contents のexboard_led_pio をled_pio に変更した。
Nios2_IDE_90_35_090819.png

これでSOPC Builder で生成して、QuartusⅡでコンパイルした。そうしたらエラー発生。nois_sdramのポート宣言がexboard_led_pio のままだった。ここを修正して、ピンのアサインも変更する必要がある。
Nios2_IDE_90_36_090819.png

トップのnois2_sdram_led.v (niosのスペルが間違っているがこのままとする) のexboard_led_pio をled_pio に変更した。次に、IOピンのアサインはPin Planner でやるのが正式だろうが、面倒なので、nios2_sdram_led.qsf を直接書き換えてしまうことにした。

set_location_assignment PIN_88 -to exboard_led_pio[7]
set_location_assignment PIN_90 -to exboard_led_pio[6]
set_location_assignment PIN_94 -to exboard_led_pio[5]
set_location_assignment PIN_96 -to exboard_led_pio[4]
set_location_assignment PIN_99 -to exboard_led_pio[3]
set_location_assignment PIN_102 -to exboard_led_pio[2]
set_location_assignment PIN_106 -to exboard_led_pio[1]
set_location_assignment PIN_112 -to exboard_led_pio[0]



set_location_assignment PIN_88 -to led_pio[7]
set_location_assignment PIN_90 -to led_pio[6]
set_location_assignment PIN_94 -to led_pio[5]
set_location_assignment PIN_96 -to led_pio[4]
set_location_assignment PIN_99 -to led_pio[3]
set_location_assignment PIN_102 -to led_pio[2]
set_location_assignment PIN_106 -to led_pio[1]
set_location_assignment PIN_112 -to led_pio[0]


に書き換えた。
これでもう一度、QuartusⅡでコンパイルしたら通った。
NiosⅡIDEで、今までのboard_diag_0 とboard_diag_0_syslib を削除してもう一度作り直した。
board_diag_0 をBuild Project した。SignalTapⅡでコンフィグして、トリガをかけてから、NiosⅡIDEでRun As -> NiosⅡ Hardwareを選択する。
今度は、インクルードファイルをいじらなくても、Nios2 9.0 IDE の下のコンソールペインのNiosⅡTerminal Windowにa: Test LEDs のメニューが表示されている。
Nios2_IDE_90_37_090819.png

その時のSignalTapⅡの波形を下に示す。
Nios2_IDE_90_32_090819.png

完全にシングル転送となっている。
さて、a: Test LEDs がきちんと動作するかをチェックすることにする。その前にもう一度、SignalTapⅡのトリガをかける。
a キーを押すと、きちんとLEDが全部点灯した。成功。。。
a キーを押した時のSignalTapⅡの波形を下に示す。
Nios2_IDE_90_33_090819.png

やはり、シングル転送。当たり前か。。。
最後にTotal logic elements は58%(SignalTapⅡを含む)、やはり一番小さい。
Nios2_IDE_90_34_090819.png

(追加)
NiosⅡ 9.0 IDE を使ってみる5(NiosⅡの設定を変更してみる)”のNiosⅡ/sでCaches and Memory Interfaces のEnable Burst のチェックをしないで、4つのバースト転送が発生したと書いた。これは、もしかして、NiosⅡプロセッサのバスユニットはバースト転送対応でなく、シングル転送対応だが、SDRAMのコントローラにコマンドを書き込んでReadする際に、SDRAMコントローラは、最初にアクティベートコマンドを発行してバンクをアクティブにする必要がある。それや、これやで、処理待ちしている間に、シングル転送のReadコマンドがSDRAMコントローラのFIFOバッファに積まれてしまったので、SDRAMコントローラがバースト転送してしまったのではないかと思う。NiosⅡ/sでCaches and Memory Interfaces のEnable Burst のチェックをした場合にはきっちり16バースト転送が行われている。これはキャッシュフィルの場合のバースト転送ができている。
とりあえず、このような現象が起きているのではないか?と推測している。
  1. 2009年08月20日 05:41 |
  2. NiosⅡ EDS
  3. | トラックバック:0
  4. | コメント:0

NiosⅡ 9.0 IDE を使ってみる5(NiosⅡの設定を変更してみる)

NiosⅡ 9.0 IDE を使ってみる4(インターフェースボードのLEDの点灯テスト)”でスマートじゃないけどLEDのテストも出来たので、一旦NiosⅡのコアを入れ替えてみることにした。NiosⅡにコアは3種類あって、それぞれ機能が違っている。今は一番機能の多く、一番ロジックを使用するコアを使用してる。今回は2番目のNiosⅡ/sに変更した。これはいままでのNiosⅡ/f に比べて、データキャッシュやバレルシフタなどがない。
Nios2_IDE_90_22_090818.png

これでSOPC Builder で生成して、QuartusⅡでコンパイルした。するとやはり以前より小さくなった。Total logic elements が77%になった。(SignalTapⅡが入っている状態)以前は92%だった。下がNiosⅡ/s を実装した時のFlow summary。(ただし、SignalTapⅡが入っている状態)
Nios2_IDE_90_23_090818.png

下がNiosⅡ/f を実装した時のFlow summary。(ただし、SignalTapⅡが入っている状態)
Nios2_IDE_90_25_090818.png

SignalTapⅡで最初のSDRAMのReadをキャプチャしているのが、NiosⅡ/fの時にはバーストでアクセスされていたが、NiosⅡ/s を実装した時にはシングル転送だった。データキャッシュが入っていないせいだろうか?
Nios2_IDE_90_21_090818.png

下がNiosⅡ/fを実装した時の最初のSDRAMのReadのキャプチャ。
Nios2_IDE_90_15_090815.png

NiosⅡ/s を実装した時は、Nios2 9.0 IDE の下のコンソールペインにNiosⅡTerminal Windowが表示された状態では(キーを入力しなければ)SDRAMのReadは発生しない。これは命令キャッシュが入っているので当然だと思う。キー待ちのポーリング時はSDRAMにアクセスは発生しないはず。a キーを押すとSDRAMのReadアクセスが発生する。下図参照。
Nios2_IDE_90_24_090818.png

緑色で囲ったBurst Readの部分と黄色で囲ったSingle Readの部分が見える。たぶん、Burst Readの部分は命令、Single Readの部分はデータだと思われる。Single Readの部分はずいぶん上の方のアドレスを使用している。

下にNiosⅡ/fを実装した時、a キーを押した時のSDRAMのReadアクセスを示す。
Nios2_IDE_90_26_090818.png

Burst Readばかり。

最後にNiosⅡ/fを実装してSignalTapⅡを実装していない場合のTotal logic elements は79%だった。
SOPC_Builder_19_090806.png

256サンプルのSignalTapⅡに590のlogic elementsと9,728のmemory bitsを使用している。


(2009/08/19:追記)
くりさんに教えていただいて、SOPC BuilderのNiosⅡ CPUの設定項目のうちのCaches and Memory Interfaces で、Enable Bursts をチェックしてみた。デフォルトではチェックはされていないようだ。実はEnable Burstsにチェックを入れると、一番大きなNiosⅡ/fでは、リソースが多すぎてコンパイルができない。よって、NiosⅡ/sだけでやってみた。
Nios2_IDE_90_27_090819.png

Enable Burstsにチェックを入れて、SOPC BuilderでGenerateし、QuartusⅡでコンパイルする。NiosⅡ9.0 IDEからBuild Projectして、SignalTapⅡでコンフィグし000番地のReadアクセスでトリガをかけ、NiosⅡ9.0 IDEでRun As -> NiosⅡHardware を選択して、最初にSignalTapⅡにかかった波形が下の波形だ。
Nios2_IDE_90_28_090819.png

バーストReadしている。やはりEnable Burstsにチェックを入れるとバーストするようだ。次に、a キーを押した時にSignalTapⅡで000番地のReadアクセスでトリガをかけたらどんな波形が見えるかを見てみる。下の図画素の波形。
Nios2_IDE_90_29_090819.png

かなりバーストReadするようになった。0番地からF番地までバーストReadしているので、16バースト、32バイトを一度に読み込んでいる。
ちなみに上のSDRAM波形のコマンドは、最初からプリチャージ、プリチャージ、リフレシュ、アクティベート、バーストRead、プリチャージ、アクティベート、シングルRead、シングルRead、シングルRead、シングルRead。
やはり、Enable Burstsにチェックを入れる以前よりはバースト長が長い。でも、以前も4バーストReadはしていたようなので、Enable Burstというよりは、きっちり32バイト読み込むというイネーブルビットなのだろうか?
最後にどのくらい使用リソースが増えたかというと、下の図がQuartasⅡのFlow Summary。
Nios2_IDE_90_30_090819.png

Total logic elements が77%のところ85%になった。344個、logic elementsの使用が増えた。
やはりこのデバイスではNiosⅡをいろいろ試すのには小さいようだ。
  1. 2009年08月18日 06:19 |
  2. NiosⅡ EDS
  3. | トラックバック:0
  4. | コメント:2

NiosⅡ 9.0 IDE を使ってみる4(インターフェースボードのLEDの点灯テスト)

くりさんのご指摘のおかげで、(本当に恥ずかしいバグだった)”NiosⅡ 9.0 IDE を使ってみる3(SDRAMが動作しない原因を追及がわからず...わかりました)”でSDRAMを動作させることができた。
今度はテストできるはず?なのに、うまく行かないインターフェースボードのLEDをテストしてみることにした。
board_diag.h, board_diag.c を見ると、TestLEDs(void)関数があって、これを生かせば、そのままLEDのテストができるはず。だけど、下のようになっていて、LED_PIO_NAME をdefine しないと生きない。

#ifdef LED_PIO_NAME

/*
* static void TestLEDs(void)
*
* This function tests LED functionality.
* It exits when the user types a 'q'.
*/

static void TestLEDs(void)
{


そこで、#define LED_PIO_NAME をboard_diag.h に追加した。これでNios2 9.0 IDE でBuild Project をすると、エラー発生。
LED_PIO_BASEがdefine されていないそうだ。そこでSOPC Builder を起動してexboard_led_pio のベースアドレス0x00000000 を確認した。そのアドレスをLED_PIO_BASEの値としてdefine した。
結局、board_diag.h に追加したdefine は下の2つ。

#define LED_PIO_NAME
#define LED_PIO_BASE 0x00000000


これでNios2 9.0 IDE でBuild Project をするとビルド出来て、Nios2 9.0 IDE の下のコンソールペインにNiosⅡTerminal Windowが表示された。
Nios2_IDE_90_19_090816.png

前回の表示よりも a: Test LEDs の項目が増えている。a を入力するとインターフェースボードのLED 8個がすべて点灯した。
Nios2_LED_test_1_0890816.jpg

ここでq を入力するとLEDテストが終了して8個の LED がすべて消灯した。
Nios2_IDE_90_20_090816.png

これでLEDはOK。
7セグメントLEDやRS-232Cもテストしてみようかな?
  1. 2009年08月16日 20:46 |
  2. NiosⅡ EDS
  3. | トラックバック:0
  4. | コメント:8

ChipScope Pro 11.2期限切れ

しばらくAltera のツールをいじっていたが、XilinxのISE11.2に戻って、気になることはChipScope Proが期限切れになってるはずなんだけど、果たして動かないか?ということだった。
ChipScope Analyzer とCore Inserter を単体で動かすと動く。。。
それではと、ISEのプロジェクトからChipScope ProのIPをAdd して、それをダブルクリックして観察する信号を追加し、終了。なんだ、動くんだ。。。
ISEをインプリメントし始めたら、Implement Design のTranslate でChipScopeのライセンスエラー発生。。。やはり、ライセンス期限が過ぎて動かない。。。残念ということになった。
やはり、無料で使えるAltera のSignalTapⅡは魅力的だ。。。
  1. 2009年08月15日 07:30 |
  2. Chipscope
  3. | トラックバック:0
  4. | コメント:0

NiosⅡ 9.0 IDE を使ってみる3(SDRAMが動作しない原因を追及がわからず...わかりました)

NiosⅡ 9.0 IDE を使ってみる2(SDRAMが動作しない)”でSDRAMのReadデータが出ていないことがわかった。今回は何とかしてSDRAMを動作させてみたい。

まずはSDRAMのイニシャライズ部分を見てみる。下のタイミングチャートに示す。
Nios2_IDE_90_14_090814.png

最初にプリチャージして、リフレッシュを2回、点線の部分がモードコマンドで、バースト長1、シーケンシャルモード、/CASレイテンシ3となっている。その後はReadしている。イニシャライズ手順は問題なさそう。

一度、sdram_clk を0度にしてやってみようと思う。やってみたがやはりだめだった。
sdram_clkを-30度にしてみたが、やはりだめだった。もう一度Pinの配置を見たけれど、問題ないみたいだ。
トップモジュールがVerilogだからダメということはないでしょうよね?原因がわからない。
サンプルをSignalTapⅡで見てみると読めているようだ。違いがわからない?
といういうわけで、いちおうサンプルではSOPC Builder , Nios2 IDEのテストをすることができたし、これでOKということにしようと思う。今度Alteraのツールを試す時には、Digi-keyでDE1を購入することにしたほうが良いかも?しれないと思うようになった。

追記:くりさんに指摘していただきましたが、SDRAM_Dがoutputになっていました。正しくはinoutです。くりさん、本当にありがとうございました。
これでSDRAMのVerifyエラーもなくなりました。SDRAMがRead出来るようになりました。下図参照。
Nios2_IDE_90_15_090815.png

000hをReadして0014hが読めています。
NiosⅡ9.0 IDE を立ち上げて、board_diga0 で右クリックかRun AS... -> NiosⅡHardwareを選択すると、NiosⅡTerminal Windowが表示された。LEDは制御できなかった。この辺がまだなぞ?
Nios2_IDE_90_16_090815.png

しかし、inout がoutputと間違っていてもエラーが出ないのですね?自分で間違ったのが悪いとはいえ、エラーを出してほしかったかなと?ちょっとさみしいです。。。
  1. 2009年08月15日 06:59 |
  2. NiosⅡ EDS
  3. | トラックバック:0
  4. | コメント:2

NiosⅡ 9.0 IDE を使ってみる2(SDRAMが動作しない)

NiosⅡ 9.0 IDE を使ってみる1”でSDRAMのVerifyがエラーになって先に進めなかった。(原因がわかりました。SDRAM_Dの宣言をinout とする必要があるところをoutputにしてしまいました。)
動作するサンプル回路は、PLLのlockedとPowerONタイマータイムアウトのANDを取ってSOPC Builderで生成したNiosⅡシステムのリセットに入っている。FPGA技術Vol.4でも備前長船さんがaltpllのlocked 信号はロック前の準安定状態でもぽつぽつ1になってしまうと書いてあったので、それでPLLのlockedとPowerONタイマータイムアウトのANDを取っているのだと思う。
今回はALTPLLの設定にHold 'locked' output low for というオプションを見つけたので、それを入れてPowerONタイマータイムアウトは入れないでどうなるか様子を見てみることにした。

さて、初めにSOPC Builder を立ち上げてpll をDelete し、Generate ボタンをクリックしてシステムを生成する。
Nios2_IDE_90_8_090813.png

システムの生成が終了した。
Nios2_IDE_90_9_090813.png

SOPC Builder で生成してあったaltpllpll をMegaWizard Plug-In Managerで修正する。QuartusⅡのToolsメニューからMegaWizard Plug-In Manager... を選択する。ダイアログでEdit an existing custom megafunction variation を選択して、Next >ボタンをクリックする。altpllpll.v を選択してNext > ボタンをクリックして、設定を開始する。
Parameter Settings のInputs/Lock の項目で、Lock output のCreate 'locked' output にチェックを入れる。次にHold 'locked' output low for にもチェックを入れる。
Nios2_IDE_90_10_090813.png

これでaltpllpllの設定は終了したのでFinishボタンで終了した。
次にトップのnois2_sdram_led.v を修正した。altpllpll をインスタンシエーションした。具体的には下のようになった。

/ nois2_sdram_led

`default_nettype none

module nois2_sdram_led(
    input    wire         clk,
    input    wire        reset_n,
    output    wire [7:0]    exboard_led_pio, 
    output    wire        sdram_clk,
    output    wire [11:0]    SDRAM_A,
    output    wire [1:0]    SDRAM_BA,
    output    wire        SDRAM_nCAS,
    output    wire        SDRAM_CKE,
    output    wire        SDRAM_nCS,
    output    wire [15:0]    SDRAM_D,
    output    wire [1:0]    SDRAM_DQM,
    output    wire        SDRAM_nRAS,
    output    wire        SDRAM_nWE);
    
    wire clk_pll;
    wire pll_locked;

  nois_sdram nois_sdram_inst
    (
      .clk_0                             (clk_pll),
      .out_port_from_the_exboard_led_pio (exboard_led_pio),
      .reset_n                           (pll_locked),
      .zs_addr_from_the_sdram          (SDRAM_A),
      .zs_ba_from_the_sdram            (SDRAM_BA),
      .zs_cas_n_from_the_sdram         (SDRAM_nCAS),
      .zs_cke_from_the_sdram           (SDRAM_CKE),
      .zs_cs_n_from_the_sdram          (SDRAM_nCS),
      .zs_dq_to_and_from_the_sdram     (SDRAM_D),
      .zs_dqm_from_the_sdram           (SDRAM_DQM),
      .zs_ras_n_from_the_sdram         (SDRAM_nRAS),
      .zs_we_n_from_the_sdram          (SDRAM_nWE)
    );
    
    altpllpll altpllpll_inst(
        .inclk0 ( clk ),
        .c0 ( clk_pll ),
        .c1 ( sdram_clk ),
        .locked ( pll_locked )
    );
endmodule


これでQuartusⅡでコンパイルして通った。やってみたのですが、やはり同じでした。残念。もう一度サンプルと同じ回路を使ってやってみます。
サンプル回路とほとんど同じにしてみました。reset_nはスイッチにつながっているので、スイッチを押さなければ1です。クロックをcountでカウントしてcount[10] が1になって、altpllpll のlocked が1になった時、ANDでNoisⅡシステムのリセットが外れるようにしました。これでサンプル回路と同じはずです。(下にソースを示します)これでもSDRAMがFailしました。

// nois2_sdram_led

`default_nettype none

module nois2_sdram_led(
    input    wire         clk,
    input    wire        reset_n,
    output    wire [7:0]    exboard_led_pio, 
    output    wire        sdram_clk,
    output    wire [11:0]    SDRAM_A,
    output    wire [1:0]    SDRAM_BA,
    output    wire        SDRAM_nCAS,
    output    wire        SDRAM_CKE,
    output    wire        SDRAM_nCS,
    inout    wire [15:0]    SDRAM_D,
    output    wire [1:0]    SDRAM_DQM,
    output    wire        SDRAM_nRAS,
    output    wire        SDRAM_nWE,
    
    output    wire [7:0]    digit);
    
    wire clk_pll;
    wire pll_locked;
    reg        [10:0] count;
    wire reset_n_int_node, reset_n_int;

  nois_sdram nois_sdram_inst
    (
      .clk_0                             (clk_pll),
      .out_port_from_the_exboard_led_pio (exboard_led_pio),
      .reset_n                           (reset_n_int),
      .zs_addr_from_the_sdram          (SDRAM_A),
      .zs_ba_from_the_sdram            (SDRAM_BA),
      .zs_cas_n_from_the_sdram         (SDRAM_nCAS),
      .zs_cke_from_the_sdram           (SDRAM_CKE),
      .zs_cs_n_from_the_sdram          (SDRAM_nCS),
      .zs_dq_to_and_from_the_sdram     (SDRAM_D),
      .zs_dqm_from_the_sdram           (SDRAM_DQM),
      .zs_ras_n_from_the_sdram         (SDRAM_nRAS),
      .zs_we_n_from_the_sdram          (SDRAM_nWE)
    );
    
    altpllpll altpllpll_inst(
        .inclk0 ( clk ),
        .c0 ( clk_pll ),
        .c1 ( sdram_clk ),
        .locked ( pll_locked )
    );
    
    always @(posedge clk) begin
        if (!reset_n)
            count <= 11'd0;
        else begin
            if (count[10]==1'b0)
                count <= count + 11'd1;
        end
    end
    assign reset_n_int_node = count[10];
    assign reset_n_int = reset_n_int_node & pll_locked;
    
    assign digit = 8'b1111_1111; // 7segment LED 消灯
endmodule


(2009/08/15:上のVerilog-HDLコードが間違っていたので、SDRAM_Dのoutputをinoutに変更しました。この下の3つの波形はSDRAM_Dをoutputとして測定した波形です。Readデータが出ていませんでした)

さてどうしよう?仕方がないので、この際せっかくSignalTapⅡの使い方を練習したので、SignalTapⅡでSDRAMとのやり取りを見てみることにした。
まずは、SDRAMにWrite しているところをキャプチャする。下の図。
Nios2_IDE_90_11_090814.png

SDRAMの領域をVerifyするのは、アドレス0番地から書いて読みだしているようだ。その0番地と1番地のWriteを見いる。最初にバンクをアクティベートしてから、0014hと0084hを書き込んでいる。
次のその番地をReadした時の値を見てみる。下の図参照。
Nios2_IDE_90_12_090814.png

0番地、1番地をReadしてもデータはFFFFhだ。読めていない。ちなみにリフレッシュはどうかというと。下の図。
Nios2_IDE_90_13_090814.png

ちゃんとプリチャージしてリフレッシュしている。間隔は20nsのクロックサイクルで256サンプル = 5.12us しかサンプルできないのでわからない。もうFPGAのリソースが残っていないので、これが限界だ。
  1. 2009年08月14日 06:15 |
  2. NiosⅡ EDS
  3. | トラックバック:0
  4. | コメント:2

FPGA技術 Vol.5

今日、出来上がったばかりだというFPGA技術 Vol.5をすすたわりさんから直接いただいちゃいました。ありがとうございました。
今回は特にすごいです。なななんと、撮影できますPさんと備州長船さんが書かれています。内容も凄いですよ。
撮影できますPさんは、300円液晶を例にFPGAの使い方を説明されています。300円液晶にカウンタでグラデーションを表示する方法。ハードウェアでマンデルブロー集合を書く方法。いやーレベル高いです。当然、XilinxのFPGAです。
備州長船さんは、当然Alteraで、SOPC Builder で使えるAvalonバスのMMスレーブの作り方です。具体的には8ビットPCM音源コアです。こちらも凄いです。良く書かれていて、(実はまだ全部は読んでいませんが。。。)後で、やりながらじっくり読みたいです。本当にレベルが高い。
すすたわりさんも最後に書かれています。つくばにFPGAカフェというショップを作られているのは知っていましたが、秋ごろ完成とのことです。今そのショップで委託販売するハードウェアを募集しているそうです。まだWebページはからのようですが、これから整備されるのでしょう?
買って損のない雑誌に仕上がっていると思います。これは買わなきゃ損だと思います。
  1. 2009年08月11日 19:49 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:5

東京FPGAカンファレンス2009

9/15(火)の東京FPGAカンファレンス2009に申し込んだ。
今年もなひたふさんの講演があるみたいだし、ヒューマンデータさんも出展しているようなので、楽しみだ。だけど、出展社は少ないような感じだ。
  1. 2009年08月10日 18:06 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

www.alldatasheet.jp

以前、”DDR SDRAMシミュレーションモデル”でALL DATASHEET.COMを紹介したが、それの日本語サイトが出来ていた。知らなかった。
www.alldatasheet.jp には、”このサイトで検索して検索結果がなかったら他のサイトでも検索結果がないでしょう。 ”と書いてある。すごい自信だが、それだけのことはあるんだと思う。
  1. 2009年08月10日 17:30 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:2

NiosⅡ 9.0 IDE を使ってみる1

次に、日昇テクノロジーのMAX II/Cyclone IIボードのマニュアル2009/2/26の76ページ、第6章に従ってNiosⅡ 9.0 IDEを使ってみることにする。

最初に、前回作成した.sof をQuartusⅡのProgrammer から書き込む必要がある。nois2_sdram_led というプロジェクトなのだが、出来たSOFファイルはnios2_sdram_led_time_limited.sof だった。無料版なので時間制限があるのだろうか?
とにかくこれしかないのでProgrammer で書きこんだ。下図参照
Nios2_IDE_90_1_090809.png

そうすると、OpenCore Plus Status が出てくるので、そのままに置いておくそうだ。
Nios2_IDE_90_3_090809.png

次に、NiosⅡ9.0 IDE を立ち上げて、ワークスペースを今回のプロジェクトのフォルダに設定した。File メニューからNew -> NiosⅡ C/C++ Application を選択した。New Project ダイアログが起動した。
SOPC Builder System PTF File: にnois_sdram.ptf を選択し、Select Project Templete にBoard Diagnostics を選択してFinish ボタンをクリックする。
Nios2_IDE_90_1_090809.png

board_diag_0 を右クリックして、Build Project を選択し、ビルドを行う。
Nios2_IDE_90_4_090809.png

ビルドは結構長い。。。ビルドが終了したらエラーが出ていた。SYSID_BASEやSYSID_TIMESTAMPがundeclared だそうだ。
Nios2_IDE_90_5_090809.png

困った。Webを検索しても解決策は見つからなかったが、SYSID_BASEなどがsystem.h にあるのはわかった。boar_diag.h からsystem.h はインクルードされている。
とりあえず原因がわからないが、NoisⅡIDE起動時にもう1つNoisⅡIDEを起動していたのが原因だろうか?もう一度新しくプロジェクトを作って確かめてみることにする。

takepon256さんに教えていただいて、上の問題は解決できました。takepon256さんありがとうございました。
SOPC Builder を変更したので、”SOPC Builderを使ってみる1”を変更しました。

もう一度、board_diag_0を作り直して、ビルドしたらもんだくなくビルド出来たようだ。なお、たぶんjtag_uart_0 ではなくてjtag_uart に名前を変えたほうがNoisⅡ9.0 IDEでWarningが出るのを防げるようだ。
Nios2_IDE_90_6_090811.png

左側のペインのboard_diag_0 で右クリックしてRun As -> Nois Ⅱ Hardware を選択した。そうするとmake し始める。
ここで、board_diag_0.elf のダウンロードから先に進まない。下に示すメッセージがコンソールに出てきた。

Using cable "USB-Blaster [USB-0]", device 1, instance 0x00
Pausing target processor: not responding.
Resetting and trying again: OK
Reading System ID at address 0x00000018: verified
Initializing CPU cache (if present)
OK

Downloading 02000000 ( 0%)
Downloading 02010000 (92%)
Downloaded 70KB in 1.6s (43.7KB/s)

Verifying 02000000 ( 0%)
Verify failed between address 0x2000000 and 0x200FFFF
Leaving target processor paused


SDRAMが動作していないのかな?
日昇テクノロジーのサンプルでやってみた。LEDがアサインされていないのかコマンドを打つとエラーになったが、Board Diagnosticsのコンソールは起動した。QuartusⅡで回路を見るとリセット回路が付加されている。もしかして、これを付けないと動作しないのか?付けてやってみることにした。

(2009/08/12:追記)
原因がわかりました。IOピンのうちSDRAM_nCSのアサインを忘れていました。
SOPC_Builder_26_090812.png

あわててSDRAM_nCSをPIN_191に指定しました。これでもう一度QuartusⅡでコンパイル。
やはり、NoisⅡIDEでSDRAMがVerify failが出るのは変わらず。。。

(2009/08/15:追記)
トップのVerilog-HDLをミスっていました。
SDRAM_Dをinoutとするところoutputと記述してしまいました。
  1. 2009年08月10日 05:39 |
  2. NiosⅡ EDS
  3. | トラックバック:0
  4. | コメント:2

スライド丸のこを使って棚を作った

昨日は、以前購入したスライド丸のこを使って、作っていた棚が完成しました。この棚は奥さんの実家から頼まれたものです。初めて、棚作りを頼まれました。
結構苦労してしまいました。最初、スライド丸のこの機能を覚えるためにいじってたのですが、スライド丸のこは横に斜め切りもできるのですが、縦に斜め切りもできます。縦の角度をいじっているときに良く戻さなかったので、板を切った時に微妙ですが、縦に斜め切りになってしまいました。それを気付かなかったため、組み立て後に縦板が地面と直角にならずに斜めになってしまいました。高さが左右で3mm 程ずれてしまいました。
このときに板が斜めに切れていたのがわかりました。しょうがないので、再度ばらして、スライド丸のこの角度を調整しなおして再度切りなおしました。2mm程板が短くなりましたが、大丈夫でしょう。
これで、再度組み立てました。これでやっと地面と直角になって、左右の高さの差が0.5mm くらいになりました。これでOK。
昨日は、オイルフィニッシュで塗装して、乾かして完成です。もし木地があらかったら、紙やすりで仕上げます。まとまってよかったです。
tana_090810.jpg

  1. 2009年08月10日 05:09 |
  2. 木工
  3. | トラックバック:0
  4. | コメント:0

黒部ダムに行ってきました

昨日は、はとバスの”日帰りで行く!立山・黒部アルペンルート(大観峰往復)(日帰り)”に参加して、黒部ダムに奥さんと2人で行ってきました。子供たちは誘ったのですが来ませんでした。しかし、兎に角ハードでした。黒部ダムまで行って日帰りで帰ってくるのですから。。。
家を朝、4時30に出て、車で万博公園駅へ。車を置いて、TXで新御徒町まで、そこから大江戸線に乗り換えて新宿西口へ。新宿西口広場の先にバスの出発場所があります。新宿西口に来たことがないので、うろうろ、iPhoneのマップも使って場所探し、ようやく6時40分の集合時間ちょうどくらいに着きました。
バスに乗り込んで出発。一路、長野県を目指して、中央高速道をひた走り、途中、双葉のサービスエリアで休憩。ここで、黒部ダムではレストランで食事をしている暇がないので、昼食を買っていくようにとの添乗員さんの説明がありました。どんだけ忙しいツアーなんじゃ~と多少不安になりました。双葉のサービスエリアでは焼き立てパンが売っていたので、これを購入。でも朝もパンだったので、パンでないものを買いたかった。。。
途中で諏訪湖が見えました。わー良く見える。上から見ると景色がきれいです。(一度行ったことがあります)
kurobe_dam_1_0808.jpg

バスは中央道から長野道に入って、豊科インターチェンジで高速を降りました。ここからは、普通の道路を通って扇沢に11時くらいに着きました。扇沢には、黒部ダムに行くためのトロリーバスの発着所があります。
kurobe_dam_2_0808.jpg

ここはもう黒部峡谷の入り口で幽玄な雰囲気、雲が下に降りてきたような感じです。乗用車もたくさん来ていました。
kurobe_dam_3_0808.jpg

ここからトロリーバスで黒部ダムへ。黒部ダムに着いたら、楽な方と220段の階段を上るダム展望台の2つを選べと言われて、奥さんの希望でキツイほうに、日ごろの運動不足がたたって疲れました。景色は綺麗です。霞がかかっているようになっていました。天気は曇りで、パラパラ雨が降り出しています。
kurobe_dam_4_0808.jpg

黒部ダムの方を見ると観光用の放水があって、とても雄大な眺め。。。
kurobe_dam_5_0808.jpg

しかしこのダム展望台よりも下の方の展望台の方が黒部ダムに近くて迫力がありました。
kurobe_dam_6_0808.jpg

次の目的地の黒部平までのケーブルカーの駅に行くまでの行程でこのように見学をしているのですが、時間が足りなくて黒部ダムの上を歩いて行くときには時速6.5km/h程度の早足でした。(トロリーバスの駅からケーブルカーの駅までは、黒部ダムの上を歩いて移動します)
ケーブルカーの駅で時間があったし、12時を回っていたので、買ってきたパンで食事。立ちながら食べました。本当に時間のないツアーです。
kurobe_dam_7_0808.jpg

ケーブルカーで黒部平に上がったら雨でした。外に行ってもガスっていて景色は見えず。。。お店で黒部そばを奥さんと分け合って食べました。白エビのかき揚げ入りのそばでしたが、朝からパンしか食べていなかったので、おいしかったのなんの。。。おいしかったです。でもおなかが膨れていたので、奥さんと2人で1つにしました。(雨で観光ができなかったので、結局そばを食べる時間ができました)
ゴロゴロと雷が鳴ってきて不安になりましたが、ロープウェーで大観峰に行きました。
でも、大雨でなにも見えず。。。結局、お土産を見ていました。
kurobe_dam_8_0808.jpg

ここからは引き返します。またロープウェーで黒部平に降りて、ケーブルカーで黒部ダムに帰ってきたら大雨でした。がっくり。。。
トロリーバスで扇沢に着いたら、また雨。。。雨にたたられます。
午後4時50分頃、扇沢をでて帰りました。途中の中央道で晴れ間が見えて虹がかかりました。せめてもの慰めかな。。。
kurobe_dam_9_0808.jpg

途中渋滞情報もあって心配しましたが、定刻の午後9時に新宿に着きました。家に着いたのは11時を過ぎてしました。とにかく疲れました。
今回は大観峰からの景色を見ることができなかったので、リベンジを誓いました。でも、今度は少なくとも一泊が良いです。。。今回は子供たちを置いて行くので日帰りになりましたが、泊まるのが正常だと思います。

  1. 2009年08月08日 06:25 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:8

SOPC Builderを使ってみる3(IOピンやタイミング制約を加えてテスト)

SOPC Builderを使ってみる2(NiosⅡのインスタンシエーション)”でコンパイルは通ったので、今度はIOピンや動作周波数などのタイミング制約を入力してコンパイルし、テストしてみる。
まずは、”QuartusⅡでSignalTapⅡを試してみるまでの準備5(入力、出力ピンの制約とタイミング制約)”を参照してPin Plannerを立ち上げて、IOピンの配置を制約する。途中までIOピンを入力したのだが、QuartusⅡでのIOピンの制約ファイルはどれなんだろう? ISEだと、配置制約もタイミング制約も.ucf というファイルに全部書いてあったが、QuartusⅡのタイミング制約を書いたファイルは、”QuartusⅡでSignalTapⅡを試してみるまでの準備6(入力、出力ピンの制約とタイミング制約2)”でやってみたように.sdc だった。
下に途中まで入力したPin Plannerを示す。
SOPC_Builder_15_090806.png

入出力ピンの制約ファイルをフォルダから探ってみたが、どうやら nois2_sdram_led.qsf というのがそうらしい。下に nois2_sdram_led.qsf を示す。

# -------------------------------------------------------------------------- #
#
# Copyright (C) 1991-2009 Altera Corporation
# Your use of Altera Corporation's design tools, logic functions
# and other software and tools, and its AMPP partner logic
# functions, and any output files from any of the foregoing
# (including device programming or simulation files), and any
# associated documentation or information are expressly subject
# to the terms and conditions of the Altera Program License
# Subscription Agreement, Altera MegaCore Function License
# Agreement, or other applicable license agreement, including,
# without limitation, that your use is for the sole purpose of
# programming logic devices manufactured by Altera and sold by
# Altera or its authorized distributors. Please refer to the
# applicable agreement for further details.
#
# -------------------------------------------------------------------------- #
#
# Quartus II
# Version 9.0 Build 184 04/29/2009 Service Pack 1 SJ Web Edition
# Date created = 19:20:23 July 31, 2009
#
# -------------------------------------------------------------------------- #
#
# Notes:
#
# 1) The default values for assignments are stored in the file:
# nios2_sdram_led_assignment_defaults.qdf
# If this file doesn't exist, see file:
# assignment_defaults.qdf
#
# 2) Altera recommends that you do not modify this file. This
# file is updated automatically by the Quartus II software
# and any changes you make may be lost or overwritten.
#
# -------------------------------------------------------------------------- #


set_global_assignment -name FAMILY "Cyclone II"
set_global_assignment -name DEVICE EP2C5Q208C8
set_global_assignment -name TOP_LEVEL_ENTITY nois2_sdram_led
set_global_assignment -name ORIGINAL_QUARTUS_VERSION "9.0 SP1"
set_global_assignment -name PROJECT_CREATION_TIME_DATE "19:20:23 JULY 31, 2009"
set_global_assignment -name LAST_QUARTUS_VERSION "9.0 SP1"
set_global_assignment -name EDA_SIMULATION_TOOL ""
set_global_assignment -name EDA_TIME_SCALE "1 ps" -section_id eda_simulation
set_global_assignment -name EDA_OUTPUT_DATA_FORMAT NONE -section_id eda_simulation
set_global_assignment -name USE_GENERATED_PHYSICAL_CONSTRAINTS OFF -section_id eda_blast_fpga
set_global_assignment -name DEVICE_FILTER_PACKAGE PQFP
set_global_assignment -name DEVICE_FILTER_PIN_COUNT 208
set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0
set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85
set_global_assignment -name QIP_FILE nois_sdram.qip
set_global_assignment -name VERILOG_FILE nois2_sdram_led.v
set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top
set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top
set_global_assignment -name LL_ROOT_REGION ON -section_id "Root Region"
set_global_assignment -name LL_MEMBER_STATE LOCKED -section_id "Root Region"
set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top
set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL"
set_location_assignment PIN_152 -to SDRAM_A[11]
set_location_assignment PIN_187 -to SDRAM_A[10]
set_location_assignment PIN_160 -to SDRAM_A[9]
set_location_assignment PIN_161 -to SDRAM_A[8]
set_location_assignment PIN_162 -to SDRAM_A[7]
set_location_assignment PIN_163 -to SDRAM_A[6]
set_location_assignment PIN_164 -to SDRAM_A[5]
set_location_assignment PIN_165 -to SDRAM_A[4]
set_location_assignment PIN_185 -to SDRAM_A[3]
set_location_assignment PIN_182 -to SDRAM_A[2]
set_location_assignment PIN_181 -to SDRAM_A[1]
set_location_assignment PIN_180 -to SDRAM_A[0]
set_location_assignment PIN_188 -to SDRAM_BA[1]
set_global_assignment -name MISC_FILE "H:/HDL/Altera/qdesigns/nisyo_board/nios2_sdram_led/nios2_sdram_led.dpf"


一度、Pin Planner を終了して、試しに nois2_sdram_led.qsf に下の行をBA[1]のすぐ下の行にテキストエディタで追加してみる。

set_location_assignment PIN_189 -to SDRAM_BA[0]


再びPin Planner を立ち上げるとSDRAM_BA[0] のピン制約が入っていました。
SOPC_Builder_16_090806.png

これでPin Planner だけでなく、テキストエディタでIOピン制約のコピー&ペーストができるようになった。
すべてのIOピンの制約を入力した。ところで、Pin Planner を設定していて思ったのだけれど、AlteraのFPGAのデフォルト出力電流値は24mAに設定されているのですね?Xilinxは12mAだと思ったけど、倍の電流を流していますね。これだと波形の立ち上がりは速くなるし、クロックエッジからの出力の立ち上がり時間も速くなると思うけど。。。SSOや波形のリンキングはどうなのかな?と思ったりする。特にQFPだし。。。でもそんなところまで気にするような動作周波数ではないかな?とりあえずデフォルトで行くことにする。

次はTimeQuestで動作周波数の制約だが、日昇テクノロジーのサンプルがどうなっているか見たら.sdc ファイルがなかった。制約はかかっていないようだが、PLLの動作周波数での制約はかかっているようだった。どうも制約がかかっていないのは、Xilinx使いとしては気分が悪いので、セットアップ時間、クロックからの出力時間も制約をかけることにした。もう一度、”QuartusⅡでSignalTapⅡを試してみるまでの準備5(入力、出力ピンの制約とタイミング制約)”を見ながらTimeQuestでタイミング制約を生成してみる。
SDRAMからの入力のセットアップ時間を7nsとすることにした。TimeQuest のConstraintsメニューからSet Input Delay...を選ぶ。Set Input Delayダイアログが表示されたら、SDRAM_Dをすべて選んで、7nsの制約をかける。
SOPC_Builder_17_090806.png

SDRAMのクロックからの出力時間も7nsとした。同様にConstraintsメニューからSet Output Delay...を選ぶ。Set Output Delayダイアログが表示されたら、SDRAMの信号をすべて選んで、やはり7nsの制約をかける。
SOPC_Builder_18_090806.png

nois2_sdram_led.sdc を書いておこうと思ったが、設定しないのにFalse Pathがたくさん設定されていて長いので省略。自動的に設定されるのだろうか?
その後、コンパイルして通りました。これでQuartusⅡでのコンパイルは終了かな?
SOPC_Builder_19_090806.png


2009/08/09 追記:
くりさんのご指摘によってTimeQuest の制約が使われていないのがわかりました。もう一度、制約を使ってコンパイルできるようにしたいと思います。

QuartusⅡのAssignmentsメニューからSettings...を選択する。Settingsダイアログが出るので、CategoryでTiming Analysis Settings を選択する。Timing analysis processing のUse TimeQuest Timing Analyzer during Compilation のラジオボタンをクリックして選択する。
SOPC_Builder_20_090810.png

次にTiming Analysis Settings の下のTimeQuest Timing Analyzer を選ぶ。SDC file to include in the project でSDC filename: にnois2_sdram_led.sdc を選択してAddボタンをクリックする。
SOPC_Builder_21_090810.png

nois2_sdram_led.sdc が追加される。
SOPC_Builder_22_090810.png

これでOKボタンをクリックしてSettingsのダイアログを閉じる。もう一度コンパイルする。コンパイル後はTimeQuest Timing Analyzerに変わっていた。そうかこうなるのか?納得。。。タイミングは満たしていました。
SOPC_Builder_23_090810.png

くりさん、教えていただいてありがとうございました。

  1. 2009年08月06日 18:11 |
  2. SOPC Builder
  3. | トラックバック:0
  4. | コメント:6

SOPC Builderを使ってみる2(NiosⅡのインスタンシエーション)

やっと、日昇テクノロジーのFPGAボードのIOピンの接続リストが出来上がりました。欲しい方がもしいらっしゃったらメールください。

SOPC Builderを使ってみる1”でNiosⅡを生成できた。
次にNiosⅡのインスタンシエーションをする。日昇テクノロジーのMAX II/Cyclone IIボードのマニュアル2009/2/26では、回路図(BDF)でシンボルを読み込んでIOポートを付けたが、私はVerilogでインスタンシエーションを行うことにする。
nois_sdram_inst.v にインスタンシエーションの例が載っているので、それを参考にnios2_sdram_led.v を書くことにする。下にnois_sdram_inst.v の内容を示す。

  //Example instantiation for system 'nois_sdram'
  nois_sdram nois_sdram_inst
    (
      .clk_0                             (clk_0),
      .out_port_from_the_exboard_led_pio (out_port_from_the_exboard_led_pio),
      .pll_0_c0_out                      (pll_0_c0_out),
      .pll_0_c1_out                      (pll_0_c1_out),
      .reset_n                           (reset_n),
      .zs_addr_from_the_sdram_0          (zs_addr_from_the_sdram_0),
      .zs_ba_from_the_sdram_0            (zs_ba_from_the_sdram_0),
      .zs_cas_n_from_the_sdram_0         (zs_cas_n_from_the_sdram_0),
      .zs_cke_from_the_sdram_0           (zs_cke_from_the_sdram_0),
      .zs_cs_n_from_the_sdram_0          (zs_cs_n_from_the_sdram_0),
      .zs_dq_to_and_from_the_sdram_0     (zs_dq_to_and_from_the_sdram_0),
      .zs_dqm_from_the_sdram_0           (zs_dqm_from_the_sdram_0),
      .zs_ras_n_from_the_sdram_0         (zs_ras_n_from_the_sdram_0),
      .zs_we_n_from_the_sdram_0          (zs_we_n_from_the_sdram_0)
    );


nois2_sdram_led.v をNotepad++で作って、ProjectメニューからAdd/Remove Files in Project を選択して、nois2_sdram_led.v をプロジェクトに追加した。
SOPC_Builder_11_090805.png

これで、コンパイルしたらエラーが出た。どうやらwire input clk などと書くと通らないようだ。Verilog2001に対応していないのかな?(Verilog2001の書き方を間違っていました。正しくは input wire clk, です。takepon256さん、ありがとうございました。)
仕方がないので、input clk; wire clk; に分けて記述したところ、文法のエラーはなくなったのだが、今度はTop-level design entity がないとエラーが出てしまった。
SOPC_Builder_12_090805.png

一旦、nois2_sdram_led.v を消して、FileメニューのNew...からnois2_sdram_led.v を作り直してみたがだめ。検索してみると、”Error: top level design entity " " is undefined”が引っ掛かった。
それによると、AssignmentsメニューからDevice...のGeneralをクリックして、Top-level entityを設定するとのことだった。実際にやってみるとnois2_sdram_ledが2つあって、現在選択されていない方にしたらコンパイルが通り始めた。一安心。やはり、最初にトップのファイルを作った方がよさそうだ。
でも、最終的にEDA Netlist Writerで下に示すエラーが出た。

Error: Can't generate netlist output files because the file "H:/HDL/Altera/qdesigns/nisyo_board/nios2_sdram_led/incremental_db/compiled_partitions/nios2_sdram_led.root_partition.map.atm" is an OpenCore Plus time-limited file


検索してみたところ、やはりAltera Forlumの”Open Core IP time limited source files expired.”にsettings->eda tool settings->simultionをオフしたらと書いてあったが、settingsがわからない。どうやら、Assignments->eda tool setting...のsimulation のようだ。現在はModelSim Alteraになっているので、これをNoneに変更した。
SOPC_Builder_13_090805.png

やっとコンパイルが通りました。よかった。。。
SOPC_Builder_14_090805.png

良かったけど、まだIOピンもアサインしていないし、動作周波数も制約していないので、もう一度コンパイルをやり直す。
最終的なnois2_sdram_led.vを下に示す。

// nois2_sdram_led

`default_nettype none

module nois2_sdram_led(clk, reset_n, exboard_led_pio, sdram_clk, SDRAM_A, SDRAM_BA, SDRAM_nCAS, SDRAM_CKE, SDRAM_nCS, SDRAM_D, SDRAM_DQM, SDRAM_nRAS, SDRAM_nWE);

    input             clk;
    input             reset_n;
    output [7:0]    exboard_led_pio;
    output             sdram_clk;
    output [11:0]    SDRAM_A;
    output [1:0]    SDRAM_BA;
    output             SDRAM_nCAS;
    output             SDRAM_CKE;
    output             SDRAM_nCS;
    inout    [15:0]    SDRAM_D;
    output    [1:0]    SDRAM_DQM;
    output            SDRAM_nRAS;
    output             SDRAM_nWE;

    wire         clk;
    wire         reset_n;
    wire [7:0]    exboard_led_pio;
    wire         sdram_clk;
    wire [11:0]    SDRAM_A;
    wire [1:0]    SDRAM_BA;
    wire         SDRAM_nCAS;
    wire         SDRAM_CKE;
    wire         SDRAM_nCS;
    wire [15:0]    SDRAM_D;
    wire [1:0]    SDRAM_DQM;
    wire         SDRAM_nRAS;
    wire         SDRAM_nWE;

  nois_sdram nois_sdram_inst
    (
      .clk_0                             (clk),
      .out_port_from_the_exboard_led_pio (exboard_led_pio),
      .pll_0_c0_out                      (),
      .pll_0_c1_out                      (sdram_clk),
      .reset_n                           (reset_n),
      .zs_addr_from_the_sdram_0          (SDRAM_A),
      .zs_ba_from_the_sdram_0            (SDRAM_BA),
      .zs_cas_n_from_the_sdram_0         (SDRAM_nCAS),
      .zs_cke_from_the_sdram_0           (SDRAM_CKE),
      .zs_cs_n_from_the_sdram_0          (SDRAM_nCS),
      .zs_dq_to_and_from_the_sdram_0     (SDRAM_D),
      .zs_dqm_from_the_sdram_0           (SDRAM_DQM),
      .zs_ras_n_from_the_sdram_0         (SDRAM_nRAS),
      .zs_we_n_from_the_sdram_0          (SDRAM_nWE)
    );
endmodule


しかし、AlteraのQuartusⅡの論理合成ツールはVerilog2001に対応していないのでしょうか?
AlteraはSignalTapⅡがFreeで使える分、ポイントが高いと思ったが、Verilog2001が使えないのでは考えてしまう。。。
Verilog2001使えました。訂正いたします。(AlteraはSignalTapⅡがFreeで使える分、ポイントが高い)
#年は取っていますが、Alteraのツールは初心者で学ぶことが多すぎます。limuxが動作したら良いな。。。いつも途中で挫折してしまうので、このボードでは無理かもしれないけど。うまく行くんだったボードを買っても良いかな?20年前くらいにUNIXのソースコードをみんなで読んだりしたけど、もうだいぶ過去になっている。
#実は今日から5日間夏休みです。いつもと同じようなことをやっています。

(追記)
年をとってもケアレスミスをしてしまってお恥ずかしい。。。もう一度nois2_sdram_led.v を貼っておきます。

// nois2_sdram_led

`default_nettype none

module nois2_sdram_led(
    input    wire         clk,
    input    wire        reset_n,
    output    wire [7:0]    exboard_led_pio, 
    output    wire        sdram_clk,
    output    wire [11:0]    SDRAM_A,
    output    wire [1:0]    SDRAM_BA,
    output    wire        SDRAM_nCAS,
    output    wire        SDRAM_CKE,
    output    wire        SDRAM_nCS,
    output    wire [15:0]    SDRAM_D,
    output    wire [1:0]    SDRAM_DQM,
    output    wire        SDRAM_nRAS,
    output    wire        SDRAM_nWE);

  nois_sdram nois_sdram_inst
    (
      .clk_0                             (clk),
      .out_port_from_the_exboard_led_pio (exboard_led_pio),
      .pll_0_c0_out                      (),
      .pll_0_c1_out                      (sdram_clk),
      .reset_n                           (reset_n),
      .zs_addr_from_the_sdram_0          (SDRAM_A),
      .zs_ba_from_the_sdram_0            (SDRAM_BA),
      .zs_cas_n_from_the_sdram_0         (SDRAM_nCAS),
      .zs_cke_from_the_sdram_0           (SDRAM_CKE),
      .zs_cs_n_from_the_sdram_0          (SDRAM_nCS),
      .zs_dq_to_and_from_the_sdram_0     (SDRAM_D),
      .zs_dqm_from_the_sdram_0           (SDRAM_DQM),
      .zs_ras_n_from_the_sdram_0         (SDRAM_nRAS),
      .zs_we_n_from_the_sdram_0          (SDRAM_nWE)
    );
endmodule

  1. 2009年08月05日 13:34 |
  2. SOPC Builder
  3. | トラックバック:0
  4. | コメント:4

スライド丸のこを購入

だいぶ、木工にはまってきています。今度はスライド丸のこを買ってしまいました。あまり良い品物ではないですが、DIY専用ということで仕事用に使うなというEARTH MAN 190mmスライド丸のこ SM-100を購入しました。
これがあると、木材を直角に切れます。丸のこは持っていますが、定規を当てても、なかなか直角に切るのは難しいのです。これだとぴったり直角に切ることができます。欲しかったのですが、三万円以上するので、購入できないでいました。(45度にも切れます)
昨日、EARTH MAN 190mmスライド丸のこ SM-100を見たのですが、15,800円で売っていたので、早速今日行って購入してしまいました。店員さんに聞いたところ、やはりDIYようなので、仕事にハードに使うと壊れるそうです。でもそんなに使わないので大丈夫でしょう?
奥さんの実家でも棚を頼まれました。これで、うまく作ることができそうです。

FPGAの方は日昇テクノロジーのFPGAボードのIOピンの接続リストを作っています。地味な作業です。出来たら、どなたか必要な方いらっしゃいますか?バグはあると思うので、バグを見つけたら知らせていただけたらな?と思います。
slidenoko_090805.jpg

2009/08/06 追記: 昨日スライド丸のこを使ってみました。確かに直角に切れて重宝します。ただ、モーターの回転音があまり良くないです。やはり安物という気がしますが、今のところ使えていますし、あるとないとでは大きな差なので、使っていこうと思っています。(やはり、日立やマキタが良いですね。3倍以上の値段ですけど。。。)
  1. 2009年08月03日 21:12 |
  2. 木工
  3. | トラックバック:0
  4. | コメント:0

ISE11.2iのアップデート

今日、ISE11.2iのアップデートがあるのかな?と思って、Help -> XilinxUpate をしてみたら、PlanAhead Japanese Documentation Update と ISE Japanese Documentation Update があったので、早速アップデートした。
Xilinx_updata_2_090802.png

PlanAhedの日本語マニュアルを少し読んでみましたが、PlanAheadとChipscopeが統合されているようです。PlanAheadからChipscopeのコアを挿入できるようです。もしかしたら、今までネットがなくなって苦労することがあったコア挿入作業をより簡単に行うことができるかもしれません。後でやってみたいと思います。
  1. 2009年08月02日 21:03 |
  2. Xilinx ISEについて
  3. | トラックバック:0
  4. | コメント:0

食品棚完成

昨日、食品棚を白いオイルフィニッシュで塗装しました。一回塗装しただけではほとんど白くなりません。もう家で使いたいということで、一度塗りになりましたが、奥さんにこれは白ではないと怒られてしまいました。
とりあえず、今日上と下をLアングルで連結して完成。。。
syokuhindana_1_090802.jpg

良かったです。長かったです。やっと完成しました。
ホームセンターで引き出しを買ってきて設置した状態が下です。
syokuhindana_2_090802.jpg

すっきりしました。良かったです。一番下は引き出しは入れないことにしました。
  1. 2009年08月02日 20:02 |
  2. 木工
  3. | トラックバック:0
  4. | コメント:0

SOPC Builderを使ってみる1

日昇テクノロジーのMAX II/Cyclone IIボードのマニュアル2009/2/26を参考にして、SOPC Builder を試してみることにした。しかし、このマニュアルに載っているnios_led_sch というフォルダはサンプルをダウンロードした中にないし、このマニュアルもボードのマニュアルと銘打っている割にはQuartusⅡやSOPC Builder などツールの説明書だし、結局ボードのマニュアルはないんだよな~。回路図から読み解けといった感じ。回路図もCycloneⅡの乗ったボードと表示ボードの2つになっているので、コネクタを合わせて読み解く必要があるし。。。ちょっとマニュアルが不親切。FPGAも小さいし、もっとやりたくなったら、純正のボードを購入することにする。USB Blasterもどきは今回手に入ったし。。。

愚痴はこのくらいにして、SOPC Builder を試してみることにする。MAX II/Cyclone IIボードのマニュアル2009/2/26の53ページ、第五章 NIOSⅡシステム・モジュールの設計を参考に進めていく。
QuartusⅡを立ち上げてnois2_sdram_led プロジェクトを作る。ToolsメニューからSOPC Builder を立ち上げる。(この辺は日昇テクノロジーのマニュアルを参照しているので、適宜、画面を貼り付ける)
SOPC_Builder_1_090731.png

Verilogを選択して、NiosⅡプロセッサを追加する。その際にJTAG Debug Module のレベルも選択できるみたい。どのレベルのJTAG Debug をするかによってLEの数が違ってくる。これは当たり前か。。。MicroBlazeにはXMDがあるが、設定はなかったような?
SOPC_Builder_2_090731.png

次に行くと、Custom Instractions が設定できる。気軽にカスタム命令が設定できるのかな?あらかじめ使いそうな命令は左側に用意されているようだが、ハードウェアを追加した命令追加はImport... ボタンあたりから使うのかな?
SOPC_Builder_3_090731.png

これでNiosⅡプロセッサの設定は終わり、ちなみにNiosⅡはNiosⅡ/f という一番機能が充実しているもの。
つぎにSDRAMコントローラを追加する。Custom を指定して、データ幅を16bitsにする。次に行くとSDRAMのパラメータを指定するが、SDRAMのデータシートがないので、ネットで探してきた。型番はK4S640432HというサムソンのSDRAM。
まずは、リフレッシュコマンドの発行間隔だけど、64ms refresh period (4K cycle)なので、15.625usでOK。初期化についてはマニュアルに何も書いていないで、これで大丈夫でしょう?
後はデータシートに書いていないのでわからない。サンプルプロジェクトを立ち上げてみたらデフォルトだったので、そのままで行くことにする。
SOPC_Builder_4_090731.png

これでNiosⅡとSDRAMは作られたようだ。
次はインターフェース・ボードに8個付いているLEDを組み込む。左のペインのPeripherals -> Microcontroller Peripherals -> PIO(Parallel I/O)をダブルクリック、PIOを設定する。マニュアルと違って8ビット幅あるので、そのままFinishボタンをクリックした。
SOPC_Builder_5_090731.png

JTAG UARTを組み込む。JTAG UARTは、Interface Protocols -> Serial -> JTAG UART をダブルクリックして、JTAG UARTを設定する。これはマニュアルと同じくデフォルトのまま。
その後はPLLの設定。
Output Clocksのclk c2はSDRAM用の制御クロックだそうですが、Clock Phase Shiftを -63度にするとは、もしかして、READデータを受けるFPGAのセットアップ時間を確保するためなのかな?(2009/08/06 追記:そうとも言いますが、クロックを出力するときの出力の遅延をキャンセルするためですね。たぶん。。。)
SOPC_Builder_6_090731.png

PLLを設定し終わった。次は、Peripherals -> Debug and Performance -> System ID Peripheralをダブルクリックする。
現在のSOPC Builder の表示は下のようになっている。
SOPC_Builder_7_090731.png

ここからpio_0 をrename で名前を変えて、exboard_led_pio に変更した。
Clockフィールドでpllから出力されたpll_0.c0 に各モジュールのクロックを変更するようなのだが、SDRAM Controller だけは、わざわざ作ったpll_0.c1にするのではないだろうか?マニュアルみてもそのようには書いていないが、はたしてどうしたほうがいいか???サンプルとして出来ているsdram_testプロジェクトを見ると、PLLは使っていないし、SDRAM Controller もそのままのクロックを使っている。ここは、pll_0.c1 はせっかく作ったのだが、とりあえず、SDRAM Controller もpll_0.c0 を使うことにする。
(2009/8/2追加:ここでのクロックはあくまでもSDRAM Controller のクロックで、後でpll_0.c1をSDRAMのクロックとして出力していました)
SOPC_Builder_8_090731.png

(2009/08/10 追加:ここでWarning が出ていました。sysid_0 をsysidにRenameするとWarning が消えました。Warningを消しておかないと、後でNoisⅡ IDEでエラーが出ます。Warningを消した状態を下の図に示します。)
SOPC_Builder_24_090810.png

cpuをダブルクリックして、Reset VectorとException Vectorにsdram_0を指定する。Finishボタンで終了する。
SOPC_Builder_9_090731.png

SOPC Builder でGenerateボタンをクリックする。System generationが成功した。
(2009/08/10 追加:sysid_0をsysidにRenameした図に変更しました)
SOPC_Builder_25_090810.png

2009/08/02 追記: 日昇テクノロジーのFPGAボードは回路図だけでピンにどの素子がつながっているかのリストがありません。問い合わせてみたのですが、ないとのこと。仕方がないので、QuartusⅡでインプリメントする前に自分でリストを作ることにしました。まだ、1つの基板だけだったら良いのですが、上にインターフェース基板が載っているので、IOがコネクタ経由になるのでリストを作らないとわかりません。SUZAKUはリストがマニュアルに記載されているので良かったのですが。。。今度、購入するときにはAltera 純正のボードを購入することにします。サンプルプロジェクトのコメントはたぶん中国語で化けていますし、別にコメントを見なくてもVerilogコードは読めるのですけど、どうもいまいちです。。。
  1. 2009年08月01日 15:11 |
  2. SOPC Builder
  3. | トラックバック:0
  4. | コメント:0