Posts Tagged with "FPGA"

既に発行済みのブログであっても適宜修正・追加することがあります。
Even in the already published blog, we may modify and add appropriately.
posted by sakurai on June 13, 2019

組み立てたPCBをUltra96と組み合わせ動作確認を行います。4層だから電源、グラウンドノイズが抑えられるかと思いましたが、2層とあまり変わらず、400mVp-pくらいありました。やや大きい気がします。

2層と言えどもベタ電源、ベタグラウンドとしているので4層と変わらないのか、それとも3端子レギュレータのノイズがかなり強力で、バイパスしきれていないのか不明です。パスコンをかなり入れている割にはあまり効いていない感じがします。

3端子レギュレータの温度上昇が心配だったので、デジタル温度計を繋ぎ、数時間動作させてみました。39度までは上がらないようです。12Vから3.3Vに落としているのでドロップ電圧が大きく、ドロップ電圧×電流の電力を熱として消費するため熱暴走が心配でした。このレベルの消費電力であれば、ヒートシンクは不要のようです。

図111.1
図111.1 PCB基板

ところで、前回使用したFusion PCBは実装費用が(BokTechに比べたら)高額だったのですが、今回実装費用を約65 USDも値下げしてきました。比較してみると、この基板を製造費、実装費、部品費、配送料込みで、

ベンダー Fusion PCB BokTech
2層板(5枚製造、2枚SMD実装) 89.13⇒23.52 USD 54.83 USD
4層板(5枚製造、2枚SMD実装) 129.13⇒63.52 USD 92.02 USD
2019年5月調べ

図111.2
図111.2 PCB基板価格

と競合であるBokTechを下回る価格を打ち出してきました。従来はBokTechよりも約35 USD高かったのですが、BokTechよりも約30 USDも安くなっています。

そもそも実装費用がこれだけ安ければ、全てSMDにして実装を任せても良くなります。また、部品費用はそのほうが安いものが多いため、メリットがあるでしょう。手ハンダを前提としたスルーホール中心の考え方まで変える必要がありそうです。


左矢前のブログ 次のブログ右矢

posted by sakurai on June 9, 2019

あまりにもPCB製作が安いので、4層板も試作してみました。PCB業者は前回と同様Bocktechです。今回は、PCB製造に7.78日と4層のせいかかなりかかりました。PCB(SMDのみ)実装に0.90日、配送(DHL)に6.13日と、ネットでの支払い完了から数えて到着まで14.81日かかりました。またコストは、送料込みで92.02 USDで、PCB製造が42.19 USD、PCB実装に29.83 USD、配送(DHL)に20.00 USDという内訳です。

完成した回路図を図110.1に示します。EAGLEにより作図しました。UltraZedボードとUltra96ボードの兼用であるため、電源のORをショットキーバリアダイオードで取っています。どちらの電源がONしているかを2色LEDの色で表示しています。初版から比べてリセットSWとDIP SWを追加しました。

図110.1
図110.1 論理回路図

PCBアセンブリはSMD部品2個のみを実装してもらいました。garberデータの他にBOMのエクセルファイルをアップロードします。PCBアセンブリ費用29.83 USDの内訳は、部品費6.64 USD、セットアップ費20.00 USD、組み立て費0.92 USD、サービス費2.27 USDとのことでした。2枚SMD実装してもらって29.83 USDなら苦労してハンダリフローや手付ハンダをしなくても良いかもしれません。

図110.2
図110.2 PCB BOM

Boktechにより5枚を製造し、2枚をSMD実装したPCBです。

図110.3
図110.3 PCB表面

図110.4
図110.4 PCB

組み立てを実施したPCBです。電源や主要信号にテストポストを立てています。


左矢前のブログ 次のブログ右矢

posted by sakurai on April 15, 2019

Bocktechという会社にオーダーしていたPCBが届きました。 このメーカーだと、PCB製造に2.66日、PCB実装に1.02日、配送(DHL)に2.00日と、ネットでの支払い完了から数えて、わずか5.68日しかかかっていません。

それなのに、値段は送料込みで54.83 USDと最安でした。PCB製造が1.00 USD、PCB実装に29.83 USD、配送(DHL)に24.00 USDという内訳です。

