Spartan-3A スタータキット

〜イーサネットでの受信その2〜


2007/08/13

あなたは 人目のお客様です.

昨日やったイーサネットでの受信 ではとりあえず動いてはいるがまともに受信できてないので, きちんと受信できるように修正したい.

で,エンディアンとかタイミングとかを全体的に見直し.

main.v
rx.v
tx.v
ether_ctrl.v
ether_rx.v
ether_tx.v
memory.v
s3astarter.ucf

基本的な動作は変わっていない. コマンド体系も前回と同じ.

で,さっそく試してみる. 前回同様, スタータキットと FreeBSD のPCをクロスケーブルで直結し, FreeBSD側から投げたフレームをスタータキットで受信する.

まずはフレーム送信に使う FreeBSD マシンの設定.

teapot# ifconfig udav0 up
teapot# ifconfig udav0 inet 192.168.10.1/24
teapot# ifconfig udav0 media 100baseTX
teapot# ifconfig udav0 ether 00:01:23:45:67:89
teapot# ifconfig udav0
udav0: flags=108943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST,NEEDSGIANT> mtu 1500
        inet 192.168.10.1 netmask 0xffffff00 broadcast 192.168.10.255
        ether 00:01:23:45:67:89
        media: Ethernet 100baseTX
        status: active
teapot#
ifconfig でIPアドレスなどを設定する. 実験用として,MACアドレスを 00:01:23:45:67:89 というものすごーくてきとうな ものに設定している.

次にスタータキットをシリアルで FreeBSD マシンに接続し,スタータキットを起動.

teapot# cu -l /dev/cuad0
Connected
READY
READYが出たらSコマンドでリセットし,Gコマンドでリンクアップの確認.
teapot# cu -l /dev/cuad0
Connected
READY$S+SET$G+7809$G+780d
0x7809→0x780dなので,リンクアップしていることがわかる.

次に,AコマンドとRコマンドで受信バッファの状態の確認.

teapot# cu -l /dev/cuad0
Connected
READY$S+SET$G+7809$G+780d$A+00000000$R+00000000
                         ~~~        ~~~
                         Aコマンド  Rコマンド
サイズゼロ,バッファ先頭もゼロクリアされていることが確認できる.

フレームをキャプチャして確認するために,FreeBSDでwiresharkを起動する.

wiresharkでは udav0 に対してキャプチャを開始する. 注意として,FreeBSD-6.x では以下のようにしないとうまくキャプチャできない.


キャプチャを開始した状態

で,キャプチャ開始した状態で,FreeBSDマシンから ping を投げる.

hiroaki@teapot:~>% ping -c 1 192.168.10.2
PING 192.168.10.2 (192.168.10.2): 56 data bytes
^C
--- 192.168.10.2 ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss
hiroaki@teapot:~>% 
これにより,アドレス解決しようとしてARPフレームが投げられる.


ARPフレームのキャプチャ結果

wiresharkで見ると,たしかにARPが投げられていることがわかる.

これでスタータキット側でも受信できているはずなので, Aコマンドでサイズを確認する.

teapot# cu -l /dev/cuad0
Connected
READY$S+SET$G+7809$G+780d$A+00000000$R+00000000$A+00000010
                                               ~~~
                                               Aコマンド
さっきとは異なり,サイズとして 0x00000010 を応答している. 4バイト単位で処理しているので,64バイトを受信していることがわかる.

Rコマンドで受信バッファの中身を見てみよう.

teapot# cu -l /dev/cuad0
Connected
READY$S+SET$G+7809$G+780d$A+00000000$R+00000000$A+00000010$R+ffffffff$R+ffff0001$R+23456789$R+08060001$R+08000604$R+00010001$R+23456789$R+c0a80a01$R+00000000$R+0000c0a8$R+0a020000$R+00000000$R+00000000$R+00000000$R+00000000$R+168d631e$R+00000000$R+00000000$R+00000000$R+00000000
                                                          ~~~ →
                                                          Rコマンド
えーと,これではわかりにくいので,受信したデータを整理すると以下のようになる.
0x0000  ffffffff ffff0001 23456789 08060001
0x0010  08000604 00010001 23456789 c0a80a01
0x0020  00000000 0000c0a8 0a020000 00000000
0x0030  00000000 00000000 00000000 168d631e
0x0040  00000000 00000000 00000000 00000000
wiresharkでのキャプチャ結果に一致している.バッチリだ.

先頭6バイトの ff の連続はARPの宛先MACアドレス(ブロードキャストなのでオール1), その直後の6バイト 0x000123456789 は FreeBSD 側の送信MACアドレスになっている. あとは0x0806がARPフレームを指し,フレームの内容が続いている. 注意として,最後に FCS として,0x168d631e という値が受信できている. ここで,FCSも含めて64バイトになっていることに注意. イーサネットの最小フレームサイズは64バイトだが,これはFCSも含めてのサイズ なので,送信できるデータの(宛先MACアドレスなども含んでの)最小サイズは 60バイトということになる.

とりあえず受信はそれっぽくできた.あとはPHYのループバック機能を利用して, 送信のデバッグをしたい.


メールは kozos(アットマーク)kozos.jp まで