スターターキット編

※ 2010年当時の内容をそのまま掲載しております。
  リンク切れなどございますが、ご容赦ください


はじめまして、mamehachi です!
BBT で、FPGA 見習いやってます。
まだ、まだ、駆け出しです 

これから SiTCP について学ぼうと思っているところです。

さて、何から始めようかな…

SiTCP って何が嬉しいんだろう。
データをイーサネット上で転送できるFPGA用のライブラリか~。
プログラムを組まずに、お気軽に転送できるってことかな…
ネットワークのプログラミングは難しそうだから、これは、うれしいな!

う~ん。他にもいいことがあるのかな?
Dr. Bean 教えてください。

なんじゃ、まだまだ、修行が足りんの~。
目先の楽さだけに目を付けおって…

確かに、ハードウエアだけで、TCP のサーバーとして機能するから、

ソフトを組まなくて良いのじゃが、もっと注目せんといかん特徴があるのじゃよ。



ハードウエアで実装しているから、高速で安定した転送ができるのじゃよ。

最近は、FPGA に CPU を実装することもできるのじゃが、高速には動作せぬのじゃ。

それに、ライブラリが小さいから、中規模クラスのFPGAでユーザの回路と

共に実装することができるのもこのライブラリのウリじゃ。

UDP のよる通信で、レジスタの設定も出来るのじゃぞ。



内田先生のページがあるから、ちゃんと、目を通しておきなさい!



確か、先日、注文しておいた Xilinx の「Spartan-3A スタータ キット」

届いていたはずじゃ。

SiTCP User Community にあるサンプルを、動かしてみてはどうじゃ。

分かりました。

「Spartan-3A スタータ キット」 で SiTCP を動かしてみます。

スタータキットを、探さないと…

こんにちは、mamehachi です。

Xilinx の「Spartan-3A スタータ キット」手に入れました!

さて、早速、開封。



基板、マニュアル、USBケーブル、CD が入っていますね。

マニュアルといっても、動作確認ぐらいしか書いてないな~。



まずは、「Start Here」と書かれたマニュアルに従って動作確認をしてみよう。

ちゃんと動作するのかちょっとドキドキするな~。



電源を接続して、電源スイッチをON…

`

Welcome to S3A &

S3AN Starter Kit

` ```

とLCDに表示されました。

そして、約1秒後、コンフィグレーションのメニュー表示になりました。

無事起動しました~!





詳しいマニュアルは、オンラインにあるのか~。

検索、検索…



スタータキットの資料が置いてあるページがありました。



このボードは REVISION D だから

「Spartan-3A/3AN FPGA スタータ キット ボード ユーザー ガイド」

でいいようだな。後で、目を通しておこう。



資料探している途中で ISE12 って見かけたけど、CD には、ISE11 って書いてあるな~。

ISE11 でいいのかな?



こんな時は、Dr.Been に聞いてみよう。

どうなんですか?

知ってるとは思うが、ISE は、xilinx が提供している開発環境じゃ。

ISE12 が最新じゃが、スタータキット用の SiTCP のサンプルは、ISE11 用なので、

今回は、xilinx がフリーで提供している ISE11の WebPack をインストールするのが良いぞ。

こんにちは、mamehachi です。
 
今回は、ISE11 の WebPACK を、インストールします。
 
ISE WebPACK のページから
「Windows および Linux 用 ISE WebPACK ソフトウェアのダウンロード」をクリック。
 
ISE のいろんなバージョンがおいてあるぞ。
Dr. Been が ISE11 を使うように、言っていたな~。
ISE11 にもいろいろバージョンがあるけど、11.1 をまずインストールしないといけないみたいだな。
11.1 の All Platforms (WebPACK)をダウンロード...
 
ん、ユーザ登録をしないといけないのか。
英語だからめんどくさいけど、必要な項目を埋めればいいだけか。なんとか終了。
 
2.67GB もあるから結構時間がかかるな~。
 
Windows のソフトで tar ってめずらしいけど、
Lhaplus で tar の展開できるのかな。
お、出来そうだ...
  

 
あれ、こんな表示が出てしまった。
うまく解凍できないみたいだな~。
 
Dr. Been なんで解凍できないのですか?

これは、100 文字より長いファイル名を使えるようにする GNU 独自の拡張に
対応していないからじゃよ。ワシも以前、悩んだものじゃ。

tar のマニュアルに多少記述があるぞ。
そうじゃの~、古いバージョンのマニュアルの説明のほうが分かりやすいかもしれんの~。

どちらも英語じゃから、お主にはちょっと辛いかの~。
「tar @LongLink」で検索してみるのが良いかもしれんの~。
このことについて、ブログなど書いている人が結構おるから、参考になるじゃろう。

Laplus は、GNU 独自拡張に対応していないようじゃから、他のツールを探すのが良いぞ。

他のツールって言われても、大丈夫なのはどれなんだろう~。
Dr. Been も冷たいよな~。お勧めのツールを教えてくれればいいのに!

Dr. Been が教えてくれないなら、Google 先生に聞いてみよう...

tar の解凍ができそうだから、とりあえず 7-ZIP を試そう。
Windows XP だから、32bit版をダウンロードして、実行。
インストール先を指示するだけで簡単に終了。
さて、解凍できるのかな~。

tar ファイルを右クリックすると...おー、「7-ZIP」のメニューが増えてる。
 

 
[ここに解凍]を選択...
  


無事、解凍できるかな~。

終わった。
エラー表示もでなかったし、「Xilinx_11.1_WebPack_SFD」ディレクトリも出来ているから
うまくいったっぽいぞ。

ディレクトリを開いて...
う~ん、「xsetup.exe」でいいのかな。ちょっと、linux っぽい名前だな~。
「xsetup.exe」を実行。

 



いろいろ設定があるけど、全部デフォルトでいいみたいだな~。
 


 
[インストール]ボタンをクリック。

インストールが始まったけど...結構掛かるな~。

おっと、ダイアログボックスが出ている。

 
一時間弱はかかったかな。
あれ、まだ続くのか...
VC++ 関連のものみたいだけど、これはすぐ終了。

次は、ライセンスか~。
 

 
[Start ISE WebPack] を選択して、[Next]をクリック。

Xilinx のサイトが表示されるのか~。いや、いや、結構手間がかかるな~。
WebPACK Lisense を選んで...お、e-mail でライセンスファイルが送信されるのか...
 

 
[Copy License...] をクリックして、送られてきたファイルを指定してして、[close]。

さすがにこれで終了かな?

おっと、次は Update か~。
 

 
[Check for Updates] をクリック。
 

 
[OK] をクリック。
 


あれ、エラー表示だ!

う~ん、とりあえず、リトライしてみるか。
ん、また同じダイアログだ。ダメか。
とすると、キャンセルするしかないか。

 
一応、完了。いまいち、すっきりしないけど...

11.5 が最新だから、update はしないとまずいんだろうな~。
また、Dr. Been に聞くか...
「なんじゃ、そんなこともわからんのか」な~んて嫌味のひとつも言われそうだな...

気を取り直して、まずは起動してみよう。
デスクトップ上の [Xilinx ISE 11] をダブルクリック。

お~、立ち上がった。
 

 
メニューの [Help]-[XilinxUpdate...] というのがあるぞ。
お、インストールの時と同じだ。

 
[Yes]。
 


 

ん、[License State] が [Invalid] の項目があるな~。
ちょっと、あやしいぞ。
外して、試してみよう。
 


 

一旦、アプリケーションを止めるのか。
[Yes]をクリック。
 


 

かなり時間がかかるみたいだな~。。
全然進まないから、ちょっと、出掛けてこよう。
やっと、update 終わりました。

3時間位かかったのかな。

さてと、もう一度起動してみよう。

[Help]-[About...]
で、バージョン表示。
 

 
無事、11.5 になった。
良かった良かった。
Dr. Been に聞かずに済んだし 

さてと、次はやっとサンプル版の起動だな。
やったことは大したことはないけど、意外と時間がかかったな~。

こんにちは、mamehachi です。
やっと、SiTCP に辿りつきました~ 

まずは、サンプル版をSiTCPサイトからダウンロードしてこよう!
SiTCP のメインメニューからダウンロードを開いて、
「Sample source for Xilinx Spartan 3A Starter kit」をクリックしてダウンロード。

XC3ASKSample.4.0.zip が、ダウンロードできました。
ZIP ファイルを解凍すると、XC3A_SK_SiTCP デレクトリができたぞ。

ISE を立ち上げよう。
ん~。file メニューを見ると、[Open Project] があるな~。これだろう。
ファイルの種類に「*.xise」ってあるから、拡張子が「xise」の
ファイルを
探せばいいんだな。

お、XC3A_SK_SiTCP/ISE11 の中に「ISE11.xise」ってファイルがあったぞ。
これだな。開いてみよう。


再生のアイコンをクリックすればいいのかな。

あれ、コンパイル済みなのか~。何も起こらないな~。

コンパイルしてみたいから、

XC3A_SK_SiTCP/src/S3A_SK_SiTCP.V

を変更せずに保存しなおして、タイムスタンプを更新してみよう。



もう一回、再生[Implement Top Module]をクリック。



お~、コンパイルできたみたいだ。

warning は出ているけど、大丈夫だろう。

 


「Generate Programming File」が「?」だな~。

再生アイコンのヒント表示に、「Implement Top Module」ってでるな~。
これは、Implement までみたいだな。

う~ん、どうすればいいんだろう。
[Generate Programing File] を右クリックするとしてみるか...

 



[Run] かな。



ちょっと待つと…



出来たみたいだ。

 

さ~て、スタータキットで動かすぞ!

って、どうすればいいんだ。

[Configure target Device] っぽいけど。

ユーザーズガイドを、見てもこの辺りについては詳しく書いてないようだな~。

Dr.Been に聞いてみよう。
どうすればいいんですか?

そうじゃの~。
スタータキットの FLASH に書き込むことも出来るのじゃが、
今回は USB ケーブルを使って JTAG で直接 FPGA をプログラムするのが
簡単で良いじゃろう。
スタータキットの設定の変更も必要ないしの~。

まずは、ISE の [Configure Target Device] にある
[Manage Configure Project(iMPACt)] をダブルクリックして
起動するのじゃ。
立ち上がったら、[Boundary Scan] を選択して、
[Initialize Chain] を実行すると、
後は、なんとなく分かるじゃろう。

USB ケーブルか~。
確か、キットについていたはずだ...。
USB ケーブルで、PCとスタータキットを接続して、
電源を入れてみよう。




あ、ドライバーのインストールするのか~。

[いいえ、今回は接続しません] を選択して、[次へ] をクリック。 



[ソフトウェアを自動的にインストールする] を選択して、[次へ] をクリック。


さーて、動かしてみよう! 

と思ったらまた同じダイアログが表示されたぞ。

また、ドライバーのインストールなのかな?
同じ手順で、... 完了。

あれ~、また、出てきたな~。
大丈夫なのかな~。
もう一度、繰り返すか...完了。

今度は、ダイアログが出てこない。
良かった、先にすすめる  

[Manage Configuration Project(iMPACT)] をダブルクリック。 

Boundary Scan って、Dr.Bean が言っていたな~。



[Boundary Scan] を、クリック。

ん、何も起きないな~。じゃ、ダブルクリック。 

「Right click to Add Device or Initialize JTAG chain」って出たぞ。

Dr.Bean が[Initialize Chain] を実行しろと言っていたのは、これだな。

「Right click」と書かれている付近を右クリックすると…



[Initialize Chain] を、クリック。

お~、FPGA が、表示された!

「Do you want to continue and assign configuration files(s)?」

って聞いているから、[Yes] かな。


表示されている、「s3a_sk_sitcp.bit」を指定すれば、良さそうだな。



[Open] をクリック。


FLASH は使わないと言っていたから、[No] でいいだろう。

あれ、また出てきたぞ。

あ、xcf04s に色が付いているな~。

一個ずつ選択するみたいだな。

FLASH だから、[Bypass] でいいかな。


デフォルトで大丈夫だろう。



[OK] をクリック。


xc3s700a を右クリックするんじゃないかな~。


予想通りだ  
[Program] をクリック。


お、どうだろう。


うまくいったみたいだ!

スタータキットの LED 表示が変わったぞ。


LD7 のみ点滅するようになりました。



動作しているみたいだな~。

LED の表示以外に起動確認の方法はないのかな~?

まずは、ping を打って、導通確認をするのが良いじゃろう。

サンプル版は、SiTCP のデフォルトの IP アドレスを使用しているのじゃ。
IP address: 192.168.10.16<br>TCP port: 24<br>UDP port: 4660

デフォルトは、これじゃ。

分かりました。PING で確認してみます。



まず、クロスケーブルでPC と接続しよう。

スタータキットのRJ-45コネクタのLEDが緑色で点灯したから、

LINK は、無事上がったみたいだな~。



コマンドプロンプトを起動して、

PING…えっとアドレスが、192.168.10.16…

    
あれ、 失敗だ  

あ~、そうか、ネットワークの設定をしなきゃ。



[スタート]-[コントロールパネル]



で、コントロールパネルを表示して、

[ネットワーク接続]をダブルクリック。


[ローカルエリア接続] をダブルクリック。


[プロパティ] をクリック。




[インターネット プロトコル (TCP/IP)] をダブルクリック。



スタータキットが、192.168.10.16 だから、


でいいだろう。



今度は、うまくいくかな。

もう一度、ping を実行。


お、応答が返ってきた~!    

ちゃんと、動いているようだ 

次回は、機能の確認をしてみます!

こんにちは、mamehachi です。



今回は、SiTCP を動かして、その機能を確認してみます。



さて、どうしようかな。

確か、SiTCP User Community Site のダウンロードに「SiTCP Utility」が

あったけど、使えるんじゃないかな~。



SiTCP Utility」 をダウンロードしてみよう。



SiTcpUtil.0.9.2e.zip がダウンロードできました。

中を見てみると、「setup.exe」があるな~。

一応、解凍してから、実行。


[実行]をクリック。


[同意する]をクリック。

そういえば、SiTCP Utility のダウンロードの説明に、


注意:.NET Framework3.5のインストールには数十分かかる場合があります。


って書いてあったな~。
結構時間が掛かるのかな~。
ちょっと、放っておくか...


あ、終わってる 

10分弱ぐらいかな~。意外と早かったな~。


[インストール」をクリックだな。


お、インストール終了したと思ったら、起動した 



アドレスやポートは、Dr.Bean の言っていたデフォルト値になっているみたいだな。

まずは、UDP から確認してみよう。



[制御(UDP)]タブをクリック。


レジスタアドレスは 0 で、試してみよう。

[読み出し] をクリック。


おっ。目が動いた…ちょっと、ビックリ 



とりあえず、何か読めたな~。



今度は適当に書き込んでみよう。


こんな感じでデータを書いて、[書き込み] をクリック。




お、LED の表示が変わったぞ!



読みだしてみよう、[読み出し]をクリック。


アドレス 8 以降が、書けるみたいだな~。

でも、アドレス 9 は、書けないのかな?



LED は、下位 7 bit と考えると、0x19 だな~。

とすると、アドレス 8 が LED なのかな?



アドレス 8 に 0x55 を書き換えてみよう。


[書き込み]をクリック。


お~、予想通りだ 



UDP は、動作しているようだな。



次は、TCP をやってみよう



[データ(TCP)]タブをクリック。


[受信開始]をクリック。


何も受信できないみたいだな~。



Dr. Bean に聞いてみよう。

なんで、受信できないのですか?


仕様も分からずに、闇雲にやってもうまくいかんぞ。
簡単だから、ソースを見てどう動くのか調べてみなさい!

分かりました。見てみます。

ソースは、確か、

XC3A_SK_SiTCP¥Src

にあったはず。

S3A_SK_SiTCP.V を見てみよう。

思ったより分量がないぞ。
理解できそうだ

//--------------------------------------------------------------
//    LED
//---------------------------------------------------------------
    reg    [23:0]    ledCnt;

    always@ (posedge CLK25M or posedge RST) begin
        if(RST)begin
            ledCnt[23:0] <= 24'd0;
        end else begin
            ledCnt[23:0] <= ledCnt[23:0] + 24'd1;
        end
    end

    assign    LED[7]    = ledCnt[23] & ledCnt[22];



これは、点滅している LED の記述だな~。

えーと、肝心の TCP は、どこかな。

  SiTCP(
    .CLK          (CLK25M          ), // in : System Clock
    .RST          (RST             ), // in : System reset

    (略)

  // User I/F
    
    (略)
    
  // FIFO I/F
    .TCP_RX_WC    (TCP_RX_WC<span>[15:0] ), // in : Rx FIFO write
    .TCP_RX_WR    (TCP_RX_WR       ), // out: Write enable
    .TCP_RX_DATA  (TCP_RX_DATA[7:0]), // out: Write data[7:0]
    .TCP_TX_FULL  (TCP_TX_FULL     ), // out: Almost full flag
    .TCP_TX_WR    (TCP_TX_WR       ), // in : Write enable
    .TCP_TX_DATA  (TCP_TX_DATA[7:0]), // in : Write data[7:0]

    (略)
  );

//---------------------------------------------------------------
//    TCP loopback FIFOl
//---------------------------------------------------------------

  assign    TCP_RX_WC[15:11] = 5'b11111;

  sitcp_fifo    sitcp_fifo(
    .clk          (CLK25M              ),
    .rst          (TCP_OPEN            ),
    .data_count   (TCP_RX_WC[10:0]     ),
    .full         (),
    .wr_en        (TCP_RX_WR           ),
    .din          (TCP_RX_DATA[7:0]    ),
    .empty        (sitcpFifoEmpty      ),
    .rd_en        (sitcpFifoRe         ),
    .dout         (TCP_TX_DATA[7:0]    ),
    .valid        (TCP_TX_WR           )
  );

  assign    sitcpFifoRe = ~TCP_TX_FULL & ~sitcpFifoEmpty;

そうじゃの~。
telnet で接続して、echo が返ることを確認するのが良いじゃろう。
telnet コマンドは、デフォルトで port 番号 23 を使うのじゃが、
指定することも可能なのじゃよ。
指定の仕方は、コマンドのヘルプででも調べるのじゃな。

そっか~。
telnet で、確認できるのか~。
さて、コマンドプロンプトを起動しよう。

telnet -h で、分かるかな~。

なるほど、アドレスの後にポート番号を書けばいいんだな。

telnet 192.168.10.16 24

おー、ちゃんと echo が返ってきている。

一応、TCP での通信の確認は出来たな~。
かなり低速でだけど

そうだ、UDP のソースも見てみよう!

XC3A_SK_SiTCP¥Src¥S3A_SK_SiTCP.V

を見てみると…

//--------------------------------------------------------------
//    Slow control
//--------------------------------------------------------------
  RBCP_REG    RBCP_REG(
    // System
    .CLK         (CLK25M         ),  // in  : System clock
    .RST         (SiTCP_RST      ),  // in  : System reset
    .LED         (LED[6:0]       ),  // out : LED[6:0]
    .DIP_SW      (SW[3:0]        ),  // in  : DIP_SW[3:0]
    // RBCP I/F
    .RBCP_ACT    (RBCP_ACT       ),  // in  : Active
    .RBCP_ADDR   (RBCP_ADDR[31:0]),  // in  : Address[31:0]
    .RBCP_WE     (RBCP_WE        ),  // in  : Write enable
    .RBCP_WD     (RBCP_WD[7:0]   ),  // in  : Write data[7:0]
    .RBCP_RE     (RBCP_RE        ),  // in  : Read enable
    .RBCP_RD     (RBCP_RD[7:0]   ),  // out : Read data[7:0]
    .RBCP_ACK    (RBCP_ACK       )   // out : Acknowledge
  );

//--------------------------------------------------------------

となっているな~。
このモジュールを見れば、分かりそうだ。

XC3A_SK_SiTCP¥Src¥ にあるもうひとつのファイルが、それだな~。

RBCP_REG.v を開いてみよう!

このソースも短いから理解できそうだ。

//--------------------------------------
//    Read data mux.
//--------------------------------------
    reg        [7:0]    muxRegDataA        ;
    reg                 muxRegAck        ;

    always@ (posedge CLK) begin
        case(regAddr[3:0])
            4'h0:    muxRegDataA[7:0] <= X00Data[7:0];
            4'h1:    muxRegDataA[7:0] <= X01Data[7:0];
            4'h2:    muxRegDataA[7:0] <= X02Data[7:0];
            4'h3:    muxRegDataA[7:0] <= X03Data[7:0];
            4'h4:    muxRegDataA[7:0] <= X04Data[7:0];
            4'h5:    muxRegDataA[7:0] <= X05Data[7:0];
            4'h6:    muxRegDataA[7:0] <= X06Data[7:0];
            4'h7:    muxRegDataA[7:0] <= X07Data[7:0];
            4'h8:    muxRegDataA[7:0] <= X08Data[7:0];
            4'h9:    muxRegDataA[7:0] <= X09Data[7:0];
            4'hA:    muxRegDataA[7:0] <= X0AData[7:0];
            4'hB:    muxRegDataA[7:0] <= X0BData[7:0];
            4'hC:    muxRegDataA[7:0] <= X0CData[7:0];
            4'hD:    muxRegDataA[7:0] <= X0DData[7:0];
            4'hE:    muxRegDataA[7:0] <= X0EData[7:0];
            default:muxRegDataA[7:0] <= X0FData[7:0];
        endcase

        muxRegAck&nbsp;       <= regCs & (regRe | regWe);
    end

データが16個あって、アドレス0から順に割り当てられているんだな。

  assign  {X00Data[7:0],X01Data[7:0],X02Data[7:0],X03Data[7:0]} = `FPGA_VER;
  assign  {X04Data[7:0],X05Data[7:0],X06Data[7:0],X07Data[7:0]} = `FPGA_ID;

  assign  X08Data[7:0] = regX08Data[7:0];
  assign  X09Data[7:0] = {4'd0,DIP_SW[3:0]};
  assign  X0AData[7:0] = regX0AData[7:0];
  assign  X0BData[7:0] = regX0BData[7:0];
  assign  X0CData[7:0] = regX0CData[7:0];
  assign  X0DData[7:0] = regX0DData[7:0];
  assign  X0EData[7:0] = regX0EData[7:0];
  assign  X0FData[7:0] = regX0FData[7:0];

お、書き換えられなかったところは、Version と FPGA の ID 表示だったのか~。
X09Data[7:0] に DIP SW の内容が代入されているぞ。
アドレス 9 だけ、値が 0x00 で不思議だったんだよな~。
後で、DIP SW の値を変えて、試してみよう!

//--------------------------------------
//     Sig. assignment for outputs
//--------------------------------------
     wire     [6:0]     LED;

     assign    LED[6:0]    = X08Data[6:0];
X08Data[6:0] が、LED に代入されている。
確かに、アドレス 8 の値に書き込んだら LED の表示が変化していたな~。

他のアドレスは、レジスタ接続されているんだ。

よし、大体理解できたぞ。

DIP SW を試してみよう!

DIP SW の値を変更して...


SiTCP Utility で、[制御(UDP)] を選択して、[読み出し] をクリック。




0x00 から 0x05 に変わりました。
ちゃんと、DIP SW の値が反映されているな~。


SiTCP の一通りの機能を確認できました~。
まだまだ、これからですが、SiTCP と FPGA に関する理解が深まったような気がします 
スタータキット編は、今回をもって終了です。

また、何かに挑戦するときに、お会いしましょう!