後は品質がどうかということなので、部品を実装して、動作チェックしてみましたが、特に問題無く動作しました。2層なので電源ノイズは小さくない(300~400mVp-p)ですが、これは会社の問題では無いです。

総じて価格は最安、納期は最短ということで、当面この会社のサービスを利用することになりそうです。

図97.1
図97.1 PCB

試作なのでPCBは5枚オーダーしました。

図97.2
図97.2 PCB基板表面

そのうちの2枚にSMDを実装しています。最低の実装数量が2枚となっているためです。

図97.3
図97.3 PCB基板裏面


左矢前のブログ 次のブログ右矢

PCBの完成

posted by sakurai on April 7, 2019

FusionPCBにオーダーしていたメインPCBが届きました。実装も依頼したので、基板だけよりは時間がかかります。受注から実装完成まで18.94日、DHLによる配送が0.95日でした。FusionPCBは若干高いようですが、DHLの配送料込みなので、他社と価格比較する際はトータルで見る必要があります。

コストを抑えるため、実装はSMD部品のみ依頼し、残りのスルーホール部品はマニュアルによるハンダ付けとしました。

図96.1
図96.1 完成したPCB

部品を実装したボードをUltra96ボード、PMOD-VGAボード、PMOD-I2S(サウンド)ボード、PMOD-JOY-SWボードと組み合わせて、Space Invadersが正常に動作することを確認しました。

基板図の表、裏の両面を示します。

図96.2
図96.2 ガーバーデータ表

図96.3
図96.3 ガーバーデータ裏

UltraZedボードでは電源ONでリセットがかかったのですが、プロトタイプボードを実装して電源を入れたところ、電源スイッチをONしなければならないことが分かりました。ところが、Ultra96ボードの電源スイッチがインタフェースボードで隠されて押しにくいことが分かったので、新たに電源スイッチとついでに敵の強さを設定するDIP SWを設けました。回路は他は基本的には変えていません。ソルダーレジスト色は黒にしてみました。

図96.4
図96.4 SketchUPによる3D化

図96.5
図96.5 IndigoRTによるレンダリング


左矢前のブログ 次のブログ右矢

FSMのダイレクトリターン

posted by sakurai on April 4, 2019

さて、非リーフFSMコールの後、リーフコールがある場合は、単純に前記シーケンスの組み合わせとなります。図で示すと図95.1のようになります。

図95.1
図95.1 非リーフコールからリーフコール

ここで結構見られるのが、リーフを呼んで戻った後、何もせずにさらにcallerに戻るパターンです。これを実現するより効率的な方法として、ダイレクトリターン手法があります。これを図95.2に示すと、リーフをコールする前にスタックから戻り番地を取り出しreturnに入れ、リーフへジャンプします。リーフからは知らずにリターンすると、ダイレクトリターンが行われます。

図95.2
図95.2 ダイレクトリターン

特殊な場合として、上記のようにパラメータ設定だけしてリーフにジャンプするような場合は、そもそもリーフであるため、以下の図のような呼び出しとなります。

図95.3
図95.3 ダイレクトリターン

例として、残機表示サブFSMは、(リーフである)copyAreaを呼び出すので、returnを破壊するため非リーフですが、その後のシーケンスでcopyAreaを呼び出しダイレクトリターンを行います。その際には図95.3のダイレクトリターン手法は取れないため、図95.2のダイレクトリターン手法を取っています。


左矢前のブログ 次のブログ右矢

FSMのcall, returnメカニズム

posted by sakurai on March 31, 2019

前記事の共通シーケンスの続きとなります。

FSMのcall, returnメカニズムとして、returnレジスタを設置し、caller側で戻り先ステート(通常は現ステートの次)をreturnに格納しておいて、calleeを呼ぶ機構にしていることは、前記事で記載しました。

単純な場合はこれで動作しますが、callが2段以上になると、returnレジスタが1段であるため、returnレジスタの退避等が必要になります。言うまでもなくプロセッサではスタックがこの自動化を行うわけで、プロセッサの場合の疑似コードを書くと次のようになります。

call CALEE;
:
CALEE:
:
return;

動作的には、

rs[--sp] ← PC + 4;
PC ← CALEE;
:
CALEE:
:
PC←rs[sp++];

