9個の掛け算回路で輪郭を検出するRISC-Vチップを自作、FPGA上に一から設計

イメージ画像

画像から輪郭を抽出する処理を、パソコンのソフトではなく、自作のチップの中で走らせたい。しかも、市販の完成品ではなく、CPUから画像処理回路まで一切を自分で設計してみたい。そんな挑戦をやり遂げた人がいる。

Waseem Nabi氏が公開した「rv32i-vision-soc」は、書き換え可能な半導体チップ「FPGA」の上に、CPUと画像処理回路を一から作り込んだシステムだ。CPUには、設計図が公開されている命令セット「RISC-V」の基本形(RV32I)を採用し、画像の輪郭を検出する専用回路と組み合わせた。卒業制作として作られ、実際に基板上で動く。使ったのはXilinxのFPGAボード「Nexys A7」だ。

このシステムの心臓部は2つある。1つは、自作したRISC-VのCPUで、システム全体の動作を取り仕切る。もう1つは、画像の輪郭を見つける「3×3畳み込み」の専用回路だ。畳み込みとは、画像の一部分(ここでは3×3の9画素)に重みを掛けて足し合わせ、明るさの変化が大きい場所、つまり輪郭を浮かび上がらせる計算をいう。Nabi氏はこの計算を、9個の掛け算回路を並べて一度に走らせ、1クロックで結果を出す構成にした。パソコン側ではPythonとOpenCVという画像処理ソフトが動き、画像を送るとチップ側が処理して返す。両者はメモリを介したバスとUARTという方式でつながる。

設計で苦労した点も、Nabi氏は具体的に記している。当初は9個の掛け算の結果を順番に足す構成にしたが、これが回路の動作速度の限界を大きく引き下げてしまった。そこで、足し算を木の枝のように並列に処理する構成へ組み替え、50MHz動作でタイミングの余裕を確保した。もう1つの壁は通信だ。パソコンから9画素分のデータを一気に送ると、FPGA側が取りこぼして画像が乱れた。これは、1バイトごとに2ミリ秒の間隔を空けて送る手順を組むことで解決した。

回路の設計データ(SystemVerilog)とパソコン側のPythonスクリプト、IEEE形式の詳細な技術文書は、MITライセンスでGitHubに公開されている。開発にはXilinxのVivadoを使う。CPUから画像処理回路までを自作してみたい人や、ソフトとハードを組み合わせた設計を学びたい人には、一連の流れを追える実例になるだろう。

関連情報

fabsceneの更新情報はXで配信中です

この記事の感想・意見をSNSで共有しよう
  • URLをコピーしました!

最新記事

YouTube / PodCast

【PR】読んで役立つ注目記事

目次