※ 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 のいろんなバージョンがおいてあるぞ。
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 で、確認できるのか~。
さて、コマンドプロンプトを起動しよう。
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 <= 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 に関する理解が深まったような気がします
スタータキット編は、今回をもって終了です。
また、何かに挑戦するときに、お会いしましょう!