FSMの場合はPCはstateレジスタに相当しますが、それを退避するRS(リターンスタック)配列を設置し、SP(スタックポインタ)も設置します。とはいえ、ハードウェアでありリカーシブコールがあるわけでもないため、4段程度の簡素なスタックとします。2bitですがSPも実装します。実際にはreturnを除いて2段で済んだので(トータルで3段)、SPは1bitとしています。

さらに、上記のようにプリディクリメント、ポストインクリメントの処理とせず、ポスト処理のみとします。その理由はサイクルをかければプリ処理も可能ですが、Verilogが遅延代入であることから、簡単のためポスト処理のみとしています。

また、通常のスタックがpush down(積むと上から下にスタックが伸びる)であるのに比べて、実装するスタックは本当のスタック(地面に積むため、下から上に伸びる)にします。これはどちらでもコストは同等です。

以上のような設計だと、FSMのコールは、図94.1のような疑似コードとなります(caller saved)。

図94.1
図94.1 コールの疑似コード

これは全ての場合に動作しますが、リーフコールが多いのにも関わらず、リーフではスタックは不要です。従って、call先を見分ける必要はありますが、コードの効率化を考えて呼び出しをリーフ(緑)コールと非リーフ(赤)コールに分け、リーフをコールする際は以下の図のようなコードを用います。

図94.2
図94.2 リーフコールの疑似コード

これは、元から使用していたコードと同じものとなります。returnを破壊する一般FSMを赤、returnを破壊しないリーフFSMを緑で表しています。

今回はcaller savedで実装しましたが、callee savedのほうが若干容易かもしれません。caller savedでは呼ぶ前にcalleeがreturnを壊すか壊さないかを調べてからcallしなければならないのに比べて、callee savedであれば、全てreturnレジスタに入れてcallし、callee側でさらに呼ぶときは(つまりreturnを壊す場合は)スタックに入れるという流れであるためです。


左矢前のブログ 次のブログ右矢

posted by sakurai on March 24, 2019

FusionPCBにオーダーしていた基板が届きました。以前の設計時のブログの続きです。

非常に小さい基板で、以下に基板の100円硬貨との比較写真を示します。基板業者は前回と同じFusionPCBで、今回はOSCという速達配送業者を利用して9.9USDでした。基板のみで製造に7.94日、OSCによる配送にシンセンから日本まで3.13日かかっています。シンガポール郵便よりはだいぶ早いですね。9.9USDの内訳は、7.9USDが基板制作代、2.0USDがOSCの配送料のようです。

前回はソルダーレジストを白で製造しましたが、今回は黒にしてみました。Ultra96toPMODボードもオーダーしています。レベル変換ICのみSMDだったので、手ハンダはマイクロスコープ下のハンダ付け作業となり厳しいため、レベル変換ICのみ実装もオーダーしました。

図93.1
図92.1 基板写真

さらにこれを実装したものを次の図に示します。

図93.2
図92.2 基板に部品を実装した

UltratoPMODボードに取り付けて正常に動作することを確認しました。


左矢前のブログ 次のブログ右矢

NNをFPGAに実装する(3)

posted by sakurai on March 21, 2019

最急降下法は問題があります。例えば、 $$f(x_1,x_2,x_3)=x_1^2+\frac{x_2^2}{20}+x_3^2$$ のような関数があったときの収束曲線を見てみると次のような図になります。

図92.1
図91.1 座標位置の推移

こうなるのは、出発点から見て、関数の最小値(あるいは極小値)のある方向が、出発点の最も傾斜が急な方向と、必ずしも一致しないためです。

前述のように、一段のニューロンだとフィッティングに制限がありますが、さらに隠れ層のレイヤを加え、活性化関数の非線形性を導入することで、より自由な関数へのフィッティングが可能となります。

問題はフィッティングをどのように実施するかですが、バックプロパゲーションを行います。バックプロパゲーションは、結果値が正解値とどれだけ乖離しているかを損失関数により評価し、それを各レイヤの重みベクトル$\boldsymbol{w}$に変換して、後段から前段に向かって伝えるものです。

このときに勾配テンソルが偏微分のチェインルールにより、後段から前段に向かって次々に簡単に求められるところがミソです。


左矢前のブログ 次のブログ右矢

NNをFPGAに実装する(2)

