FC2カウンター FPGAの部屋 PYNQボードのFASTX コーナー検出にラプラシアンフィルタIPとアンシャープ・マスクキング・フィルタIPを追加6(Jupyter Notebookで開発中2)

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

PYNQボードのFASTX コーナー検出にラプラシアンフィルタIPとアンシャープ・マスクキング・フィルタIPを追加6(Jupyter Notebookで開発中2)

PYNQボードのFASTX コーナー検出にラプラシアンフィルタIPとアンシャープ・マスクキング・フィルタIPを追加5(Jupyter Notebookで開発中)”の続き。

いろいろとJupyter Notebook でやってはいるが、まだカメラ画像が表示されない。ちなみに今使っているPYNQボードのMicro SDカードのイメージは 2017/02/10 以前のものだ。

症状としては、ディスプレイに映像信号が出ていない。ブルー画面のままになっている。
下に、Jupyter Notebook を Python に直したコードを貼っておく。

# coding: utf-8

# In[51]:

import os
import pynq.drivers.xlnk
from pynq.mmio import MMIO
import time

# fastx、ラプラシアンフィルタ、アンシャープ・マスクキング・フィルタのビットファイルをオープン

# bitfile open
with open('/home/xilinx/pynq/bitstream/pynq_fastx_wrapper.bit', 'rb') as bf:
    buf = bf.read()

with open('/sys/devices/soc0/amba/f8007000.devcfg/is_partial_bitstream', 'w') as fd:
    fd.write('0')

# /dev/xdevcfgにビットストリームを書き込む
with open('/dev/xdevcfg', 'wb') as f:
    f.write(buf)

# CMA領域を確保する
mmu = pynq.drivers.xlnk.xlnk()
print(mmu)

# 800x600x4バイトをCMA領域に割り当てて、仮想アドレスと物理アドレスを表示
buf = mmu.cma_alloc(800*600*4)
buf_phy = pynq.drivers.xlnk.libxlnk.cma_get_phy_addr(buf)
print("virtal", buf, "physical", hex(buf_phy))

# AXI VDMAのレジスタ領域をMMIOにとしてマップする、0x100 = 256バイトをアサイン
vdma = MMIO(0x43000000, 0x10000)
print(vdma)

# VDMAの設定
vdma.write(0x30, 0x4) # S2MM_VDMACR (Reset = 1)
i=0
while (vdma.read(0x30) & 0x4) == 0x4 :
    i += 1
vdma.write(0x30, 0x4) # S2MM_VDMACR (Reset = 1)
while (vdma.read(0x30) & 0x4) == 0x4 :
    i += 1
rd_data = vdma.read(0x30)
print('%x' % rd_data)
vdma.write(0x48, 3) # S2MM_FRMSTORE (0x48) register
vdma.write(0x30, 0x00010002) # S2MM_VDMACR (IRQFrameCount=1, Circular_Park=1)
vdma.write(0xA4, 800*4) #  S2MM_HSIZE
vdma.write(0xA8, 800*4) # S2MM_FRMDLY_STRIDE
vdma.write(0xAC, buf_phy) # S2MM_START_ADDRESS1
vdma.write(0xB0, buf_phy) # S2MM_START_ADDRESS2
vdma.write(0xB4, buf_phy) # S2MM_START_ADDRESS3
vdma.write(0x30, 0x00010003) # S2MM_VDMACR (IRQFrameCount=1, Circular_Park=1, RS=1(Run))
while (vdma.read(0x34) & 0x1) == 0x1 :
    i += 1
rd_data = vdma.read(0x30)
print('%x' % rd_data)

# FASTXコーナー検出IPの設定
fastx = MMIO(0x43C30000, 0x10000)
fastx.write(0x10, 600) # rows
fastx.write(0x18, 800) # cols
fastx.write(0x20, 20) # threshold
fastx_data = fastx.read(0x20)
print(fastx_data)

# ラプラシアンフィルタIPの設定
lap = MMIO(0x43C50000, 0x10000)
lap_data = lap.read(0)
print(lap_data)

# アンシャープ・マスキング・フィルタIPの設定
usm = MMIO(0x43C60000, 0x10000)
usm.write(0x18, 1) # usm_fil_enable_V
usm.write(0x20, 10) # k = 2.5
usm_data = usm.read(0x20)
print(usm_data)

# axisスイッチ0, 1 の初期設定(カメラ画像を選択)
axis_sw0 = MMIO(0x43C10000, 0x10000)
axis_sw1 = MMIO(0x43C20000, 0x10000)
axis_sw1.write(0x40, 0) # カメラをイネーブル
axis_sw1.write(0x44, 0x80000000) # FASTX
axis_sw1.write(0x48, 0x80000000) # ラプラシアンフィルタ
axis_sw1.write(0x4C, 0x80000000) # アンシャープ・マスキング・フィルタ
axis_sw1.write(0x0, 0x2) # Commit
axis_sw0.write(0x40, 0) # カメラを選択
axis_sw0.write(0x0, 0x2) # Commit
axis1_data = axis_sw1.read(0x44)
print('%x' % axis1_data)
axis0_data = axis_sw0.read(0x40)
print('%x' % axis0_data)

# AXI VDMA Start
#vdma.write(0xA0, 600) # S2MM Vertical Size 
vdmad = vdma.read(0xA0)
print(vdmad)

# ビットマップ・ディスプレイ・コントローラ、カメラ・コントローラ、カメラ用I2Cの設定
bmdc = MMIO(0x43C00000, 0x10000) # bitmap display controller
camc = MMIO(0x43C40000, 0x10000) # camera controller
cam_i2c = MMIO(0x41600000, 0x10000) # I2C controller for camera

# ビットマップ・ディスプレイ・コントローラのベースアドレス、カメラ・コントローラON
bmdc.write(0x0, buf_phy)
camc.write(0x0, buf_phy)
camc.write(0x4, 0) # One_shot_mode is disabled

bmdc_data = bmdc.read(0)
print('%x' % bmdc_data)
camc_data = camc.read(0)
print('%x' % camc_data)


# カメラ設定用I2Cの初期化と設定書き込み
cam_i2c.write(0x100, 0x2) # reset tx fifo ,address is 0x100, i2c_control_reg
cam_i2c.write(0x100, 0x1) # enable i2c

def cam_i2c_write_sync():
    time.sleep(1/1000) # 1ms wait

def cam_i2c_write(cam_i2c, device_addr, write_addr, write_data):
    cam_i2c.write(0x108, 0x100 | (device_addr & 0xfe)) # Slave IIC Write Address, address is 0x108, i2c_tx_fifo
    cam_i2c.write(0x108, write_addr)
    cam_i2c.write(0x108, (write_data >> 8)|0xff) # first data
    cam_i2c.write(0x108, 0x200 | (write_data & 0xff)) # second data
    cam_i2c_write_sync()

# カメラの設定
cam_i2c_write(cam_i2c, 0xba, 0xf0, 0x1) # Changed regster map to IFP page 1
cam_i2c_write(cam_i2c, 0xba, 0x97, 0x20) # RGB Mode, RGB565

mmu.cma_get_buffer(buf,64)[:]


一旦、BOOT.bin を作ってやってみようと思っている。
  1. 2017年03月04日 05:24 |
  2. PYNQ
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog19.fc2.com/tb.php/3735-f2b8d732
この記事にトラックバックする(FC2ブログユーザー)