トップ 一覧 Farm 検索 ヘルプ 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() # 解放
とかして,アクセスできる.

参考:
* https://discuss.pynq.io/t/pynq3-0-1-allocate-ddr4-returns-buffer-outside-of-address-range/4918/7