posted by sakurai on March 5, 2019

最急降下法

最適化の手法として最急降下法がしばしば用いられます。本来は、n次元ベクトル空間でのコスト関数の最小解が知りたい場所ですが、最小解を解くことは困難なので、極小解を求めます。出発点のまわりの谷底を見つけるわけであり、谷に下っていく方法のひとつとして、最も傾斜のきつい方向に降りることを最急降下法と呼びます。

最も勾配の大きい方向ベクトルを求めるため、以下の式のようにベクトル要素の偏微分をとるハミルトニアン演算子を使用します。 $$\nabla f=\left(\frac{\partial f}{\partial x_1},\frac{\partial f}{\partial x_2},\frac{\partial f}{\partial x_3}\right)$$ このハミルトニアン演算子を用いると、最急降下法による変位ベクトルは以下のように簡略に記述できます。 $$\varDelta\boldsymbol{x}=-\eta\nabla f$$ ここで$\eta$は正の小さい数、例えば0.1とします。これは学習率と呼ばれます。

これを具体的に見てみます。例えば、 $$f(x_1,x_2,x_3)=x_1^2+x_2^2+x_3^2$$ という関数があるとき、その偏微分は $$\frac{\partial f}{\partial x_1}=2x_1, \frac{\partial f}{\partial x_2}=2x_2, \frac{\partial f}{\partial x_3}=2x_3$$ となります。点$(1.0, 2.0, 3.0)$から開始して最急降下法による漸化式をExcelで実行させてみました。

繰り返し回数 $x_1$ $x_2$ $x_3$ $\frac{\partial f}{\partial x_1}$ $\frac{\partial f}{\partial x_2}$ $\frac{\partial f}{\partial x_3}$ $\Delta x_1$ $\Delta x_2$ $\Delta x_3$
0 1.000 2.000 3.000 2.000 4.000 6.000 -0.200 -0.400 -0.600
1 0.800 1.600 2.400 1.600 3.200 4.800 -0.160 -0.320 -0.480
2 0.640 1.280 1.920 1.280 2.560 3.840 -0.128 -0.256 -0.384
:
41 0.000 0.000 0.000 0.000 0.000 0.001 -0.000 -0.000 -0.000
42 0.000 0.000 0.000 0.000 0.000 0.001 -0.000 -0.000 -0.000
43 0.000 0.000 0.000 0.000 0.000 0.000 -0.000 -0.000 -0.000

のように、43回目で偏微分が全て小数点3桁までゼロとなり、局所最小値$(0.0, 0.0, 0.0)$が求められました。図91.1にこの座標$(x_1, x_2, x_3)$の推移を示します。偏微分で求めた勾配を逆に下っていく様子が現れています。

図91.1
図91.1 座標位置の推移

前項のシグモイドニューロンを多層化することにより、任意の分類が行えるようになります。


左矢前のブログ 次のブログ右矢

Neural NetworkをFPGAに実装する

posted by sakurai on March 1, 2019

Neural Network (以下NN)の理論を確認していきます。以下にシグモイドニューロンの図を示します。

図90.1
図90.1 シグモイドニューロン

図90.1のように入力値$\boldsymbol{x}$及び係数$\boldsymbol{w}$をそれぞれn次元ベクトルとし、その積が閾値$\theta$より大きい時に発火する場合、活性化関数をシグモイド$\sigma(x)$として、

$$y=\sigma(\boldsymbol{w}\cdot\boldsymbol{x}-\theta)$$

のように表せます。ここで、$-\theta=b$(bはバイアス)とおけば、

$$y=\sigma(\boldsymbol{w}\cdot\boldsymbol{x}+b)$$

となります。このシグモイド関数$\sigma(x)$は、

$$\sigma(x)=\frac{1}{1+e^x}$$

で定義され、その微分は、シグモイド関数自身を用いて

$$\sigma'(x)=\sigma(x)\left(1-\sigma(x)\right)$$ と表せます。シグモイドは微分が簡単な形で表されるので、学習時のバックプロパゲーションにおいて非常に便利な性質です。一方、勾配消失の問題があることから、近年は使用されず、ReLUにとってかわられています。

図90.2
図90.2 シグモイド関数


左矢前のブログ 次のブログ右矢


ページ: