SiTCPに関する情報を共有するためのフォーラムです。この目的に反しない範囲で、質問、コメント、回答などご自由にご投稿ください。
This forum is for sharing information about SiTCP. Please do not hesitate to post any questions, comments or answers within the scope of this purpose.

スターターキット編

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

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

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

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

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

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

Comments

  • edited June 2019
    なんじゃ、まだまだ、修行が足りんの~。
    目先の楽さだけに目を付けおって...
    確かに、ハードウエアだけで、TCP のサーバーとして機能するから、
    ソフトを組まなくて良いのじゃが、もっと注目せんといかん特徴があるのじゃよ。

    ハードウエアで実装しているから、高速で安定した転送ができるのじゃよ。
    最近は、FPGA に CPU を実装することもできるのじゃが、高速には動作せぬのじゃ。
    それに、ライブラリが小さいから、中規模クラスのFPGAでユーザの回路と
    共に実装することができるのもこのライブラリのウリじゃ。
    UDP のよる通信で、レジスタの設定も出来るのじゃぞ。

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

    確か、先日、注文しておいた Xilinx の「Spartan-3A スタータ キット」
    届いていたはずじゃ。
    SiTCP User Community にあるサンプルを、動かしてみてはどうじゃ。
  • 分かりました。

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

    スタータキットを、探さないと...
  • edited May 2019

    こんにちは、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 をインストールするのが良いぞ。
  • edited May 2019
    こんにちは、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 独自拡張に対応していないようじゃから、他のツールを探すのが良いぞ。
  • edited May 2019
    他のツールって言われても、大丈夫なのはどれなんだろう~。
    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]をクリック。
     

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

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

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

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

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

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

    こんにちは、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] を実行すると、
    後は、なんとなく分かるじゃろう。
  • edited May 2019

    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
    TCP port: 24
    UDP port: 4660
    デフォルトは、これじゃ。
  • edited May 2019
    分かりました。PING で確認してみます。

    まず、クロスケーブルでPC と接続しよう。
    スタータキットのRJ-45コネクタのLEDが緑色で点灯したから、
    LINK は、無事上がったみたいだな~。

    コマンドプロンプトを起動して、
    PING...えっとアドレスが、192.168.10.16...


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

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

    で、コントロールパネルを表示して、
    [ネットワーク接続]をダブルクリック。




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



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



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

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



    でいいだろう。

    今度は、うまくいくかな。
    もう一度、ping を実行。



    お、応答が返ってきた~!    
    ちゃんと、動いているようだ 
    次回は、機能の確認をしてみます!
  • edited May 2019
    こんにちは、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[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;

    お、TCP 関連の記述を発見!
    TCP の受信と送信を FIFO を介して繋いでいるんだな~。
    ということは、受信したものがループバックして送信されるのか~。

    それじゃ~、受信しかない SiTCP Utility では、確認できないなぁ~。
    どうすればいいんだろう。
    プログラムを用意しないといけないのかな。
    もっと、手軽な方法はないのかな~。

    Dr.Bean に聞いてみよう!

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

  • edited May 2019
    そっか~。
    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 に関する理解が深まったような気がします 
    スタータキット編は、今回をもって終了です。

    また、何かに挑戦するときに、お会いしましょう!
This discussion has been closed.