●バイアスを加算する部分の回路図とタイムチャート

 図3-02のROM以降の回路図は基本的に図2-05図2-06と同じですが、バイアスOftRomDataを足す部分は違ってくるので説明します。

 図3-03(a)にその部分の回路図を示します。これが50個、インスタンス(*1)dotpro_sigmoid_00〜49の中に存在しますが、加算結果をラッチするタイミングはそのインスタンスの番号(dotpro_sigmoid_Nの"N")に依存します。タイムチャートででその理由を説明します。

(*1)layer1.vhd内で50回、dotpro_sigmoid.vhdをport map宣言する(リスト3-01参照)。その際dotpro_sigmoid_00〜49と名前を付けたものをインスタンスという。



  図3-03 バイアスを加算する部分

 図3-03(b)のようにMATMULOUTは、addout_dly_clr(CO784=1)のタイミングでラッチされ、CO784=2の時刻で有効になります。

 またOftRomDataも同時刻から有効になります。OftRomAddrはCO784を1サイクル遅延したものなので、同図のようにOftRomAddr=1のときに加算器の出力をラッチすれば正しい演算結果が得られます(*2)。

(*2)1層目の行列は784x50なので、各列の積和結果は50個、バイアスも50個ある。したがって各インスタンスdotpro_sigmoid_00〜49の番号とバイアスOftRomData_00〜49のタイミングを合わせる必要がある。 

バイアスを加算した信号AOUTはシグモイド関数に入力されます。その回路は図2-07と同じです。シグモイドの出力はZ_WR_DATAとなり、1層目の結果RAM (RAM_Z1)に書き込まれます。

●並列化する部分のVHDLソース

 dotpro_sigmoid.vhdはlayer1.vhdの中でリスト3-01のように50個、「
インスタンス化」されます。OftNはstd_logic_vector(5 downto 0)の入力ですが、同リストのようにインスタンスの番号と同じ値が入力されます。

  リスト3-01 同じ回路を50個インスタンス化する

●バイアスを加算する部分のVHDLソース

 図3-03(a)をVHDLで記述するとリスト3-02のようになります。dotpro_sigmoid_00ならOftNは0、dotpro_sigmoid_01ならOftNは1、dotpro_sigmoid_49ならOftNは49になります。

  リスト3-02 バイアスを加算する部分


次のページへ


目次へ戻る