トップ 差分 一覧 Farm ソース 検索 ヘルプ PDF RSS ログイン

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() # 解放

とかして,アクセスできる.

参考: