I like fpga

change the world by fpga
2021/05/29

8×8の画像をverilogで処理する[pixel image processing]

FPGA   VERILOG   ZYNQ   

FPGAで、8×8の画像処理を実施する。以下のような画像を処理する。

処理の流れは、以下のような感じだ。

デバイスは、Zynqで、評価ボードは、Ultra96を使っている。

CPUは、Zynqを使用する

次には、BRAMです。CPUからアクセスするために、AXI BRAM Controllerを使います。

次は、BRAMから画像を読み出して、画像を処理する部分です。Block design上は、signal controller wrapperに含まれています。こちらは自作のモジュールになります。

次は、CPUからレジスタアクセスして、画像処理に指示を出すモジュールになります。こちらも自作モジュールになります。

画像処理をするsignal controller wrapperを詳細に見ていきます。

signal controller warpperのブロック図です。

モジュールはこんな感じです。

module signal_controller_wrapper(
	//for module control
	input CLOCK,
	input RESET,
	input START,
	input [31:0] INPUT_RAM_ADDRESS,
	input [31:0] OUTPUT_RAM_ADDRESS,
//	output [3:0] STATUS,
	output [31:0] STATUS1,
	output [31:0] STATUS2,

	//BRAM IF
	output [31:0] ADDRB,
	output CLKB,
	output [31:0] DINB,
	input [31:0] DOUTB,
	output ENB,
	output RSTB,
	output [3:0] WEB

    );

各IOの説明です。

  • CLOCK 動作クロック
  • RESET リセット
  • START 信号が1になると、BRAMから画像を読み出します。
  • INPUT_RAM_ADDRESS BRAMから読み出すアドレスを指定します。
  • OUTPUT_RAM_ADDRESS 画像の加工結果をBRAMに書き出すアドレスを指定します。
  • STATUS1,STATUS2 デバック用
  • BRAM IF ADDRB CLKB DINB DOUTB ENB RSTB WEB BRAMのポートに接続するIO

signal controllerの中身は、状態遷移をして動作しています。

  • READ 状態 BRAMからデータを読み出します。
  • CALC状態 画像を加工しています
  • WRITE状態 BRAMにデータをライトしています。
  • IDLE状態 何もしていない状態

画像処理部分のIOです。

module calc(
	input CLOCK,
	input RESET,
	input INPUT_DATA_ENABLE,
	input [31:0] INPUT_DATA[8][8],
	output OUTPUT_DATA_ENABLE,
	output [31:0] OUTPUT_DATA[8][8]
    );

今回、このIOに2次元配列を使いたくて、System Verilogで実装をしました。

  • CLOCK 動作クロック
  • RESET リセット
  • INPUT_DATA_ENBLE 1になると、INPUT_DATAのデータを読み出して、計算、画像データの加工を始めます。
  • INPUT_DATA 画像データが含まれます。
  • OUTPUT_DATA_ENABLE 計算が終了するとOUTPUT_DATA_ENABLEが1になります。
  • OUTPUT_DATA 加工された画像データが

今のところ、CALCは、INPUT_DATAをOUTPUT_DATAに入れているだけですが、今後、CALCにDCTの計算を実装する予定です。

今回紹介したモジュールのプロジェクトファイルとソースコードです。

https://github.com/y38y38/myip_start

https://github.com/y38y38/pixel_8x8_process

https://github.com/y38y38/pixel_8x8_process_workspace

« »