# SFP光モジュールでの動作について

**URL:** <https://sitcp.bbtech.co.jp/t/topic/49>\
**Category:** SiTCPに関する質問など / Questions\
**Created:** [2019 年 9 月 29 日午前 7:36 UTC](https://sitcp.bbtech.co.jp/t/topic/49 "2019-09-29T07:36:12Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![sedlimited](https://sitcp.bbtech.co.jp/letter_avatar_proxy/v4/letter/s/8edcca/32.png) [@sedlimited](https://sitcp.bbtech.co.jp/u/sedlimited)\
**Post date:** [2019 年 9 月 29 日午前 7:36 UTC](https://sitcp.bbtech.co.jp/t/topic/49/1 "2019-09-29T07:36:12Z")

</div>

自作基板のArtix-7にSiTCPを実装し、SFP光トランシーバで1GbitEthernetを動作させようとしています。AC701評価ボードのSFP用サンプルコードをベースに実装をしているのですが、うまくリンクアップしません。そこでいくつか教えてください。AC701評価基板で使用したSFPトランシーバモジュールの具体的な型番などが分かれば教えてください。またそのSFPモジュールの場合は1000BaseXモードとSGMIIモードのどちらの設定(SEL\_SGMIIの設定)で使用しているのでしょうか。  
・EthenetPHYはダウンロードしたサンプルコードのgig\_ethernet\_pcs\_pmaモジュールをそのまま使用しています。  
・開発環境はVivado2018.3を使用しています。  
・SiTCPのネットワークパラメータ設定はFORCE\_DEFAULTnを0に設定しています。  
よろしくお願いします。

---

<div class="post-metadata">

**Author:** ![mamehachi](https://sitcp.bbtech.co.jp/letter_avatar_proxy/v4/letter/m/b5a626/32.png) [@mamehachi](https://sitcp.bbtech.co.jp/u/mamehachi)\
**Post date:** [2019 年 9 月 30 日午前 11:51 UTC](https://sitcp.bbtech.co.jp/t/topic/49/2 "2019-09-30T11:51:46Z")

</div>

ラッパー(WRAP\_gig\_ethernet\_pcs\_pma\_0)は、評価ボード用ですので、Vivado のIP Catalog にて、gig\_ethernet\_pcs\_pma を検索してご利用ください。

弊社で使用しているSFPの型番は以下となります。

```auto
1000BASE-SX: AFBR-5710PZ
1000BASE-T: GLC-T-AS

```

SEL\_SGMIIの設定は、自動的に認識するようになっております。

---

<div class="post-metadata">

**Author:** ![sedlimited](https://sitcp.bbtech.co.jp/letter_avatar_proxy/v4/letter/s/8edcca/32.png) [@sedlimited](https://sitcp.bbtech.co.jp/u/sedlimited)\
**Post date:** [2019 年 10 月 2 日午前 4:26 UTC](https://sitcp.bbtech.co.jp/t/topic/49/3 "2019-10-02T04:26:14Z")

</div>

SFPの型番情報どうもありがとうございます。  
VivadoのIP Catalogでgig\_ethernet\_pcs\_pmaを生成しました。設定は以下のようにしました。  
Standard：1000BASEX → チェック入れる  
Standard：Additional tranciever control and status ports → チェック外す  
Core Functionality：Rx Gmii Clk Src → TXOUTCLK  
Core Functionality：MDIO Manegement Interface → チェック外す  
Core Functionality：Auto Negotiation → チェック入れる  
Shared Logic：Include Shared Logic in Core → チェック入れる  
結果、以下のような信号を持つモジュールが生成されました（コメントなどは削除してあります）。

module gig\_ethernet\_pcs\_pma\_0 #  
(  
parameter EXAMPLE\_SIMULATION = 0  
)  
(  
input gtrefclk\_p,  
input gtrefclk\_n,  
output gtrefclk\_out,  
output gtrefclk\_bufg\_out,  
output txp,  
output txn,  
input rxp,  
input rxn,  
output resetdone,  
output userclk\_out,  
output userclk2\_out,  
output rxuserclk\_out,  
output rxuserclk2\_out,  
input independent\_clock\_bufg,  
output pma\_reset\_out,  
output mmcm\_locked\_out,  
input [7:0] gmii\_txd,  
input gmii\_tx\_en,  
input gmii\_tx\_er,  
output [7:0] gmii\_rxd,  
output gmii\_rx\_dv,  
output gmii\_rx\_er,  
output gmii\_isolate,  
input [4:0] configuration\_vector,  
output an\_interrupt,  
input [15:0] an\_adv\_config\_vector,  
input an\_restart\_config,  
output [15:0] status\_vector,  
input reset,  
input signal\_detect,  
output gt0\_pll0outclk\_out,  
output gt0\_pll0outrefclk\_out,  
output gt0\_pll1outclk\_out,  
output gt0\_pll1outrefclk\_out,  
output gt0\_pll0lock\_out,  
output gt0\_pll0refclklost\_out  
);  
サンプルコードではこのようなモジュールをラッパー（WRAP\_gig\_ethernet\_pcs\_pma）で包んであるためにクロックの結線やパラメータの設定が見えないので、以下の点について教えていただけないでしょうか。  
・ラッパーのGMII\_CLKと接続されているクロックはどれになりますか（userclk2\_out？）  
・ラッパーのSYS\_CLKと接続されているクロックはどれになりますか（independent\_clock\_bufg?）  
・configuration\_vector[4:0]には何を設定しているでしょうか。  
・an\_adv\_config\_vector[15:0]には何を設定しているでしょうか。

よろしくお願いします。

---

<div class="post-metadata">

**Author:** ![bbt\_support](https://sitcp.bbtech.co.jp/letter_avatar_proxy/v4/letter/b/a4c791/32.png) [@bbt\_support](https://sitcp.bbtech.co.jp/u/bbt_support)\
**Post date:** [2019 年 10 月 3 日午前 1:21 UTC](https://sitcp.bbtech.co.jp/t/topic/49/4 "2019-10-03T01:21:04Z")

</div>

ラッパーの内容は、以下の通りです。  
//------------------------------------------------------------------------------  
// ethernet\_pcs\_pma  
//------------------------------------------------------------------------------   
BUFGCE BUF\_SGMII(.O(GMII\_CLK), .CE(sgmii\_clk\_en), .I(userclk2));  
assign CFG\_REG[15:0] = 16’b0000\_0000\_0010\_0000; // Use only BASE-X configulation  
gig\_ethernet\_pcs\_pma\_0 gig\_ethernet\_pcs\_pma\_0  
(  
// Transceiver Interface  
//----------------------  
.gtrefclk\_p (SGMII\_CLK\_P), // input OK :  
.gtrefclk\_n (SGMII\_CLK\_N), // input OK :  
.gtrefclk\_out (), // output :  
.gtrefclk\_bufg\_out (), // output :  
.txp (SFP\_TX\_P), // outputOK : Differential +ve of serial transmission from PMA to PMD.  
.txn (SFP\_TX\_N), // outputOK : Differential -ve of serial transmission from PMA to PMD.  
.rxp (SFP\_RX\_P), // input OK : Differential +ve for serial reception from PMD to PMA.  
.rxn (SFP\_RX\_N), // input OK : Differential -ve for serial reception from PMD to PMA.  
.resetdone (), // output : The GT transceiver has completed its reset cycle  
.userclk\_out () , // output :   
.userclk2\_out (userclk2), // outputOK :   
.rxuserclk\_out (), // output :   
.rxuserclk2\_out (), // output :   
.independent\_clock\_bufg (SYS\_CLK), // input OK :   
.pma\_reset\_out (), // output : transceiver PMA reset signal  
.mmcm\_locked\_out (), // output : MMCM Locked  
// GMII Interface  
//---------------  
.sgmii\_clk\_r (), // output :   
.sgmii\_clk\_f (), // output :   
.sgmii\_clk\_en (sgmii\_clk\_en), // outputOK : Clock enable for client MAC  
.gmii\_txd (GMII\_TXD[7:0]), // input OK : [7:0] Transmit data from client MAC.  
.gmii\_tx\_en (GMII\_TX\_EN), // input OK : Transmit control signal from client MAC.  
.gmii\_tx\_er (GMII\_TX\_ER), // input OK : Transmit control signal from client MAC.  
.gmii\_rxd (GMII\_RXD[7:0]), // outputOK: [7:0] Received Data to client MAC.  
.gmii\_rx\_dv (GMII\_RX\_DV), // outputOK : Received control signal to client MAC.  
.gmii\_rx\_er (GMII\_RX\_ER), // outputOK : Received control signal to client MAC.  
.gmii\_isolate (), // output : Tristate control to electrically isolate GMII.  
// Management: Alternative to MDIO Interface  
//------------------------------------------  
.configuration\_vector (5’b1\_0000), // input : [4:0] Alternative to MDIO interface.  
.an\_interrupt (), // output : Interrupt to processor to signal that Auto-Negotiation has completed  
.an\_adv\_config\_vector (CFG\_REG[15:0]), // input OK : [15:0] Alternate interface to program REG4 (AN ADV)  
.an\_restart\_config (1’b0), // input : Alternate signal to modify AN restart bit in REG0  
.basex\_or\_sgmii (SEL\_SGMII), // input OK : Reset default for 1000BASE-X (0) or SGMII standard (1)  
// Speed Control  
//--------------  
//1 Gbps Operation  
// set speed\_is\_10\_100 to logic 0  
//100 Mbps Operation  
// set speed\_is\_10\_100 to logic 1  
// set speed\_is\_100 to logic 1  
//10 Mbps Operation  
// set speed\_is\_10\_100 to logic 1  
// set speed\_is\_100 to logic 0  
.speed\_is\_10\_100 (SGMII\_LINK[1]), // input OK : Core should operate at either 10Mbps or 100Mbps speeds  
.speed\_is\_100 (SGMII\_LINK[0]), // input OK : Core should operate at 100Mbps speed  
// General IO’s  
//-------------  
// status vector  
// [15:14] : Pause  
// [13] : Remote Fault  
// [12] : Duplex mode(1:Full, 0:Half)  
// [11:10] : Speed(11:Reserved, 10:1000Mb/s, 01:100Mb/s, 00:10Mb/s)  
// [9: 8] : Remote Fault Encoding  
// [7] : PHY Link Status (SGMII mode only)  
// [6] : RXNOTINTABLE  
// [5] : RXDISPERR  
// [4] : RUDI(INVALID)  
// [3] : RUDI(/I/)  
// [2] : RUDI(/C/)  
// [1] : Link Synchronization  
// [0] : Link Status  
.status\_vector (STATUS\_VECTOR[15:0]), // output : [15:0] Core status.  
.reset (RESET\_IN), // input : Asynchronous reset for entire core  
.signal\_detect (1’b1), // input : Input from PMD to indicate presence of optical input.  
.gt0\_pll0lock\_out (),  
.gt0\_pll0outclk\_out (),  
.gt0\_pll0outrefclk\_out (),  
.gt0\_pll0refclklost\_out (),  
.gt0\_pll1outclk\_out (),  
.gt0\_pll1outrefclk\_out ()  
);

assign LINKSpeed[1:0] = STATUS\_VECTOR[11:10];  
assign SGMII\_LINK[1:0] = (  
((LINKSpeed[1:0]==2’b10)? 2’b00: 2’b00)|  
((LINKSpeed[1:0]==2’b01)? 2’b11: 2’b00)|  
((LINKSpeed[1:0]==2’b00)? 2’b10: 2’b00)  
);

---

<div class="post-metadata">

**Author:** ![sedlimited](https://sitcp.bbtech.co.jp/letter_avatar_proxy/v4/letter/s/8edcca/32.png) [@sedlimited](https://sitcp.bbtech.co.jp/u/sedlimited)\
**Post date:** [2019 年 10 月 7 日午前 12:06 UTC](https://sitcp.bbtech.co.jp/t/topic/49/5 "2019-10-07T00:06:41Z")

</div>

上記ラッパー内部のコードを参考にして、an\_adv\_config\_vector=16’h0020に、configuration\_vector=5’b10000にセットして接続を試みましたが、status vectorのbit1（Link Synchronization）が点滅するのみでした。configuration\_vector=5’b00000に設定してAuto-NegotiationをDisableにすると、status vectorのbit0,1,3が点灯するようになりました（オシロで見ると実際は数十msごとに数msリンクステータスがLoになっていました）。この時、Speedのステータスは1000Mb/sになっていましたが、DuplexModeは0でHalf Duplexの表示になっています。この状態でもPingは通りません。  
ネットワークの設定値を確認するために、WRAP\_SiTCP\_GMII\_XC7A\_32K.VのモジュールからDEFAULT\_IP\_ADDRとTCP\_SERVER\_MACを外部に出力してレジスタで読み出してみたところ、IPアドレスはデフォルトの192.168.10.16が読み出されたのですが、MACアドレスは00-00-00-00-00-00でした。FORCE\_DEFAULTn=0に設定しています。これは正しい状態でしょうか？

---

<div class="post-metadata">

**Author:** ![bbt\_support](https://sitcp.bbtech.co.jp/letter_avatar_proxy/v4/letter/b/a4c791/32.png) [@bbt\_support](https://sitcp.bbtech.co.jp/u/bbt_support)\
**Post date:** [2019 年 10 月 7 日午前 1:00 UTC](https://sitcp.bbtech.co.jp/t/topic/49/6 "2019-10-07T01:00:48Z")

</div>

FORCE\_DEFAULTn=0でMACアドレスが00-00-00-00-00-00はありえません。  
リセット解除時にFORCE\_DEFAULTn=1であったと思われます。  
FORCE\_DEFAULTnは、SiTCPのリセット（RST）の解除した一定時間後にサンプルされます。  
後から0に変えても効果はありません。

---

<div class="post-metadata">

**Author:** ![sedlimited](https://sitcp.bbtech.co.jp/letter_avatar_proxy/v4/letter/s/8edcca/32.png) [@sedlimited](https://sitcp.bbtech.co.jp/u/sedlimited)\
**Post date:** [2019 年 10 月 7 日午前 1:30 UTC](https://sitcp.bbtech.co.jp/t/topic/49/7 "2019-10-07T01:30:12Z")

</div>

FORCE\_DEFAULTnはディップスイッチにつながっていて、これを1にして立ち上げるとEEPROMのアクセスが始まり、MACアドレスのレジスタを読み出すとFF-FF-FF-FF-FF-FFが読み出されます（EEPROMの中身が全てFFなので）。ただし数秒おきにEEPROMのアクセスがあり、SiTCPが再起動しているように見えます（読み出したデータが不正のため？）。FORCE\_DEFAULTn=0の時とは明らかに動作が異なるので、FORCE\_DEFAULTnの信号は設定できているように思います。  
現状ではSiTCPのライブラリとして御社サイトからダウンロードしたSiTCP\_Netlist\_for\_Artix7-master/SiTCP\_XC7A\_32K\_BBT\_V110.ngcを使用していますが、これはAC701用のSFPサンプルコード内のSiTCP\_XC7A\_32K\_BBT\_V110.ngcと全く同じものでしょうか？

---

<div class="post-metadata">

**Author:** ![bbt\_support](https://sitcp.bbtech.co.jp/letter_avatar_proxy/v4/letter/b/a4c791/32.png) [@bbt\_support](https://sitcp.bbtech.co.jp/u/bbt_support)\
**Post date:** [2019 年 10 月 7 日午前 1:59 UTC](https://sitcp.bbtech.co.jp/t/topic/49/8 "2019-10-07T01:59:54Z")

</div>

SiTCP\_XC7A\_32K\_BBT\_V110.ngcは同じものです。  
MACアドレスが00-00-00-00-00-00はSiTCPがリセットされていないのかもしれません。  
はじめにRSTを1にしてください。

---

<div class="post-metadata">

**Author:** ![sedlimited](https://sitcp.bbtech.co.jp/letter_avatar_proxy/v4/letter/s/8edcca/32.png) [@sedlimited](https://sitcp.bbtech.co.jp/u/sedlimited)\
**Post date:** [2019 年 10 月 7 日午前 8:14 UTC](https://sitcp.bbtech.co.jp/t/topic/49/9 "2019-10-07T08:14:20Z")

</div>

RSTは1から0に変化させています。CLK（200MHz）が入力されてから約1秒ほど後にRSTを0にして解除しています。考慮すべきリセット信号の条件などありますでしょうか。PHY（gig\_ethernet\_pcs\_pma）のリセット解除との順番などは特に規定はないでしょうか。  
FORCE\_DEFAULTn=1の時はEEPROMへのアクセスが開始されるので、リセットは解除されていると思うのですが、この時にSiTCPからのGMII\_RSTn、SiTCP\_RSTをモニタすると数秒おきにリセット信号が出力されています。現状書き換えができておらずEEPROMの中身が全てFFでデータの整合が取れないため、リブートするという認識で正しいでしょうか。  
またこの時にMACアドレスを読み出してみるとリセット時=全部0、リセット解除時=全部Fになりました。一方でIPアドレスの方はリセット時=0xC0A80A10（192.168.10.16）でリセット解除時=全部Fとなりました。リセット解除時の動作としてはROMの中身が反映されているように見えるのでよさそうですが、リセット時はMACとIPで少し様子が違います。FORCE\_DEFAULTn=0の時にこのあたりのロジックがうまく動いていないということはないでしょうか。  
CLK,RST,FORCE\_DEFAULTnの信号でMACの出力は決まりそうですし、特に速度が厳しいようなロジックでもないのでMACがうまく出力されない理由がちょっとわかりません。  
お手数をおかけしますがよろしくお願いします。

---

<div class="post-metadata">

**Author:** ![bbt\_support](https://sitcp.bbtech.co.jp/letter_avatar_proxy/v4/letter/b/a4c791/32.png) [@bbt\_support](https://sitcp.bbtech.co.jp/u/bbt_support)\
**Post date:** [2019 年 10 月 8 日午前 5:21 UTC](https://sitcp.bbtech.co.jp/t/topic/49/10 "2019-10-08T05:21:42Z")

</div>

RSTはシステムクロックで数クロックで十分です。  
FORCE\_DEFAULTn=1でEEPROMにライセンスが入っていない場合、リセットを繰り返します。  
FORCE\_DEFAULTn=1の場合、MACアドレスの値がEEPROMの状態に応じて変わります。  
MACアドレスの初期値は、リリースされている「SiTCP\_XC7A\_32K\_BBT\_V110.ngc」を  
再度実機で確認しましたが、02-00-C0-A8-00-10です。  
SiTCPから出力されるMACアドレスも異常ですがgig\_ethernet\_pcs\_pmaもAuto-Negができない、Linkが安定しないなど  
FPGAの動作が不安定な可能性があります。FPGAの電源などの回路的問題がないかも確認してください。

---

<div class="post-metadata">

**Author:** ![bbt\_support](https://sitcp.bbtech.co.jp/letter_avatar_proxy/v4/letter/b/a4c791/32.png) [@bbt\_support](https://sitcp.bbtech.co.jp/u/bbt_support)\
**Post date:** [2019 年 10 月 9 日午前 12:48 UTC](https://sitcp.bbtech.co.jp/t/topic/49/11 "2019-10-09T00:48:22Z")

</div>

MACアドレスは、MY\_MAC\_ADDRですが、TCP\_SERVER\_MACを見ていませんか？  
TCP\_SERVER\_MACの初期値は00-00-00-00-00-00で正常です。

---

<div class="post-metadata">

**Author:** ![sedlimited](https://sitcp.bbtech.co.jp/letter_avatar_proxy/v4/letter/s/8edcca/32.png) [@sedlimited](https://sitcp.bbtech.co.jp/u/sedlimited)\
**Post date:** [2019 年 10 月 19 日午前 12:51 UTC](https://sitcp.bbtech.co.jp/t/topic/49/12 "2019-10-19T00:51:00Z")

</div>

MY\_MAC\_ADDRは正しいアドレスが出力されていました。  
何が原因なのかよくわからなくなり、SFP光モジュールの送受信ポートを1本のファイバーで直結してループバックのパスを作り、GMIIのTXポートからデータを送信してRXポートに戻ってくるデータを確認するようなロジックを作って様子を見たところ、プリアンブルのパターンがビット反転しており、回路を確認すると基板上で受信側のRXPとRXN信号が逆に接続されていました。改修した結果Pingが通るようになりました。オートネゴシエーションをOFFにしていると、間違った接続でもSYNC,LINKランプが点灯したりするので、物理層は動いているのかと勘違いしてました。こちらの凡ミスでお騒がせしました。
