DMA for IObundle SoCs with:
- 1 AXI manager data interface (memory source/destination path)
- 1 AXI-Lite subordinate control interface (register programming and status)
This repository contains the hardware module, software driver, and integration support files for simulation/embedding flows.
iob-dma moves data from an AXI-full source address range to an AXI-full destination address range under software control.
Software configures source/destination addresses, transfer length, and burst length through the control registers, then starts source-to-destination DMA operations.
- The DMA reads data from AXI source address space and writes it to AXI destination address space.
- The internal datapath connects read-side output to write-side input, so no external AXI-Stream interface is required.
- A single
starttriggers both source read and destination write paths. busyremains high while the transfer is in progress.
Example programming sequence:
dma_init(DMA_BASEADDR);
dma_start_transfer(src_addr, dst_addr, length_words, burstlen_words);
while (dma_busy()) {
// wait
}- Used for DMA transfers between AXI-full source and destination memory regions.
- Configurable address, burst length, ID, and data width parameters.
- Used by CPU/software to configure and monitor the DMA.
- Exposes control/status registers for source and destination addressing plus shared transfer control/status.
The DMA exposes source and destination address registers, while transfer control/status fields use the same semantics for both paths:
- Source address:
src_addr - Destination address:
dst_addr - Shared transfer fields:
length,burstlen,start,busy,buf_level soft_reset
Typical sequence:
- Program
src_addranddst_addr. - Program
lengthandburstlen. - Trigger
start. - Poll
busyuntil transfer completes.
Driver files are available in software/src/:
iob-dma.hiob-dma.c
Exposed helper functions:
dma_init(...): initializes the DMA base address.dma_start_transfer(...): starts a source-to-destination transfer.dma_busy(...): reports transfer progress.
void dma_init(int base_address);
void dma_start_transfer(uint32_t *src_addr, uint32_t *dst_addr, uint32_t length, uint32_t burstlen);
uint8_t dma_busy();iob_dma.py: DMA description and configurable parametershardware/src/iob_dma.v: top-level RTLsoftware/src/: C driver and software support