PYNQ > DMA tutorial: DMA to streamed interfaces > DMAを二つから一つにしてみた


動作環境
Windows 10 Pro (v1909) 
PYNQ-Z1 (Digilent) (以下、PYNQと表記)
PYNQ v2.5 Image
Vivado v2019.1 (64-bit)

関連

概要

作成したBlock Design

PS:M_AXI_GP0からaxi_dma_0:S_AXI_LITEに接続する場合も、三つ目のAXI SmartConnectが必要だった。
(不要になるかと考えていた)。

Pythonスクリプト

from pynq import Overlay

overlay = Overlay("/home/xilinx/jupyter_notebooks/base/dma_200808.bit")
overlay.ip_dict
結果
{'axi_dma_0': {'addr_range': 65536,
  'device': <pynq.pl_server.device.XlnkDevice at 0xb0272490>,
  'driver': pynq.lib.dma.DMA,
  'fullpath': 'axi_dma_0',
  'gpio': {},
  'interrupts': {},
  'mem_id': 'SEG_axi_dma_0_Reg',
  'phys_addr': 1077936128,
  'state': None,
  'type': 'xilinx.com:ip:axi_dma:7.1'}}

一つのDMAになったので、dma_sendもdma_recvも同じものを指定。

import pynq.lib.dma

dma_send = overlay.axi_dma_0
dma_recv = overlay.axi_dma_0
from pynq import allocate
import numpy as np

data_size = 100

input_buffer = allocate(shape=(data_size,), dtype=np.uint32)

for i in range(data_size):
    input_buffer[i] = i + 0xcafe0000
for i in range(10):
    print(hex(input_buffer[i]))
結果
0xcafe0000
0xcafe0001
0xcafe0002
0xcafe0003
0xcafe0004
0xcafe0005
0xcafe0006
0xcafe0007
0xcafe0008
0xcafe0009

DMA転送(PS to PL)する。

dma_send.sendchannel.transfer(input_buffer)
output_buffer = allocate(shape=(data_size,), dtype=np.uint32)

for i in range(10):
    print('0x' + format(output_buffer[i], '02x'))
結果
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00

DMA転送(PL to PS)をする。

dma_recv.recvchannel.transfer(output_buffer)
for i in range(10):
    print('0x' + format(output_buffer[i], '02x'))
結果
0xcafe0000
0xcafe0001
0xcafe0002
0xcafe0003
0xcafe0004
0xcafe0005
0xcafe0006
0xcafe0007
0xcafe0008
0xcafe0009

手じまい

del input_buffer, output_buffer