リスト15(b)
### 提案モジュール一覧
1. **GMII_MAC_TxRx**: Ethernetフレーム送受信を処理し、GMIIでPHYチップと接続。
2. **Frame_Buffer**: Ethernetフレームの送受信バッファリング(FIFOベース)。
3. **IP_Processor**: IPv4パケットの生成/解析、ARPおよびICMP(Ping)処理。
4. **TCP_Engine**: TCPセグメントの生成/解析、接続管理、再送信制御。
5. **HTTP_Server**: HTTPリクエスト解析、静的コンテンツ配信(GET/POST対応)。
6. **Content_Storage**: 静的コンテンツ(HTML/JSON)を格納するBRAMインターフェース。
7. **AXI_Interconnect**: モジュール間をAXI4-Stream/AXI4-Liteで接続。
8. **Clock_Reset_Manager**: クロックドメイン管理とリセット同期。
### モジュール間接続イメージ
各モジュールはAXIバスで接続され、データフローは以下のように進行:
- **GMII_MAC_TxRx** ↔ **Frame_Buffer** ↔ **IP_Processor** ↔ **TCP_Engine** ↔ **HTTP_Server** ↔ **Content_Storage**
- **AXI_Interconnect**が各モジュールのデータ/制御信号を仲介。
- **Clock_Reset_Manager**がクロック(例: 125MHz for GMII, 100-200MHz for System)とリセットを提供。
以下に各モジュールの詳細を解説します。
---
### 1. GMII_MAC_TxRx
- **役割**: Ethernetフレームの送受信を処理し、GMIIインターフェースで外部PHYチップ(10/100/1000Mbps対応)と接続。
- **機能**:
- **送信**: 上位層(IP_Processor)からのペイロードをEthernetフレームに変換(プリアンブル、SFD、MACアドレス、Type、FCS付加)。
- **受信**: GMIIからのフレームを解析(FCS検証、プリアンブル除去)。
- **GMII制御**: TX(tx_en, tx_er, txd[7:0], tx_clk)、RX(rx_dv, rx_er, rxd[7:0], rx_clk)信号管理。
- **MDIO/MDC**: PHYチップ設定(オートネゴシエーション、速度選択)。
- **SystemVerilog実装**:
- FSMで送受信状態管理(IDLE, PREAMBLE, DATA, FCS)。
- CRC32計算モジュールを内蔵(並列計算で高速化)。
- AXI4-Stream出力(tx_data, tx_valid, tx_ready)でFrame_Bufferに送信。
- クロック: 10Mbps=2.5MHz, 100Mbps=25MHz, 1000Mbps=125MHz対応。
- **入出力**:
- **入力**: GMII RX信号(rxd, rx_dv, rx_er, rx_clk)、AXI4-Stream(tx_data)。
- **出力**: GMII TX信号(txd, tx_en, tx_er, tx_clk)、AXI4-Stream(rx_data)。
- **制御**: AXI4-LiteでMDIO設定(PHYレジスタ制御)。
- **考慮点**:
- クロックドメインクロッシング(CDC)処理(PHYクロックとシステムクロック間)。
- FCSエラー検知で不正フレーム破棄。
- リソース節約のため、ジャンボフレーム未対応。
- **参考**: verilog-ethernetのMACモジュールをSystemVerilogで改変。
---
### 2. Frame_Buffer
- **役割**: Ethernetフレームの送受信バッファリング。パケット処理のタイミング調整。
- **機能**:
- 送受信FIFO(BRAMベース)でパケットを一時格納。
- パケット順序保持とデータ整合性確保。
- AXI4-StreamでGMII_MAC_TxRxとIP_Processorを接続。
- **SystemVerilog実装**:
- デュアルポートBRAMでFIFO実装(読み書き独立)。
- バッファサイズ: 最大1518バイト(標準フレーム)×数パケット(例: 8KB)。
- ステータス信号(full, empty, almost_full)でフロー制御。
- **入出力**:
- **入力**: AXI4-Stream(GMII_MAC_TxRxからrx_data, IP_Processorからtx_data)。
- **出力**: AXI4-Stream(IP_Processorへrx_data, GMII_MAC_TxRxへtx_data)。
- **考慮点**:
- バッファオーバーフロー防止(バックプレッシャー: ready信号)。
- BRAMリソース節約のため、バッファサイズ最適化。
- テスト: シミュレーションでFIFO動作確認。
---
### 3. IP_Processor
- **役割**: IPv4パケット処理、ARP、ICMP(Pingのみ)対応。
- **機能**:
- **IPパケット処理**: ヘッダー生成/解析(Version, IHL, TTL, Protocol, Checksum)。
- **ARP**: IP-MAC変換(ARP Request/Reply処理、キャッシュテーブル)。
- **ICMP**: Echo Request受信時にEcho Reply生成(Type=8→Type=0)。
- 静的IPアドレス(例: 192.168.1.100)固定。
- **SystemVerilog実装**:
- FSMでパケット種別(IPv4/ARP/ICMP)分岐処理。
- チェックサム計算モジュール(16ビット1の補数和、並列化)。
- ARPキャッシュをBRAMに格納(例: 16エントリ)。
- AXI4-StreamでFrame_BufferとTCP_Engine接続。
- **入出力**:
- **入力**: AXI4-Stream(Frame_Bufferからrx_data)。
- **出力**: AXI4-Stream(Frame_Bufferへtx_data, TCP_Engineへrx_data)。
- **制御**: AXI4-LiteでIPアドレス/キャッシュ設定。
- **考慮点**:
- ICMP最小限(Pingのみ)でロジック簡略化。
- フラグメンテーション未対応(MTU以下想定)。
- テスト: WiresharkでPing応答/ARP解決確認。
---
### 4. TCP_Engine
- **役割**: TCPサーバーとして接続管理とデータ転送。
- **機能**:
- 3ウェイハンドシェイク(LISTEN → SYN_RCVD → ESTABLISHED)。
- セグメント生成/解析(シーケンス番号、ACK番号、フラグ: SYN/ACK/FIN、ウィンドウサイズ)。
- 再送信(タイムアウト検知、ACK欠如時)。
- ポート80固定(HTTP専用)。
- 単一接続(複数接続未対応で簡略化)。
- 簡易フロー制御(固定ウィンドウサイズ: 例4KB)。
- **SystemVerilog実装**:
- FSMでTCP状態遷移(RFC 793準拠: LISTEN, SYN_RCVD, ESTABLISHED, FIN_WAIT等)。
- TCB (Transmission Control Block) をレジスタで管理(シーケンス番号、ACK番号、状態)。
- 再送信バッファをBRAMに実装(例: 8KB)。
- チェックサム計算(TCPヘッダー+ペイロード、並列化)。
- AXI4-StreamでIP_ProcessorとHTTP_Server接続。
- **入出力**:
- **入力**: AXI4-Stream(IP_Processorからrx_data)。
- **出力**: AXI4-Stream(IP_Processorへtx_data, HTTP_Serverへrx_data)。
- **制御**: AXI4-Liteでポート設定/状態モニタ。
- **考慮点**:
- 単一接続でFSM簡略化、リソース節約。
- タイマー(再送信用)はシステムクロックカウンタで実装。
- テスト: curlでTCP接続/データ転送確認。
---
### 5. HTTP_Server
- **役割**: HTTPリクエスト処理と静的コンテンツ配信(GET/POST対応)。
- **機能**:
- リクエスト解析(GET/POST、URI、ヘッダー: Host/Content-Length)。
- レスポンス生成(200 OK, 404 Not Found, Content-Type: text/html)。
- 静的コンテンツ配信(BRAMから読み込み)。
- POSTデータ受信(簡易処理、レスポンス固定)。
- **SystemVerilog実装**:
- FSMでリクエスト解析(文字列マッチング: "GET ", "POST ", URIパス)。
- レスポンステンプレートをROM/BRAMに格納(例: "HTTP/1.1 200 OK\r\n")。
- AXI4-LiteでContent_Storageからコンテンツ読み込み。
- AXI4-StreamでTCP_Engineとデータ交換。
- **入出力**:
- **入力**: AXI4-Stream(TCP_Engineからrx_data)。
- **出力**: AXI4-Stream(TCP_Engineへtx_data)。
- **制御**: AXI4-Liteでコンテンツアドレス指定。
- **考慮点**:
- 静的コンテンツのみ(例: index.html, data.json)。
- リクエストバッファサイズ制限(例: 1KB)。
- テスト: BrowserでGET/POSTアクセス確認(例: curl -X POST)。
---
### 6. Content_Storage
- **役割**: 静的コンテンツ(HTML/JSON)を格納し、HTTP_Serverに提供。
- **機能**:
- BRAMベースのコンテンツ格納(例: 64KB)。
- 読み込み専用アクセス(コンパイル時埋め込み)。
- ファイルマッピング(例: /index.html → BRAMアドレス0x0000)。
- **SystemVerilog実装**:
- BRAMモジュール(初期化ファイルでコンテンツロード)。
- AXI4-Liteスレーブインターフェース(アドレス/データ読み込み)。
- **入出力**:
- **入力**: AXI4-Lite(アドレス、読み込みリクエスト)。
- **出力**: AXI4-Lite(コンテンツデータ)。
- **考慮点**:
- BRAM容量に応じたコンテンツサイズ制限。
- テスト: シミュレーションでコンテンツ読み込み確認。
---
### 7. AXI_Interconnect
- **役割**: モジュール間をAXI4-Stream(データフロー)とAXI4-Lite(制御)で接続。
- **機能**:
- データストリーミング(パケット/セグメント転送)。
- 制御信号管理(設定、レジスタアクセス)。
- **SystemVerilog実装**:
- AXI4-Streamマスター/スレーブ(Valid/Readyハンドシェイク)。
- AXI4-Liteでアドレスデコード(各モジュールのレジスタマッピング)。
- オープンソースAXI IPを参考(pulp-platform/axi)。
- **入出力**:
- 各モジュールのAXIポート接続(詳細は各モジュール参照)。
- **考慮点**:
- バス帯域幅最適化(例: 32ビットデータパス)。
- テスト: AXIプロトコルチェッカで検証。
---
### 8. Clock_Reset_Manager
- **役割**: クロックとリセット信号の管理。
- **機能**:
- クロック生成(システム: 100-200MHz, GMII: 2.5/25/125MHz)。
- CDC処理(複数クロックドメイン同期)。
- リセット同期(非同期入力、同期解除)。
- **SystemVerilog実装**:
- PLLモジュールでクロック生成(Vivado/Quartus内蔵)。
- CDC用FIFO/ハンドシェイク回路。
- リセット同期回路(フリップフロップ複数段)。
- **入出力**:
- **入力**: 外部クロック(例: 50MHz)、リセット信号。
- **出力**: 各モジュール用クロック/リセット。
- **考慮点**:
- タイミング制約設定(クロックドメイン分離)。
- テスト: タイミング解析レポート確認。
---
### 全体設計と考慮点
- **アーキテクチャ**: パイプライン化でスループット向上。各モジュールは並列処理し、AXI4-Streamで低遅延データフロー。
- **リソース最適化**: BRAM使用(例: バッファ64KB、コンテンツ64KB)、LUT/FFはFSM簡略化で節約。
- **デバッグ**: ILAでモジュール間信号モニタリング。シミュレーションでパケットフロー検証。
- **テスト戦略**:
- ユニットテスト: 各モジュールのSystemVerilogテストベンチ。
- 統合テスト: Ping応答(ICMP)、HTTP GET/POSTアクセス(Browser/curl)。
- Wiresharkでパケットキャプチャ。
- **参考プロジェクト**: verilog-ethernetのMAC/IP/TCPモジュールをSystemVerilogで再構成、Strega HTTPサーバーの構造参考。
リスト19 RAMからAXI4-Streamに出力するモジュールの仕様
**目的**: RAMからデータを読み出し、AXI4-Streamで出力するSystemVerilogモジュールを設計する。
**モジュール名**: axi_emac_fifo_output
**言語**: SystemVerilog
**入力信号**:
- aclk_out: 出力クロック
- aresetn: アクティブLowリセット
- m_axis_tready: 出力受付可能信号
- rd_dout[n:0]: RAM読み出しデータ信号 (有効ビット + 最終ビット + データ(8bit))
**出力信号**:
- m_axis_tvalid: データ有効
- m_axis_tdata[7:0]: 8ビット出力データ
- m_axis_tlast: データの終端を示す
- rd_en: RAM読み出しイネーブル信号
- rd_ad[n:0]: RAM読み出しアドレス信号 (nはパラメータで指定)
- rd_din[n:0]: RAM書き込みデータ信号 (有効ビットクリア用) = [9:0]
- [9]: 有効ビット (valid bit)
- [8]: 最終ビット (last bit)
- [7:0]: 8bitデータ
**機能**:
- RAMからデータをaclk_outドメインで読み出し、AXI4-Streamに出力。
- RAMの有効ビットがセットかつm_axis_treadyがHighの場合、データを8ビット(m_axis_tdata[7:0])で出力ステートに移行。
- 出力後、RAMの有効ビットをクリアするためにrd_dinを更新。
- m_axis_tlastはRAMデータの最終ビットに基づいて設定。
- RAM読み出しアドレスはリングバッファ形式で管理。
**設計制約**:
- always_combの使用禁止: 出力制御と状態遷移はalways_ffに統合、出力信号はレジスタ化。
- next_stateの使用禁止: ステートマシンはstate信号のみで制御、always_ff内でcase (state)を使用。
- 合成可能性: always_ffとassignのみ使用。
- RAM読み出しはaclk_outで同期。
リスト20 RAMの仕様
**目的**: デュアルクロックRAMをSystemVerilogで設計する。
**モジュール名**: axi_emac_fifo_ram
**言語**: SystemVerilog
**入力信号**:
- aclk_in: 書き込みクロック
- wr_en: 書き込みイネーブル信号
- wr_ad[n:0]: 書き込みアドレス信号 (nはパラメータで指定)
- wr_din[n:0]: 書き込みデータ信号 = [9:0]
- [9]: 有効ビット (valid bit)
- [8]: 最終ビット (last bit)
- [7:0]: 8bitデータ
- aclk_out: 読み出しクロック
- rd_en: 読み出しイネーブル信号
- rd_ad[n:0]: 読み出しアドレス信号 (nはパラメータで指定)
- rd_din[n:0]: 書き込みデータ信号 = [9:0]
- [9]: 有効ビット (valid bit)
- [8]: 最終ビット (last bit)
- [7:0]: 8bitデータ
**出力信号**:
- rd_dout[n:0]: 読み出しデータ信号
**機能**:
- デュアルクロックRAM: 書き込みはaclk_inで同期、読み出しはaclk_outで同期。
- 深さ: パラメータ化 (デフォルト: 2048エントリ, 10ビット幅)。
- データ: 有効ビット + 最終ビット + データを格納。
- 書き込み: wr_enがHighの場合、wr_adのアドレスにwr_dinを書き込む。
- 読み出し: rd_adのアドレスからrd_doutを読み出す。
- 読み出し側書き込み: rd_enがHighの場合、rd_adのアドレスにrd_dinを書き込み。
- クロックドメイン間の分離を考慮し、適切な同期を行う。
**設計制約**:
- 合成可能性: always_ffとassignのみ使用。
- RAM制御はステートマシンと分離し、always_ffで実装。
リスト21 AXI4-Streamから入力しRAMに出力するモジュール
**目的**: AXI4-Streamインターフェースを介して入力データを処理し、RAMを介して出力するSystemVerilogモジュールを設計する。
**モジュール名**: axi_emac_fifo
**言語**: SystemVerilog
**入力信号**:
- aclk_in: 入力クロック
- aclk_out: 出力クロック
- aresetn: アクティブLowリセット
- s_axis_tvalid: データ有効
- s_axis_tdata[7:0]: 8ビット入力データ
- s_axis_tuser: データの先頭を示す (Highで有効)
- s_axis_tlast: データの終端を示す
- m_axis_tready: 出力受付可能信号
**出力信号**:
- s_axis_tready: 入力受付可能信号
- m_axis_tvalid: データ有効
- m_axis_tdata[7:0]: 8ビット出力データ
- m_axis_tlast: データの終端を示す
**機能**:
- 入力処理、RAM、出力処理を以下のサブモジュールで実装:
- axi_emac_fifo_input: AXI4-Stream入力データを処理し、RAMに書き込む。
- axi_emac_fifo_ram: デュアルクロックRAMでデータを格納。
- axi_emac_fifo_output: RAMからデータを読み出し、AXI4-Streamで出力。
- サブモジュールの接続:
- axi_emac_fifo_inputの出力(wr_en, wr_ad, wr_din)をaxi_emac_fifo_ramの入力に接続。
- axi_emac_fifo_ramの出力(rd_dout)をaxi_emac_fifo_outputの入力に接続。
- axi_emac_fifo_outputの出力(rd_en, rd_ad, rd_din)をaxi_emac_fifo_ramの入力に接続。
- クロックドメイン:
- 入力処理とRAM書き込みはaclk_inで同期。
- 出力処理とRAM読み出しはaclk_outで同期。
- パラメータ: RAM深さは2048エントリ(デフォルト)、10ビット幅。
**設計制約**: