【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC...

45
- 1 - 【卒業論文】 CORDIC アルゴリズムを用いたデジタルハードウェア ニューラルネットワーク FPGA への実装 電気電子工学科 39 期卒業 出席番号 34 Nguyen Anh Tuan Posts and Telecommunications Institute of Technology(PTIT) 指導教員 兼田 教授 提出日 2006 2

description

This is Graduation thesis about "Digital Hardware for Neural Network Using CORDIC Algorithm - [ FPGA implementation ]" .http://vjc.jimdo.com/ , Nguyen Anh Tuan, Japan, LSI,日越架橋学友会-Vietnam Japan Bridge Club (VJC), monbusho, グエン アン トアン,  豊橋技術科学大学,  nguyen anh tuan 博士前期課程,  nguyễn tuấn anh, 阮英俊、、日本政府(文部文部科学省)奨学金、国費留学生、ロータリー米山記念奨学会奨学金,西尾kiraraロータリークラブ、財団法人 神野教育財団 奨励奨学金,財団法人 KDDI財団 外国人留学生助成 研究奨励金 ,ハノイ工科大学, CORDICアルゴリズム, CORDIC Algorithm

Transcript of 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC...

Page 1: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 1 -

【卒業論文】

CORDICアルゴリズムを用いたデジタルハードウェア

ニューラルネットワーク

FPGA への実装

電気電子工学科 第 39 期卒業

出席番号 34 番 Nguyen Anh Tuan

Posts and Telecommunications Institute of Technology(PTIT)

指導教員 兼田 護 教授

提出日 2006 年 2 月

Page 2: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 2 -

目次 第 1 章 はじめに……...........................................................................................1 1.1 背景……..............................................................................................1 1.2 ディジタルハードウェア化の必要性.........................................................1 第 2 章 ニューラルネットワーク...........................................................................1 2.1 ニューラルネットワークのモデル...........................................................2 2.2 バックプロパゲーションアルゴリズム.....................................................2 第 3 章 CORDIC アルゴリズムによるディジタルニューラルネットワークへの実現.....2 3.1 CORDIC アルゴリズムとは....................................................................2 3.2 ディジタル回路化のための CORDICアルゴリズム............... .......................3

第 4 章 FPGA によるディジタルハードウェアニューラルネットワークの実装............4 4.1 図形パターン認識するニューラルネットワークのニューロンの構造.........5 4.2 順方向処理の全体制御回路........................ ............................. ..............4 4.3 VHDLによるハードウェアの設計................................................. ............6 4.3.1 乗算部............................................ ..............................................6 4.3.2 加算部.................................................................................... .......8 4.3.3 Cordic アルゴリズム............................... ........................................8

4.3.3.1 Cordicによる 10進数⇔ 2進数の特別な変換法.........................9 4.3.3.2 Cordic アルゴリズムによる Cos,Sin 関数計算回路......... ...........9

4.3.4 (Sigmoid)シグモイド関数部..........................................................11 4.3.5 全体制御回路の説明........................................................................12 4.4 実験結果..............................................................................................16 4.5 結果の検討考察.....................................................................................20

第 5 章 結言...................................................................................................... .21 参考文献..................................................................................................................22 謝辞.........................................................................................................................22 付録.........................................................................................................................23

Page 3: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 3 -

第 1 章 はじめに 現在、ニューラルネットワークの研究が盛んに

行われ実際に様々な情報を処理しているが,その

多くが,パソコンの直列処理によるシミュレーシ

ョンであり,素子数が大きくなるとそれだけ処理

の完了までに時間が掛かってしまう欠点がある.

本研究の目的は、コンピュータ上でシミュレー

トしたディジタルニューラルネットワークを実

際のハードウェアで実現し,上記の欠点を克服す

ることである.

本研究では、電子回路上で信号を並列処理する

ので、コンピュータ上で逐次処理するよりも高速

になるという利点がある。

1.1 背景 ニューラルネットワークの研究は、MacCullochと Pitts が 1943 年にニューロンの数学モデルを提

案したことから始まった。そして 1961 年には、

Rosenblatt によって、学習アルゴリズムの基礎で

あるパーセプトロンが発明された。パーセプトロ

ンは、入力と出力を規則的に与え、ニューロン間

の結合重みを修正するという形でネットワーク

を学習させることを可能にしたものである。しか

し、1969 年に Minsky と Papert によってパーセプ

トロンの限界が示された。パーセプトロンは線形

分離可能な問題に対しては有効であるが、逆に線

形分離不可能な問題に対しては必ずしも有効で

ないということが証明された。[2]それ以来、ニュ

ーラルネットワークの研究は下火になったが、

1986年にRumelhartらによってバックプロパゲー

ション(back-propagation : 誤差逆伝播法)という

新しい学習方法が提案された。この方法によって、

パーセプトロン型のネットワークにおいて線形

分離不可能な問題に対しても学習が可能になっ

た。その結果、これまで難しかった画像や音声の

認識などにも応用されるようになり、ニューラル

ネットワークの可能性が大きく広がった。[3] 1.2 ディジタルハードウェア化の必要性 ニューラルネットの特徴を生かした応用例は

多数存在する。例えば、特殊なカメラを用いた連

続画像を処理する装置がある。その装置は、人間

の視覚システムを取り入れたもので、手のジェス

チャーをカメラで取り込み、形状を認識し、学習

済みの特徴と照らし合わせて判断する。また画像

中の人間の数を数えるために、人間の顔を検出す

るシステムもある。このシステムは人間の肌の特

徴として熱に注目し、顔と認識できるようなパタ

ーンを生成し、学習させることでパターン認識を

行っている。他にも、手書き文字の文字認識や音

声認識にも応用されている。手書き文字認識では

形の歪みや変形、音声ではアクセントやイントネ

ーションといったものを含む情報処理を行って

いる。

これらのようなニューラルネットを応用した

システムを実現するには、ソフトウェアによるも

のとハードウェアによるものの2つが考えられ

る。ソフトウェアによる実現は、ネットワークの

構造が自由であり、変更もハードウェアに比べて

容易である。しかし大規模化すると処理時間が長

くなる。また小型化が難しい。それに対し、ハー

ドウェアによる実現は、ネットワークの構造を変

更しにくいが、大規模化しても処理時間が長くな

らないし小型化もしやすい。またネットワークを

構成するニューロンの数が多いほど、ニューラル

ネットの実現できる機能は高くなる。よってニュ

ーラルネットをシステムの一部として組み込む

場合、ハードウェアでの実現が望ましい。ただし、

ネットワークの構造は変更しにくい、またニュー

ロンの数は増やしにくいので、使用に制限がでる

可能性はある。[3]

第 2 章 ニューラルネットワーク

2.1 ニューラルネットワークのモデル 脳内では膨大な数の神経細胞“ニューロン”が

相互に結合し,信号を伝搬していくことで高度な

情報処理を行っている.ニューラルネットワーク

は脳内の,ニューロンの相互結合による情報伝達

機構をモデル化したものである.ニューラルネッ

トワークはネットワークの構造から大きく2種

類に分類できる。 Fig.1 に示すように、入力層から出力層まですべ

て順方向のみに結合されており、フィードバック

結合などの相互結合の形態を持たないようなニ

ューラルネットワークを「階層型ニューラルネッ

トモデル(Multi-layered Neural Network Model)」と

呼ぶ。[6] 入力層 中間層 出力層

Fig.1:階層型ニューラルネットモデル

Page 4: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 4 -

一方、ユニット間の結合が必ずしも順方向のみ

とは限らないようなモデルとして「相互結合ニュ

ーラルネットモデル(Fully Connected Neural Network Model)」がある。(Fig.2)

Fig.2:相互結合ニューラルネットモデル 本研究では、階層型の一つの特別なモデルとし

て「単純パーセプトロン構造」を利用して、図形

パターン認識するディジタルニューラルネット

ワークをハードウェア化する。

Fig.3:単純パーセプトロン構造 単純パーセプトロンとは

パーセプトロンは、心理学者 Rosenblatt によっ

て発明され、パターンを学習識別する機能を有す

るニューラルネットワークであり、形式ニューロ

ンとシナプスの可塑性を用いている。パーセプ

トロンの意味は認識(perception)機械である。 Fig.3 に示すように、パーセプトロンは、感覚ユニ

ット(Sensory Unit)、連合ユニット(Associative Unit)、反応ユニット(Response Unit)からなる3層

の階層型ニューラルネットワークである。以下で

は、意味を理解しやすくため、感覚ユニット、連

合ユニット、反応ユニットを、各々、「入力層」、

「中間層」、「出力層」と言い換えることにする。 つまり、「単純パーセプトロン」では、出力層

のニューロンは1個で、すべての中間層のニュー

ロンから入力を受ける。

入力は、入力層ニューロン1個で、すべての中

間層のニューロンへ、中間層のニューロンから出

力層のニューロンへと方向である。[7] 2.2 バックプロパゲーションアルゴリズム 結合係数を適正な値に修正して,ニューラルネ

ットワークを任意の情報処理機構にすることを

学習と呼ぶ.学習のアルゴリズムとしてバックプ

ロパゲーションアルゴリズムの手法を学び,簡単

な構造のニューラルネットワークにおいて実践

した. バックプロパゲーションアルゴリズムによる

学習の手法は以下の①~④である. ① 学習させたい入力信号と出力信号の組を用意

する,この組は複数個でも学習できる.また,

学習させたい出力信号を教師信号と呼ぶ. ② ニューラルネットワークに信号を入れ,順方

向処理を行い出力を出す. ③ 出力された信号と教師信号との誤差を,順方

向処理とは逆に出力層から入力層の方向へ伝

播させる.このとき、伝播された誤差を使い

結合係数を修正する. ④ 全ての組で③の誤差が規定値以下になれば学

習は完了.誤差が大きければ,②から④を繰

り返していき,予め決めていた回数を終えて

も規定値よりも小さくならなければ学習は失

敗. 学習が成功したニューラルネットワークは情

報処理プログラムを必要とせず,入力信号を入れ

ると対応した信号を直ちに出力できるようにな

る.[4]

第 3章 CORDICアルゴリズムによるディジ

タルニューラルネットワークへの実現

3.1 CORDIC アルゴリズムとは CORDIC と は COordinate Rotational DI

CORDIC アルゴリズムの基本的な原理は、関数

gital Computerの頭文字語で、Volderによって 1959 年に

考え出された三角関数、乗算、除算などの初等関

数演算を行うアルゴリズムです。このアルゴリズ

ムは、シフト、加減算による演算を繰り返し行う

ことで三角関数などの値を得ることができると

いう特徴を持っており、FPGA、ASICを始めとす

るハードウェア向きのアルゴリズムとして知ら

れています。 CORDICアルゴリズムは 1972 年に発売された

世 界 初 の ポ ケ ッ ト ・ サ イ ズ 関 数 電 卓 HP-35(Hewlett Packard社)や数値演算コプロセッサ

8087(Intel社)を始め、通信、デジタル信号処理、

ロボット工学などさまざまな分野で応用されて

います。

Page 5: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 5 -

を2次元平面上のベクトルととらえて,ベクトル

の回転の反復計算によって関数値を求めるもの

である.初期値と収束条件を適正に定めることで,

各種の初等関数が実現できる。

このアルゴリズムは加減算とシフト演算の繰

り返しだけで関数計算ができるので、乗算が不得

意なディジタル演算に適したものである。その動

作は下記の CORDIC ブロック図に表されている。

Fig.4:CORDIC ブロック図

3.2 ディジタル回路化のための CORDIC

アルゴリズム 評価関数に sin,導関数に cos を使うようにし

たので,ディジタル回路で sin,cos を計算するア

ルゴリズムが必要になる. sin, cos を求める場合なので,原点をから出

る角度θの単位ベクトル V を考える.実部を x,虚部をyとするとx,yは順に cos,sin に対応す

る.

Fig.5:ベクトルの回転

CORDIC アルゴリズムの計算式

複素数直交座標系において、ベクトルVは次式で

表される。

θθ sincos VjVjyxV +=+=

このベクトルを-θを回転させて、実軸と重ねて、

これを 0V とする。ここで、Fig.5 に示すように、

から初めて)0,,0( 0000 === yVxV θ 、

( )

とすれば、が小さくなる方向に

との角差とをとり、ベクトル

のと直角に大きさ途中、

11

1

11

1

'

'

21

−−

−−

+=

iii

iii

ii

i

VVV

VVV

VV

θθ

)2/1(tan 1111

−−−− += i

iii sθθ

ただし、

>−≤+

=−

−− )(1

)(1

1

11 θθ

θθ

i

iis

  

  

であり、

+=

−=

−−

−−

−−

−−

11

11

11

11

2

2

ii

iii

ii

iii

xsyy

ysxx

となる。n回の繰り返し後、 θθ ≅n であれば、

となる。そこで、

   

  

  ただし、

、から演算を開始、途中

 

>−≤+

=

+=

−=

+=

====

−−

−−

−−

−−

−−

−−−−

)(1)(1)2/1(

)2/1(

)2/1(tan

0...,64676026.1/1,0

1

11

11

11

11

11

1111

000

θθθθ

θθ

θ

i

ii

ii

iii

ii

iii

iiii

s

xsyyysxx

s

yVx

とすれば、最終的に

≅≅

θθ

sincos

n

n

yx

が得られる。なお、 )2/1(tan 11 −− i の値は予め定数と

( )

( )

θ

θ

θ

θ

sin64676026.12

11211

111

sin2/11

cos64676026.12

11211

111

cos2/11

2

1

22

1

0

21

2

1

22

1

0

21

V

Vy

V

Vx

n

n

i

in

n

n

i

in

+××

+=

+=

+××

+=

+=

=

=

Page 6: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 6 -

用意しておけば良く、

−−11

2 iiy

の値は 」を「 11 −− iyi

桁だけ右シフトすることにより、乗算回路使用すること

なく、容易に計算できる。それは、2 進数なので、最

上位 bitから最下位 bit方向に進むと、数値の値は小

さくなる。

例えば、 210 10008 = ,今 bit1 を 1bit 右シフトすれ

ば、次になる。 122 284010010008 ==→=

この CORDIC アルゴリズムを使用して、VHDL 言

語を用いて回路を設計して成功した。この回路で、

いろいろな角度の sin,cos の値を確かめられた。

その結果、当たり前かもしれないが CORDIC で実

験するとき、角度の入力値の小数部のビット数が

多ければ多くほど、計算の正確度が高くなり、真

値に近づく。

(詳しくは結果の検討考察の表4に参照)

第4章 ディジタルニューラルネットワー

クのハードウェア化

Fig.6:ハードウェア化の手順

この手順には、Step2 を飛ばして設計しても構

わないが、船体制御回路の動作を理解しやすくた

めに作成した方がよいと思う。

4.1 図形パターン認識するニューラルネット

ワークのニューロンの構造

Fig.3:単純パーセプトロン構造 順方向処理の計算式は次の通りである。 入力層: ii YX , はそのまま入って、何もせずに入力

層を出る。

( ) ( )1.........5

121  中間層:

+= ∑

=jjijij wYwXfZ

具体的に:

( )( )( )( )( )25155

24144

23133

22122

21111

wYwXfZwYwXfZwYwXfZwYwXfZwYwXfZ

ii

ii

ii

ii

ii

+=+=+=+=+=

出力層: ( ),2..........5

1 

= ∑

=jjkjk wZfZ

具体的に:

( )kkkkkk wZwZwZwZwZfZ 5544332211 ++++=

ただし、

( )

出力層の出力値

合係数中間層・出力層間の結

シグモイド関数

中間層の出力値

合係数入力層・中間層間の結

入力層の入力値

:

:)(:

:

:,:,

21

k

jk

j

jj

ii

Z

wSigmoidf

Z

wwYX

Fig.3 の「単純パーセプトロンの構造」の計算式に

示すように、このニューラルネットワークをハー

ドウェアかするには、「乗算部」、「加算部」、

「Sigmoid 関数部」、「Cordic 部」および最も大切

な「全体制御回路」という回路を設計する必要が

ある。そのため、図形パターン認識する順方の向

全体制御回路のブロック図を作成した。

Page 7: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 7 -

4.2 順方向処理の全体制御回路

入力層 中間層 出力層

Fig.7:ハードウェアニューラルネットワーク

(1),(2)に示した計算式を表すハードウェア

ニューラルネットワークの順方向処理の全体制

御回路は Fig.6 に示した。この全体制御回路には、

直角座標系上で三角形の図形パターン[5]の内外

にある点の座標(Xi,Yi)を入力信号とする。また、

実際のハードウェアで全体回路を制御するため

に、RESET,CLK を加え、乗算器の演算要求信号

(RQM1,RQM2)及び Sigmoid 関数部の演算許可信

号(ES1,ES2)を備えた。 また、全体回路の制御タイミングで、何クロッ

ク目に結果 Zk が出るのかを明確にするために、

出力信号 READY,制御状態変数 Q を用意した。 図形パターン認識の回路なので、直角座標系上

に適当な点の座標( ii YX , )を入力とする。 次に、入力層から中間層へのシナプス結合係数

[3] ijw ( 25,152111 ......, wwww )を使用して、乗算

器 Mi(M1,M2,.......M10)の入力として実行する。

そ れ か ら 、 乗 算 器 の 出 力 の OMi(OM1,OM2,.......OM10)を加算器Ai(A1,A2,…A5)の入力として入る。続けて、加算器の出力 OAi(OA1,OA2,…….OA10)を(Sigmoid)シグモイ

ド関数回路部 Si(S1,S2……S5)の入力として入

る。この(Sigmoid)シグモイド関数回路部の中

に、「Cordic 関数回路部」がある。それから、

( Sigmoid )シグモイド関数回路部の出力

(Z1,Z2,..…..Z5)の値を求めることができる。こ

こまでの回路は「入力層・中間層間の回路である」 ここからは、「中間層・出力層間の回路」に入

る。前段で、(Sigmoid)シグモイド関数回路部の

出力(Z1,Z2…..Z5)の値を求められてきたので、

上記のブロック図に示すように、乗算器 Mjk(M11,M12…..M15)の入力として入る。 また、入力層から中間層へのシナプス結合係数

jkw ( kkk www 521 ......, )を使用して乗算器 Mjk(M11,M12,.......M15)の入力として実行する。そ

れ か ら 、 乗 算 器 の 出 力 の OMjk( OM11,OM12,……OM15 ) を 加 算 器 Ai(A1,A2,..…A5)の入力として入る。続けて、加

算器の出力 OA6 を(Sigmoid)シグモイド関数回

路部 S6 )の入力として入る。その後、(Sigmoid)シグモイド関数回路部の出力は全体回路の出力

の値になるので、Zk を求め出すことができる。

Page 8: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 8 -

4.3 VHDLによるハードウェアの設計 上記のブロック図をハードウェア化するには、

回路設計が必要である。ここで、VHDL(Very High Speed Integrated Circuit Hardware Description Language)という「超高速集積回路ハードウェア記

述言語」を用いて回路を設計する。 つまり、上記のブロック図に示す「乗算器」、「加

算器」、「Sigmoid 関数部」、「Cordic 部」および「全

体制御回路」を設計する必要がある。ただし、各

部は何個もあるので、一つの回路だけを作れば、

「コンポーネント」として、容易に扱うことがで

きる。 4.3.1 乗算部

Fig.3 に示したニューラルネットワークのニュ

ーロン間のシナプス結合係数 jkjj www ,, 21 [5]が

負数および小数を含むため、回路設計には、「2

の補数表示固定小数点乗算器」の回路を設計した。

また、論理ゲートの使用量の問題に対して、「並

列型乗算器」よりも、「直列型乗算器」を使用し

た方が少ない。

n n-1 n-2 ………… 4 3 2 1 0

符号 1bit 整数部 I bit 小数部 D bit Fig.8:数値の語長のモデル

符号ビットには、 負数

 正数

10

と規約されている。

また、係数と入力座標の掛け算の結果のもとに

して、整数(Integer)部のビット数(I bit)は何ビッ

トを使うのかを決める必要がある。そして、小数

(Decimal)部のビット数(D bit)は Cordic アルゴリ

ズムにより適切なビット数を決められる。(詳し

くは[4.3.4]節に参照)

Fig.9:直列型2の補数表示整数乗算器

ただし、ACC( ACC

上記の Fig.9 に示すように、「直列型2の補数表

示整数乗算器」において、被乗数、乗数、および

積の関係は図示すれば、次のようになる。

umulator)は累算機の記

号を表し、M(Multiplier)は乗算器の記号である。

符号ビット(1bit)

被乗数(12bit) 乗数(12bit)

×

=

Fig.10:小数部ビットは無い場合

一方、「直列型2の補数表示固定小数点乗算

器」の場合は次のようになる。 符号ビット(1bit)

被乗数(12bit) 乗数(12bit)

×

小数点 =

Fig.11:整数部ビットは無い場合

ただし、今回は「直列型2の補数表示固定小

数点乗算器」の整数部 7bit のデータを実行するの

で、乗算器の結果は次のようになる。 符号ビット(1bit) 被乗数(12bit) 乗数(12bit) × = 小数点

7bit 右シフト 使用部分 捨てる部分

Fig.12:整数部 7bitの場合

ここで、積の bit 長は倍長となっているので、

その下位を丸めて、上位だけを積として使用する

ことができる。ただし、整数部は 7bit および

XM,YM の正負によって、計算式が異なるので,乗算器の結果は次の通りである。 Case1

ZM<=ACC(16 downto 5)-1;

:XM,YMは同時に「正数」または「負数」

の場合、乗算器の結果ZMの計算式は

Case2:XM,YMはいずれか「正数」、いずれか

「負数」の場合、乗算器の結果ZMの計算式は ZM<=ACC(16 downto 5)+1;

7bit 4bit 7bit 4bit

(16~5) ACC(23~17) ACC(4~0) ACC

整数部 11bit 整数部 11bit

ACC(23~12) ACC(11~0)

小数部 11bit 小数部 11bit

ACC(23~12) ACC(11~0)

Page 9: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 9 -

リスト 4.3.1: 「直列型2の補数表示固定小数点乗算器」 (語長は 12bit,ただし、符号 1bit、整数部 7bit、小数部 4bitとする)

library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity Multiplier_12bit is Port (RESETM,CLKM,RQM:in std_logic; RQM:ReQuest signal of Multiplier Circuit

RDYM:out std_logic; RDYM:ReaDY signal of Multiplier Circuit XM,YM:in std_logic_vector(11 downto 0); ZM:out std_logic_vector(11 downto 0) ZM≡ブロック図の OMi(OM1…..OM5) );

end Multiplier_12bit; architecture Behavioral of Multiplier_12bit is signal Q:integer range 0 to 13; 状態値=0~13 signal ACC:std_logic_vector(23 downto 0); 塁算器(ACCumulator) signal B:std_logic; 拡張レジスタ signal WA,WB:std_logic_vector(11 downto 0); begin

ZM<=ACC(16 downto 5)+k;

<>><+>><<−

=0,00,010,00,01

YMXMorYMXMYMXMorYMXM

k    

    

WA<=ACC(23 downto 12)-XM; WB<=ACC(23 downto 12)+XM; process(CLKM,RESETM) begin

if RESETM='1' then RDYM<='0';Q<=0; elsif CLKM'event and CLKM='1' then case Q is when 0 =>if RQM='1' then Q<=1; ACC<=(23 downto 12=>'0') & YM;B<='0';end if; when 1 to 11 => if ACC(0)='1' and B='0' then ACC<=WA(11) & WA & ACC(11 downto 1); 減算と右算術シフト B<=ACC(0); elsif ACC(0)='0' and B='1' then ACC<=WB(11)& WB & ACC(11 downto 1); 加算と右算術シフト B<=ACC(0); else ACC<=ACC(23)&ACC(23 downto 1);end if; 右算術シフト Q<=Q+1; when 12 => if ACC(0)='1'and B='0' 加減算のみ then ACC(23 downto 12)<=WA; (シフトなし) elsif ACC(0)='0'and B='1' then ACC(23 downto 12)<=WB;

end if; Q<=Q+1;RDYM<='1'; when 13 => if RQM='0' then RDYM<='0';Q<=0;end if; when others =>null; end case;

end if; end process; end Behavioral;

Page 10: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 10 -

ACC のクリア、Y の取り込み Q の状態 加減算,RDYM=1 RQM=1 RQM=0

RQM=1 加減算と右シフト RQM=0 RESETM=1

Fig.13:状態遷移図

Fig.14:制御タイミングの一例 実験結果 リスト 4.3.1および Fig.13 に示した状態遷移図

の制御タイミングは Fig.14 に示されている。 Fig.14に示したように、RESETM=1およびRQM=0の時、Q=0,状態の変化はない。次に、RESETM=0および RQM=1 の時、状態 Q=0 で乗算開始要求信

号 RQM=1 により、演算を開始し、状態を 1~11と変化しながら、ACC の最下位ビットとレジスタ

B の値により、加減算などを制御して塁算を管理

する。最後に、状態 Q=12 において、RDYM=1 と

して演算を終了し、状態 13 で RQM=0 となるのを

待ち、次の乗算要求を備えて、回路を初期状態

(Q=0)に戻すものである。 また、4.1 節に説明した内容を、下記の実際の

一例を乗算結果の証拠として説明する。 ( X= 210 01000000010.12.6 = )>0

( Y= 210 00000000011.13.5 = )>0 なので、乗算器の結果は次のようになる。 ACC=0000000

5) downto ACC(16

110000100100 00000

ZM<=ACC(16 downto 5)-1= 00001001.0011-1= 102 125.901000001001.0 =

一方、真値は 101010 9.1=3.52.6 × とい値である。

ただし、( ) ( )210 小数小数 → を変換するには、普

通の変換法ではなくて、「Cordic による特別な変

換法」を使用する必要がある。(4.3.3 に参照)

4.3.2 加算部

入力2つの加算器 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity Adder_12bit_Input2 is Port( XA1,XA2:in std_logic_vector(11

downto 0); ZAI2:out std_logic_vector(11 downto

0) );

end Adder_12bit_Input2; architecture Behavioral of dder_12bit_Input2 is begin ZAI2<=XA1+XA2; end Behavioral; 入力5つの加算器 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity Adder_12bit_input5 is Port(XA1,XA2,XA3,XA4,XA5:

in std_logic_vector(11 downto 0);

ZAI5:out std_logic_vector(11 downto 0)

0 13 12 11 2 1

Page 11: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 11 -

); end Adder_12bit_input5; architecture Behavioral of A2dder_12bit_input5 is begin ZAI5<=XA1+XA2+XA3+XA4+XA5; end Behavioral; XA1 ZAi .

. +

. XA5

Fig.15:2の補数表示数の加算器 4.3.3 Cordic アルゴリズム

今回「2の補数表示固定小数点」のデータを使

用するので、10 進数のデータを 2 進数に変換する

必要がある。ただし、普通の変換法を使わずに

Cordic による特別な変換法を利用しなければな

らない。 4.3.3.1 Cordic による 10 進数 ⇔ 2 進数

の特別な変換法

11 10 43210

符号ビット 整数部 小数部 (I bit) (D bit)

Fig.16:データ形式 Fig.16 に示すように、データ 12bit 中に 4bit 小

数部がある。そこで、(仮想)小数点は 4 ビット

目にあるものとしてすべてのデータをスケーリ

ング(scaling)する。真値が1.0000のとき、 1624 = となるので、小数点のデータを 10 進数に変換す

る場合、次の式に従わなければならない。 ( ) ( )210 16 小数小数 =×

4.3.3.2 Cordic アルゴリズムによる Cos,Sin関

数計算回路

Fig.17 に示したように、RESETM=1 および

RQM=0 の時、出力 ZM=0,状態の変化はない。次

に、RESETM=0 および RQM=1 の時、状態 Q=0で乗算開始要求信号 RQM=1 により、演算を開始

し、状態を 1~5と変化しながら、ACC の最下位

ビットとレジスタ B の値により、加減算などを制

御して塁算を管理する。最後に、状態 Q=6 にお

いて、RDYM=1 として演算を終了し、状態 7 で

RQM=0 となるのを待ち、次の乗算要求を備えて、

回路を初期状態に戻すので、Q=0 になる。 Fig.18 は、4.3.1 節に説明した内容を、実際の

一例の証拠として示す。

入力角度 TH= 210 1001.0000000157080.12

==π

Cordic による計算結果は次のようになる。 ( )( ) 10000.000000012

00625.00001.000000002==

≈==

π

π

Sin

Cos

これは真値と非常に近く、正確度が高いと思わ

れる。これによって、語長の小数ビットが多け

れば多くほど正確度が高くなることがわかる。

Q の状態 ES=0 ES=1

初期値設定 1回目 5回目 6回目 終了設定

ES=0 RESETS=1

Fig.17:状態遷移図

Fig.18:制御タイミングの一例

0 7 6 1 5

Page 12: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 12 -

リスト 4.3.3:「2の補数表示固定小数点」のデータ形式を Sin・Cos関数計算回路の記述 (語長は 12bit,ただし、符号 1bit、整数部 7bit、小数部 4bitとする)

library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity Cordic_Sin_Function_12bit is Port ( RESETS,CLKS,ES: in std_logic; ES:Enable signal of Sigmoid Circuit READYS: out std_logic;

TH: in std_logic_vector(11 downto 0); COS,SIN: out std_logic_vector(11 downto 0)

); end Cordic_Sin_Function_12bit; architecture Behavioral of Cordic_Sin_Function_12bit is subtype CONST_type is std_logic_vector(11 downto 0);

type ARRAY_DATA is array(0 to 4) of CONST_type; constant CONST: ARRAY_DATA:=ARRAY_data'(

"000000001101","000000000111",--00D,007 )2/1(tan 11 −− i の値は予め定数

"000000000100","000000000010",--004,002 と用意するために下記の計算表

"000000000001" ); --001 が必要である

signal Q: integer range 0 to 7; 表 1: )2/1(tan 11 −− i の値

signal X,XX,Y,YY,Z,W: std_logic_vector(11 downto 0); begin W<=Z-TH; --1 XX<=to_stdlogicvector(to_bitvector(x) sra Q-1);--2 YY<=to_stdlogicvector(to_bitvector(y) sra Q-1);--3 process(RESETS,CLKS) begin if RESETS='1' then Q<=0;READYS<='0'; --4

elsif CLKS'event and CLKS='1' then if Q=0 then --5

if ES='1' then READYS<='0';

Z<=(others=>'0');

X<="000000001010";--00A 初期値64676026.1

10 =x

Y<=(others=>'0'); 1660725.0 ×=

Q<=1; 1610107.9 A=≈= end if; elsif Q<6 then --6 if W(7)='1' then --7 X<=X-YY;Y<=Y+XX;Z<=Z+CONST(Q-1);

else X<=X+YY;Y<=Y-XX;Z<=Z-CONST(Q-1);

end if; Q<=Q+1;

elsif Q=6 then READYS<='1';COS<=X;SIN<=Y;Q<=7; --8 else --9 if ES='0' then Q<=0;READYS<='0';end if; end if;

end if; end process; end Behavioral;

Page 13: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 13 -

コメント「--1」で示した文は Z と Th との大小

関係をチェックするために行う演算である。それ

は、使用する入力データは Integer ではなく、2 進

数表示を利用するからである。これにより、W の

MSB(Most Significant Bit)という符号ビットは 1であれば W は負であり、Z<TH でわかる。

次に、以下の文は CORDIC アルゴリズム理論で

説明した計算式である。

>−≤+

=

+=

−=

−−

−−

−−

−−

−−

)(1)(1)2/1(

)2/1(

1

11

11

11

11

11

θθθθ

i

ii

ii

iii

ii

iii

s

xsyyysxx

  

  

  ただし、

これは「--2」及び「--3」に示す。ここで、X及び Y を「Q-1」bit だけ右算術シフトして、それ

ぞれ XX および YY を作成する回路である。これ

は、入力信号データ X,Y の bit_vector 型 → std_logic_vector 型に変換するためからである。 「--4」は Process 文は計算回路の制御機構であ

り、強制リセットするための回路である。Process文の起因リストには強制リセット信号とクロッ

ク信号である。 「--5」は状態 0 の場合、ES=1 の時の初期値設

定を行っている。 「--6」は状態 1~5における動作である。 「--7」に示すように、W(7)は符号ビットであ

るので、W(7)=1 の時は Z<TH である。 「--8」状態 6 における動作である。READYSフラグを立てて、X を COS に+、Y を SIN に出力

して状態 7 に進む。 「--9」は状態 7 における動作である。ここで、

ES=0 であれば READYS フラグを下ろして(0 に

して)状態を初期状態に戻す。 4.3.4 (Sigmoid)シグモイド関数部

第 3章に Sigmoid関数について説明したが、こ

こで、実際に回路設計のとき、どう扱うのかにつ

いて説明する。

Fig.19 及び Fig.20 に示すように、[-π/2, π/2]にCordicによる sin関数のグラフは通常の sin関数の

グラフと同様であるが、(-∞,-π/2)及び(π/2, ∞) の場

合は違ってくる。実際に通常の Sin 関数と同様に

VHDL で「Cordic による sin 関数」の回路を設計

するつもりだったのであるが、Fig.21 に示すよう

に、(-∞,-π/2)及び(π/2, ∞)の場合は自動的に Sigmoid関数の形に同様であることがわかった。これによ

り、Sigmoid 関数の代替関数として,いろんな関

数の中で、「CORDIC アルゴリズムによる sin 関

数」は最適であることが見つかった。 Sigmoid 関数および Sigmoid 関数の代替関数と

して、次式で表される。

Sigmoid 関数

xx ef −+=

11

Sigmoid 関数の代替関数

<<−+

−≤

=

)2

(1

)22

(2sin1

)2

(0

)(

x

xx

x

f

π

ππ

π

ただし、 sinx は通常の sinx ではなく、「Cordic による sin 関

数」を利用したのである。

-1.5

-1

-0.5

0

0.5

1

1.5

-8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8

Fig.19:通常の sin 関数のグラフ

-1.5

-1

-0.5

0

0.5

1

1.5

-8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8

Fig.20:Cordic による sin 関数のグラフ

-0.2

0

0.2

0.4

0.6

0.8

1

1.2

-8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8

Sigmoid代替関数 Sigmoid関数

Fig.21:Sigmoid 代替関数及び Sigmoid 関数の

グラフ

Page 14: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 14 -

それは、Fig.20 に示すように、「Cordic による sin 関

数」のグラフ

−≤−=

)2

(1

)2

(1sin

x

xx

π

π

なることによって、Sigmoid 関数の代替関数値も自

動的に

−≤=

+=

)2

(1

)2

(0

2sin1)(

x

xxfπ

π

  

となるから

である。 したがって、判別回路を設計せずに、一つだけ

のケース

<<−

22ππ x の設計した。

その回路の設計は次の通りである。

リスト 4.3.4 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity Sigmoid_Cordic_Sin_Function is Port ( RESETS,CLKS,ES: in std_logic; READYS: out std_logic; WA: in std_logic_vector(11 downto 0); OS: out std_logic_vector(11 downto 0)

); end Sigmoid_Cordic_Sin_Function; architecture Behavioral of Sigmoid_Cordic_Sin_Function is component

Cordic_Sin_Function_12bit Port ( RESETS,CLKS,ES: in std_logic; READYS: out std_logic; TH: in std_logic_vector(11 downto 0); COS,SIN: out std_logic_vector(11

downto 0) ); end component; signal SIN:std_logic_vector(11 downto 0); begin CORDIC:Cordic_Sin_Function_12bit port map(RESETS,CLKS,ES,READYS,WA,open,SIN); OS<=to_stdlogicvector(to_bitvector (16+SIN) sra 1); --"00000001.0000"=16(Integer) end Behavioral;

「Cordic による sin 関数」を利用して、Sigmoid の

代替関数の回路の VHDL 記述をリスト 4.3.4 に示

す。 Entity 部 Port の入出力信号については、RESETSはリセット信号、CLKS はクロック信号、ES は演

算開始許可信号、READYS は演算終了フラグであ

る。 12bit の角度(radian)信号 WA を入力して、OS の

Coridc による sin 関数の計算値を出力する。 Architecture 部 component の入出力信号は

「Cordic による sin 関数」の VHDL 記述の信号と

まったく同様である。それは、Sigmoid 部の中に

Cordic をコンポーネントとして利用できるからで

ある。 Signal 文において、SIN は Sigmoid 演算の作業

変数である。それは、Cordic による sin 関数の計

算結果は出力信号なので、port map(変数)文の変数

には使えないからである。 下線の部分 Sigmoid 関数の代替関数として書き

換 え た の で あ る 。 た だ し 、 VHDL で

2sin1)( xf +

= を直接に掛けず、次のよう記述

できるのである。1=“00000001.0000”=16なので、

bit_vector 型→ std_logicvector 型に変換する必要

がある。また、2 分の{ }xsin1+ を実行するために、

sra(shift right arithmetic)を右に 1bit シフトすればで

きる。次は簡単な例で説明すると、例えば、

8.0=“00001000.0000”,であり、 1284 = を 計算し

たい場合は、ただ右に 1bit シフトすれば、次のよ

うになる。“00000100.0000”←これは 4 になるこ

とを確かめることができた。 4.3.5 全体制御回路

Fig.7 の全体制御回路のブロック図にに示すよ

うに、乗算器は 15 個(M1~M15)の回路があり、

加算器及び Sigmoid 関数部の回路も 6 個(A1~A6),(S1~S6)がある。その中で、乗算器および

Sigmoid 関数部はすべての回路は同じなので、

各々は一つの回路しかを作る必要はない。ただし、

図で見てわかると思うが、中間層の加算器と出力

層の加算器が違うので、別の回路を記述した。 それで、各々回路部を全体制御回路の一つのコ

ンポーネントとして利用すると、設計するには非

常に楽できた。しかし、要注意する必要があるの

は、Port map 文の括弧の中である。Port map 文と

は、全体制御回路の信号として、Component 回路

を取り扱って実行するコマンドである。なので、

全体回路で、Component のある信号を使ってない

ときは要注意する必要がある。

Page 15: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 15 -

リスト 4.3.5:「2の補数表示固定小数点」のデータ形式を全体制御回路の記述 (語長は 12bit,ただし、符号 1bit、整数部 7bit、小数部 4bit とする)

library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity Whole_of_Circuit is Port ( RESET,CLK:in std_logic; 入力信号のリセット信号、クロック信号 Xi,Yi:in std_logic_vector(11 downto 0); 座標の入力データ Zk:out std_logic_vector(11 downto 0) 全体制御回路の出力信号

); end Whole_of_Circuit; architecture Behavioral of Whole_of_Circuit is component Multiplier_12bit Port ( 全体制御回路、乗算器の回路をコン

RESETM,CLKM,RQM:in std_logic; ポーネントとして利用するので、乗算器 RDYM:out std_logic; の入出力信号とまったく同様

XM,YM:in std_logic_vector(11 downto 0); RESETM:リセット信号 ZM:out std_logic_vector(11 downto 0) CLKM:クロック信号

); RQM:ReQuest signal of end component; Multiplier Circuit

component Adder_12bit_Input2

Port ( XA1,XA2: in std_logic_vector(11 downto 0); 中間層の加算器

ZAI2:out std_logic_vector(11 downto 0) (入力は2つ) );

end component;

component Sigmoid_Cordic_Sin_Function Port ( 全体制御回路、乗算器の回路をコンポ

RESETS,CLKS,ES: in std_logic; ーネントとして利用するので、乗算器 READYS: out std_logic; の入出力信号とまったく同様 WA: in std_logic_vector(11 downto 0); RESETM:リセット信号 OS: out std_logic_vector(11 downto 0) CLKM:クロック信号 ); ES:Enable signal of end component; Sigmoid Circuit

component Adder_12bit_input5 Port (

XA1,XA2,XA3,XA4,XA5: in std_logic_vector(11 downto 0); 出力層の加算器 ZAI5:out std_logic_vector(11 downto 0) (入力は5つ) ); end component; signal Q:integer range 0 to 38; 制御状態変数(rangeは制御タイミングのクロック数) signal RQM1,RQM2,ES1,ES2,READY:std_logic; 乗算器,Sigmoid関数部演算開始信号 signal OM1,OM2,OM3,OM4,OM5,OM6,OM7,OM8,OM9,OM10,OM11,OM12,OM13, OM14,OM15,OA1,OA2,OA3,OA4,OA5,OA6,Z1,Z2,Z3,Z4,Z5,w11,w21,w12,w22,w13,w23,w14,w24,w15,w25,w1k,w2k,w3k,w4k,w5k:std_logic_vector(11 downto 0);

演算の作業変数

Page 16: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 16 -

リスト 4.3.5:「2の補数表示固定小数点」のデータ形式を全体制御回路の記述 (語長は 12bit,ただし、符号 1bit、整数部 7bit、小数部 4bit とする)

(続き) begin --Multiplier Mi(i=1~10) w11<="000000001001";--w11=0.5401840 結合係数 M1:Multiplier_12bit port map(RESET,CLK,RQM1,open,Xi,w11,OM1); --OM1:output of M1 w21<="000000000101";--w21=0.3211372 結合係数 M2:Multiplier_12bit port map(RESET,CLK,RQM1,open,Yi,w21,OM2); --OM2:output of M2 w12<="000000000011";--w12=0.1977752 結合係数 M3:Multiplier_12bit port map(RESET,CLK,RQM1,open,Xi,w12,OM3); --OM3:output of M3 w22<="000000001001";--w22=0.5743167 結合係数 M4:Multiplier_12bit port map(RESET,CLK,RQM1,open,Yi,w22,OM4); --OM4:output of M4 w13<="000000111110";--w13=3.9021218 結合係数 M5:Multiplier_12bit port map(RESET,CLK,RQM1,open,Xi,w13,OM5); --OM5:output of M5 w23<="100000011110";--w23=-1.8753718 結合係数 M6:Multiplier_12bit port map(RESET,CLK,RQM1,open,Yi,w23,OM6); --OM6:output of M6 w14<="100000000111";--w14=-0.4268485 結合係数 M7:Multiplier_12bit port map(RESET,CLK,RQM1,open,Xi,w14,OM7); --OM7:output of M7 w24<="000000011101";--w24=1.7927740 結合係数 M8:Multiplier_12bit port map(RESET,CLK,RQM1,open,Yi,w24,OM8); --OM8:output of M8 w15<="100001111001";--w15=-7.5608993 結合係数 M9:Multiplier_12bit port map(RESET,CLK,RQM1,open,Xi,w15,OM9); --OM9:output of M9 w25<="000001001100";--w25=4.77022408 結合係数 M10:Multiplier_12bit port map(RESET,CLK,RQM1,open,Yi,w25,OM10);--OM10:output of M10 --Adder Ai(i=1~5) A1:Adder_12bit_Input2 port map(OM1,OM2,OA1);--OA1:output of A1 A2:Adder_12bit_Input2 port map(OM3,OM4,OA2);--OA2:output of A2 A3:Adder_12bit_Input2 port map(OM5,OM6,OA3);--OA3:output of A3 A4:Adder_12bit_Input2 port map(OM7,OM8,OA4);--OA4:output of A4 A5:Adder_12bit_Input2 port map(OM9,OM10,OA5);--OA5:output of A5

Page 17: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 17 -

リスト 4.3.5:「2の補数表示固定小数点」のデータ形式を全体制御回路の記述 (語長は 12bit,ただし、符号 1bit、整数部 7bit、小数部 4bit とする)

(続き) --Sigmoid function Si(i=1~5) S1:Sigmoid_Cordic_Sin_Function port map(RESET,CLK,ES1,open,OA1,Z1);--Z1:output of S1 S2:Sigmoid_Cordic_Sin_Function port map(RESET,CLK,ES1,open,OA2,Z2);--Z2:output of S2 S3:Sigmoid_Cordic_Sin_Function port map(RESET,CLK,ES1,open,OA3,Z3);--Z3:output of S3 S4:Sigmoid_Cordic_Sin_Function port map(RESET,CLK,ES1,open,OA4,Z4);--Z4:output of S4 S5:Sigmoid_Cordic_Sin_Function port map(RESET,CLK,ES1,open,OA5,Z5);--Z5:output of S5 --Multiplier Mi(i=10~15) w1k<="100000010101";--w1k=-1.2854211 結合係数 M11:Multiplier_12bit port map(RESET,CLK,RQM2,open,Z1,w1k,OM11);--OM11:output of M11 w2k<="100000001111";--w2k=-0.9513310 結合係数 M12:Multiplier_12bit port map(RESET,CLK,RQM2,open,Z2,w2k,OM12);--OM12:output of M12 w3k<="000000001111";--w3k=0.9655813 結合係数 M13:Multiplier_12bit port map(RESET,CLK,RQM2,open,Z3,w3k,OM13);--OM13:output of M13 w4k<="000000011011";--w4k=1.7124505 結合係数 M14:Multiplier_12bit port map(RESET,CLK,RQM2,open,Z4,w4k,OM14);--OM14:output of M14 w5k<="100000100001";--w5k=-2.0948081 結合係数 M15:Multiplier_12bit port map(RESET,CLK,RQM2,open,Z5,w5k,OM15);--OM15:output of M15 --Adder A6 A6:Adder_12bit_input5 port map(OM11,OM12,OM13,OM14,OM15,OA6);--OA6: output of A6 --Sin function S6 S6:Sigmoid_Cordic_Sin_Function port map(RESET,CLK,ES2,READY,OA6,Zk);

Page 18: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 18 -

4.4 実験結果

ディジタルニューラルネットワークのシミュ

レーションの結果の三角形をもとにして、三角形

の外側と内側の適当な点をハードウェアの入力

信号として入る。ハードウェアの出力は“1”で

あれば、三角形の「内側」にあると認識でき、出

力は“0”であれば、三角形の「外側」にある点

と正確に認識できた。

具体的に、たとえば Fig.23 に示すように、内側

にある点(5.0,4.0)を認識する実験を実行すると、

次のようになる。

ハードウェアディジタルニューラルネットワ

ークの入力は Fig.24 に示すように、今回利用する

データの語長は 12bit(1:7:4の順に符号:整数:

小数)である。そして、Cordic による特別な変換

法を利用して、2 進数に変換してからハードウェ

アの実験装置にあるスイッチで入力値を設定す

る。具体的に、5.0=00000101.0000

4.0=00000100.0000

という2つのスイッチで、スイッチの状態

(ON,OFF の順に 0,1)と設定する。ここに注意する

必要があるのは通常と違って、スイッチは“ON”

の時、“0”の状態と相当で、スイッチは“OFF”

の時、“1”の状態と相当である。

この入力の値をシミュレーションで求め出した

ニューロン間の結合係数と乗算して、全体制御回

路の動作通りに実行して、結果的に全体制御回路

の出力 Zk=00000001.0000=1 であり、シミュレー

ションした三角形の「内側」にある点を認識でき

た。この結果は Fig.23 に示される。

逆に、Fig.22 に示すように、「外側」にある

点(2.0,7.0)を認識する実験を実行すると、次のよ

うになる。

具体的に、2.0=00000010.0000

7.0=00000111.0000

この入力の値をシミュレーションで求め出した

ニューロン間の結合係数と乗算して、全体制御回

路の動作通りに実行して、結果的に全体制御回路

の出力 Zk=00000000.0000=0 であり、シミュレー

ションした三角形の「外側」にある点を認識でき

た。この結果は Fig.25 に示される。

実際に、共同研究のシミュレーションでは

Fig.22 に示すような三角形を望むが、結果的に

Fig.23 に示すような図形しかできないため、ハー

ドウェアで実験するときはその図形のもとにし

て、図形の「内側」「外側」の点を実行する。

Fig.22:望む図形

リスト 4.3.5:「2の補数表示固定小数点」のデータ形式を全体制御回路の記述 (語長は 12bit,ただし、符号 1bit、整数部 7bit、小数部 4bit とする)

--タイミング制御 process(CLK,RESET) begin if RESET='1' then RQM1<='0';RQM2<='0';ES1<='0';ES2<='0';Q<=0; elsif CLK'event and CLK='1' then case Q is when 0 => Q<=1;--初期状態設定 when 1 => RQM1<='1';Q<=Q+1;--中間層の乗算器演算開始 when 2 to 13 =>Q<=Q+1;--中間層の乗算器の途中で、次々の状態に進むだけ when 14 =>ES1<='1';Q<=Q+1;--乗算器の結果が出る瞬間に中間層の Sigmoid演算開始 when 15 to 20 =>Q<=Q+1;--中間層の Sigmoid関数部の途中で、次々の状態に進むだけ when 21 =>RQM2<='1';Q<=Q+1;--Sigmoidの結果が出る瞬間に出力層の乗算器演算開始 when 22 to 33 =>Q<=Q+1;--出力層の乗算器の途中で、次々の状態に進むだけ when 34 =>ES2<='1';Q<=Q+1;--乗算器の結果が出る瞬間に出力層の Sigmoid演算開始 when 35 to 41=>Q<=Q+1;--出力層の Sigmoid関数部の途中で、次々の状態に進むだけ when 42=>null; --Sigmoidの結果が出る瞬間全体回路の出力値が得られて、終了

end case; end if; end process; end Behavioral;

Page 19: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 19 -

Y

X

(2.0,7.0) (5.0,4.0) Fig.23:ディジタルニューラルネットワークの 5000回を実行した図形のシミュレーションの結果[5]

この図形は共同研究のシミュレーションでは、

表 1 に示すような[0,1]の間の値に応じて、記号

で分けてシミュレーションしたが、ハードウェア

では図形の「内側」と「外側」の順に“1”,“0”

という二つの値だけ認識できるのはわかった。つ

まり、「@」と「!」の図形の範囲の中にある点の

順に図形の「内側」と「外側」を正確に認識でき

た。

表 2:シミュレーションでの記号の値のレンジ

! - + = * @

0 [0,0.25] [0.25,0.5] [0.5,0.7] [0.7,0.85] [0.85,1]

Page 20: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 20 -

Fig.24:全体制御回路の制御タイミングの「内側」にある点を認識できた結果

Page 21: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 21 -

Fig.25:全体制御回路の制御タイミングの「外側」にある点を認識できた結果

Page 22: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 22 -

論理合成回路(RTLレベル)

Page 23: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 23 -

論理合成回路(ゲートレベル)

Page 24: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 24 -

実装したVLSI

Page 25: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 25 -

4.5 結果の検討考察 4.5.1 乗算器の考察 符号ビット(1bit) 被乗数(12bit) 乗数(12bit) × = 小数点

7bit 右シフト 使用部分 捨てる部分

Fig.12:整数部 7bitの場合

Fig.12 に示すように、今回語長(整数部 7bit)を利用するので、乗算の結果は整数部がない場合と

違うのはわかった。(4.3.1 の実験結果に参照)

n-1 n-2 ………… 4 3 2 1 0

符号 1bit 整数部 I bit 小数部 D bit Fig.8:数値の語長のモデル

一般化すると、Fig.8 に示すような語長を利用す

る場合、乗算器の結果 VHDL で設計するときは次

のようになる。

( )[ ] ( ){ } kDdowntoInACCZM ++−−= 112

<>><+>><<−

=0,00,010,00,01

YMXMorYMXMYMXMorYMXM

k    

    

ただし、 ZM:乗算器の出力信号 XM,YM:乗算器の入力信号 I は整数部の bit 数 D は小数部の bit 数

4.5.2 Sigmoidの代替関数として CORDICによる sin関数の考察

表 3:通常の sin,cos関数の真値,Cordic による計算 sin,cosの計算および Sigmoid関数値の比較

真値

Cordic による

関数語長

12(小数 4bit)

の計算

Sigmoid 関数

語長

12bit(小数 4bit)

の計算

角度 x (10 進数) 2の補数(2進数) (10 進数) 2 の補数(2 進数) (10 進数)

-2π sinx 0.0 11111111.0001 -0.938≒-1 00000000.0000 0.0

cosx 1.0 11111111.1110 -0.125≒0 計算しない 計算しない

-π/2 sinx -1.0 11111110.1111 -1.063≒-1 11111111.1111 -0.063≒0

cosx 0.0 00000000.0000 0.0 計算しない 計算しない

-π/3 sinx -0.866 11111111.0001 -0.9375 00000000.0000 0.0

cosx 0.5 00000000.1000 0.5 計算しない 計算しない

0 sinx 0.0 11111111.1111 -0.063≒0 00000000.0111 0.4375

cosx 1.0 00000001.0010 1.125≒1.0 計算しない 計算しない

π/6 sinx 0.5 00000000.0111 0.4375 00000000.1011 0.6875

cosx 0.866 00000000.1111 0.9375 計算しない 計算しない

π/2 sinx 1.0 00000001.0000 1.0 00000001.0000 1.0

cosx 0.0 00000000.0001 0.0625 計算しない 計算しない

π sinx 0.0 00000001.0000 1.0 00000001.0000 1.0

cosx -1.0 11111111.1111 -0.0625≒0 計算しない 計算しない

Sigmoid 関数の代替関数

実際に、[-π/2, π/2]の間、Cordic による

sin,cos の計算は、語長の小数部の bit 数が多け

れば多くほど、計算の正確度が高くなり、真値に

近づくことがわかった。たとえば、表 4 に示す。

<<−+

−≤

=

)2

(1

)22

(2sin1

)2

(0

)(

x

xx

x

f

π

ππ

π

7bit 4bit 7bit 4bit

(16~5) ACC(23~17) ACC(4~0) ACC

Page 26: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 26 -

表 4:小数部の bit数および語長 bit数によって計算の結果の比較

真値

Cordic による

関数語長

12(小数 4bit)

Cordic による

関数語長

12(小数 8bit)

Cordic による

関数語長

16(小数 8bit)

Cordic による

関数語長

16(小数 12bit)

角度 x (10 進

数) (10 進数) (10 進数) (10 進数) (10 進数)

π/6 sinx 0.5 0.4375 0.5039 0.5039 0.4998

cosx 0.866 0.9375 0.8672 0.8672 0.8664

π/4 sinx 0.7071 0.5625 0.6953 0.6953 0.7070

cosx 0.7071 0.8125 0.7109 0.7109 0.7065

したがって、表 4 に示すように、Cordic による

sin,cos の計算は語長は関係なく、小数部の bit 数だけに関係があるとわかった。例えば、同じ小数

部 8bit の語長 12bit と 16bit のときは計算結果はま

ったく同じである。

第 5 章 結言

今 回 実 験し たのは Xilinx ○R 社製 Spartan ○R-Xc2s150TMの 15万ゲート規模のFPGAを利用した。

VHDLを用いて設計した「図形パターン認識する

ニューラルネットワークの順方向処理」の全体制

御回路をFPGAに書き込んで、コンピュータ上で

図形のシミュレーション[5]通りに図形の内外を

正確に認識できた。そのハードウェアは次の写真

である。

Fig.26:ハードウェアニューラルネットワークを

FPGA への実装(内側にある点を認識できた状態)

Fig.26 に示すのは三角形の「内側」にある点を

認識することを表すものである。FPGA に接続す

る入出力回路には、LED の点灯と消灯は通常と逆

なのである。具体的に、LED が点灯するとき、“0”を表し、逆に LED が消灯するとき、“1”を表すも

のである。 今回出来上がったディジタルハードウェアニュ

ーラルネットワークは語長(12bit,1:7:4 の順

に符号ビット、整数部ビット、小数部ビット)を 使用し、15 万ゲート規模の FPGA の 99%の slices量を占めた。実際に、15 万ゲート規模の FPGA は

2 個があるので、順方向の全体制御回路を前段と

後段を分けようと考えていたが、実際に実験装置

の 15 万ゲートの FPGA のある問題点で分けるの

は不可能だった。その問題点は以下の通りである。 実際に、Fig.7 に示すように、入力層・中間層間の

回路を前段の一つの15万ゲート規模のFPGAに書き

込むために、ここに回路を切らなければならない。

入力層 中間層 出力層

Fig.7:ハードウェアニューラルネットワーク しかし、とんでもないことが起こったのである。

それはここに回路を切ると、前段から後段へつな

ぐためのバース数が足りないからである。実際に

Z1,Z2…Z5 は一つ一つ 12bit なので、全部

12x5=60bit であり、FPGA の入出力のピン割付表

には 60pin が必要だ。これは不可能なのである。 また、他の回路の切り方として、Fig.7 に示すよ

うに、加算器A6の出力のところで回路を切ろうと考え

たが、そうすると前段回路は15万ゲートの FPGA の

110%の slices を占めた。これもだめだとわかった。 それで、2つの15万ゲート規模の FPGA をつ

なぐのは実際に不可能ということがわかった。つ

まり、回路規模を拡大するためには、ゲート数の

Page 27: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 27 -

大規模の FPGA を利用するしかないと考えられる

のだ。 したがって、もし 50万ゲート、100万ゲート規

模の FPGA があれば、もっと複雑なパターン認識

を拡大できると思われる。

例えば、今回 15万ゲートという FPGAの slices

が少ないため、ハードウェア化にはディジタルニ

ューラルネットワークの「単純パーセプトロン構

造」を利用して、入力層 2個、中間層 5個、出力

層 1個という少ないニューロン数を設計した。し

かし、100 万ゲート規模の FPGAがあれば、Fig.27に示すような多数のニューロン構造でも、このハ

ードウェア化の手順を利用すればできるはずと

思われる。

Fig.27:多数のニューロンの階層型ニューラル ネットワーク[3]

Fig.28:アルファベットの学習[3]

今回、三角形という図形を正確に認識できた

ことにより、これから他の図形パターンを認識で

きるのも期待される。また、Fig.28 に示すような

文字パターン認識なども実現できると思われる。

参考文献

[1]兼田護:“VHDL によるディジタル電子回路設計”

森北出版(2006)

[2]Emil M. Petriu, Dr. Eng., P. Eng., FIEEE Professor School of Information Technology and Engineering University of Ottawa Ottawa, ON., Canada: “Neural Networks:Basics” http://www.site.uottawa.ca/%7Epetriu/NN_bas

ics-tutorial-2004.pdf

[3]木村 知史:学習率を変動させる階層型ハードウ

ェアニューラルネットワーク― “A Multi-Layered Hardware Neural Network with a Variable Learning Rate ”高知工科大学 電子・光システム工学コ-ス

[4] 志賀崇史:“評価関数に CORDIC アルゴリズ

ムを用いハードウェアニューラルネットワーク”

大分高専電気電子情報工学専攻 特別研究論

文,AES0305,2005,2

[5] 池田将光:“CORDIC アルゴリズムを用いたディ

ジタルハードウェアニューラルネットワーク―シミュレ

ーション―大分高専電気電子工学科卒業研究論文

概要集, No.3907 ,2006/2/3

[6]馬場則夫・小島史男・小澤誠一著:“ニューラ

ルネットの基礎と応用”共立出版(1994) [7]吉冨康成:“ニューラルネットワーク”朝倉書

店(2002)

謝辞 最後に、本研究を行うにあたり,多大なるご指

導をいただきました兼田護先生に心から厚く御

礼を申し上げます.

Page 28: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 28 -

付録 1:Cordicによる sin,cosの計算

(語長 12bit(1:3:8の順に符号ビット:整数ビット:小数ビット)の場合の回路設計)

library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity cordic_sin_function_12bit is Port ( RESETS,CLKS,ES: in std_logic; READYS: out std_logic; TH: in std_logic_vector(11 downto 0); COS,SIN: out std_logic_vector(11 downto 0) ); end cordic_sin_function_12bit; architecture Behavioral of cordic_sin_function_12bit is subtype CONST_type is std_logic_vector(11 downto 0); type ARRAY_DATA is array(0 to 8) of CONST_type; constant CONST: ARRAY_DATA:=ARRAY_data'( "000011001001","011111001010",--0C9,077 "000000111111","000000100000",--03F,020 "000000010000","000000001000",--010,008 "000000000100","000000000010",--004,002 "000000000001" ); --001 signal Q: integer range 0 to 11; signal X,XX,Y,YY,Z,W: std_logic_vector(11 downto 0); begin W<=Z-TH; XX<=to_stdlogicvector(to_bitvector(x) sra Q-1); YY<=to_stdlogicvector(to_bitvector(y) sra Q-1); process(RESETS,CLKS) begin if RESETS='1' then Q<=0;READYS<='0';

elsif CLKS'event and CLKS='1' then if Q=0 then if ES='1' then READYS<='0'; Z<=(others=>'0'); X<="000010011011";--09B Y<=(others=>'0'); Q<=1; end if; elsif Q<10 then --5 if W(11)='1' then --6 X<=X-YY;Y<=Y+XX;Z<=Z+CONST(Q-1); else X<=X+YY;Y<=Y-XX;Z<=Z-CONST(Q-1); end if; Q<=Q+1; elsif Q=10 then READYS<='1';COS<=X;SIN<=Y;Q<=11;--7 else --8 if ES='0' then Q<=0;READYS<='0';

end if; end if;

end if; end process; end Behavioral;

Page 29: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 29 -

付録 2:Cordicによる sin,cosの計算

(語長 16bit(1:7:8の順に符号ビット:整数ビット:小数ビット)の場合の回路設計)

library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity Cordic_Sin_Function_16bit is Port ( RESETS,CLKS,ES: in std_logic; READYS: out std_logic; TH: in std_logic_vector(15 downto 0);

COS,SIN: out std_logic_vector(15 downto 0) ); end Cordic_Sin_Function_16bit; architecture Behavioral of Cordic_Sin_Function_16bit is subtype CONST_type is std_logic_vector(15 downto 0); type ARRAY_DATA is array(0 to 8) of CONST_type; constant CONST: ARRAY_DATA:=ARRAY_data'( "0000000011001001","0000000001110111",--00C9,0077 "0000000000111111","0000000000100000",--003F,0020 "0000000000010000","0000000000001000",--0010,0008 "0000000000000100","0000000000000010",--0004,0002 "0000000000000001" ); --0001 signal Q: integer range 0 to 11; signal X,XX,Y,YY,Z,W: std_logic_vector(15 downto 0); begin W<=Z-TH; XX<=to_stdlogicvector(to_bitvector(x) sra Q-1); YY<=to_stdlogicvector(to_bitvector(y) sra Q-1); process(RESETS,CLKS) begin if RESETS='1' then Q<=0;READYS<='0'; elsif CLKS'event and CLKS='1' then if Q=0 then if ES='1' then READYS<='0'; Z<=(others=>'0'); X<="0000000010011011";--009B Y<=(others=>'0'); Q<=1; end if; elsif Q<10 then --5 if W(11)='1' then --6 X<=X-YY;Y<=Y+XX;Z<=Z+CONST(Q-1); else X<=X+YY;Y<=Y-XX;Z<=Z-CONST(Q-1); end if; Q<=Q+1; elsif Q=10 then READYS<='1';COS<=X;SIN<=Y;Q<=11;--7 else --8 if ES='0' then Q<=0;READYS<='0';end if; end if; end if; end process; end Behavioral;

Page 30: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 30 -

付録 3:Cordicによる sin,cosの計算

(語長 16bit(1:3:12の順に符号ビット:整数ビット:小数ビット)の場合の回路設計)

library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity Cordic is Port ( RESET,CLOCK,E: in std_logic; READY: out std_logic; TH: in std_logic_vector(15 downto 0); COS,SIN: out std_logic_vector(15 downto 0) ); end Cordic; architecture Behavioral of Cordic is subtype CONST_type is std_logic_vector(15 downto 0); type ARRAY_DATA is array(0 to 12) of CONST_type; constant CONST: ARRAY_DATA:=ARRAY_data'( "0000110010010001","0000011101101011",--0C91,076B, "0000001111101011","0000000111111101",--03EB,01FD "0000000100000000","0000000010000000",--0100,0080 "0000000001000000","0000000000100000",--0040,0020 "0000000000010000","0000000000001000",--0010,0008 "0000000000000100","0000000000000010",--0004,0002 "0000000000000001" ); --0001 signal Q: integer range 0 to 15; signal X,XX,Y,YY,Z,W: std_logic_vector(15 downto 0); begin W<=Z-TH; XX<=to_stdlogicvector(to_bitvector(x) sra Q-1); YY<=to_stdlogicvector(to_bitvector(y) sra Q-1); process(RESET,CLOCK) begin if RESET='1' then Q<=0;READY<='0';

elsif CLOCK'event and CLOCK='1' then if Q=0 then if E='1' then READY<='0'; Z<=(others=>'0'); X<="0000100110110111";--00B7 Y<=(others=>'0'); Q<=1; end if; elsif Q<14 then --5 if W(15)='1' then --6 X<=X-YY;Y<=Y+XX;Z<=Z+CONST(Q-1); else X<=X+YY;Y<=Y-XX;Z<=Z-CONST(Q-1); end if; Q<=Q+1; elsif Q=14 then READY<='1';COS<=X;SIN<=Y;Q<=15;--7 else --8 if E='0' then Q<=0;READY<='0';end if; end if;

end if; end process; end Behavioral;

Page 31: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 31 -

付録 4:通常の sin,cos関数の真値,Cordic による計算 sin,cosの計算および Sigmoid関数値の比較

(表 3 の証拠として付ける)

Fig.29:Cordic による sin,cos の計算、語長 12bit(小数部 4bit)の-2πの時

Fig.30:Cordic による sin,cos の計算、語長 12bit(小数部 4bit)の-π/3の時

Fig.31:Cordic による sin,cos の計算、語長 12bit(小数部 4bit)の-π/6の時

Fig.32:Cordic による sin,cos の計算、語長 12bit(小数部 4bit)の 0の時

Page 32: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 32 -

Fig.33:Cordic による sin,cos の計算、語長 12bit(小数部 4bit)のπ/6の時

Fig.34:Cordic による sin,cos の計算、語長 12bit(小数部 4bit)のπ/2の時

Fig.35:Cordic による sin,cos の計算、語長 12bit(小数部 4bit)のπの時

Fig.36:Sigmoid の代替関数の計算、語長 12bit(小数部 4bit)の-2πの時

Fig.37:Sigmoid の代替関数の計算、語長 12bit(小数部 4bit)の-π/2の時

Page 33: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 33 -

Fig.38:Sigmoid の代替関数の計算、語長 12bit(小数部 4bit)の-π/3の時

Fig.39:Sigmoid の代替関数の計算、語長 12bit(小数部 4bit)の 0の時

付録 5:小数部の bit数および語長 bit数によって計算の結果の比較

(表 4 の証拠として付ける)

Fig.33:Cordic による sin,cos の計算、語長 12bit(小数部 4bit)のπ/6の時

Fig.33:Cordic による sin,cos の計算、語長 16bit(小数部 12bit)のπ/6の時

Page 34: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 34 -

Fig.33:Cordic による sin,cos の計算、語長 12bit(小数部 4bit)のπ/4の時

Fig.33:Cordic による sin,cos の計算、語長 16bit(小数部 8bit)のπ/4の時

Fig.33:Cordic による sin,cos の計算、語長 16bit(小数部 12bit)のπ/4の時

Page 35: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 35 -

付録 6:乗算器の計算

(語長 12bit(1:3:8の順に符号ビット:整数ビット:小数ビット)の場合の回路設計)

library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity 2_housuu_jouzanki_shousuuten_12bit is Port (RESETM,CLKM,RQM:in std_logic; RDYM:out std_logic; XM,YM:in std_logic_vector(11 downto 0); ZM:out std_logic_vector(11 downto 0) ); end 2_housuu_jouzanki_shousuuten_12bit; architecture Behavioral of 2_housuu_jouzanki_shousuuten_12bit is signal Q:integer range 0 to 13; signal ACC:std_logic_vector(23 downto 0); signal B:std_logic; signal WA,WB:std_logic_vector(11 downto 0); begin

ZM<=ACC(20 downto 9)+k;

<>><+>><<−

=0,00,010,00,01

YMXMorYMXMYMXMorYMXM

k    

    

WA<=ACC(23 downto 12)-XM; WB<=ACC(23 downto 12)+XM; process(CLKM,RESETM) begin if RESETM='1' then RDYM<='0';Q<=0; elsif CLKM'event and CLKM='1' then case Q is when 0 =>if RQM='1' then Q<=1; ACC<=(23 downto 12=>'0') & YM;B<='0';end if; when 1 to 11 => if ACC(0)='1' and B='0' then ACC<=WA(11) & WA & ACC(11 downto 1); B<=ACC(0); elsif ACC(0)='0' and B='1' then ACC<=WB(11)& WB & ACC(11 downto 1); B<=ACC(0); else ACC<=ACC(23)&ACC(23 downto 1);end if; Q<=Q+1; when 12 => if ACC(0)='1'and B='0' then ACC(23 downto 12)<=WA; elsif ACC(0)='0'and B='1' then ACC(23 downto 12)<=WB;end if; Q<=Q+1;RDYM<='1'; when 13 => if RQM='0' then RDYM<='0';Q<=0;end if; when others =>null; end case; end if; end process; end Behavioral;

Page 36: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 36 -

付録 7:乗算器の計算

(語長 16bit(1:7:8の順に符号ビット:整数ビット:小数ビット)の場合の回路設計)

library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity Multiplier_16bit is Port (RESETM,CLKM,RQM:in std_logic; RDYM:out std_logic; XM,YM:in std_logic_vector(15 downto 0); ZM:out std_logic_vector(15 downto 0) ); end Multiplier_16bit; architecture Behavioral of Multiplier_16bit is signal Q:integer range 0 to 17; signal ACC:std_logic_vector(31 downto 0); signal B:std_logic; signal WA,WB:std_logic_vector(15 downto 0); begin

ZM<=ACC(24 downto 9)+k;

<>><+>><<−

=0,00,010,00,01

YMXMorYMXMYMXMorYMXM

k    

    

WA<=ACC(31 downto 16)-XM; WB<=ACC(31 downto 16)+XM; process(CLKM,RESETM) begin if RESETM='1' then RDYM<='0';Q<=0; elsif CLKM'event and CLKM='1' then case Q is when 0 =>if RQM='1' then Q<=1; ACC<=(31 downto 16=>'0') & YM;B<='0';end if; when 1 to 15 => if ACC(0)='1' and B='0' then ACC<=WA(15) & WA & ACC(15 downto 1); B<=ACC(0); elsif ACC(0)='0' and B='1' then ACC<=WB(15)& WB & ACC(15 downto 1); B<=ACC(0); else ACC<=ACC(31)&ACC(31 downto 1);end if; Q<=Q+1; when 16 => if ACC(0)='1'and B='0' then ACC(31 downto 16)<=WA; elsif ACC(0)='0'and B='1' then ACC(31 downto 16)<=WB;end if; Q<=Q+1;RDYM<='1'; when 17 => if RQM='0' then RDYM<='0';Q<=0;end if; when others =>null; end case; end if; end process; end Behavioral;

Page 37: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 37 -

付録 7:順方向の全体制御回路のタイミング制御の(本当の Sigmoid関数(指数関数)の場合)

(語長 16bit(1:7:8の順に符号ビット:整数ビット:小数ビット)の場合の回路設計)

library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity Whole_of_Circuit is Port ( RESET,CLK:in std_logic; Xi,Yi:in std_logic_vector(15 downto 0); Zk:out std_logic_vector(15 downto 0) ); end Whole_of_Circuit; architecture Behavioral of Whole_of_Circuit is component Multiplier_16bit Port ( RESETM,CLKM,RQM:in std_logic; RDYM:out std_logic; XM,YM:in std_logic_vector(15 downto 0); ZM:out std_logic_vector(15 downto 0) ); end component; component Adder_16bit_input2 Port ( XA1,XA2: in std_logic_vector(15 downto 0); ZAI2:out std_logic_vector(15 downto 0) ); end component; component Sigmoid_Cordic_Sin_Function Port ( RESETS,CLKS,ES: in std_logic; READYS: out std_logic; WA: in std_logic_vector(15 downto 0); WS: out std_logic_vector(15 downto 0) ); end component; component Adder_16bit_input5 Port (XA1,XA2,XA3,XA4,XA5: in std_logic_vector(15 downto 0); ZAI5:out std_logic_vector(15 downto 0) ); end component; signal Q:integer range 0 to 60; signal RQM1,RQM2,ES1,ES2,READYS:std_logic; signal WM1,WM2,WM3,WM4,WM5,WM6,WM7,WM8,WM9,WM10,WM11,WM12,WM13,WM14,WM15,WA1,WA2,WA3, WA4,WA5,WA6,WS1,WS2,WS3,WS4,WS5,w11,w21,w12,w22,w13,w23,w14,w24,w15,w25,w1k,w2k,w3k,w4k,w5k:std_logic_vector(15 downto 0); begin

Page 38: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 38 -

付録 7:順方向の全体制御回路のタイミング制御のソースコード(続き)

(語長 16bit(1:7:8の順に符号ビット:整数ビット:小数ビット)の場合の回路設計)

--Multiplier Mi(i=1~10) w11<="0000000001100110";--wi1j1=0.3977132 M1:Multiplier_16bit port map(RESET,CLK,RQM1,open,Xi,W1,WM1);--WM1:output of M1 w21<="0000000000101001";--wi2j1=0.1619119 M2:Multiplier_16bit port map(RESET,CLK,RQM1,open,Yi,W2,WM2);--WM2:output of M2 w12<="1000000011111111";--wi1j2=-0.9955862 M3:Multiplier_16bit port map(RESET,CLK,RQM1,open,Xi,W3,WM3);--WM3:output of M3 w22<="1000000001101100";--wi2j2=-0.4225358 M4:Multiplier_16bit port map(RESET,CLK,RQM1,open,Yi,W4,WM4);--WM4:output of M4 w13<="0001111000111100";--wi1j3=30.2343025 M5:Multiplier_16bit port map(RESET,CLK,RQM1,open,Xi,W5,WM5);--WM5:output of M5 W23<="1001101011000010";--wi2j3=-26.7582626 M6:Multiplier_16bit port map(RESET,CLK,RQM1,open,Yi,W6,WM6);--WM6:output of M6 w14<="1000011110011100";--wi1j4=-7.6076150 M7:Multiplier_16bit port map(RESET,CLK,RQM1,open,Xi,W7,WM7);--WM7:output of M7 w24<="0001000000001010";--wi2j4=16.0380688 M8:Multiplier_16bit port map(RESET,CLK,RQM1,open,Yi,W8,WM8);--WM8:output of M8 w15<="1000001100111011";--wi1j5=-3.2314506 M9:Multiplier_16bit port map(RESET,CLK,RQM1,open,Xi,W9,WM9);--WM9:output of M9 w25<="0000000101111100";--wi2j5=1.4836917 M10:Multiplier_16bit port map(RESET,CLK,RQM1,open,Yi,W10,WM10);--WM10:output of M10 --Adder Ai(i=1~5) A1:Adder_16bit_input2 port map(WM1,WM2,WA1);--WA1:output of A1 A2:Adder_16bit_input2 port map(WM3,WM4,WA2);--WA2:output of A2 A3:Adder_16bit_input2 port map(WM5,WM6,WA3);--WA3:output of A3 A4:Adder_16bit_input2 port map(WM7,WM8,WA4);--WA4:output of A4 A5:Adder_16bit_input2 port map(WM9,WM10,WA5);--WA5:output of A5

Page 39: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 39 -

付録 7:順方向の全体制御回路のタイミング制御のソースコード(続き)

(語長 16bit(1:7:8の順に符号ビット:整数ビット:小数ビット)の場合の回路設計)

--Sigmoid function Si(i=1~5) S1:Sigmoid_Cordic_Sin_Function port map(RESET,CLK,ES1,open,WA1,WS1);--WS1:output of S1 S2:Sigmoid_Cordic_Sin_Function port map(RESET,CLK,ES1,open,WA2,WS2);--WS2:output of S2 S3:Sigmoid_Cordic_Sin_Function port map(RESET,CLK,ES1,open,WA3,WS3);--WS3:output of S3 S4:Sigmoid_Cordic_Sin_Function port map(RESET,CLK,ES1,open,WA4,WS4);--WS4:output of S4 S5:Sigmoid_Cordic_Sin_Function port map(RESET,CLK,ES1,open,WA5,WS5);--WS5:output of S5 --Multiplier Mi(i=10~15) w1k<="1000100001101010";--wj1k=-8.4130936 M11:Multiplier_16bit port map(RESET,CLK,RQM2,open,WS1,W11,WM11);--WM11:output of M11 w2k<="1100110010111100";--wj2k=-76.7351379 M12:Multiplier_16bit port map(RESET,CLK,RQM2,open,WS2,W12,WM12);--WM12:output of M12 w3k<="1000000110010011";--wj3k=-1.5759627 M13:Multiplier_16bit port map(RESET,CLK,RQM2,open,WS3,W13,WM13);--WM13:output of M13 w4k<="0000101000100111";--wj4k=10.1512566 M14:Multiplier_16bit port map(RESET,CLK,RQM2,open,WS4,W14,WM14);--WM14:output of M14 w5k<="1100100101000001";--wj5k=-73.2548752 M15:Multiplier_16bit port map(RESET,CLK,RQM2,open,WS5,W15,WM15);--WM15:output of M15 --Adder A6 A6:Adder_16bit_input5 port map(WM11,WM12,WM13,WM14,WM15,WA6); --WA6:output of A6 --Sin function S6 S6:Sigmoid_Cordic_Sin_Function port map(RESET,CLK,ES2,READYS,WA6,Zk);--Zk=WS6<---output of S6 process(CLK,RESET) begin if RESET='1' then RQM1<='0';RQM2<='0';ES1<='0';ES2<='0';Q<=0; elsif CLK'event and CLK='1' then case Q is when 0 => Q<=1; when 1 => RQM1<='1';Q<=Q+1; when 2 to 17 =>Q<=Q+1; when 18 =>ES1<='1';Q<=Q+1; when 19 to 28 =>Q<=Q+1; when 29 =>RQM2<='1';Q<=Q+1; when 30 to 47 =>Q<=Q+1; when 48 =>ES2<='1';Q<=Q+1; when 49 to 59=>Q<=Q+1; when 60=>null; end case; end if; end process; end Behavioral;

Page 40: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 40 -

付録 8:順方向の全体制御回路のタイミング制御のソースコード

(語長 12bit(1:7:4の順に符号ビット:整数ビット:小数ビット)の場合の回路設計)

Page 41: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 41 -

付録 9:通常の sin 関数,Cordicによる sin,Sigmoid関数(指数関数),Sigmoid の代替関数

の計算のデータ(4.3.4 のグラフの証拠)

Cordic による sin Sigmoid の代替関数 Sigmoid 関数

角度 通常の sin

∞−

−−∞−=

],2/[1]2/,2/sin[

]2/,[1

π

ππ

π

f ( )

+

=

12sin10

xf xx e

f −+=

11

[radian] 関数 注意:sinxはCordicに これは本当の

よる sin 関数 Sigmoid 関数

-7.171 -0.775694435 -1 0 0.000767964

-7.071 -0.708813459 -1 0 0.000848662

-6.971 -0.634850254 -1 0 0.000937833

-6.871 -0.554543835 -1 0 0.001036364

-6.771 -0.468696598 -1 0 0.001145234

-6.671 -0.378166299 -1 0 0.001265527

-6.571 -0.283857487 -1 0 0.001398438

-6.471 -0.186712465 -1 0 0.001545286

-6.371 -0.087701874 -1 0 0.001707527

-6.271 0.012185006 -1 0 0.001886771

-6.171 0.111950136 -1 0 0.00208479

-6.071 0.210596698 -1 0 0.002303545

-5.971 0.307139048 -1 0 0.002545194

-5.871 0.400612565 -1 0 0.002812122

-5.771 0.490083295 -1 0 0.003106956

-5.671 0.574657273 -1 0 0.003432596

-5.571 0.653489467 -1 0 0.003792236

-5.471 0.72579221 -1 0 0.004189398

-5.371 0.790843076 -1 0 0.004627962

-5.271 0.847992101 -1 0 0.005112201

-5.171 0.896668268 -1 0 0.005646819

-5.071 0.936385223 -1 0 0.006236997

-4.971 0.966746126 -1 0 0.006888429

-4.871 0.987447621 -1 0 0.00760738

-4.771 0.998282866 -1 0 0.008400734

-4.671 0.999143598 -1 0 0.009276051

-4.571 0.990021218 -1 0 0.010241631

-4.471 0.971006874 -1 0 0.011306574

-4.371 0.942290549 -1 0 0.012480855

-4.271 0.904159169 -1 0 0.013775396

-4.171 0.856993729 -1 0 0.015202143

-4.071 0.801265492 -1 0 0.016774147

-3.971 0.737531274 -1 0 0.018505653

-3.871 0.666427888 -1 0 0.020412182

-3.771 0.588665774 -1 0 0.022510625

-3.671 0.505021907 -1 0 0.024819329

-3.571 0.416332027 -1 0 0.027358189

-3.471 0.323482296 -1 0 0.030148728

Page 42: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 42 -

-3.371 0.227400437 -1 0 0.033214183

-3.271 0.129046467 -1 0 0.03657957

-3.171 0.029403108 -1 0 0.040271748

-3.071 -0.070534037 -1 0 0.044319453

-2.971 -0.16976643 -1 0 0.048753326

-2.871 -0.267302572 -1 0 0.053605897

-2.771 -0.362167916 -1 0 0.058911548

-2.671 -0.453414597 -1 0 0.064706423

-2.571 -0.54013091 -1 0 0.071028292

-2.471 -0.621450413 -1 0 0.077916359

-2.371 -0.696560589 -1 0 0.085410991

-2.271 -0.764710962 -1 0 0.093553377

-2.171 -0.825220595 -1 0 0.102385095

-2.071 -0.877484898 -1 0 0.111947585

-1.971 -0.920981661 -1 0 0.122281518

-1.871 -0.95527628 -1 0 0.133426057

-1.771 -0.980026094 -1 0 0.145418013

-1.671 -0.994983811 -1 0 0.158290898

-1.571 -0.999999979 -0.999999979 1.03707E-08 0.172073881

-1.471 -0.995024478 -0.995024478 0.002487761 0.186790666

-1.371 -0.980107021 -0.980107021 0.009946489 0.202458329

-1.271 -0.955396659 -0.955396659 0.022301671 0.219086117

-1.171 -0.921140289 -0.921140289 0.039429856 0.236674277

-1.071 -0.87768019 -0.87768019 0.061159905 0.255212958

-0.971 -0.8254506 -0.8254506 0.0872747 0.274681226

-0.871 -0.764973381 -0.764973381 0.117513309 0.295046265

-0.771 -0.696852801 -0.696852801 0.151573599 0.316262826

-0.671 -0.621769498 -0.621769498 0.189115251 0.33827296

-0.571 -0.54047368 -0.54047368 0.22976316 0.361006112

-0.471 -0.453777627 -0.453777627 0.273111186 0.384379584

-0.371 -0.362547578 -0.362547578 0.318726211 0.408299408

-0.271 -0.267695074 -0.267695074 0.366152463 0.432661613

-0.171 -0.170167849 -0.170167849 0.414916075 0.457353867

-0.071 -0.070940363 -0.070940363 0.464529818 0.482257453

0.029 0.028995935 0.028995935 0.514497968 0.507249492

0.129 0.128642516 0.128642516 0.564321258 0.532205352

0.229 0.227003743 0.227003743 0.613501872 0.557001118

0.329 0.323096824 0.323096824 0.661548412 0.581516042

0.429 0.415961628 0.415961628 0.707980814 0.605634852

0.529 0.504670282 0.504670282 0.752335141 0.629249848

0.629 0.588336436 0.588336436 0.794168218 0.652262681

0.729 0.666124127 0.666124127 0.833062064 0.674585791

0.829 0.737256126 0.737256126 0.868628063 0.696143444

0.929 0.801021706 0.801021706 0.900510853 0.716872363

1.029 0.856783742 0.856783742 0.928391871 0.736721979

1.129 0.903985077 0.903985077 0.951992539 0.755654305

Page 43: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 43 -

1.229 0.942154093 0.942154093 0.971077047 0.773643503

1.329 0.970909416 0.970909416 0.985454708 0.790675175

1.429 0.989963734 0.989963734 0.994981867 0.806745456

1.529 0.999126661 0.999126661 0.99956333 0.821859955

1.629 0.998306644 1 1 0.836032603

1.729 0.987511878 1 1 0.849284465

1.829 0.966850219 1 1 0.861642555

1.929 0.936528113 1 1 0.873138694

2.029 0.896848527 1 1 0.883808426

2.129 0.848207928 1 1 0.893690038

2.229 0.791092315 1 1 0.902823661

2.329 0.726072369 1 1 0.911250497

2.429 0.653797748 1 1 0.919012135

2.529 0.574990596 1 1 0.926149986

2.629 0.490438328 1 1 0.93270481

2.729 0.400985762 1 1 0.938716334

2.829 0.307526679 1 1 0.944222959

2.929 0.210994892 1 1 0.949261533

3.029 0.112354913 1 1 0.953867188

3.129 0.012592321 1 1 0.958073242

3.229 -0.08729609 1 1 0.961911132

3.329 -0.186312266 1 1 0.965410392

3.429 -0.283466872 1 1 0.968598667

3.529 -0.377789171 1 1 0.971501739

3.629 -0.468336726 1 1 0.974143586

3.729 -0.554204814 1 1 0.97654644

3.829 -0.634535471 1 1 0.97873087

3.929 -0.70852606 1 1 0.980715864

4.029 -0.77543729 1 1 0.982518912

4.129 -0.834600608 1 1 0.984156101

4.229 -0.885424872 1 1 0.985642199

4.329 -0.927402263 1 1 0.98699075

4.429 -0.960113357 1 1 0.988214153

4.529 -0.983231316 1 1 0.98932375

4.629 -0.996525153 1 1 0.990329905

4.729 -0.99986204 1 1 0.991242077

4.829 -0.993208636 1 1 0.992068894

4.929 -0.97663142 1 1 0.992818218

5.029 -0.950296025 1 1 0.99349721

5.129 -0.914465586 1 1 0.994112389

5.229 -0.86949811 1 1 0.994669683

5.329 -0.815842896 1 1 0.995174482

5.429 -0.754036049 1 1 0.995631685

5.529 -0.684695124 1 1 0.996045741

5.629 -0.608512951 1 1 0.996420692

5.729 -0.526250718 1 1 0.996760204

Page 44: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 44 -

5.829 -0.438730361 1 1 0.997067608

5.929 -0.346826356 1 1 0.997345921

6.029 -0.251456977 1 1 0.997597883

6.129 -0.153575122 1 1 0.997825978

6.229 -0.054158796 1 1 0.998032457

6.329 0.045798667 1 1 0.99821936

6.429 0.145298525 1 1 0.998388537

6.529 0.243346608 1 1 0.998541664

6.629 0.338963252 1 1 0.99868026

6.729 0.431193088 1 1 0.9988057

6.829 0.519114584 1 1 0.99891923

6.929 0.60184926 1 1 0.999021978

7.029 0.678570456 1 1 0.999114967

7.129 0.748511601 1 1 0.999199121

付録 10:Cordic による ( ) ( )2進数進数 ⇔10 の特別な変換法

(語長 12bit(1:7:4の順に符号ビット:整数ビット:小数ビット)の場合

(語長 16bit(1:7:8の順に符号ビット:整数ビット:小数ビット)の場合

小数部 10 進数

=小数部 4bit× ( =42 16) 16 進数 2 進数

0.1 2 2 0010

0.2 3 3 0011

0.3 5 5 0101

0.4 6 6 0110

0.5 8 8 1000

0.6 10 A 1010

0.7 11 B 1011

0.8 13 D 1101

0.9 14 E 1110

小数部 10 進数

=小数部 8bit× ( =82 256) 16 進数 2 進数

0.1 26 1A 00011010

0.2 51 33 00110011

0.3 77 4D 01001101

0.4 102 66 01100110

0.5 128 80 10000000

0.6 154 9A 10011010

0.7 179 B3 10110011

0.8 205 CD 11001101

0.9 230 E6 11100110

Page 45: 【FPGA Implementation】 Digital Hardware for Neural Network Using CORDIC Algorithm-A.T.Nguyen-ICG-TUT

- 45 -

付録 11:

XC2S150評価ボードのピン割付表

(*CN3,CN4に入出力装置を付けた場合.)

INPUT CN3 CN4

sw1.1 P150 P45

sw1.2 P152 P47

sw1.3 P161 P49

sw1.4 P163 P58

sw1.5 P162 P59

sw1.6 P160 P57

sw1.7 P151 P48

sw1.8 P149 P46

sw2.1 P147 P44

sw2.2 P142 P42

sw2.3 P140 P37

sw2.4 P138 P35

sw2.5 P135 P33

sw2.6 P133 P30

sw2.7 P127 P27

sw2.8 P125 P23

sw3.1 P122 P21

sw3.2 P120 P18

sw3.3 P115 P16

sw3.4 P113 P14

sw3.5 P111 P9

sw3.6 P109 P7

sw3.7 P100 P5

sw3.8 P99 P204

OUTPUT CN3 CN4

LED1 P134 P29

LED2 P136 P31

LED3 P139 P34

LED4 P141 P36

LED5 P146 P41

LED6 P148 P43

LED7 P98 P203

LED8 P108 P4

LED9 P110 P6

LED10 P112 P8

LED11 P114 P10

LED12 P119 P15

LED13 P121 P17

LED14 P123 P20

LED15 P126 P22

LED16 P132 P24

[INPUT]

PSW0 P195

PSW1 P199

PSW2 P200

PSW3 P201

P80 Clock0 (32Mhz) P77 Clock1 (1.8432Mhz)

3 2 1 0