- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!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() # 解放
とかして,アクセスできる.
参考:
* https://discuss.pynq.io/t/pynq3-0-1-allocate-ddr4-returns-buffer-outside-of-address-range/4918/7