# oct-fpga/udp-network-demo architecture

> Architecture diagram of the GitHub repository oct-fpga/udp-network-demo, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-28). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/oct-fpga/udp-network-demo
- Repository: https://github.com/oct-fpga/udp-network-demo

## Overview

This repository demonstrates sending UDP packets between two U280 FPGA systems, with optional AES-128 encryption on transmit and decryption on receive, or pass-through. A host application reads packet data, configures network settings, and launches the FPGA kernels; received data is copied back to host memory. The README also documents dual-port operation and Python/PYNQ sender and receiver examples. The network and CMAC kernels are supplied as prebuilt objects, so their internal implementation and exact interconnect are not represented here; the sampled host excerpts show register configuration and kernel launches.

Main entry points: [`networklayer/networklayer.xo`](https://github.com/oct-fpga/udp-network-demo/blob/2023.1/networklayer/networklayer.xo) (UDP network layer), [`host/udp_host_sender_if3.cpp`](https://github.com/oct-fpga/udp-network-demo/blob/2023.1/host/udp_host_sender_if3.cpp) (Sender host), [`host/udp_host_receiver_if3.cpp`](https://github.com/oct-fpga/udp-network-demo/blob/2023.1/host/udp_host_receiver_if3.cpp) (Receiver host), [`user_krnl/src/rxkrnl.cpp`](https://github.com/oct-fpga/udp-network-demo/blob/2023.1/user_krnl/src/rxkrnl.cpp) (Receive kernel)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_host["Host applications"]
  node_sender["Sender host"]
  node_receiver["Receiver host"]
  node_source_text["Packet text<br/>[alice29.txt]"]
  node_sender_python["Python sender<br/>[sender.py]"]
  node_receiver_python["Python receiver<br/>[receiver.py]"]
  node_received_data["Received packet data"]
end

subgraph group_user["User kernels"]
  node_tx["Transmit kernel<br/>[txkrnl.cpp]"]
  node_rx["Receive kernel<br/>[rxkrnl.cpp]"]
  node_aes["AES routines<br/>[AESfunctions.cpp]"]
  node_aes_tables["AES tables<br/>[AEStables.h]"]
end

subgraph group_network["Network hardware"]
  node_udp["UDP network layer<br/>[networklayer.xo]"]
  node_cmac["CMAC interfaces<br/>[cmac_0.xo]"]
end

subgraph group_peer["Remote endpoint"]
  node_network_peer(("Other U280"))
end

node_sender_actor(("Operator"))

node_sender_actor -->|"runs sender"| node_sender
node_sender_actor -->|"runs receiver"| node_receiver
node_source_text -->|"reads packets"| node_sender
node_sender -->|"configures network"| node_udp
node_sender -->|"checks link"| node_cmac
node_sender -->|"launches kernel"| node_tx
node_sender -->|"sends buffer"| node_tx
node_tx -->|"encrypts with"| node_aes
node_aes -->|"uses tables"| node_aes_tables
node_tx -->|"streams packets"| node_udp
node_udp -->|"transmits frames"| node_cmac
node_cmac -->|"sends packets"| node_network_peer
node_network_peer -->|"delivers packets"| node_cmac
node_cmac -->|"receives frames"| node_udp
node_receiver -->|"configures network"| node_udp
node_receiver -->|"checks link"| node_cmac
node_receiver -->|"launches kernel"| node_rx
node_udp -->|"streams packets"| node_rx
node_rx -->|"decrypts with"| node_aes
node_rx -->|"writes host buffer"| node_receiver
node_receiver -->|"reads buffer"| node_received_data
node_sender_python -.->|"reads packets"| node_source_text
node_sender_python -.->|"configures network"| node_udp
node_sender_python -.->|"launches kernel"| node_tx
node_receiver_python -.->|"configures network"| node_udp
node_receiver_python -.->|"launches kernel"| node_rx
node_rx -.->|"writes host buffer"| node_receiver_python

click node_sender "https://github.com/oct-fpga/udp-network-demo/blob/2023.1/host/udp_host_sender_if3.cpp"
click node_receiver "https://github.com/oct-fpga/udp-network-demo/blob/2023.1/host/udp_host_receiver_if3.cpp"
click node_source_text "https://github.com/oct-fpga/udp-network-demo/blob/2023.1/host/alice29.txt"
click node_sender_python "https://github.com/oct-fpga/udp-network-demo/blob/2023.1/notebooks/sender.py"
click node_receiver_python "https://github.com/oct-fpga/udp-network-demo/blob/2023.1/notebooks/receiver.py"
click node_tx "https://github.com/oct-fpga/udp-network-demo/blob/2023.1/user_krnl/src/txkrnl.cpp"
click node_rx "https://github.com/oct-fpga/udp-network-demo/blob/2023.1/user_krnl/src/rxkrnl.cpp"
click node_aes "https://github.com/oct-fpga/udp-network-demo/blob/2023.1/user_krnl/src/aes/AESfunctions.cpp"
click node_aes_tables "https://github.com/oct-fpga/udp-network-demo/blob/2023.1/user_krnl/src/aes/AEStables.h"
click node_udp "https://github.com/oct-fpga/udp-network-demo/blob/2023.1/networklayer/networklayer.xo"
click node_cmac "https://github.com/oct-fpga/udp-network-demo/blob/2023.1/cmac/cmac_0.xo"

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_sender,node_receiver,node_source_text,node_sender_python,node_receiver_python,node_received_data toneBlue
class node_tx,node_rx,node_aes,node_aes_tables toneAmber
class node_udp,node_cmac toneMint
class node_network_peer toneRose
class node_sender_actor toneIndigo
```

## Components

### Host applications

- [Sender host](https://github.com/oct-fpga/udp-network-demo/blob/2023.1/host/udp_host_sender_if3.cpp): `host/udp_host_sender_if3.cpp`
- [Receiver host](https://github.com/oct-fpga/udp-network-demo/blob/2023.1/host/udp_host_receiver_if3.cpp): `host/udp_host_receiver_if3.cpp`
- [Packet text](https://github.com/oct-fpga/udp-network-demo/blob/2023.1/host/alice29.txt): `host/alice29.txt`
- [Python sender](https://github.com/oct-fpga/udp-network-demo/blob/2023.1/notebooks/sender.py): `notebooks/sender.py`
- [Python receiver](https://github.com/oct-fpga/udp-network-demo/blob/2023.1/notebooks/receiver.py): `notebooks/receiver.py`
- **Received packet data**

### User kernels

- [Transmit kernel](https://github.com/oct-fpga/udp-network-demo/blob/2023.1/user_krnl/src/txkrnl.cpp): `user_krnl/src/txkrnl.cpp`
- [Receive kernel](https://github.com/oct-fpga/udp-network-demo/blob/2023.1/user_krnl/src/rxkrnl.cpp): `user_krnl/src/rxkrnl.cpp`
- [AES routines](https://github.com/oct-fpga/udp-network-demo/blob/2023.1/user_krnl/src/aes/AESfunctions.cpp): `user_krnl/src/aes/AESfunctions.cpp`
- [AES tables](https://github.com/oct-fpga/udp-network-demo/blob/2023.1/user_krnl/src/aes/AEStables.h): `user_krnl/src/aes/AEStables.h`

### Network hardware

- [UDP network layer](https://github.com/oct-fpga/udp-network-demo/blob/2023.1/networklayer/networklayer.xo): `networklayer/networklayer.xo`
- [CMAC interfaces](https://github.com/oct-fpga/udp-network-demo/blob/2023.1/cmac/cmac_0.xo): `cmac/cmac_0.xo`

### Remote endpoint

- **Other U280**

### Other components

- **Operator**

## Connections

- Operator → Sender host: runs sender
- Operator → Receiver host: runs receiver
- Packet text → Sender host: reads packets
- Sender host → UDP network layer: configures network
- Sender host → CMAC interfaces: checks link
- Sender host → Transmit kernel: launches kernel
- Sender host → Transmit kernel: sends buffer
- Transmit kernel → AES routines: encrypts with
- AES routines → AES tables: uses tables
- Transmit kernel → UDP network layer: streams packets
- UDP network layer → CMAC interfaces: transmits frames
- CMAC interfaces → Other U280: sends packets
- Other U280 → CMAC interfaces: delivers packets
- CMAC interfaces → UDP network layer: receives frames
- Receiver host → UDP network layer: configures network
- Receiver host → CMAC interfaces: checks link
- Receiver host → Receive kernel: launches kernel
- UDP network layer → Receive kernel: streams packets
- Receive kernel → AES routines: decrypts with
- Receive kernel → Receiver host: writes host buffer
- Receiver host → Received packet data: reads buffer
- Python sender → Packet text: reads packets
- Python sender → UDP network layer: configures network
- Python sender → Transmit kernel: launches kernel
- Python receiver → UDP network layer: configures network
- Python receiver → Receive kernel: launches kernel
- Receive kernel → Python receiver: writes host buffer
