【Nand2tetirs】名著『コンピュータシステムの理論と実装』を読んで、実際にコンピュータシステムを構築してみる #4
今回の内容
↓前回
前回はNANDから、NOT, AND, OR, XORを構築しました。
今回は電子機器にもよく用いられるマルチプレクサ、デマルチプレクサを構築します。次回は多ビット化・多入力化を行う予定です。ここまでが本書の第1章の内容になります。
マルチプレクサ (Multiplexor)
まずは、Muxを構築します。Muxの回路記号と入出力関係は以下です。
a, bの2入力以外に、制御信号selが加わった3入力1出力です。
初めて見る方でも真理値表を眺めていると法則が分かると思いますが、制御信号selによって、a or bの論理を出力する内容になっています。
動作が分かりやすいように単純化した真理値表は下表の通りです。
OR, AND, NOTを使用してMUXを構築しました。selにより、a, bいずれかの論理が選択されている挙動を確認することができます。
デマルチプレクサ (Demultiplexor)
Dmuxの回路記号と真理値表は以下の通りです。回路記号はMuxと左右対称に近い形になっています。入出力の信号数はMuxと逆です。
動作が分かりやすいように単純化した真理値表は下表の通りです。
内部回路図は下記の通り。Muxで使用したORは不要です。
selによって、入力信号をa,bに割り振ってデコードしている様子が分かります。
以上のMux, Dmuxは電子機器の設計によく登場します。
下図のように通信したい信号をMux側が選択して、Dmux側で受信する構成にした場合、途中の経路は信号1本で満足できるためコネクタやケーブルの極数、サイズ、重量、コストの削減することが可能になります。
他には、例えばArduinoのような開発ボードでは複数のIFを備えているPinがあり、これらは大体、GPIO, SPI, I2C, UART, PWMなど多重化されています。これは使いたいIFを配線しておけば、コーディング時に所望の機能を選択することで機能が仕様可能になることを意味しており、内部でMuxが使われているので『Pin muxing』や『Pin mux』と呼ばれています。
SoCでは機能毎に独立したpinにすると、途方もない数の極数が必要になります。これはコスト上現実的ではないので、設計者はメーカーのPin description, Pin mux表を見ながら必要なIFの系統数が満足できるか調べる必要があります。
まとめ
今回はMux、DMuxを構築しました。次回は本書でも取り上げられており、Hackコンピュータを構築する上で必要になる多入力、多ビットの基本論理ゲートの構築を行います。今回も構築した回路データはGithubのリポジトリに置きました。
【電子工作】安価でFPGAのUSB-JTAGプログラマを作成してみた
はじめに
FPGA(Lattice社, MachXO)の純正プログラマがべらぼうに高かったため、今回は秋月様の力を拝借して自作のUSB-JTAGプログラマを作成しました。用途は書き込みくらいなので、簡易的構成にして約1/10のコストで実現できたので、忘備録を兼ねて記事にしました。
純正プログラマの価格は最安値ではありませんが、私が見たサイトでこのくらい。
Nintendo switchとほぼ同じと考えるとやっぱりお高い!
わざわざ高級な純正品を買わなくとも¥2,500ほどで作成!
私の開発ボードのIFがFFCだったので変換子基板を実装せざるを得なかったのですが、対象がピンヘッダ等であれば¥2,000を切る格安でFPGAプログラマが作成できます。
購入部材
購入部材は下記。ユニバーサル基板や線材は省略。
https://akizukidenshi.com/catalog/g/gM-02990/
回路図
AE-2232DのJTAG IFのピンアサインは下表のようになっていました。
各信号のプルアップ/プルダウンの仕様は接続先の開発ボード/デバイスの仕様に依ります。今回は接続先の回路内でTMSは10kΩで3.3Vにプルアップ、TCKは2.2kΩでプルダウンされていたので、これらはプログラマ回路上ではスルー。TDI, TDOはそれぞれプログラマ側でPUさせる必要があったので、10kΩでプルアップさせました。接続先の仕様によりますが、大体2.2~10kオーダーが目安のようですね。
回路に従ってブレッドボードで組んで動作確認すると、FPGAに正常に書き込みができました。ただし、defaultのTCKの周波数では書き込みNGになったため、プログラマソフト上で分周させて速度を落とすことでPASSさせることができました。まさに下記リンクの対策です。おそらくオシロで見れば波形品質が悪いことが原因なのでしょうが、詳細は追っていません。そのうち観測してみます。
HW-USBN-2Aでは書き込みが成功しますが、HW-USBN-2Bを使用すると書き込みができません。どうすれば良いでしょうか? - 半導体事業 - マクニカ
また、AE-2232DではEEPROMが非実装になっているので一応ペリフェラルを購入して実装しましたが、今回の書き込みではそもそも不要です。どういった時にEEPROMが必要なのかよく分かっていません。分かり次第、この記事に加筆しようと思います。
<2022/4/17追記>
オシロで波形品質を確認しました。
まずは、書き込みに失敗する条件。分周なしDefault周波数6MHzの際の波形は下図。TCKを筆頭に全く追従できておらず、電圧が上がりきっていないことが分かりました。
一方で書き込みに成功した波形は下図。波形品質は良好なので書き込み時間を犠牲に書き込みに成功していたことの裏付けが取れました。
改めてモジュールのデータシートを確認すると、TTLレベルの通信では通信速度最大3Mbpsが保証されていました。Default 6MHzでは無理なはずでした。
ドライバのインストール
FT2232Dを制御するために下記のFTDIのサイトからDriverを入手しました。
"DRIVERS">"VCP Drivers"を選択して、OSに対応したDriverをDLして流れに沿ってインストールすればOKです。
※Windows10 x64は2022/4/2時点で『CDM212364_Setup.zip』でした。
インストールが完了すると、下図のようにデバマネ上で2つのポートが認識されます。
まとめ
今回はFPGAのソフト書き込み用のUSB-JTAGプログラマを作成しました。
用途が限定的であれば、純正品を買わずに格安で治具を作成できることに気付きました。手を動かすことで、JTAGの物理仕様について理解を深める嬉しい効果もあります。そうなるとプロトコルも気になるところです。時間があればオシロで観測したいです。あっ、まだ自宅にはオシロないんだった(すっとぼけ)。そろそろいい加減に買うか…それでは。
【はんだ付け名人への道】はんだ付け練習キットを購入して表面実装の技術を磨いてみた
はじめに
電気製品を扱うエンジニアにとって『はんだ付け』は、ものづくりの現場において重要な技術だと思います。しかし、メーカーに就職しても練習の場が提供されるのは稀で、各々がOJTを通じて先輩社員の技術を盗んだり、基板や部品を壊しながら身に着けているのが現実のように見受けられます。
そこで今回は、Amazonではんだ付け練習キットを購入したので製品と一連の実装→検査の流れ、忘備録を兼ねてtipsを紹介しようと思います。
工具については色々なサイトで紹介されているので省略します。調節可能なはんだこて、フラックス、ケミカルペーストは必須で、こて先は面実装ではマイナスドライバのようなD型がお気に入り。よくデフォルトで付属される円錐型は面実装に不向きだと思います。
購入した練習キットについて
Amazon.co.jp: はんだ 練習 LEDモジュール 電子工作キット電子プロダクションスイート DIYキット 溶接練習ボード : 産業・研究開発用品
Amzonで898円で購入しました。評価は☆2.7とあまり高くないですね。
レビューを見ると中級~上級者向きというコメントが散見されました。
確かに誰もが最初はユニバーサル基板でリード線付きの物から始めるのが大半ですが、実際の製品では大半が表面実装なので業界的には初心者~中級者くらいかと思います。
現場では0603とかざらに使われていますが、このキットで使用する最小が1608ですし、部品間の距離も大分離れていてお膳立てされていますしね。
回路図や部品情報は一切なし!情報はAmazonのページを見れば分かるやろ?というストロングスタイルでした。
確かに画像と照らし合わせれば実装に問題ないけど、汎用部品を使っているんだろうからせめてドキュメントくらい用意するのが筋では…
パターン図が落ちていましたが、部品ブロック毎に独立しているのね…連動しないんだ...
チップ抵抗(2012) 100Ω×20本ノック (難易度:★☆☆☆☆)
こての温度を340~350℃程度に調整したら、まずは下図赤線の範囲内に抵抗をひたすら半田付けしていきます。これ以上高温にしすぎると酸化が進みやすくなるので止めたほうが良いです。"0805"と基板のシルク印刷がありますが、これはインチ表記なのでミリ表記に直すと2012 (2.0mm×1.2mm)になります。
そこそこ綺麗に付けられたんじゃないかと思います。
100Ω抵抗 20個が全て直列に接続されているため、J1-J2間の抵抗は2kΩです。
テスターで測定して理論値通りになったので、品質はともかく正常にはんだ付けできたことが確認できました。
このようなチップ部品をはんだ付けするコツは下記の2点だと思います。
①フラックスをランドに事前に塗布してはんだが拡がりやすいように準備する
②予めはんだを片側に盛って、部品を基板面に這わせながら結合!
ピカピカの綺麗な濡れあがりができた時は気持ち良いです。
チップ容量(2012) 1uF×20本ノック (難易度:★☆☆☆☆)
次に、20個のコンデンサ1uFを並列接続させます。合計容量が20uFになれば成功です。要領は抵抗と同じですが抵抗よりも背が高いため、濡れあがりに必要なはんだ量は多くなります。多めにはんだをマシマシで盛る必要があります。
実測値が抵抗に比べて大きいですが、積層セラミックコンデンサ(MLCC)は測定条件によって測定静電容量の公称値が変動しやすのでこんなところでしょうか。少なくともはんだ付けは正常に行えたことは確認できました。
チップ抵抗(1608) 100Ω×20本ノック (難易度:★☆☆☆☆)
サイズが変わりまして1608(1.6mm×0.8mm)抵抗のはんだ付けです。1005ほどではないですが、電子機器によく使用されます。顕微鏡いらずなので難易度は★1(易しい)です。顕微鏡が欲しくなってくる1005で★2(ちょいムズ)、0603で★3(ムズい)の難易度だと思います。
100Ωを20個直列させた合成抵抗値なので2kΩになるはずです。
J5-J6間の実測値1.965kΩなので正常にはんだ付けができたようです。
チップ容量(1608) 1uF×20本ノック (難易度:★☆☆☆☆)
サイズは同じ1608です。
こちらも並列接続の合成容量20uFですが、こちらは実測値が近しいですね。
ムラがありますね。背が高めだと濡れあがりが難しいです。
チップアレイ抵抗 1kΩ×6本 (難易度:★★★☆☆)
個人的に一番難しく感じるのがこのチップアレイ。電極が小さい上に短い。隣の電極とショートしやすいのでフラックスを使わないと困難です。
チップアレイ抵抗は下図のように4つの抵抗を内部に含んでいるアレイ構造になっています。4ラインの合成抵抗はそれぞれ6kΩになるはずです。実測値より正しくはんだ付けができたようです。一回ですんなりいかず、細かく測定しながら原因の箇所を突き止めて修正することでpassできました。フラックス使わないと私は無理です。
後、このような大きくて極数が多い部品は下図のようにカプトンテープで固定することにより、ズレが発生せずに安定してはんだ付けが行えます。上手い人はいちいちテープで固定せずに行えるのですが、大雑把な私にはこの工程が必要です。
バイポーラトランジスタ 3個×2か所 (難易度:★☆☆☆☆)
バイポーラトランジスタ(BJT)が合計6か所あります。
余りミスの発生しない箇所です。ランドも大きいし、電極間が離れているので楽です。
下にあるタッチポイントと各トランジスタの電極間が導通していればOKです。
ダイオード 3個×2か所 (難易度:★☆☆☆☆)
ダイオードを10個付けます。ダイオードにはアノード、カソードの極性があることに注意が必要です。黒い線がある方がカソードになります。
データシートがありませんが、Amazonの説明文を読む限り順電圧方向の電圧降下は約2.72Vとのことです。測定条件(主に電流値)によって実測値も変動するので精度はこの程度ですかね。はんだ付けは正常に行えています。
謎の IC×2個 (難易度:★★☆☆☆)
素性の分からない謎のIC2個を実装します。
①カプトンテープでしっかり固定
②対角に位置する電極を最初にはんだ付けして固定
この手順を踏めば失敗する確率が減ります。
残念ながらテスト方法はチップの足と外側の電極間の導通チェックしかないです。
謎の LQFPパッケージIC×2個 (難易度:★★★☆☆)
こちらも下記の手順です。
①カプトンテープでしっかり固定
②対角に位置する電極を最初にはんだ付けして固定
ただ、こちらのパッケージはピッチ約0.5mmなので①は慎重に行う必要があります。
テストはこちらもピンと外側の電極間が導通できているか1本1本チェックする必要があります。もっとスマートに検査できる仕組みがあったら嬉しいな…
当然フラックスを使います。使わないと私にはとても無理です。フラックスリムーバも使用して綺麗に出来上がったのではないかと思います。
はんだこてで外すのは非常に困難です。低融点はんだで素早く手を動かして外している動画を見たことがありますが、まだチャレンジしたことがありません。はんだを盛ってブロアー(ヒートガン)と呼ばれる熱風を出す工具を使って外す方法が一般的です。極力避けたい作業ですね。
まとめと感想
以上ではんだ付けが終わりました。大雑把な私ですが、それなりに集中したのでそれなりな出来栄えになりました。
結果として良い練習になりましたが、最後に全体のブロックが連動して視覚的に楽しませてくれるギミックみたいなものが欲しかったです。
紹介したもののそこまで推せない練習キットなので、もっと良い練習キットがあれば是非コメント欄で教えていただけると幸いです。
【Nand2tetirs】名著『コンピュータシステムの理論と実装』を読んで、実際にコンピュータシステムを構築してみる #3
今回の内容
↓前回
前回設計したNANDをブロック化して、NOT, AND, OR, XORを構築します。
最初はNANDのみ使用可能な状態ですが、論理ゲートを構築できたらブロック化して手駒を徐々に増やして行こうと思います。
徐々に仲間(Component)が増えて最後に魔王(CPU)を倒すRPGのような感覚です。
構築した回路はGithubのcircuitsリポジトリに順次アップしています。
NAND回路のブロック化
前回MOSFETを用いて設計したNAND回路を簡略化のためブロック化します。
ブロック化の方法についてはこちらのサイトを参考にさせていただきました。
電圧源とGNDはブロックの端子として出したいので、Labelに置き換えます。
回路図(.asc)を一部修正後、[Hieraruchy]->[open this Sheet's Symbol]でSymbol(.asy)を作成します。[Draw]からLineやArc、Circleを駆使してそれっぽいシンボルを作成します。
大きさはアバウトですが完成しました。
実際に作成したComponentが所望の動作するか確認します。
前回のNANDシミュレーション回路を置き換えたところ、同じ出力結果が得られたためブロック化が成功したことが分かります。
Nand to NOT
Notは前回MOSFETレベルで設計しましたが、NANDから再構築します。
2入力の論理がTrueの時に出力がFalseになるNANDの特性を利用して、2入力をshortすればNOTが完成します。
NANDのようにNOTもブロック化して、今後簡単に使用できるようにします。
正常にブロック化できたことが確認できました。
Nand to AND
ANDの記号と真理値表は以下の通りです。
ANDは2入力の積をとります。
NANDの出力を反転させることでANDは構築できます。
直前にパーティに入れたNOTが早速活躍しました。
MOSFETは合計8個使用されています。
ANDをブロック化して…パーティに仲間が加わりました。
Nand to OR
ORの記号と真理値表は以下の通りです。
ORは2入力の和をとります。
2入力いずれも反転してNANDに入力する構成でORは実現できました。
トランジスタは12個使用されています。
ORがパーティに加わりました。
Symbolの出力部分がもう少し尖がった方が見栄えが良いですが、本質的ではないのでこれで良しとします。
Nand to XOR
最後はXORを構築します。
これまでに比べると複雑ですが、NOT, NAND, ORを駆使して実現できました。
トランジスタは24個使用されています。
最後の論理ゲートXORが加わりました。
まとめ
NANDからNOT, AND, OR, XORの各論理ゲートが構築できることが確認できました。
次回は1段階ボトムアップしてMux, DMuxをパーティ総力を挙げて構築します。
構築した回路はGithubのcircuitsリポジトリに順次アップしています。
【Nand2tetirs】名著『コンピュータシステムの理論と実装』を読んで、実際にコンピュータシステムを構築してみる #2
今回の内容
今回から論理ゲートの動作について復習するとともに、トランジスタレベルから設計を行って本と講義の内容より1段階理解を深めようと思います。
シミュレーション上とはいえ、Nand2tetrisならぬFET2tetris。
シミュレーション環境構築は、東京大学生産技術研究所のチュートリアル資料を参考にさせていただきました。
回路図データはGithubにも順次アップしています。
シミュレーション環境:
・シミュレータ: LTspice
・CMOSプロセス:0.18um
正しく0.18umプロセスのライブラリが読み込めているか確認するため、下図のNMOSを制御するだけの超シンプルな回路を作成して、DC解析を行いました。
ゲート電圧を線形的に上げていくと、閾値電圧Vth≒0.4V付近でNMOSがON(強反転領域にシフト)して電流が流れ始めていることが分かります。
ライブラリ内で設定されている各種パラメータをMOSFETの電流式に当てはめれば整合性が確認できると思いますが、ここでは一旦ライブラリが正しく読み込めていることを確認できたので論理ゲートの設計を進めます。各論理ゲートの記号と真理値表を示して、トランジスタレベルで構築&シミュレーションにかけて所望の動作になっているか確認します。
電源電圧および、入出力電圧はIO電圧としてよく用いられる1.8Vに定めました。
FET to NOT (Inverter)
まず、一番シンプルなNotゲートから設計しました。
Notは1入力の否定を出力します。
所謂Inverterです。PMOSとNMOSで実現できます。
確かNMOSのチャネル移動度はPMOSの1/3だったので、(W/L)は反比例の関係になるようにWのサイズ調整しています。
FET to Nand
続いて、最も"primitive"な要素であるNandゲートを構築しました。
大学で習いますが論理ゲートは全てNandから構築可能なので、本書ではNandからボトムアップでCPUを構築しています。
Nandは2入力1出力です。入力がどちらも1(True)の場合のみ、0(False)を出力します。
Notより複雑ですが、PMOS, NMOSの違いに注意しながら机上で単純なスイッチに置き換えた等価回路を書いてみると、真理値表を満足する動作が得られることが理解できます。
今回はここまで。
次回はNANDを部品化(ブロック化)して、AND, OR, XORを構築します。
【Nand2tetirs】名著『コンピュータシステムの理論と実装』を読んで、実際にコンピュータシステムを構築してみる #1
冒険のはじまり
先日、CPUの名著『CPUの創りかた』を遅まきながら読んだところ、とても面白くてこれまで頭の中でブラックボックス化されていたCPUの動作原理をざっくり理解することができました。内容は論理ゲートICからTD4(とりあえず動作するだけの4bitCPU)を手はんだで構築する過程を理論と共に順序立てて丁寧に説明されています。
早速、部品を取り寄せて構築しようと思いましたが、開発効率を重視してどうせならFPGAで構築したいと考えました。(業務でも少し扱っているので)
また、本書の内容だけでは実際のコンピュータシステムの動作原理(機械語、コンパイラ、アセンブラ、VMなど)を十分に理解できないと感じました。
加えて、TD4はCPUをかなり単純化した構成であり、もう少し踏み込んだ構成を設計したいと考えたため、タイトルにもある名著『コンピュータシステムの理論と実装』を手に取りました。
Nand2tetris
本を読みつつ、Coursera(※1)にてヘブライ大学講師である筆者がコースを開講していることが分かったため、理解の補助としてPartⅠ, Ⅱを現在受講しています。
本書の流れは下図のように、ハードウェア編とソフトウェア編に分かれています。
ハードウェア編では、Nandゲートを最小単位として、そこから各論理ゲートやCPU, RAMといったチップセットを構築します。そして、それらを組み合わせてComputerを構築します。最後に、アセンブリ言語から機械語に変換するアセンブラを作成する。
ソフトウェア編では、中間語から機械語に変換するVM変換器, コンパイラ, OSを設計します。
このように、最小単位のNandからボトムアップで設計を進める構成となっています。
読者は最終的に、Nandからテトリスが遊べるコンピュータシステムを構築できるようになるので、本書は『Nand2tetris』と呼ばれて親しまれています。
私はハードウェアエンジニアですが、理解を深めるために高水準言語のPythonを使用してソフトウェア編も奮闘する予定です。
(※1)Coursera(コーセラ)は、オンラインで大学や企業が提供するコースが受講できる学習サイト
無料で受講可能だが、課題の自動採点機能や修了書が欲しい人は各Partで5,500円を支払う必要がある
次回は最小単位であるNandゲートをはじめとした論理ゲートをトランジスタレベルから設計して理解を深めた記事を書く予定です。
【合格体験記】ハードウェアエンジニアがE資格(2021#2)に挑戦した
はじめに
私のように、日常の業務でPythonや機械学習、深層学習を扱わない初学者に対する1つの前例として参考になればと思い、体験記として情報を残すことにしました。あまり他の体験記では言及されていない内容を盛り込むように意識して記述しました。
データ
JDLA認定プログラム:
AVILENの全人類がわかるE資格コース
費用:
認定プログラム+基礎講座セット:259,600円
E資格本番模試::16,280円
受験料:33,000円
キャッシュバック:-20,900円 (G検定受講者対象)
合計:287,980円
受験日:
2021年8月28日(土)
合格発表:
2021年9月17日(金)
G検定でもお世話になったAVILENさんに引き続き面倒を見ていただきました。
AVILENさんは高い合格率を誇る業者です。金額設定は高めですが、教材とサポートの充実を考えると結果的に満足しています。しかし、修了試験が難しいため、高い合格率には生存者バイアスが潜んでいると感じました。
私はG検定の流れでお世話になりましたが、現在では1,2万程度で受講できる業者さんもいるようなので、クオリティとお財布との相談になると思います。
受験に使用した教材
AVILENの教材のみ!
黒本やゼロつくも買いましたが、結局殆ど使いませんでした。
理由は、下記のように認定プログラム内の演習問題数が潤沢だったためです。
多様性を確保するために黒本に手を出すのも良いと思いますが、中途半端になるくらいならいっそ買う必要はないと思います。ゼロつくは計算グラフを用いた逆伝搬などに多く紙面を割いていたので、そこを理解するために使用しました。
問題量:
公式例題2021:20問
想定問題集:75問
付録の対策問題集 30問
本番模試:106問
分野別対策問題:
線形代数:49問
統計:46問
情報理論:52問
Python:42問
機械学習:35問
順伝播:32問
前処理と工夫:38問
データの学習:31問
CNN:52問
RNN:38問
強化生成モデル:46問
終了試験:100問
再受験:100問
模擬試験:100問
スケジュール感
3/20 受講開始
7/23 実装演習課題
8/6 修了試験合格
8/28 受験
9/17 合格通知
受講開始から修了試験合格まで約4か月もかかってしまった点が反省点です。
理由は、途中1.5か月ほど飽きて中だるみしてしまったためです(笑)
一応速習で2か月で終わらせる方もいるようですが、目安として受講開始から修了までは3か月が精神的にも丁度良いのではないかと思います。
後進の方に薦める日程感は下記。
N月 受講開始
N+3月 修了試験合格
N+4, 5月受験
良いスコアを獲得したい方は最後の2か月、
とにかく合格できれば良いと思う方は最後の1か月間をひたすら演習期間にすると、正答率もぐんぐん伸びると思います。
個人的アドバイス
・認定プログラムの業者を通じて、協会から20問程度の公式例題が配布されます。
これらは完璧に理解しましょう。(わざわざ配布するってことは…ねぇ…)
・問題を解く際には、正解以外の選択肢についても根拠を持って×と言えるようにする。問題の正解分だけ覚えていた方が、本番ちょっと捻られるだけで苦労している雰囲気でした。
・実装演習は、論文を読んで最新の手法を取り入れたり、凝った面白いテーマにする必要は一切ありません。単に合格を目指すのであれば、ネットに落ちているいくつかの手法やコーディング演習の手法を組み合わせたり、検証に異なるデータセットを使用して考察を行えば、直ぐに独自工夫点のある成果物が完成します。個人的には合格した後に遊べば良いと考えているので、2週間目安に対して3日程で終わらせました。
・行列が久しい人は、何よりもまず行列計算による形状変換について完全に理解しましょう。この知識があるだけで、コーディング問題に対処できる率が上昇します。(dot計算系の問題など)
・コーディング演習はとにかくネット等で調べて、力技でガンガンスピーディに提出を進めることを勧めます。当然講義内容と関連しているのですが、あまり丁寧に進めると上記問題を演習する時間が不足しますし、講義内容とコーディング演習の関連付けは後々理解できるようになるので、とにかく修了に向けてガシガシ進めましょう。