メモ置き場

メモ置き場です.開発したものや調べたことについて書きます.

[tex: ]

FPGA(Nexys4 DDR)を使ったリアルタイムエッジ検出

FPGAを使ってリアルタイムエッジ検出をし,結果をモニターに表示する.
コードはここ
github.com




実際にエッジ検出をしている様子はこちらから.
www.youtube.com



スイッチでカメラで取り込んだ画像とエッジ検出した画像を切り替えられるようになっている.
ちなみにカメラで撮っているのはこの本.
トランジスタ技術 2018年11月号
(今回作成したプロジェクトと本の中身は全く無関係です.)


今回作成した回路の中身はこんな感じ.
f:id:okchan08:20190117123827p:plain

カメラから取り込んだ画像を一旦バッファーに貯めて起き,逐次読み出しながらフィルター処理を施して行く.カメラの画像サイズはバッファー容量の制約からQVGAにした.*1

バッファーにはBlock RAM(BRAM)を使っている.幅が16bit(or 12bit)で深さがQVGAの画素数である76800である.カメラキャプチャとフィルタ回路の出力をバッファ溜め込む.それが3つあるので合計 3700Kbくらいの消費になる.
配線配置後にリソース消費をVivadoで確認すると,BRAMは全体の70%の消費だった.Nexys4は4860 KbのBRAMが使えるので,3200 Kb程度のBRAMを使ったことになって無矛盾かな.
f:id:okchan08:20190117131021p:plain



画像処理は2段階のフィルタをかけている.1段目のフィルタは3×3のメディアン・フィルタで,2段目が5×5のラプラシアン・フィルタを使っている.メディアン・フィルタは画像の平滑化,ラプラシアン・フィルタはエッジ検出を行う.各フィルタの原理などについては別の記事で書こうと思う.


タイミング条件はかなりの配線で満たされていない.
f:id:okchan08:20190117131032p:plain

フィルタ回路は150MHzくらいのクロックで動作させているが,このクロックが早すぎるのかもしれない.映像を見ている限り変な動作をしているわけでもなさそうなので,今回は特に対策をしないでおく.set_multicycle_pathあたりでタイミング条件を緩めるか,もっと周波数を落とすかをすればいいかと思う.

*1:本当はVGAサイズでやりたかったけど,リソース的に厳しそう.ボードにあるDDR2メモリをバッファーに使えば余裕だと思うけど,メモリインターフェースのコントロールが大変そうだったり,Memory Interface Generatorを使ってDual port的にDDR2を使えたりできるのかだったり,その辺りが不明だったので今回はやめた.