An easy-to-use and high-performance Direct Memory Access (DMA) Controller for AXI4 bus, written in synthesizable SystemVerilog.
-
AXI4-based DMA, which copies arbitary length of data on the memory-mapped bus from one place to another
-
Outstanding transactions, and decoupled read & write module. Allow to perform multiple DMA transfers at the same time
-
Word-aligned burst mode transfers (Note: unaligned transfers are not yet fully supported but will be fixed in the future)
-
Back-to-back transfers. Guarentee to utilize 100% of bus capacity, even when transfer length is equal to or less than the bus data width
The top module of the DMA controller core is axi_dma_controller, which is implemented in axi_dma_controller.sv.
| Name | Default Value | Description |
|---|---|---|
| ADDR_WD | 32 | Address width of the AXI bus |
| DATA_WD | 32 | Data width of the AXI bus |
| CHANNEL_COUNT | 8 | Unused. |
| MAX_BURST_LEN | 16 | Max burst length of each split AXI transaction, in cycles |
- Clock and Reset Interface
| Type | Name | Description |
|---|---|---|
| input | clk | Clock signal for the whole core |
| input | rst | Asynchrounous active-high reset signal for the whole core |
- DMA Command Interface
| Type | Name | Description |
|---|---|---|
| input | cmd_valid | Command handshake signal from requester (user) side |
| output | cmd_ready | Command handshake signal from responder (the core) side |
| input [ADDR_WD-1:0] | cmd_src_addr | Source address of DMA transfer |
| input [ADDR_WD-1:0] | cmd_dst_addr | Destination address of DMA transfer |
| input [1:0] | cmd_burst | Burst type, corresponding to M_AXI_AR/AWBURST. Currently only INCR (2'b01) is supported |
| input [ADDR_WD-1:0] | cmd_len | Length of DMA transfer in bytes |
| input [2:0] | cmd_size | Narrow transfer size used in AXI bus, corresponding to M_AXI_AR/AWSIZE. Keep the input to constant $clog2(DATA_WD/8) (i.e. 3'd2 for 32-bit width bus and 3'b3 for 64-bit) |
- AXI Bus Interface
| Type | Name | Description |
|---|---|---|
| output | M_AXI_ARVALID | |
| input | M_AXI_ARREADY | |
| output [ADDR_WD-1:0] | M_AXI_ARADDR | |
| output [7:0] | M_AXI_ARLEN | |
| output [2:0] | M_AXI_ARSIZE | |
| output [1:0] | M_AXI_ARBURST | |
| input | M_AXI_RVALID | |
| output | M_AXI_RREADY | |
| input [DATA_WD-1:0] | M_AXI_RDATA | |
| input [1:0] | M_AXI_RRESP | |
| input | M_AXI_RLAST | |
| output | M_AXI_AWVALID | |
| input | M_AXI_AWREADY | |
| output [ADDR_WD-1:0] | M_AXI_AWADDR | |
| output [7:0] | M_AXI_AWLEN | |
| output [2:0] | M_AXI_AWSIZE | |
| output [1:0] | M_AXI_AWBURST | |
| output | M_AXI_WVALID | |
| input | M_AXI_WREADY | |
| output [DATA_WD-1:0] | M_AXI_WDATA | |
| output [STRB_WD-1:0] | M_AXI_WSTRB | |
| output | M_AXI_WLAST | |
| input | M_AXI_BVALID | |
| output | M_AXI_BREADY | |
| input [1:0] | M_AXI_BRESP |
-
Narrow transfers are not supported yet
-
Unaligned transfers are not supported yet (therefore
cmd_src_addr,cmd_dst_addrandcmd_lenare required to be multiple of data width in bytes (ADDR_WD / 8)) -
Interleaved and out-of-order transfers are not supported yet