# open-sdr/openwifi-hw architecture

> Architecture diagram of the GitHub repository open-sdr/openwifi-hw, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-29). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/open-sdr/openwifi-hw
- Repository: https://github.com/open-sdr/openwifi-hw

## Overview

openwifi-hw is the FPGA hardware half of a Linux mac80211-compatible Wi-Fi SDR. Its functional path spans radio sampling, receive processing and control, then transmit processing and radio output; board-specific designs provide the target platform. The tree identifies these IP blocks, and the README describes their role as part of a board FPGA design, but no source excerpts were supplied, so the internal wiring shown is limited to the named functional stages. The driver/software and RF hardware are external to this repository.

Main entry points: [`ip/xpu/src/xpu.v`](https://github.com/open-sdr/openwifi-hw/blob/master/ip/xpu/src/xpu.v) (XPU control), [`ip/rx_intf/src/rx_intf.v`](https://github.com/open-sdr/openwifi-hw/blob/master/ip/rx_intf/src/rx_intf.v) (RX interface), [`ip/openofdm_rx`](https://github.com/open-sdr/openwifi-hw/tree/master/ip/openofdm_rx) (OFDM RX), [`ip/tx_intf/src/tx_intf.v`](https://github.com/open-sdr/openwifi-hw/blob/master/ip/tx_intf/src/tx_intf.v) (TX interface)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_radio_phy["Radio and PHY"]
  node_rx_intf["RX interface<br/>[rx_intf.v]"]
  node_openofdm_rx["OFDM RX"]
  node_tx_intf["TX interface<br/>[tx_intf.v]"]
  node_openofdm_tx["OFDM TX<br/>[openofdm_tx.v]"]
end

subgraph group_packet_control["Packet and Control"]
  node_xpu["XPU control<br/>[xpu.v]"]
  node_side_ch["Side channel<br/>[side_ch.v]"]
end

subgraph group_platform["Board Platform"]
  node_board_design["Board design"]
  node_board_top["Board top-level<br/>[system_top.v]"]
  node_board_block["Board block design<br/>[system.bd]"]
end

node_linux(("Linux driver"))
node_rf(("SDR transceiver"))

node_rf -->|"sample input"| node_rx_intf
node_rx_intf -->|"RX samples"| node_openofdm_rx
node_openofdm_rx -->|"decoded frames"| node_xpu
node_xpu -->|"frame exchange"| node_linux
node_linux -->|"TX requests"| node_xpu
node_xpu -->|"TX control"| node_tx_intf
node_tx_intf -->|"frame data"| node_openofdm_tx
node_openofdm_tx -->|"transmit samples"| node_rf
node_board_top -->|"instantiates"| node_board_block

click node_rx_intf "https://github.com/open-sdr/openwifi-hw/blob/master/ip/rx_intf/src/rx_intf.v"
click node_openofdm_rx "https://github.com/open-sdr/openwifi-hw/tree/master/ip/openofdm_rx"
click node_xpu "https://github.com/open-sdr/openwifi-hw/blob/master/ip/xpu/src/xpu.v"
click node_side_ch "https://github.com/open-sdr/openwifi-hw/blob/master/ip/side_ch/src/side_ch.v"
click node_tx_intf "https://github.com/open-sdr/openwifi-hw/blob/master/ip/tx_intf/src/tx_intf.v"
click node_openofdm_tx "https://github.com/open-sdr/openwifi-hw/blob/master/ip/openofdm_tx/src/openofdm_tx.v"
click node_board_design "https://github.com/open-sdr/openwifi-hw/tree/master/boards"
click node_board_top "https://github.com/open-sdr/openwifi-hw/blob/master/boards/zc706_fmcs2/src/system_top.v"
click node_board_block "https://github.com/open-sdr/openwifi-hw/blob/master/boards/zc706_fmcs2/src/system.bd"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_rx_intf,node_openofdm_rx,node_tx_intf,node_openofdm_tx toneBlue
class node_xpu,node_side_ch toneAmber
class node_board_design,node_board_top,node_board_block toneMint
class node_linux,node_rf toneIndigo
```

## Components

### Radio and PHY

- [RX interface](https://github.com/open-sdr/openwifi-hw/blob/master/ip/rx_intf/src/rx_intf.v): `ip/rx_intf/src/rx_intf.v`
- [OFDM RX](https://github.com/open-sdr/openwifi-hw/tree/master/ip/openofdm_rx): `ip/openofdm_rx`
- [TX interface](https://github.com/open-sdr/openwifi-hw/blob/master/ip/tx_intf/src/tx_intf.v): `ip/tx_intf/src/tx_intf.v`
- [OFDM TX](https://github.com/open-sdr/openwifi-hw/blob/master/ip/openofdm_tx/src/openofdm_tx.v): `ip/openofdm_tx/src/openofdm_tx.v`

### Packet and Control

- [XPU control](https://github.com/open-sdr/openwifi-hw/blob/master/ip/xpu/src/xpu.v): `ip/xpu/src/xpu.v`
- [Side channel](https://github.com/open-sdr/openwifi-hw/blob/master/ip/side_ch/src/side_ch.v): `ip/side_ch/src/side_ch.v`

### Board Platform

- [Board design](https://github.com/open-sdr/openwifi-hw/tree/master/boards): `boards`
- [Board top-level](https://github.com/open-sdr/openwifi-hw/blob/master/boards/zc706_fmcs2/src/system_top.v): `boards/zc706_fmcs2/src/system_top.v`
- [Board block design](https://github.com/open-sdr/openwifi-hw/blob/master/boards/zc706_fmcs2/src/system.bd): `boards/zc706_fmcs2/src/system.bd`

### Other components

- **Linux driver**
- **SDR transceiver**

## Connections

- SDR transceiver → RX interface: sample input
- RX interface → OFDM RX: RX samples
- OFDM RX → XPU control: decoded frames
- XPU control → Linux driver: frame exchange
- Linux driver → XPU control: TX requests
- XPU control → TX interface: TX control
- TX interface → OFDM TX: frame data
- OFDM TX → SDR transceiver: transmit samples
- Board top-level → Board block design: instantiates
