Diary/2024-1-28
PYNQ いろいろ
sshやシリアルコンソールで接続したPYNQ環境でFPGAのコンフィギュレーションをしたかったので,
source /usr/local/share/pynq-venv/bin/activate export BOARD=ZCU111 export XILINX_XRT=/usr
としてPythonで,
from pynq import Overlay overlay = Overlay("base.bit")
と,するなど.
また,PLに接続されたDRAMにアクセスしたかったので,
/dts-v1/; /plugin/; / { /*reserved memory*/ fragment@4 { target-path = "/"; overlay4: __overlay__ { reserved-memory { ranges; reserved { reg = <0x04 0x00 0x01 0x00>; }; }; }; }; };
というdram.dtsoを用意して,
xilinx@pynq:~$ dtc -I dts -O dtb -o dram.dtbo dram.dtso -q root@pynq:/home/xilinx# sudo -s root@pynq:/home/xilinx# mkdir /sys/kernel/config/device-tree/overlays/dram root@pynq:/home/xilinx# ls /sys/kernel/config/device-tree/overlays/dram dtbo path status root@pynq:/home/xilinx# cat /sys/kernel/config/device-tree/overlays/dram/status unapplied root@pynq:/home/xilinx# cat dram.dtbo > /sys/kernel/config/device-tree/overlays/dram/dtbo root@pynq:/home/xilinx# cat /sys/kernel/config/device-tree/overlays/dram/status applied
とか.
dtsoファイルの
reg = <0x04 0x00 0x01 0x00>;
は,0x4_0000_0000から0x1_0000_0000を対象にすることを意味している.
これで,Cからなら
int mem; if((mem = open("/dev/mem", O_RDWR)) < 0) { perror("open"); return EXIT_FAILURE; } volatile unsigned int *dram; dram = (volatile unsigned int *)mmap(NULL, 0x100000000llu, PROT_READ | PROT_WRITE, MAP_SHARED, mem, 0x400000000llu);
としてアクセスしたり,Pythonで,
buffer = pynq.allocate((2**19,), dtype='u4', target=ol.ddr4_0) buffer[0:10] # 読む buffer[0:10] = [0xcafe0000 + i for i in range(10)] # 書く buffer.flush() # フラッシュ buffer.freebuffer() # 解放
とかして,アクセスできる.
参考: