●積和演算の部分

 画像ROMからの出力X_RD_DATAと、重みROMからの出力MatRomDataは、図2‐05(a)に示すように
乗算器に入力されます。同図(b)のタイムチャートを見ると双方のインデックスが合っているのが分かります(XnとW1,nのnが一致している)。

 それらの乗算結果は同図(a)のようにDF/F(D型フリップフロップ)で遅延されてmulout_dlyとなり、
加算器に入力されます。加算結果addoutもまたDF/Fで遅延されてaddout_dlyとなり、加算器にフィードバックされます。

 タイムチャートのaddoutを見ると乗算結果mulout_dlyが徐々に
累積されているのが分かります。このように積和演算が進んでいきます。

 加算結果addoutはCO784=1のタイミングでDF/FでラッチされMATMULOUTとなります。これが積和演算結果、すなわち行列乗算の最初の要素P0になります。P0, P1, P2, ... , P49まで
50個演算して終了します。




  図2‐05 784要素を積和演算する。結果は50個になる


●バイアスの配列もROMに割り当てる

 図2‐06のように
バイアスの配列もROMに割り当てます。配列のインデックス(0〜49)がアドレスに相当するので、アドレス幅は6ビットになります。またデータの範囲は-256〜255なのでデータ幅は9ビットになります。


  図2‐06 バイアスの要素数は50。これもROMに格納する


バイアスを加算する部分

 行列乗算の後
バイアスを加算しますが、ここで述べたように、そのままだとバイアスの影響力が1/256になってしまうため、図2‐07のようにMATMULOUTを
8ビット右シフトさせてMATMULOUT_sftとしてからバイアスOftRomDataを加算します。


●疑似シグモイド関数

 図2‐07の後半は「疑似シグモイド関数」です。ここで述べたように、最初にAOUTを2ビット右シフトしてAOUT_sftとします。
 そのあとはリミッタ回路を通り、128を足してSigLimit_plus_128となります。
 最後にCO784=3のタイミングでラッチされZ_WR_DATAとなり、これがニューラルネットワーク
1層目の出力となります。
 なお、図2‐07ではタイムチャートは省略しています(後々の論理シミュレーションで確認)。


  図2‐07 バイアスを足して疑似シグモイド関数にかける



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

 積和→バイアス加算→シグモイド関数で1層目の演算は終了、それを2層目に渡すためにいったん
RAMに溜め込みます。図2-08のようにデュアルポート(書き込みと読み出しのバスが別々)です。タイムチャートは省略します(後々の論理シミュレーションで確認)。


  図2‐08 1層目の結果を2層目に渡すRAM


次のページへ


目次へ戻る