●積和演算の部分

 図2‐05の回路図をVHDLで記述するとリスト2‐03のようになります(
積和演算)。
 画像ROMからの出力X_RD_DATAと、重みROMからの出力MatRomDataが乗算されます(mulout)。なおこの際、X_RD_DATAの最上位に符号ビットが追加され、PixRomDataになります(MatRomDataが符号付きなのでそれに合わせる)。
 乗算器は遅延が大きくなるので、乗算後いったんラッチし、遅延の伝搬を断ち切ります(mulout_dly)。

 mulout_dlyは累積器の出力(addout_dly)と
加算されます(addout)。
 addoutは遅延器で遅延されaddout_dlyとなり、それは加算器にフィードバックされます。これにより「
累積器」が構成されます。
 addoutはaddout_dly_clrのタイミングでラッチされ、MATMUOUTが取り出されます。これが
積和演算の結果になります。

  リスト2‐03 積和演算のVHDL (layer1.vhd)


●バイアスを加算する部分

 図2‐07の回路図をVHDLで記述するとリスト2‐04のようになります。
 積和演算結果を
8ビット切り捨て(Pythonでの右シフトに相当)、MATMULOUT_sftになります。
 その後バイアスOFTBと加算します。OFTBはOftRomDataのビット数をMATMULOUT_sftと合わせたものです。加算結果はAOUTとなります。


●疑似シグモイド関数の部分

 AOUTを
2ビット切り捨て、AOUT_sftとなり、さらに-128、127で飽和するリミッタをかけSigLimitになります。
 SigLimitに
128を加算し、下位8ビットを取り出してZ_WR_DATAとなります(この際CLKでラッチする)。これが1層目の結果です。

  リスト2‐04 バイアス加算→疑似シグモイド関数のVHDL
(layer1.vhd)

1層目の結果を溜め込むRAMの部分

 図2‐08
の回路図をVHDLで記述するとリスト2‐05のようになります。
 この部分はトップモジュール(
deep_hw.vhd)にあります。RAM_Z1がインスタンス化されて入出力信号が割り当てられています。

  リスト2‐05 RAMを介して次の層へデータを渡す (deep_hw.vhd)


●2層目、3層目も同じようにVHDL化する

 1層目(layer1.vhd)に関して説明しましたが、2層目、3層目も回路構成はほぼ同じです。1層目のVHDLをコピペし、カウンタのクリアやデコード値などを適宜変更し、あとは
シミュレーションで動作を確認しましょう。


ROMファイルはEXCEL+VBAで自動生成

 なお重みROM (ROM_W1.vhd)の下にはリスト2‐06のように
50個ものROM (ROM_W1_00〜49)があります。それぞれアドレス幅10ビット、データ幅9ビットです。

 ROM_W1_00〜49はそれぞれ784個の固有のデータを持っています。それらをEXCEL表からVHDLにコピペするのは大変なので、
EXCEL+VBAで自動生成させます。その手順についてはコラム21を参考にしてください。

  リスト2‐06 ROM_W1は50個のROMを一つにまとめたもの (ROM_W1.vhd)


最初のページへ


目次へ戻る