プロ電子技術者のコモンセンス

長嶋 洋一



\section*{1. プリント基板・ハンダ付けの常識と注意点}

●微細化の最終ターゲット
 各種部品を搭載するプリント基板は電子機器の「基礎」
です。LSIなどの半導体パッケージの小型化は、周辺部品
(抵抗・コンデンサ・コネクタ等)にも波及し、チップ部
品による表面実装技術(SMT)として普及してきています。
 このような電子回路の微細化はプリント基板を大きく
変化させ、DIPの「ピン間配線3-4本」という微細パター
ン、また4層や6層の多層基板、実装のためのフレキシブ
ル基板、SMT対応ハンダ付け(ソルダリング)技術など、新
しい展開を見せています(図A-1(a))。プリント基板は、
システムの小型軽量化の最後のターゲットなのです。

●ハンダ付けのポイント
 試作基板のハンダ付けでは、「天プラハンダ」「イモ
ハンダ」などの悪い例がよく知られていますが、このレ
ベルをクリアしたプロにとっての重要ポイントは、量産
時の信頼性についての視点です。具体的には、
 ・熱設計:発熱する部品のプリントパターンとハンダ
  には十分な熱容量を確保する
 ・ノイズ対策:GNDパターンへの配線長、信号線の配線
  ライン、パターン面の面積など
 ・ハンダとフラックスの選択:部品の導線材料との相
  性、基板面への「ぬれ性」、洗浄工程の検討など
 ・部品取り付け:力の加わる部品(スイッチ・コネクタ)
  や自動挿入機による組み立て工程への考慮
などの項目について十分に検討します。

●新しい課題
 表面実装技術(SMT)では、従来のハンダ付けとは異なる
多くのトラブルが発生するために(図A-1(b))、自動機に
よるリフローハンダ付けにも特別の注意が必要です。
 また、地球環境問題が注目され、フロン洗浄でない新
しい基板洗浄工程が必要で、「無洗浄フラックス」「ウ
ォータージェット洗浄」「超音波洗浄」「代替フロン」
「アルコール洗浄」など、新技術が提案されています。

\section*{10. TTLとCMOSとの混在は要注意}

●TTLとCMOSは同じ電圧・信号レベル?
 ディジタル回路は単一の電源電圧+5V、信号レベルはオ
ンオフが+5VとGNDである、と一般に言われていますが、
実際はTTLゲートの出力は3.5V程度、スレッショルドレベ
ルも約1.4Vと低く、ノイズマージンが小さい特徴があり
ます。これに対してCMOSゲートは出力信号を電源電圧ま
でほぼフルスイングし、スレッショルドレベルも2.5Vと
高いので、ノイズマージンの点で強力です(図B-10(a))。
 ところがCMOSでは、静電気に弱いとか入力端子をオー
プンにしておくとラッチアップするとか、TTLにない注意
点もあって、各種周辺LSIなどとともに両者はなんとなく
混在されてしまう場面もあります。

●CMOSからTTLへの接続に注意
 図B-10(b)のように、CMOSゲートの出力は十分にフルス
イングされているために、TTLゲートの入力レベルに対し
て十分なマージンを確保しており、このような接続に問
題はありません。離れた基板にケーブルで信号を供給す
る場合にも、原則としてCMOSバッファを使います。
 ところが、たまたま周辺LSIの出力がTTLレベルで、回
路がCMOSゲートで受けるような場合には、図のように入
力確定レベルとTTLの出力レベルがほぼ交錯しているため
に、TTL出力の負荷が重かったり、動作クロックが高速の
場合に誤動作を起こす可能性があります。

●安定動作のための対策
 このような場合には、HS-CMOSシリーズの中で入力レベ
ルをTTLレベルとした「74HCTシリーズ」を使います。こ
れは入力電圧レベルのみをTTLレベルとして確実に判定し、
出力をCMOSレベルでフルスイングするICシリーズで、各
社がラインナップの一部として揃えてきています。
 また、場合によってはプルアップ抵抗を小さな抵抗値
にして対策することもあります。もっとも基本は「最初
から混在させない」設計にありますが、条件によっては
このような対策で安定な動作を実現できます。

\section*{100. ASICの選択指針}

●まずは「ASIC化の必要性」からスタート
 ASICというとゲートアレイやスタンダードセルといっ
た「セミカスタムLSI」を示す場合もありますが、ここで
は「広義のASIC」、すなわちPLDやFPGAなども含めた、ユ
ーザである回路設計技術者がハードウェアをカスタム設
計できる一群のデバイスを対象として考えます。
 ASICには図J-100のようにいろいろな種類があり、まず
はこの選択に迷うこともあります。ここで重要なのは、
  ・回路のコンパクト化・システムの軽薄短小化
  ・設計情報に関する秘密保持、専用回路の優位性
  ・量産時に大幅なコストパフォーマンスを実現
といった「ASICの必要性」を正しく認識して、ビジネス
として確信をもってプロジェクト化することです。

●数量の条件から大分類
 ASICの検討は、数量の条件から大きく分類されます。
ロット10万個以上の大量生産システムであれば、開発期
間の条件さえクリアされれば、間違いなくカスタムLSI化
が最大のメリットを生み出します。
 また、ある程度(ロット1000個から数万個)の数量であ
れば、ゲートアレイやセルベースLSI(スタンダードセル)
化によって大きなメリットを得られます。
 これより少ない、少量多品種・高付加価値のシステム
や実験・試作システム、あるいはセミカスタムLSIのブレ
ッドボードとしては、PLDやLCAやFPGAを活用することに
なります。

●開発費用・開発期間のトレードオフ
 開発対象のASICが決定すれば、次のステップとしては
スケジューリングとコストの検討になります。開発期間
と開発費用は同時に最善の条件にはなりにくい性質があ
りますから、「時間をカネで買う」のか「コストをマン
パワーで稼ぐ」のか、プロジェクト全体のスケジューリ
ングやコスト検討(原価・償却費用・製造コストまで)の
際に注意します。オールマイティの作戦はありません。

\section*{101. 基本ファンクションセル}

●ASICの回路設計はTTLと同じ?
 ハードウェア記述言語(HDL)によってソフトウェア的に
設計するのでなければ、ツールを使ったASICの回路設計
は「TTLによる設計」という、従来のスタイルとほとんど
変わりません。
 ASICの回路設計ツールCADには、図J-101のようなTTLと
番号まで同じ「TTLセル」という基本的な標準セルが100
種類ほど「部品」として登録してあり、番号を指定する
だけで画面に呼び出して利用できます。また、
  ・TTLでは負論理出力だったゲートの正論理版
  ・TTLでは2入力だったゲートのn(3-10)入力版
なども豊富に用意してあります。これらの「基本ファン
クションセル」を組み合わせることで、TTL設計よりも自
由度の高い回路設計を行えます。

●ボトムアップ設計の考え方
 標準TTLではパッケージやチップサイズの関係で、たと
えば3ステートラッチは4ビットや6ビットから8ビットま
でしかありませんでした。しかし、ASICのCAD内では「広
大なゲートの海」を相手にしていますから、7ビットや10
ビット、あるいは24ビットや32ビットのラッチを自由に
「一つのブロック」として定義でき、部品として回路図
の中で扱えます。
 これがASIC設計における「ボトムアップ設計」で、上
の階層の回路図で一つの「箱」として回路ブロックを記
述して、実際にはその下の階層で中身を基本ファンクシ
ョンセルの組み合せとして実現します。

●ボトムアップ設計もトップダウンの視点から
 もちろん、基本ファンクションセルの組み合せで下の
階層を記述する場合であっても、その上の階層、さらに
全体の階層構造に関する設計アウトラインがイメージさ
れていることは必要条件となります。
 ASIC設計ツールのCADは非常に強力で使いやすいために、
このような階層設計を感覚的にも支援してくれます。

\section*{102. 入出力セルとピン配置の検討}

●ASICの豊富な入出力セル
 ASICの基本ファンクションセルの中で、TTLでの回路設
計とややイメージが異なるのは、入出力セルに関する部
分です。ASICが実際に外界とインターフェースする重要
な接点であり、カスタムチップになってしまえば開発し
たユーザだけでなく、メーカも入出力ピンからしかASIC
の内部をアクセスすることができません。
 ASICメーカ各社は、専用の「入出力セル」を豊富に用
意しており(図J-102(a))、回路設計で用いる基本ファン
クションセルに信号を直接ピンに接続することはできず、
必ず入出力セルを経由しなければなりません。

●入出力セルの選択
 入力セルの基本的な選択肢としては、
  ・TTLレベル/CMOSレベルとシュミット入力の指定
  ・プルアップ/プルダウン抵抗付きオプション
  ・静電気・ノイズ保護バッファ(セルが大きくなる)
  ・水晶振動子/セラロック専用の発振回路用セル
などがあります。また、出力セルの選択肢としては、
  ・TTLレベル/CMOSレベル/オープンドレイン
  ・ローノイズ化のための(波形を鈍らせる)回路
  ・LED駆動などのための電流出力ドライブ仕様
などがあります。また、バスラインに接続するための双
方向3ステート入出力セルでは、入力セルと出力セルの
それぞれのオプションが用意されています。

●ASICのピン配置
 ASICはセミカスタムLSIですから、基本的には開発者で
あるユーザが自由に信号ピンの配置を指定できます。製
品の基板パターンと合わせたLSIのピン配置を設計できる
のも、ASICの大きなメリットの一つです。
 しかし、図J-102(b)のように、実際にはファウンドリ
であるメーカ側からの「要請」「条件」「指定」がある
場合も多いものです。具体的には、同時スイッチングの
信号ラインの近くにGNDピンを置いたり、電源・GNDピン
を等間隔にしたり、オシレータ周辺のGNDピンなどです。

\section*{103. マクロセルの選択}

●中規模のブロックはマクロセル化する
 ASICの回路設計でTTLレベルと大きく異なるのは、設計
CADの支援によって、任意の階層のブロックを「ブラック
ボックス化」できることです。これはソフトウェア開発
におけるサブルーチンや関数の定義と同じ発想です。
 図J-103のように、基本ファンクションセルとしては用
意されていないような回路で、TTLで数ゲートから10数ゲ
ート程度になった一定の機能ブロック、という設計上の
「単位」はよく登場します。この場合、同じ回路を何度
も使う場合は当然として、その部分だけであっても、
  ・さらに上の階層の設計をスムースにする
  ・シミュレーション検証の単位とする
という2つの目的で、CADシステムが許す範囲(階層・数量)
で積極的に「マクロセル」として登録していきます。

●論理的マクロセルには注意
 回路設計ツールの画面上ではマクロセルとして1つのブ
ロックになっているようでも、ゲートアレイの「マクロ
ファンクションセル」として登録した場合には、ちょっ
と注意が必要です。つまり、回路上では一群のゲートが
コンパクトにまとまっているようでも、実際のチップ上
では散在しているゲートを組み合わせているからです。
 ある程度の十分なマージンを取って、同期的にシステ
ムを組んでいれば問題ありませんが、CPUインターフェー
ス部分などの非同期の単純な論理回路では、離れたゲー
トを論理的に結び付けるレイアウト配線長の影響で、シ
ミュレーションのTYPICALタイミングでは通過しても、MAX
とMINの条件でクリチカルになる場合があります。

●ハードマクロのメリット
 これに対して、配線だけでなくセル自体を設計できる
セルベースLSIでは、必要に応じてマクロセルをセルコン
パイラで自動生成させてカスタム登録できます。これは
マクロセル内のゲートが物理的に接近していますから、
開発期間はかなり余分にかかりますが、シミュレーショ
ン段階では安定した結果を得られます。

\section*{104. メガセルとセルコンパイラ}

●メーカ提供の巨大セルブロック
 ASIC設計の際にユーザ(開発者)が登録するマクロセル
以外に、特にセルベースLSI(スタンダードセル)では、メ
ーカから提供されている特定機能の巨大なセルブロック
を活用できます。
 これには図J-104(a)のように、
  ・各種・いろいろな仕様のメモリセル
  ・ALUなどの算術・論理演算セル
  ・各種・いろいろな仕様の乗算器ブロック
  ・CPUそのものというセル(「CPUコア」という)
などがあり、いずれもTTL相当の基本ファンクションセル
で等価に設計したとすれば、ゲート数・チップサイズと
も非常に巨大になって、事実上は実現不可能なものばか
りです。

●セルコンパイラ
 このうち、レディメイドのメガセルとしてラインナッ
プが用意されているメガセルについては、メーカ側で高
度のコンパクション(レイアウト圧縮)が施され、シミュ
レーションモデルも完備した「完全なブラックボックス」
として利用できます。
 また、たとえばメモリや乗算器で、
  ・希望する1ワードのビット幅
  ・希望するワード数やアクセス遅延・演算遅延時間
などのスペックを指定すると、設計システムがシミュレ
ーションモデルからレイアウトまでを自動生成してくれ
る「コンパイルド・セル」も多くなりました。メーカ提
供のメガセル(場合によってはマニュアル配線まで行う)
ほどの最適化は望めませんが、高度なシステムをオンチ
ップ化するために活躍しているASIC機能です。

●一部のゲートアレイでも登場
 これまではセルベースLSIの特権だったメガセルですが、
シー・オブ・ゲートのゲートアレイの一部はメモリセル
やCPUコアを搭載できるようになりました。機会があれば、
ぜひとも活用したい強力な援軍というわけです。

\section*{105. ASICのディジタル時分割設計}

●ASICの時分割設計の考え方
 ディジタル回路、とくにデータ処理・信号処理・演算
処理などの大規模回路では、システムのスタートライン
(入力信号)からゴール(出力信号)までのパス(ステージ)
が、かなりの長さになるとともに、制御信号や内部情報
のための信号が複雑に入り組みます。また、多くの部分
で信号バスラインが大小のフィードバックループを構成
するのが特徴(FFTやディジタルフィルタなど)です。
 このような巨大なシステムは、当然ながらASICした場
合には「時分割同期システム」として設計しないと、チ
ップ上のゲートや配線の遅延の影響で、満足する性能を
得る(シミュレーションを通る)ことはできません。

●ソフトウェアのモジュール分割と同じ発想で
 回路図レベルでの設計であってもハードウェア記述言
語での設計であっても、このようなASIC回路の時分割設
計の指針は共通です。図J-105のように、入力から出力ま
での処理の概要を眺めた上で、前後で受け渡される情報
(信号)が比較的限られているポイント、具体的にはラッ
チで一時的に信号を保持することで、「パイプラインの
1段」と定義できるブロックに分割します。
 これは、ソフトウェアのモジュール分割とまったく同
じ発想であり、ノイマン型のCPUの動作というのは時分割
動作と原理は同じですから、ハードとソフトが同じ土俵
で並ぶことになります。

●信号ループと初期化テスト回路に注意
 ASICの時分割回路設計で注意すべきポイントとしては、
  ・信号がループする場合、確実にラッチで止める
  ・各段のラッチパルスは共通のシステムクロックで
  ・テストのための信号初期化回路を考慮する
  ・テストのための信号出力ラインを確保する
という、回路仕様とは直接に関係しない部分です。具体
的には本書の別のページに解説していますが、時分割機
能だけに注目して余裕のない回路を設計すると、あとか
らこれらの回路を組み込むのに苦労します。

\section*{106. ASICの階層化設計(トップダウン)}

●トップダウン設計:最上位ページから
 ASICの回路設計支援ツールによる設計では、マクロフ
ァンクションセルの登録を活用して、すでにTTLレベルと
して実際に存在する回路をASIC化していく(ボトムアップ
による置き換え設計)が最初のものでした。
 しかし現在では、むしろ最初から設計ツール上で機能
を実現する回路を設計する場合が多く、ここでは図J-106
のように、トップダウン的なアプローチとなります。こ
の図では、まず最上の階層として"TOP"というページを展
開しますが、このページには、
  ・入出力セルと下位のブロック(箱)しか置かない
  ・入出力セルからの信号ライン名を全て定義する
という設計指針に徹するのがポイントです。トップのペ
ージには、具体的な回路セルを置かないのです。

●次の階層でも回路セルはぐっと我慢
 トップの下の階層としては、トップのページに「箱」
として定義されたいくつかの機能ブロックが、より具体
的に展開されることになります。ただし1-2万ゲート程度
の規模のASICの場合、ここでも具体的な回路セルに展開
することをぐっとこらえて、さらに複数の機能ブロック
の「箱」に分割して定義し、トップの階層と信号名の対
応をとって定義することに徹します。
 これによって、中間階層の各ブロックで定義された下
位ブロックの総数は数十個程度、定義された信号名もか
なりの数になります。しかし、各下位ブロックは数十ゲ
ートから数百ゲート程度にまで分割されて、結果的には
シミュレーションやテストに便利な構成となります。

●具体的に記述する階層でもマクロを活用する
 そして、いよいよ具体的な回路セルで各ブロックを記
述する階層となります。ただし、ここでも煩雑になる回
路をマクロ化して、さらに下の階層に展開することはよ
くあります。たとえばバス幅が24ビットであれば、24ビ
ットのラッチは1つの「箱」として定義し、下の階層で具
体的に3つの8ビットラッチとした方がスッキリします。

\section*{107. ASIC内バス設計のポイント}

●ASIC内バスラインの見方
 具体的にTTLなどの部品を使って回路を設計している時
には気付かないことですが、ASICでは「配線」、とくに
バスラインに対する配慮が必要です。プリント基板の設
計では、どんなに回路が複雑になっても、配線は多層基
板やジャンパやケーブルによって自在に引き回すことが
できます。配線長の遅延がクリチカルな部分も、バイパ
スのように専用線を使って最短経路で配線できます。
 ところがASICはチップとして2次元に配置されますから、
プロセスの進化で配線が2層・3層になったところで、基
本的に「平面」を意識した回路設計が重要になります。
具体的には、論理的には自在に引き回せる回路設計CADの
画面上でも、なるべく配線の部分をスッキリさせること
が、最終的なチップの配線設計でも有効となります。

●バス幅の考え方
 図J-107(a)は、ASIC内のバス幅についての視点です。
内部処理の要請で、データ幅が16ビット・24ビット・32
ビットなどの広いビット幅になることは一般的ですが、
これはASICにおいては厳しい条件です。回路図を視覚的
に考えればわかることですが、配線量は膨大なものにな
り、ASIC業界の有名な図式:
  ・チップサイズ→歩留まり→LSIコスト
によって、最終的にはかなり高価なLSIになってしまう可
能性が高くなります。
 そこで、あえてバスを時分割多重化して、たとえば4ビ
ット幅のバスを数回回して使えないか、などと検討する
ことになります。

●バスラインの交差
 図J-107(b)は、ごく簡略化したASIC内の乗算累算ブロ
ックの回路例です。ここで明かなように、バスラインが
なるべく交差しないように考慮することも重要です。信
号を引き出す部分の交差は仕方ありませんが、意味もな
く多ビットのバスが単純に交差している回路図は失格で、
回路図として「交差を避ける」マナーをお勧めします。

\section*{108. CPU周辺LSIとしてのインターフェース}

●CPUとASICのインターフェース
 多くのASICは、汎用のCPU周辺LSIとして見あたらない
オリジナル機能を搭載して、実際のシステムではCPUの周
辺LSIとして活躍しています。この場合、ホストCPUとの
情報交換や制御機構といったインターフェース機能を、
ASIC側で設計することになります。
 図J-108(a)はこのようなインターフェースの形態につ
いて分類したもので、デバイスやセルの進化とともに選
択肢も増えているものです。ここでは従来の、
  ・ハンドシェイクによって対等に情報交換
  ・ASICからCPUに割り込みをかける
  ・CPUからASICに割り込みをかける
  ・たれ流し的に情報を与え合う(ポーリング)
という代表的な手法が基本となります。

●機能セルによる新しい方法
 さらに最近では、ASICのメガセルの充実によって
  ・FIFOセルによるFIFOインターフェース
  ・デュアルポートRAMによる双方向情報交換
  ・シリアル通信セルを利用してCPUとシリアル通信
などといった新しい方法もとられています。最後のシリ
アル通信というのは効率が悪いように思いますが、実は
ASIC内のパイプライン処理に同期したシリアル通信セル
をうまく利用することで、CPUとの同期調整を吸収してし
まう効果があり、わざわざ別経路で通信する手間に見合
うメリットを生む場合もあるのです。

●CPUクロックとの関係
 ASICとCPUは、ともにシステムクロック信号を必要とし
ますが、ここでは図J-108(b)のように、両者の同期関係
について4通りの組み合せがあります。一般には非同期シ
ステムとして、情報交換の際にはインターフェース回路
で調停しますが、クロックにある種の同期関係をとるこ
とで、インターフェース回路が大幅に簡略化されたり、
情報交換のパフォーマンスを上げることも可能ですから、
システム設計の際に十分に検討したいところです。

\section*{109. ASIC内蔵メモリセルの活用}

●ASIC内蔵メモリの特徴
 汎用のメモリ(特にここではRAM)というのはASICの内蔵
メモリよりも非常に低コストで、一般にASICの内蔵メモ
リをASICの内部で使うこと以外のメリットは考えにくい
ものです。しかし、ASICのメモリセルの特徴を検討する
ことで、いくつかの活用ポイントが上げられます。
 まず、CPU周辺LSIとしてASICを用いる場合に、1チップ
CPUに内蔵されたRAMエリアの拡大のために使用するケー
スがあります。組み込み機器のCPUでは、内蔵RAM程度で
十分な場合も多く、システムとしてわざわざ巨大なRAMを
置くことを避ける場合に採用されます。(図J-109)

●ASIC内蔵メモリの特長を生かす
 これよりも積極的にASIC内蔵メモリセルの特長を生か
した活用法として、ASICの高速性による「高速メモリ」
も注目されます。たとえば、汎用DSPチップを使った信号
処理システムの場合、ワークRAMとしてアクセスタイムが
20-50ナノ秒程度の高速メモリが必要となりますが、これ
はバイポーラRAMの面倒な世界となります。ところがCMOS
のASICのメモリセルは、簡単にこの水準を提供できるの
です。ただしこの場合、入出力セルの遅延に注意します。
 また、ASIC内蔵メモリとして「3ポートRAM」などのコ
ンパイルドセルが用意されていれば、この部分を外部に
切り出して画像処理システムに活用する、といった可能
性もあります。データ容量でなく、タイミング回路とス
ピードのメリットを生かした方法です。

●ASICの一般化傾向をおおいに利用する
 この他にも、ピン数を確保した上で「56ビット64ワー
ドRAM」などという、汎用RAMにない特殊なメモリを外部
に提供したり、CMOSのASICの特長である低消費電力機能
を生かしてバックアップメモリとして活用する場合もあ
ります。
 ASICは数量条件も開発コストも、傾向としてはますま
す身近なものになりますから、このような「軽いノリ」
でASICをとらえることも可能になりつつあります。

\section*{11. バス・バッファの使い方}

●データバスのドライブ
 バスラインに信号を乗せるドライバとしては、必要の
ない時にハイ・インピーダンス状態(スリーステート状態
とも言う)に切り替えるためのイネーブル制御端子を持っ
た、540(バッファ)や541(インバータ)を使います。また
8ビット単位のバスでない制御信号・スイッチ入力ライン
のドライバには、6回路入力の367(バッファ)や368(イン
バータ)を個別に使う場合もあります(図B-11(a))。

●バスファイトに注意
 これらのバスバッファを使う場合の注意点としては、
「イネーブル信号を排他的にする」ことがもっとも重要
で、結果的にバスラインに複数の信号を同時に乗せるこ
とのないように注意します。
 同時に複数のドライバがイネーブルされた場合、たま
たま同じ信号であるとオシロではその信号レベルが観測
されますが、2つのドライバの出力がハイとローで衝突す
ると、バスラインが不定状態になるばかりでなく、素子
破壊につながる場合もあります。
 この状態(バスファイト)は、CMOSバッファの場合、信
号ラインの電圧が電源の半分あたりで確定(指で触れても
変動していなければ「ハイ・インピーダンス状態」で浮
いているのではない)するのでTTLよりも発見が容易です。

●定番の245と574
 バスラインのドライバとして定番のICは、双方向8ビッ
トバッファの245と、3ステートバッファ付き8ビットDラ
ッチの574(かつての定番374よりもピン配置が最適化され
た機種)です。
 245を使う場合のポイントは、方向コントロールDIRの
制御と、イネーブル端子とのタイミング設計で、「イネ
ーブルされたまま方向を変える」ような動作をしないよ
うに注意します。
 574と似た8ビットラッチには、トランスペアレントラ
ッチ(Gラッチ)の573もありますが、こちらは入力データ
がそのまま出力に出ますから注意が必要です。

\section*{110. CPUコア:究極のASIC技術}

●非同期なCPUとASICシステムの非効率
 CPUシステムの中でASICを使い、このASICがDSPのよう
にパイプライン処理で多量の情報を演算処理し、ASICと
CPUとの間でも多量の情報交換があるような場合について
考えてみましょう。
 まず図J-110(a)のように、CPUシステムとASIC(DSP)シ
ステムとが非同期的に動作している、一般的なケースに
ついて考えます。CPUがASICに与えたい情報、ASICからCPU
に返したい情報は、それぞれのシステム/チップ内のRAM
に多量に蓄積されていますが、これは本質的に「転送さ
れてしまえば同じ情報」です。これを分散して両方が持
っている、というのは考えてみれば非効率な話です。

●非同期システムのインターフェースも非効率
 そして、これら両者のシステムは情報交換のためのイ
ンターフェースを行いますが、ここでも非同期システム
同士ですから、「待ち合わせ」「割り込みによる停止」
「ステータスの監視」といった、双方ともに面倒な回路
と処理を必要とします。これは、システム全体の処理能
力のかなりの部分をインターフェースに費やしているこ
とに相当しますから、これまた多大な非効率、というこ
とができます。

●「コアCPU」のシステム
 そこで図J-110(b)のように、ASICチップ上にCPUコアを
持ち、DSPシステムも含めて完全に同期設計したシステム
(これを筆者は「究極チップ」と呼んでいます)について
考えてみましょう。
 ここではチップ内のRAMをCPUもDSPも共有していて、同
期的(時分割的)にこの情報を参照しますから、「情報を
転送」する必要はありません。また、システム内のバス
も資源も時分割的に共有していますから、「インターフ
ェース」も不要です。本質的に共同動作しているという
わけです。このようなシステムがどれだけのパフォーマ
ンスを生み出すか、ちょっと真剣に考えてみて下さい。
世の中にはこのシステムの隠れた実例は多いのです。

\section*{111. 開発プロジェクトのマネジメント}

●開発プロジェクトのメリット
 日本型のシステム開発手法として有名な「プロジェク
ト方式」は、特定のシステムを短期集中的に開発するた
めには極めて有効なものです。もっとも、高度経済成長
のバブルを越えたこれからの時代には、むしろ「過去の
手法」として冷静に検討して、本当に重要なポイントだ
けを今後に生かしていくことも必要のようです。
 開発プロジェクトとしていろいろな分野の専門家を集
めるメリットには、
  ・専門分野を専門家が担当することの効率良さ
  ・異分野のメンバとの交流から新アイデアや新しい
   視点が得られる(マンネリ防止・活性化)
  ・仕事と責任を合理的に分担し、ドキュメント化に
   よって客観的に成果がまとまる
  ・若手をメンバに加えることによる効率的なOJT
などがあり、まだまだある程度以上のシステム開発では
主流となっていくものでしょう。

●ツールの活用
 マネジメントツールとしての「コンカレント・エンジ
ニアリング」については別に述べますが、プロジェクト
開発を進めるツール(環境)としては、電子メールや各種
ソフトウェアツール(CASE・データベース・CAD等)の支援
も積極的に活用することになります。(図K-111)

●プロジェクト・マネジメント
 開発プロジェクトのマネジメントとして重要なポイン
トとしては、
  ・上流のシステム構築・システム設計に重点を置く
  ・コスト/スケジュール検討の重要性は仕様と同格
  ・シミュレーションによって時間とコストを稼ぐ
  ・あらゆるリスク・マネジメントも「設計」のうち
  ・知的財産権と製造物責任の視点から責任をもつ
  ・電子メール・電子会議によるドキュメント管理
などがあります。気持ちよく人間の能力を引き出すのが
マネジメントの原点です。

\section*{112. エディタ(プロのツール)を駆使する}

●エディタはもっとも基本のソフト
 人間が接しやすい領域で「情報処理」という言葉をも
っとも忠実に実行しているソフトの代表が「エディタ」
(テキストエディタ)でしょう。プログラミング言語にし
ろ文書にしろデータにしろ、コンピュータのキーボード
から入力される情報は全て「テキストファイル」をベー
スにしていて、このテキストファイルを対象としたあら
ゆる「編集」機能を盛り込んだソフトがエディタです。
 マンマシンインターフェースがウインドゥ化されて、
マルチジョブ・カット&ペーストが簡単になっても、プ
ロ技術者の仕事としてテキストベースの入力が無くなる
ことはありません。そこで、エンジニアが「生存環境」
として長時間接するだけに、エディタは十分に検討して
選び、また効果的に使い込んでいきたいものです。

●エディタの機能を駆使する
 エディタには、図K-112のような基本的機能が充実して
おり、たとえばワープロソフトでなくFEPとエディタで文
書を作成する方がストレスが少ないのは有名な話です。
 エディタを「データ処理ツール」として使うことも一
般的で、たとえば筆者がCOMMAND.COMをカスタマイズ(メ
ッセージを関西弁化した)した時には、COMMAND.COMをDUMP
したファイルをエディタで処理して、メッセージ文字列
をサーチ・リプレースすることで簡単に完了しました。
 また、豊富に提供されている「マクロ機能」を駆使す
ると、新しいエディタに乗り換えても、「これまでのエ
ディタと同一の操作法」を設定することもできます。プ
ログラミング言語に合わせたマクロ設定も便利です。

●「エディタ」から「仕事環境」へ
 エディタの編集機能を一種のアイデアプロセッサとし
て創造的発想支援ツールとして使ったり、データベース
や通信ソフトを呼び出す基幹ソフトとして活用する人も
多いものです。さらに「子プロセス起動」機能を強化し
て、通常はいつもエディタの中で生息して必要な仕事ソ
フトを呼び出す、という生存環境の中枢にもなります。

\section*{113. プログラミング言語の使い分け作戦}

●純血主義の場合
 マイコンシステムやパソコンソフトを開発していく場
合、プログラミング言語の使い方はエンジニアごとに千
差万別です。筆者はどれがよくてどれが悪い、などと言
うつもりはありませんので、ここでは並列的に紹介して
いきましょう。(図K-113)
 まず、特定の言語で貫き通す「純血主義」、たとえば
C言語とかアセンブラとかBASICの専門家、という方針が
あります。Unixのように環境が安定していれば手堅いの
ですが、マイコンではCPUに対する処理系(コンパイラや
アセンブラ)が変わると苦労する場合もあります。そして、
「言語とともに過去のものになる」リスクが存在します。

●混血主義の場合
 メイン部分をC言語で書きながら高速サブルーチン部分
をアセンブラ化する、などの「適材適所」技術を研究し
て駆使するタイプです。最適なパフォーマンスを引き出
す技術力は高いものとなりますが、そこまでの日々の勉
強も必要です。
 また、マイコンシステムなどでは対象CPUや処理系が変
わるたびに、初期には不安定で微妙な言語間インターフ
ェースの調整をすることになり、技術力を裏付ける努力
がつねに要求される、しかし挑戦したい世界です。

●浮気主義の場合
 これは「新しいものになるべく飛びつく」という姿勢
で、実は筆者が個人的にもっとも好きな方針です。新し
いCPU、新しい言語・処理系やパラダイムが登場すると、
開発環境自体の「初期バグ」も多い中で敢えて採用して
挑戦する、という積極的な立場です。
 当然ながら「過去の資産の再利用」も「ソフト部品の
蓄積」もありませんが、何より発想と視野が広がり、新
しい技術を収集して伝道するアンテナとしても活躍でき
ます。スケジュールとリスクのプレッシャの中で、エン
ジニアリングを楽しみながらシステムを開発する、とい
うこのようなアプローチも知って欲しいと思います。

\section*{114. CASE、CAD、CIM、...その未来}

●CADとCIM
 マイコンシステムや電子回路の設計・開発では、すで
にCADやCIMといったツールは、いろいろな段階で自然な
「道具」となっています。たとえばCADの場合、
  ・ドラフタ代わりのプロットアウト用製図CAD
  ・部品データベースと結び付いた回路設計支援CAD
  ・階層化設計・自動配線を支援する大規模なCAD
  ・動作シミュレーションによる実験支援CAD
  ・3次元機構設計・熱設計・ノイズシミュレータなど
といった設計のレベルごとに、多くのCADツールが活躍し
ています。
 また、生産ま段階でもNCからCIMへといろいろなツール
が支援して、大量生産だけでなく少量多品種生産に対応
するためのLAN化CIMも、メーカによっては稼働中です。

●ソフトウェアのCASE
 ソフトウェアの開発支援環境としては、CASE(Computer
Aided SogtwareEngineering)ツールが活用されつつあり
ます。ここでのCASEは「狭義の(ソフトウェア)CASE」で、
  ・要求仕様からフローチャートを自動生成する
  ・DFD(データフローダイアグラム)による設計支援
という「上流CASE」と、
  ・フローチャートからソースプログラムを自動生成
  ・シミュレータでのデバッグから自動ROM化まで
という「下流CASE」があります。上流から下流まで一貫
してやって欲しいと誰もが思いますが、組み込み機器や
リアルタイムのマイコンシステムなどの領域では、まだ
一般には別々のツールをつぎはぎ利用しています。

●システムのCASE
 CASEにはもう一つ、広義のCASE(Computer Aided System
Engineering)もあります。(図K-114)
 これは、狭義のCASEから設計支援のCAD・シミュレータ、
生産支援・生産管理のためのCIMやデータベースまでを統
合的にシステム化したもので、コンカレントエンジニア
リングのソフト版と言えますが、まだまだ途上段階です。

\section*{115. コンカレント・エンジニアリングの考え方}

●コンカレント・エンジニアリングは「古い」技術
 最近、あちこちで話題になっている「コンカレント・
エンジニアリング」ですが、この基本となる考え方:
  ・システム構築から設計開発・生産までを一貫する
  ・複数のメンバが情報を共有して共同して行う
  ・最初の分析とスケジューリングに比重を置く
  ・複数の作業段階をなるべく並行させて効率化する
といった思想は、昔から言われているものです。ただ最
近の新しい視点として、
  ・製品のライフサイクル全体を視界に入れる
というポイントは、地球環境やPL(product Liability)の
風潮によって最近ブームとなり、「製造だけでなく廃棄
を考慮した設計」という新テーマが生まれました。

●コンカレントエンジニアリングの2つの側面
 図K-115は、マイコンシステム技術者が直面する仕事の
領域を示した「地図」です。このような業務領域を一つ
のプロジェクトと見れば、コンカレントエンジニアリン
グ(CE)技術によって、2つのポイントから支援されます。
 その一つは「手法としてのCE」で、グループウェアに
よるマネジメントや、シミュレーションを駆使した初期
段階での徹底した分析・プランニングがあります。
 そしてもう一つは「CEツール」という具体的なシステ
ムのことで、各種CASEツールやLAN化された情報システム
によるプロジェクト支援をいいます。

●コンカレントエンジニアリングの実行計画
 概念としては歴史が長いコンカレントエンジニアリン
グが「掛け言葉」として再ブームになったのは、具体的
整然と理論整備され、実際に稼働するCEツールが登場し
てきたためです。
 この具体的な実行プログラムとしては、
  ・経営者とメンバ全員がCEの考え方をまず理解する
  ・「製品ライフスタイル」という考え方を徹底する
  ・CEの目的と手法を整理して具体的なツールを活用
などがあり、規模ごとにそれぞれ活用の効果があります。

\section*{116. クロス開発ツールと言語の選択}

●クロス開発ツール
 いろいろなCPUごとに、アーキテクチャに応じたアセン
ブリ言語(ニモニック)が定義されて、マニュアル片手に
それぞれの言語のプロとなれば一人前、という時代があ
ったことなど、フレッシュマン技術者は知らないでしょ
う。現代では、これは完全に過去のこととなりました。
 現在は、多くのCPUがおなじ高級言語(Cなど)で開発で
き、アセンブラであっても共通の「標準記述フォーマッ
ト」で吸収してしまうようになりました。以前ならアセ
ンブラのマクロ機能によって実現していた部分です。ま
た、たとえばCコンパイラは一旦アセンブラソースを出力
するものも多く、ソースプログラムとしての表面的な違
いほど、実際の部分は変わらなくなっています。この、
「クロス言語系開発ツール」の恩恵は大きいのです。

●より進化したクロス開発環境
 図K-116は、より進化した統合的なソフトウェアのクロ
ス開発システムを示しています。これは概念だけでなく、
(まだ高価ですが)実際に稼働しているものです。人間の
プログラマがシステムに与えるソースだけを見ると、Cや
アセンブラなど、従来とあまり変わりません。
 ところが、Cプリプロセッサやマクロアセンブラから変
換されたアセンブラプログラムが処理される対象は、従
来の開発システムのようにそれぞれ特定のCPUのデータと
して持っている「参照表」でなく、「標準化されたCPUモ
デル」のデータベースなのです。この特長は、既存のCPU
だけでなく、新しいCPUのデータでもオリジナルのCPUで
あっても、チップの特性を標準フォーマットで記述(定義)
すると「アセンブラが自動生成される」ところです。

●言語はあくまで思考の道具
 このようなシステムがサポートするソフトウェア開発
とは、プログラミング言語に縛られない、より本質的な
システム設計作業になっていくことになります。これは
開発ツールの支援のもとで、より「創造性勝負」の時代
になっていくことを意味しています。

\section*{117. ユーティリティの活用とファイル変換}

●テキストファイルとユーティリティ
 パソコンによるシステム開発環境では、いろいろなテ
キストファイルとして、エディタを最大のツールとして
  ・ソースプログラム本体
  ・各種ドキュメントファイル
  ・(インテルHEXなどの)ROMデータファイル
などを扱います。(図K-117)
 また、最近のソフトウェア開発ツール(コンパイラやリ
ンカ)なども、Unixと同様のテキストファイルベースの中
間ファイルを用いるものが多くなりました。処理中だけ
存在して消去されるテンポラリファイルですが、拡張子
が「$1$」「_$_」「$$$」など、普通は使われない名前で
たくさん生成されています。

●バイナリファイルとユーティリティ
 また、多量のデータをまとめて扱う場合には、1バイト
の8ビットをフルに使用したバイナリファイルも使われて
います。いろいろなファイルを変換するコンバータソフ
トを自分で製作する場合、1バイト入出力の処理はバイナ
リファイルの方がずっと簡単です。なお、MS-DOSの内部
/外部コマンドでバイナリファイルを読み書きしようと
すると、「ファイル終了コード(1Ah)」でファイルが終わ
ってしまいますから、注意しましょう。

●いろいろな特殊形式ファイル
 この他にも、特殊形式ファイルとして
  ・特定サイズのバイナリデータをヘッダとして持つ
  ・各データファイルのディレクトリ情報を持つ、特
   別のインデックスファイルを使った間接アクセス
  ・ワープロのような1バイトごとのアトリビュート
  ・暗号化された圧縮ファイル
などがあります。
 面白いと関心したデータファイルに、中身は完全にテ
キストデータなのに、先頭に1バイトだけ「1Ah」を置い
たファイルがありました。うっかりとテキストエディタ
で変更できないのに、容易にエディットできるのです。

\section*{118. ROMライタとメモリ媒体の検討}

●パソコンによるマイコンシステム開発
 簡単な組み込み用途のマイコンシステムでは、図K-118
のようにパソコンを用いた開発システムを用いるのがも
っとも一般的です。ここでは、パソコンは
  ・ソースプログラムの開発(エディタ)
  ・プログラムの機械語化(コンパイラ、アセンブラ)
  ・シミュレーション、デバッグ
と一人何役もこなして活躍します。また、このような複
数の処理をできれば並行して実行したい、という要請に
応えて、EWSベースでさらに充実した環境もあります。

●パソコンからターゲットシステムまで
 開発パソコンとターゲットシステムとは、RS-232-Cな
どを介して、
  ・パソコンICEによるインサーキット・デバッグ
  ・ROMエミュレータによるデバッグ
  ・EPROMライタによるプログラム実験
  ・オンボードモニタ利用によるロード・デバッグ
といった色々な手段によって、実機にプログラムが移植
されていきます。
 パソコンICEによるデバッグはもっとも強力なシステム
で、ホストパソコンではC言語のソースレベルでブレーク
ポイントを設定できたり、豊富なトレース機構によって、
十分なデバッグを支援しています。
 最近のCPUはフラットパッケージ化などによってICEの
プローブとの相性が悪くなっているために、プログラム
ROMソケットに「ROMプローブ」を挿入してエミュレーシ
ョンする「ROMエミュレータ」がいろいろと充実してきて
います。単なるプログラムロードだけでなく、ターゲッ
トCPUに「裏モード」としてモニタを実行させてICEのよ
うにデバッグを支援させるものも多くなっています。

●ターゲットCPUのメモリを考える
 このように開発システムが進化していくと、ターゲッ
トCPUのメモリについても、「ICカード」「オンラインで
もらう」「RAMバックアップ」などの発想が広がります。

\section*{119. バージョンアップはどうするか}

●誰もが関係する「バージョンアップ」
 システムが複雑・高度化するほど、ある製品が永遠に
「完成」して静止することなく、ハードにしろソフトに
しろ「バージョンアップ」が宿命になります。エンジニ
アの場合には、図K-119のように、
  ・自分の生み出したシステムのバージョンアップ
  ・使っているツールがバージョンアップされる
という両面から関係するために、ある基本姿勢を貫くこ
とが「仕事のモラル」としてきわめて重要です。

●「する」バージョンアップ
 まず、自分が開発に関与したシステム・製品のバージ
ョンアップについてです。これには「プラス方向」の
  ・機能向上・機能追加などのスペック強化
  ・採用してくれているユーザへのサービス(無償)
  ・対応してさらに登録するユーザの囲い込みと把握
という積極的なものと、「マイナス方向」の
  ・バグや不具合の発見による回収・修正
  ・事故・不良など具体的なPL(製造物責任)の対応
  ・競合製品に負けた実質的値下げ(マイナチェンジ)
などもあり、技術者としてはあまり面白くないようです
が、いずれもビジネスとして重要なものです。
 ここで重要なのが、「知的財産権」「PL」「地球環境」
などの本質的・グローバルな視点で、物事をエンジニア
リングの狭い視点からだけ見るのは失格となります。

●「される」バージョンアップ
 これに対して、エンジニアとして日々活用しているツ
ール(ハードもソフトもサービスも)がバージョンアップ
される、という突然の事態にも多く遭遇します。ここで
も、「プラス方向」の
  ・「機能強化」(有償バージョンアップ)の案内
  ・ユーザ登録によるサービス/有償メンテナンス
などの判断に悩むアナウンスと、「マイナス方向」の
  ・ソフトウェアツールのバグ・ハードウェアの故障
  ・バージョンアップ通告(登録しないとサポート停止)
  ・ハードウェアの保守打ち切り・製造中止
などがあります。不正コピーなどせずに、正規のユーザ
登録をきちんとしている誠実な姿勢が対応の基礎です。

\section*{12. ROM:意外な利用法をさがそう}

●ROMのデータとして何を格納するか
 マイコンシステムでは、CPUのプログラムやデータを格
納するためにROMを使います。メモリに置かれたプログラ
ムを次々に参照して動作するのはノイマン方式コンピュ
ータの基本ですが、ここでは「それ以外」を考えます。
 図B-12(a)は、EPROMを「多数のDIPスイッチが入ったチ
ップ」と見なしたものです。基板上に置かれていろいろ
な設定を行う8ビットのDIPスイッチが、27256であれば、
なんと32768個も自由に選択できることになります。もち
ろんこのままでは「同時に」使えないのですが、逆に言
えば「あらゆるスイッチの状態の組み合せを用意できる」
ことにもなります。

●データテーブルとしてのROM
 ROMは、なにもCPUバスに接続しなければいけないもの
ではありません。ディジタル回路の中で一種の機能素子
として使うことも可能で、もっとも多い使用法としては
「データテーブル」として活用されます。
 たとえば、周期波形データを記憶させたROMのアドレス
としてカウンタ出力を与えると、データバスには周期的
な信号が出力されますから、これをD/Aコンバータで変換
すれば、簡単な信号発生器とすることができます。
 周期信号でなくても、アドレスバスを適当なビット数
に区分して、それぞれ別個のデータ入力としてみると、
図B-12(b)のように一種の「演算回路」として、一瞬にし
て入力データに対応した出力を得られる演算回路を構成
することもできます。家電製品の「ファジイ制御」の多
くは、このようなファジイデータテーブルを参照するこ
とで実現されています。

\begin{verbatim}
●EPROM・EEPROMを活用する
 従来は紫外線消去タイプのUV-EPROMが多かったのです
が、最近はオンボードで書き込み・消去が可能なEEPROM
がいろいろと登場し、ますますCPUプログラム以外での活
用領域は広がっています。ROMというのは、アイデア次第
では、もっと面白い使い方がありそうな宝庫なのです。

\section*{120. フレキシビリティの考え方}

●多品種/類品種生産の時代
 従来型の「大量生産・大量消費」ビジネスは、価値観
の多様化による消費行動の変化とともに、地球環境の視
点からも嫌われる時代となりました。これからは厳選さ
れ納得された製品が、ユーザに広く長く受け入れられる
という「本物の勝負」の時代なのです。
 ところで、ニーズ指向でもシーズ指向でも、エンジニ
アの生み出すシステム・製品が必ずしも全てヒットする
というものではありませんから、
  ・ユーザの要求に合わせて軌道修正できる
  ・モデルチェンジで製品寿命が長く生きられる
といった作戦を、システム自体として最初から考慮して
いく技術が重要になります。

●フレキシビリティ
 このような考え方は、システム設計において「フレキ
シビリティを盛り込む」というポイントとなります。具
体的には図K-120のように、
  ・多品種生産に適する機能のソフト化
  ・ハードやソフトのモジュール化
  ・仕様・設計の標準化と自動化
  ・スペック/システムの分割・組み合せ・再構成
といったいろいろな技術を駆使することになります。
 その昔「電子ブロック」というオモチャがありました
が、エレクトロニクスシステムのハードウェアだけでな
く、ファミコン感覚でソフトウェアさえも「標準部品」
化して、組み合せの自由度で勝負するのです。

●システムアップもフレキシビリティの一種
 そして、社内・業界内・異分野などのいろいろなシス
テムと組み合わせてシステム化できる自由度、というの
も一種のフレキシビリティとなります。
 たとえば、家電製品・電話関連機器・事務機器・パソ
コン・ゲーム機などと組み合わせることで新しい付加価
値や楽しみ方を提供できるシステムは、それ自身のフレ
キシビリティを活用して時代とともに生きていけます。


\section*{121. 製品のライフサイクル}

●ライフサイクルを最初から考える
 メーカが製造・生産する製品には、ソフトウェアを含
めてそれぞれの「寿命」があり、設計エンジニアにとっ
て「ライフサイクルを考えた設計」が強く要求される時
代になってきました。
 図K-121は、一般的な工業製品のライフサイクルの流れ
の中で、特に「地球環境」の視点を強調した見方です。
ここでは各種の「廃棄物(ゴミ)」として、
  ・生産に必要な材料・部品の容器・梱包材
  ・生産時の余り材(P板・線材・リード線など)
  ・検査落ち・製造ミス・規格外の廃棄品
  ・製品出荷時の過剰な梱包材・マニュアル類
については、メーカの努力によって改善されるものと一
般に考えられており、従来の無駄を続けることは非難の
対象になりかねないものです。つまり、これらの無駄を
最小限に抑える、あるいは抜本的に除去できるような計
画と設計が、最初の段階から求められているのです。

●製品そのものにも向けられる目
 また、このような資源尊重の考え方は、製品そのもの
についても重視されてきています。たとえば、
  ・機能そのものの消費材(紙・インク・線材など)
  ・消費電力(特にスタンバイ時のローパワーモード)
  ・製品そのものが「ゴミ」となった時の処分
などが話題になっており、メーカによる回収体制、製品
内部の危険物・化学汚染物質の回収義務などが検討され
ています。
 このような発想は、従来の工業社会中心・成長神話時
代にはほとんど省みられなかったものです。

●「捨てるための製品開発」ができるか?
 ここでのポイントは、反語的な言い方になりますが、
「捨てるために作る設計」です。いくら素晴らしい機能
の製品であっても、そのまま22世紀まで100年以上使われ
て行く製品は、おそらく絶対にないのです。効果的に捨
てることができる、というのも付加価値なのです。

\section*{122. ソフトのコストと外注のリスク}

●「ソフトは外注に」を考える
 コンピュータ能力・ソフトウェア開発環境の整備され
ていなかった時代には、組み込みマイコンのソフト開発
にしてもパソコンソフトの開発やオンラインソフトの開
発にしても、
  ・修得に時間のかかる開発言語・開発環境のプロ
  ・仕様変更とスケジュール的に無理がきく
  ・CPUの能力を引き出すノウハウを持っている
などのメリットで、ソフトウェア開発を外注ソフトハウ
スに依存することも一般的でした。
 しかし現在では、事務会計ソフトウェアシステムの世
界で言われる「エンドユーザ・コンピューティング(使う
者がシステムを作る)」とは別の意味で、エンジニアリン
グ分野のソフト外注を再検討する時代になっています。

●外注ソフト開発のメリット
 図K-122のように、ソフトウェア開発を外注するメリッ
トとしては、
  ・短期集中開発スケジュールに向く(外注いじめ)
  ・社内要員のプログラマよりもコストが安い
  ・システムの一部を切り分けて効率化をはかる
というポイントが注目されてきましたが、中小ソフトハ
ウスでも優秀なプログラマの人件費はかなりの水準にな
ってきています。
 当然といえば当然のことですが、本当に外注のメリッ
トを生かすためには、全体のシステム開発マネジメント
が適切に計画・実施されることが必要条件なのです。

●外注ソフト開発のデメリット
 あらゆる意味のソフトウェア開発環境の進展は、外注
利用の最大のデメリットである「技術力の発展・蓄積が
ない」という点をより鮮明にしています。言い替えると、
ある程度の開発支援環境を活用すれば、新人でもそこそ
このプログラムを簡単に作れる時代になっているために、
外注依存でノウハウが蓄積されないよりも、自社スタッ
フでのソフト開発が見直されているものです。

\section*{123. バグの分類と検討}

●バグ退治は相手を知ってから
 マイコンシステム開発にはつきものの「デバッグ」と
いうと、開発スケジュールの終盤に徹夜の連続でICEやロ
ジックアナライザと首っぴきでの作業、というイメージ
があります。これはある程度の真実でもありますが、シ
ステムの複雑さとソフトウェアの規模が巨大化した時代
には、このような「ザルですくう」「現物合わせ」的な
デバッグでは意味がなくなりつつあります。
 そこで図L-123のように、冷静に相手である「バグ」を
分析・考察して、系統的・効率的なデバッグを目指して
いきましょう。なお、ここでは「論外のバグ」について
は触れません。

●「普通のバグ」への対応
 ハードウェア、ソフトウェアそれぞれに関連した、あ
るいは両者が関係することで発生する一般のバグについ
ては、デバッグ支援環境の活用がもっとも重要です。こ
れは従来のデバッグ段階のより上流(開発段階)で、
  ・ハードウェアシミュレータによる設計時テスト
  ・エミュレータによる実験・実機テスト
  ・ソフトウェアシミュレータによる論理テスト
  ・プログラム開発ツールの自動検証機能
  ・エラー処理自動生成ツールの活用
などにより、人間の単純ミスや見落としをフォローする
もので、特にリカバーに時間のかかるハードウェア関連
のミスを事前に押え込むものとして重要です。

●「困難なバグ」への対応
 数学的原理や物理的(不確定性)原理などによる「困難
なバグ」については、ほぼお手上げです。これはアルゴ
リズムの設計段階、あるいはシステム設計の段階での問
題ですから、デバッグの対象ではありません。
 ただし、「極端に頻度の少ない事象」についてのバグ
は、いろいろなテスト手法(後述)を駆使して「頻度を上
げて実証する工夫」という可能性がありますから、デバ
ッグへの挑戦の余地があります。

\section*{124. 「2次災害」の分析とデバッグ}

●プロの対象とするバグは「2次災害」
 ここで考えるキーワードは「2次災害」です。システム
のデバッグ作業において、
  ・設計上の弱点として最初から気になってきた点
  ・これまでの経験から予測されるバグのポイント
  ・テスト項目としてマニュアル化されている検査
などの直接的なデバッグポイントというのは、いわば一
次的な項目です。ここで問題が発見された場合、製品で
は明らかに欠陥となるものであり、このようなバグが最
終製品まで残ることは一般にごく少ないのです。
 プロが対象とするデバッグというのは、この意味では
「直接的に見えない」、つまりシステムが何らかの不可
避的トラブルに遭遇した際に派生してやっと表面化する
バグを相手にすることになるのです。

●大規模コンピュータシステムに学ぶ
 そこで図L-124のような、オンラインシステムや汎用大
型計算機のような大規模コンピュータでの、「災害対策」
マニュアルが大きな参考となります。
 ここでは1次災害として、不可避的な天災や事故を想定
していますが、マイコンシステムのような小型機器であ
れば、たとえば
  ・運搬中の落下・衝撃によるシステムへのストレス
  ・ケーブルをひっかける、コーヒーをこぼす、等
  ・操作法を知らない者がでたらめにパネル操作する
などの身近なトラブルに置き換えて考えられます。

●本当に重要なものは
 このようなトラブル対策を検討していくと、ハードウ
ェアや磁気記憶メディアが物理的に破壊されることの防
止、などといった当然の対策を除けば、対策の本質は
  ・記憶されている「情報」が失われる
  ・記憶されている「情報」が変わってしまう
という事態を避けるための方策であることがわかります。
システムを自動リセットできればいいのではなく、情報
が絶対に失われないことが究極の目標なのです。

\section*{125. デバッグ環境は作り込んでおくもの}

●場当り的なデバッグは効率が悪い
 一般にデバッグといえば「相手が決まっていないから、
その場その場で柔軟に対処する」こととされています。
もちろんこの原則は正しいのですが、次々と発見される
トラブルにいちいち実験・検証・対策のハードやソフト
を用意して対応するのでは、いかにテキパキとこなした
ところで、プロの仕事としては効率が悪いものです。
 プロであれば「バグは起きる」「デバッグは必要」と
いう真実を最初から考慮して、デバッグのための「環境」
をシステム開発の段階から作り込んでおきたいものです。
もちろん、最終的な製品になった際に無駄なソフトやハ
ードとならないような考慮も重要なポイントです。

●ハードウェア的なデバッグ環境の作り込み
 図L-125はその具体例で、CPUを中心とした一般的なマ
イコンシステムに用意できる「デバッグ環境」を示して
います。
 まずCPU周辺では、プリント基板のパターンとして「テ
ストピン」のランドを持ちたいところです。CPUの外部リ
セットやシステムバス信号・クロックなどで、デバッグ
時にだけピンを取り付けて使用します。
 また、入出力ポートや通信ポートにも、デバッグ時に
だけ部品を取り付けるテストピン・ジャンパ・コネクタ
の領域を用意します。基板スペースの限度はありますが、
実際の生産時には何もしないパターンですから、設計の
最初から考慮していればかなりの密度で置けます。

●ソフトウェア的なデバッグ環境の作り込み
 ソフトウェアに関しては、プログラムメモリにそのま
ま残しておいてデバッグ時に利用する場合と、コンパイ
ル/アセンブルオプションとして本番では使わない場合
とありますが、メモリに余裕があれば前者がおすすめで
す。デバッグ用のサービスルーチンをBIOS的に用意する
ことと、RAMにいろいろなステータス情報をモニタ用に置
いておくことが中心となります。

\section*{126. 「デバッグ曲線」の教訓}

●経験則グラフの意義
 論理的で物理法則に従ったエレクトロニクスの分野で
は、なかなか「人間の経験則」などという理屈で割り切
れないものを信じないところがありますが、およそ人間
のすることには、打ち勝てない真実があります。
 たとえば、図L-126(a)の「バスタブ曲線」と呼ばれる
グラフは、一般的な工業製品のライフサイクル中の信頼
性を検討する際に用いられるものです。縦軸の故障率は、
横軸の時間に対して、最初に「初期故障」として高い値
からスタートして次第に減少し、個々の部品の劣化など
による「寿命」によって故障率が再び上昇するまで、安
定な期間があります。この事実は、現在でもマイコン機
器を含む多くの製品によって確実に証明されています。

●デバッグ曲線
 そして図L-126(b)のように、ソフトウェアのデバッグ
に関しても有名なグラフ「デバッグ曲線」があります。
これは横軸にデバッグ期間、縦軸に発見・対処されたバ
グの件数を記録したもので、どんなに頑張ってバグを発
見して曲線の傾きを大きくしても、飽和するまでには一
定の時間がかかり、発見した件数に関わらずバグは絶対
に残っていることを示しています。
 もちろん「手抜きデバッグ」はグラフがなかなか上昇
しない論外のものですが、効率よくバグをつぶしていっ
ても、曲線が飽和するまでは「まだ存在している筈」と
いう経験則は、実際にデバッグに直面している身とすれ
ば悔しく思うものです。しかし、これも真実です。

●「デバッグの終了宣言」がもっとも難しい
 このグラフからわかるように、ある程度のデバッグ期
間を経て、バグ発見の件数がほぼ飽和してきたあたりが
重要なポイントになります。
 完全にデバッグを尽くして実際に完成度が飽和してき
たのか、デバッグ手法に抜けがあって特定の種類のバグ
を発見できない(作戦変更の必要あり)なのか、という判
断とともに、プロジェクト進行の山場となる判断です。

\section*{127. テストと境界値分析}

●「正しい」ことを検証するデバッグ
 デバッグでは「異常動作を捜す」だけでなく、「正し
い動作を確認する」ことも重要な作業です。図L-127(a)
は、CPUソフトでよくある「数値判定ルーチン」の仕様で、
入力データに値によっていろいろな動作に分岐し、値が
所定の範囲になければ「何もしない」「エラーメッセー
ジを表示」という処理を行うものです。
 このような動作を実現するプログラムというのは、プ
ログラマによって何通りにも記述でき、同じ人でもCPUや
言語処理系によっていろいろに表現するものです。

●予想できる値だけでは見落とすケース
 ところが図L-127(b)のように、このようなアルゴリズ
ムを実現する手法には盲点もあります。図のケース1では
入力データをいちいち所定の判定値と比較していますか
ら問題ありません。ところがケース2のように、「入力デ
ータをそのままジャンプベクトルのオフセットの使う」
という、アセンブラで活用される高速処理テクニックを
使うと、思わぬバグを仕込んでしまったことになります。
 ここでは、あらかじめ規定されている条件値とか、範
囲外として前後の数をテストしていると問題が表面化し
ないところが厄介ですが、まるで規定外のデータが入力
された場合、予想しないエリアに暴走してしまいます。
入力データを一定範囲内に丸めこむ処理を省略してしま
ったためのバグということです。

●境界値分析とは
 このようなデバッグでのテストでは、入力データとし
てやみくもに無作為な値を試したり、乱数によって入力
を試すことはあまり意味がありません。アルゴリズムを
検討して、判定処理の前後(境界)の値、そして大小のリ
ミット一杯、さらにゼロ値やバイナリのフルビットデー
タなど、適切なデータを試すことが必要です。
 境界値分析の手法は、数学的・工学的に整理されたも
のですから、正しく理解して「適切で効果的なテスト」
を心がけるようにしたいものです。

\section*{128. パソコンICEの活用}

●エミュレータとしてのパソコンICE
 専用機に代わってマイコンシステム開発の主流となっ
たパソコンICE(ここではEWS対応版も含む)ですが、もっ
とも中心となっているのは文字通り、エミュレータとし
ての使い方です。
 基本的には図L-128(a)のように、実機システムのCPUソ
ケット部分にCPUプローブを差し込むスタイルをとります
が、最近では図L-128(b)のようにフラットパッケージの
CPUにも対応できるようになってきました。この場合、CPU
の部分に専用のコネクタ用パッドマウンタを直接ハンダ
付けしてしまいますから、接触不良もありません。

●デバッガとしてのパソコンICE
 エミュレータとして「正しい動作を確認する」だけで
済めばいいのですが、何らかのトラブルを追いかけるデ
バッグ作業が不要であることは皆無で、ICEの最大の機能
であるデバッグ機能はフル稼働しています。
 パソコンICEでも、ブレークポイント設定やI/Oポート
のトリガ機能などが充実していて、コンパイラ/アセン
ブラと一体になっている開発システムのメリットを生か
した「ソースレベルデバッグ」機能を提供するシステム
も多くなりました。

●アナライザとしてのパソコンICE
 出現頻度の低い現象や、複雑な原因のからんだ現象を
解析するのに重要なのが、デバッガ機能の拡張と考えら
れる「ロジック・アナライザ機能」です。
 ここでは、アドレスバス・データバスの状態(履歴)を
トレース・ロギングして現象を解析する機能や、疑似的
にI/Oポートを制御して動作を追跡する機能などもありま
す。パソコンのRAMディスクや拡張メモリ、さらに大容量
のHDエリアをデータ収集エリアとして活用し、膨大なデ
ータを収集できるシステムも活用されています。これは、
いわばパソコンをロジック・アナライザとして活用して
いることになり、簡単なツールを作ることで相当の解析
を行うことを可能にします。

\section*{129. RAMエミュレータの機動性}

●EPROMの機動性をさらに拡大する
 マイコンシステムの開発・デバッグ、それもフィール
ドにおける修正・テストの領域では、最近のコンパクト
なEPROMライタが大きく活躍しています。ノートパソコン
とともに現場に持参してEPROMをプログラムして差し替え
る、というのは従来の開発環境のフィールドを大きく拡
大したものと言えます。
 ところで、このように便利なEPROMベースの修正・テス
ト環境をさらに強化するツールが「RAMエミュレータ」で
す。これには大きく2つのタイプがあります。(図L-129)

●ROMソケット挿入型バックアップRAM
 第一のタイプは、EPROMライタでROMとして書き込むも
ので、パソコンからROMライタを経由して書き込むまでは
EPROMとまったく同様です。具体的には、ターゲットシス
テムのROMソケットに挿入するためのICソケットの部分に、
バッテリバックアップされたRAMを持っているもので、紫
外線消去EPROMの最大の欠点である「消去」段階を省略で
きるものです。
 手軽に持ち運びでき、バッテリは2週間程度はデータを
保持できるため、フィールド保守に活用されています。

●インテリジェントタイプ
 第二のタイプは単なるバックアップRAMではなく、CPU
を内蔵したインテリジェント方式のもので、ホストのパ
ソコンからはRS-232-CなどでインテルHEX形式のプログラ
ムを直接転送できます。この場合、単純にダウンロード
するだけであれば、EPROMプログラマの仕事までRAMエミ
ュレータがこなしてしまうので、ノートパソコンとの組
み合せは非常に強力な機動性を生み出します。
 具体的には、
  ・ROMソケットの上に箱状の全体がある一体型
  ・ROMプローブと通信ボックスの分離したもの
の2タイプがあるようですが、いずれも低価格でシンプル
な機能を提供し、「外に出た開発・テスト環境」をサポ
ートしてくれます。

\section*{13. RAM:バリエーションを活用する}

●多重ラッチからRAMへ
 ROMと並んでCPUシステムにRAMは必須のものですが、こ
こでも通常の「データメモリ」以上の使い方を考えてみ
ます。ROMとRAMの違いはライト信号WRにありますから、
「データを自在に書き換えられる」「データを一時的に
格納できる」部分が活用の第一ポイントとなります。
 現在ほどメモリが大容量・低コストでなかった時代に
は、システムの多くの情報はラッチ(フリップフロップ)
に格納されましたが、これがASICなど多重アドレス・大
容量データ化した部分には、図B-13(a)のように積極的に
メモリへと置き換えられています。RAMを多数のラッチと
見なす、という視点の展開は応用の最初の一歩です。

●同期回路にはFIFOメモリを
 また、多くのディジタル回路はシステムクロックに従
った「同期動作」を行っていますから、ここでも従来の
シフトレジスタを多数のビットに多重化してものとして、
「FIFOメモリ」タイプのRAMを活用できます。
 ここでは、本来のランダムアクセス性を使わない代わ
りに、パイプラインのように大容量のデータを単純なク
ロックによって処理することができます。

●デュアルポートRAMはシステム間通信の秘密兵器
 スタティックRAMのニューウェーブであるDPRAM(デュア
ルポートRAM)は、中核であるメモリ素子に完全に2組のア
ドレシング回路と入出力回路を持ったものです(図B-13(b))。
ここでは、それぞれのポートから自由なタイミングで自
由にメモリセルをアクセス(書き込み・読み出し)できる
のですが、たまたま同一アドレスに対する書き込み要求
が発生した時だけ、優先回路によって一方だけを有効に
しています。
 このようなDPRAMのメリットは、CPUシステムとDSPシス
テムのように、異なったクロック・同期関係で動作する
2つのシステムを自由にインターフェースできる点にあり
ます。特別なシステム間通信を必要としないため、多く
の高速システムでDPRAMが採用されています。

\section*{130. システムの保守性を考える}

●システムの情報は開発する時だけのものではない
 マイコン技術の進展は日進月歩でなく分進秒歩ですか
ら、「あるシステムの開発に関係した情報は、年月が経
てば陳腐化して必要ない」という理屈があります。それ
でなくても日々の開発業務に追われて、わかっていても
「ちゃんとしたドキュメント化」ができないのがエンジ
ニアの常でしょう。
 しかし、PL問題や製品開発後のトラブル対策では、か
なり昔の製品についての調査・対応が必要になる場合も
多いものです。この時の「保守性」は、システム開発の
アプローチによって決定的に異なってきます。

●ハードウェアの保守性
 たとえば図L-130のように、ハードウェアの保守性とし
てよく問題になるのは、
  ・特殊な部品のために廃品種となると対応できない
  ・初期ロット後はプリント基板のマスタが行方不明
  ・設計者自身も数年前の回路図はよくわからない
  ・記録されていないノウハウ的な回路で内容不明
などという笑えない「事件」で、場合によっては解析す
るよりも新規開発して無償交換した方が低コストとなる
ことも多いのです。
 これは、特にシステムハウスなどの特注開発・少量多
品種開発において見られる傾向のようです。

●ソフトウェアの保守性
 人間の記憶力が頼りになるソフトウェアの保守性とい
うのは、ハードウェアよりもさらに始末におえない性格
があります。プログラムを書いた本人でも、半年もすれ
ば自分のプログラムが読めなくなるのは一般的なことで
す。ここではひたすら「ドキュメント化」がポイントと
なり、読まれるプログラムを意識して開発します。
 また、開発環境のバージョンアップの際に、古い環境
をあとあとの保守のためにバックアップしておくことも
大切な「技術」です。ただし、開発用ハードまでは保存
しきれない、という限界があります。

\section*{131. 隠しモード/裏モード/テストモードを仕込む}

●マイコンシステムはソフト次第
 ファミコンゲームでで話題になる「裏技」には、
  ・プログラムのバグをユーザが裏技として発見する
  ・プログラム開発用の「裏モード」が発見される
  ・未公開でわざと仕込んだルーチンの「発見」
の3通りがあります。このように、マイコンシステムの動
作はすべてソフトウェア次第ですから、本来の機能とは
別の世界の可能性も大きいのです。
 システムの開発・保守の都合で意図的に「テストモー
ド」を仕込んでおくのは、プロの世界ではごく一般的な
ことですが、このエントリ方法が問題となります。誰に
でも簡単に入れるのでは「故障」と言われかねません。

●裏モード・隠しモードのいろいろ
 そこで、図L-131のようないろいろな方法で、「一般の
ユーザは気付かないのに簡単に入れる」テストモードの
エントリ方法が採用されています。
 もっともポピュラなものは「電源ON時に」何かする、
というもので、あるスイッチを押しながら電源を入れる
とパラメータがファクトリプリセット値に戻るとか、パ
ソコンのシステムブート処理が有名です。
 また、「同時にいくつかのスイッチを押す」というの
も、パソコンのホットスタートに多い方法として採用さ
れています。ここでは「定石」として、間違って同時に
押してしまわないように、かなり離れたスイッチを意識
的に選択しています。

●通信ケーブルによる特殊モード
 マイコン機器にRS-232-Cやセントロニクスのような通
信インターフェースが装備されている場合には、もっと
複雑なエントリ方法をとれます。たとえば工場出荷時の
自己検査モードのために「RS-232-C出力を入力に戻す」
というコネクタを作ります。電源ON時に所定の暗号デー
タを出力して返ってくれば、テストモードと判定して所
定の自己自己診断・自己検査を行う、というなかなか美
しいシステムです。

\section*{132. RS-232-Cによるフィールドデバッグ}

●RS-232-Cの活用法
 パソコンやワープロをモデムと接続するインターフェ
ースとして、図L-132(a)のRS-232-Cは一般的にまだまだ
活躍しています。低水準の通信規格でありながら、相手
の機器を選ばない一般性が最大のメリットで、マイコン
機器のシステム開発側としても、
  ・ドライバ・BIOSなどのソフトウェア資産が豊富
  ・UARTのLSIによってシステムの開発負担が少ない
  ・専用インターフェースICで回路的にも簡単
  め特殊なコネクタでないために一般性がある
などのメリットは大きいものです。

●フィールドデバッグ
 エレクトロニクス機器が「製品」として出荷されてし
まってからの最大の弱点は、フィールドで故障の診断を
する場合に、開発環境のような恵まれた機器を揃えにく
い場所がほとんどで、テスタやオシロではあまり手が出
せないところにあります。
 そこで、図L-132(b)のような、マイコン機器自身が内
蔵しているCPUを診断のコントローラとして使う、という
発想が有効な作戦となります。アナログ回路やメカ部分
に比べて、CPUのディジタル部分は基本的に故障の確率が
かなり低い、という事実がこれを支えています。「フィ
ールドデバッグ」と呼ばれるこの機能は重要なものです。

●RS-232-Cによるフィールドデバッグ
 この機能は、システム開発の段階から「仕込んで」お
くことがポイントです。たとえば、
  ・基板上にデバッグモード判定のジャンパを置く
  ・ROMプログラムの一部としてのデバッグルーチン
  ・RS-232-C経由で診断・モニタするホスト用ソフト
  ・電源ON時にデバッグモードか否かを判定する
などの機能は、本来の仕様に対してあまり邪魔にはなら
ないように設計できます。
 そして、フィールドではノートパソコンに組み込んだ
診断プログラムによってスマートにデバッグできます。

\section*{133. 市場デバッグとフォローの技術}

●「市場デバッグ」の恐ろしさ
 マイコン機器・エレクトロニクス機器の開発エンジニ
アの間でもっとも恐ろしいデバッグとは、役員の完成製
品評価会でも品質管理担当者の最終チェックでもなく、
市場に出てから初めて表面化するバグやトラブルの報告、
いわゆる「市場デバッグ」の情報です。
 もちろん試作・開発段階でのデバッグ作業は、あらゆ
る可能性を検討して徹底的に行われるものなのですが、
そのような可能性を越えて、不特定多数の一般ユーザが
初めて指摘する、それも故障でなく全ての製品が必然的
にそうなる「明確なバグ」が出るのが常なのです。

●トラブル発生の際の対応が重要
 このようなバグやトラブル発生の際にもっとも重要な
ことは、
  ・問題発生の情報を隠したり否定しようとしない
  ・以下のような速やかな対応をとる
  ・報告者に対する誠意ある・責任ある対応をとる
という姿勢で、エンジニアリングを越えたビジネス全体
の基本的なポイントです。企業活動としてPL問題が重視
されてきましたが、それ以前の「常識」です。
 具体的には、図L-133のような対応をとります。ここに
は技術者が直接関係することだけでなく、PL的な視点か
ら企業行動として必要な項目も入っていますが、このよ
うな「行動メニュー」をエンジニア誰もが知っているこ
とは、システム設計の上からも重要なポイントです。

●行動計画は時間軸とともに
 具体的なトラブル対策の行動指針は、時間軸で整理する
とスッキリします。「市場デバッグ」によって問題が発覚
した「現在」だけでなく、過去にも未来にも広がる領域が
あるのです。
 基本は「原因の追求」「的確な対応策」「対策の実施」
「社会的責任(告知・報告)」といった項目と、それぞれ
の時間軸との組み合せの数だけあります。このような事
態を避けるためにも、社内デバッグを徹底しましょう。

\section*{134. 最終製品となるための試験と検査}

●一般的検査項目と機器ごとの検査項目
 エレクトロニクス機器の試作開発・生産工程などの最
終検査では、図L-134のようないろいろな項目の検査が行
われます。このうち、
  ・物理的・電気的な一般的項目
  ・通信ライン・専用機能などの特殊項目
のいずれに分類されるか、という視点で検査を考えるの
は、単純に羅列するよりも状況が整理されるので、よく
活用されます。
 機器ごとの項目は、機能仕様の検討と密接にリンクし
ていて、仕様を完全に実現していることを確認するため
の最終関門です。一般的項目と違って、この検査の不備
は後でフォローしにくいために注意が必要です。

●一般的項目は電気に関する総合問題
 ほとんどのエレクトロニクス機器・マイコン機器に共
通する一般的検査項目としては、
  ・物理的なストレスへの耐性と破壊される限度
  ・外部からの電気的な各種ストレスに対する耐性
  ・外部の電子機器に悪影響を与えない放出防止策
について、いろいろなポイントから試験・検査が行われ
ます。これは後述する「誤動作対策」「信頼性対策」と
も密接に関係しています。
 いずれにしても電気的検査はあらゆる意味での「信号」
に関連した技術項目で、ディジタル屋であってもソフト
屋であっても、アナログ的ハード技術を要求されます。

●検査を規格通過に利用する
 このような検査項目は、社内で標準化して、FCCやVCCI
のような規格取得と直結させておくことが重要です。ま
た、ISO9000シリーズのような世界標準規格に開発・生産
のシステム全体を適合させれば、検査もマニュアル化さ
れて効率がアップします。
 また、電気屋が敬遠しがちな物理的項目についても、
「システムを軽薄短小にする」ことが特性の改善に大き
く寄与します。(軽い物は落としても壊れにくい)

\section*{135. 誤動作・イミュニティの分類と整理}

●誤動作対策の2つの指針
 エレクトロニクス機器・マイコン機器などの「暴走」
「誤動作」などのトラブルがよく報道されるようになり
ましたが、ここには
 ・他の機器に悪影響を与える(加害者)
 ・他の機器からの悪影響を受ける(被害者)
という2つの基本的な局面があります。(図M-135)
 前者はもちろん重大な責任ですから、エンジニアとし
ては「悪影響を与えない」「悪影響を抑える」ような設
計技術、実装技術、生産技術、検査技術を駆使して、問
題のない製品を出荷しなければなりません。このための
検査基準・規格なども世界中で規定されています。

●イミュニティの重要性
 ところが、後者は「被害者意識」で責任を他に転嫁し
たくなりますが、これも重大な設計上の問題なのです。
外部からの電磁気的な悪影響(電磁波・静電気・ノイズ等)
に対する「耐性」をイミュニティと言い、電子機器のイ
ミュニティの重要性はますます大きくなっています。
 その理由は、あらゆるエレクトロニクス機器がディジ
タル化・マイコン化されているために、日常の空間は発
生源が特定できない電磁波とノイズに満ちあふれている
ためです。そこで、機器の側で誤動作しないことが設計
上の責任となり、PLの視点からも重視されています。

●EMCとイミュニティの対策
 図M-135は、このような電磁的障害(EMC)とイミュニテ
ィについての対策方針の一覧です。個々の内容はさらに
詳述されますが、
 ・誤動作はいろいろな要因から問題が起こる
 ・対策は一つではない
 ・複合的な現象がとても多い
というポイントを十分に理解して、多角的にアプローチ
することが誤動作対策の秘訣となります。

\section*{136. 電圧低下と電源のマージン}

●電源電圧の異常と誤動作
 エレクトロニクス回路にとって、電源は回路動作のエ
ネルギー源・電圧の基準であり、電源の異常はそのまま
システムの誤動作に直結しています。
 図M-136(a)は電源電圧の異常とその影響をまとめたも
ので、基準電圧より電圧が高い場合と、基準電圧より電
圧が低い場合があります。一般に電圧が高すぎる時には
絶対的な素子破壊など致命的な影響がありますが、圧倒
的に頻度が高いのは、電圧が低下して「破壊でない誤動
作現象」を引き起こすものです。

●電源電圧低下の影響
 ICやLSI・CPUなどの半導体素子は、それぞれメーカか
ら規定された「動作保証」の電源電圧があり、これは所
定の誤差範囲内で、つねに確保されているものでなけれ
ばなりません。アナログのアンプ回路の電源であれば、
一瞬だけ+10Vの電源電圧が+8Vに低下しても、すぐに復旧
すればあまり影響はありません。ところがディジタル回
路では、たとえほんの一瞬でも規定電圧(マージン)を越
える電圧低下を起こすと、
 ・CPUにリセットがかかる
 ・CPUが停止/暴走する
 ・データが異常な値に変化する
 ・磁気メディアのデータが破壊される
などの致命的な結果を引き起こします。そして、電圧低
下の現象が再現性に乏しい場合には、「システムのトラ
ブルの原因が不明」という最悪の現象となります。

●電源電圧低下の原因
 図M-136(b)に示したのは、電子回路システムの電源電
圧が低下する原因として代表的なものです。電圧低下は
それだけがシステムトラブルの原因となるばかりでなく、
 ・ノイズマージンの低下
 ・異常信号を外部に出す
という2次的なシステムトラブルの原因となりますから、
周到に原因をつぶすことが重要です。

\section*{137. 停電と瞬停}

●AC電源電圧の異常
 システムが乾電池駆動やバッテリだけによるものでな
い限り、商用AC電源は電子機器の電源として今後も重要
であることに変わりありません。ところが、最近では非
常に頻度が低下しているものの、図M-137のようなAC電源
電圧の異常というものは存在し、頻度が低下しているだ
けに「何も起こらないこと」のための設計技術が重要に
なっています。
 AC電源の異常としては、
 ・いわゆる停電(数秒−数時間)
 ・「瞬停」(瞬間停電)
の2種類が代表的です。瞬停とはその名のとおり、交流の
半サイクル、あるいは1サイクルの期間だけ電圧がゼロに
なるような特殊な停電で、この現象は再現性が乏しいた
めに、システム側の対策がより大切なものです。

●停電の現象と対策
 一般の停電では、数秒を越えれば電源回路の出力電圧
が明らかに低下しますから、CPUリセットやパソコンのリ
ブート、さらにはアクセス中の磁気メディアのデータ破
壊に直結します。
 この対策としては、いわゆる「無停電装置」による電
源のバックアップが唯一の自衛策となります。この意味
では、ノートパソコンは内蔵バッテリで常時自衛してい
ることになります。

●瞬停の現象と影響
 人間が現象をとらえられる停電よりも厄介なのが「瞬
停」で、突然にシステムがハングしたのに使っていた人
間が自覚できない、といった事例も多いものです。
 瞬停の場合、ディジタル回路の電源などは平滑回路で
電圧変動をバッファリングしていますから、あまり影響
はありませんが、電源容量の少ないシステムではCPUリセ
ット条件まで電圧が低下する場合があります。
 また、時計のようにAC電源の周期を時間的な基準にと
っていると、時間基準の誤差や誤動作の原因となります。

\section*{138. ACインパルスノイズ}

●ACインパルスノイズとは
 家庭用コンセントでも、工場・オフィスのコンセント
でも、商用AC電源のコンセントというのは、図M-138のよ
うに屋内配線で電源ラインが並列接続されています。こ
のようなコンセントからいろいろな電気機器・電子機器
が電源をとるために起きるのが、ACインパルスノイズに
よる誤動作のトラブルです。
 AC電源をそのままの電圧で使用するようなモーターで
は、起動時に大きな「誘導ノイズ」が発生し、ACライン
を経由して電子機器の電源回路、さらに電子回路そのも
のを直撃します。この電圧は、瞬間的には数百Vから数KV
になる場合もあります。

●直接的な影響と対策
 ACインパルスノイズの直接の影響としては、
 ・電源回路の部品に対するストレス(素子破壊)
 ・ノイズによる電子回路の誤動作
 ・データラインへのノイズによるデータの誤り
などがあります。
 このための対策としては、
 ・サージアブソーバのように電圧を抑える
 ・瞬間的現象なので、時間的に平均する
 ・同じデータを2度処理して比較する(エラー訂正)
などのハード/ソフト的な対策を講じます。

●間接的な影響と対策
 ACインパルスノイズの間接的な影響としては、
 ・電源電圧の変動・電圧異常による誤動作
 ・信号ラインへの異常電圧・ノイズ
 ・CPUのリセットやハングアップ
などがあります。この対策としては、一般的なノイズ対
策・誤動作対策の手法がそのまま有効となります。
 ACインパルスノイズに対する耐性が強化されたシステ
ムでは、他システムへの妨害電磁波の放出も少ないのが
一般的ですから、基本戦略のメニューの一つとしてACイ
ンパルスノイズ対策を盛り込んでおきましょう。

\section*{139. 電源高調波電流}

●電源高調波電流とは
 電源高調波とは、トライアックによるAC位相制御電力
(調光)回路や電源入力回路の交流特性動作によって、接
続されているACコンセントを通じて、他にコンセントに
接続されている機器の電源電流に影響を与える一種のノ
イズをいいます。この場合、広義の電源高調波として含
めて考える場合もある「スイッチング電源のインバータ」
の周波数を例外とすれば、発生するノイズ成分はACの周
波数の整数倍成分になるところから「高調波」と呼ばれ
ています。(図M-139)

●電源高調波の現象
 商用AC電源といえば、電力会社が責任をもって一定の
周波数・電圧・変化特性(サインカーブ)で提供してくれ
るもので、電子機器システムにとっては「入力」として
考えられるものだ、という誤った常識を変えるところか
らスタートしましょう。
 エレクトロニクス機器の内部とはいえ、電源回路はAC
ラインと直接つながっているために、ACインパルスノイ
ズや電源高調波については、システムから外部への「悪
性の出力」にもなっているのです。図のように、例えば
トライアック回路によってACラインを位相制御すれば、
急激に電圧変化した部分では、「反作用」として同期し
たノイズがACラインに現れ、コンセントを経由して他の
機器の電源回路に対して影響します。またトライアック
をトリガしているダイアックのパルス成分も現れます。

●規格と対策
 従来はこのような電源高調波の問題はあまり表面化し
ませんでしたが、ヨーロッパを中心に世界的に規格を定
めて規制(IEC)する動きが進んでいます。電磁波放射に関
する規制などと同じように日本で規定されるのも時間の
問題と言われています。
 この現象の対策としては、「直列抵抗」「チョークコ
イル」「トランス」などの受動部品による対策、さらに
積極的に「アクティブ平滑回路」の採用などがあります。

\section*{14. 1チップCPUはプロの味方}

●マルチチップCPUシステムの時代
 最初の世代のCPUは「汎用マイクロプロセッサ」と呼ば
れ、ここでは図B-14(a)のように、メーカが提供する「周
辺LSI」のファミリを組み合わせることで、CPUのソフト
ウェアと周辺LSIの特定機能ハードウェアが効率よく助け
合って、システムを効率的に構築できました。

●1チップマイコンの登場
 ところが、電子機器の制御マイコンのシステムはいず
れも同じような周辺機能を並べること、さらにシステム
の軽薄短小化の流れは、図B-14(b)のような「1チップマ
イコン」を生み出しました。
 1チップマイコンの特徴は、最大公約数的な周辺LSI機
能のブロックをいくつか内蔵し、さらにある程度のRAMや
マスクROMの形でプログラムROMまで内蔵できる点で、文
字通り「1チップで他に何もいらない」システムを実現で
きるところにあります。
 身近なところではパソコンのキーボード、あるいは家
電機器のリモコンやパネル裏の制御回路には、すべてに
用いられていると言ってもいいほどに普及しています。

●1チップマイコンの活用
 秋葉原などの一般向けにはあまり知られていない1チッ
プマイコンですが、これは従来はマスクROMチャージに相
当する量産数量を前提とした、量産メーカの「プロのCPU」
であったためです。
 ところが最近では、1回だけプログラムできるワンタイ
ムPROM版や、外部ROM対応のCPUも多く出回ってきていま
す。この場合、「CPUと相性のいい周辺機能まで内蔵して
いる」というメリットを十分に生かせますから、少量生
産や試作開発においても活躍の場は広がってきています。
 また、CPU内蔵のA/DコンバータやD/Aコンバータ等をシ
ステムの中核要素として積極的に利用することも重要で
す。うまくCPUを選択することで、性能とコストの両方で
メリットを得られることも多いので、CPUの新製品情報は
常にフォローしておきましょう。

\section*{140. 静電気とサージ}

●静電気の恐ろしさ
 エレクトロニクス機器にとって、人体の静電気という
のは非常に恐ろしい脅威となります。たとえば冬場の乾
燥した時期にビリッと静電気の火花を体験した人は多い
と思いますが、それだけで数百ボルト以上はあり、プリ
ント基板の間近であれば破壊・故障の原因となります。
 さらに海外の気象条件はもっとも過酷なもので、絨毯
を革靴で歩いてきた人が電源を入れていないエレクトロ
ニクス機器に手を伸ばしたら、スイッチが入っていない
のにパネルのLEDが全部点灯した、という実話もあります。
それほど、人間は「静電気の発電機」としてシステムに
対する危険な存在なのです。

●空電・雷も恐ろしい
 また、空間を伝わる電磁的ノイズ(空電)や雷激なども、
システムを直撃した場合には致命的な破壊・故障を引き
起こします。このような瞬間的な電圧ストレスを、まと
めて「サージ」と呼んでいます。
 図M-140のように、サージ・静電気はシステムの外側、
具体的には外部インターフェースのコネクタやパネルス
イッチの付近から到来します。電圧のかかる時間はほん
の一瞬ですが、数KVから数十KVの電圧はこの部分の部品
や半導体を損傷させたり、付近のCMOSをラッチアップさ
せたりします。

●静電気・サージに対する対策
 このような静電気・サージに対しては、
 ・サージアブソーバを信号ラインに入れる
 ・グラウンド/シールドを強化する
 ・電源ラインを強化・二段構成にする
 ・外部と接触する部品にはソケットを使う(交換用)
などの対策をとります。
 対策に対する具体的なテスト・検証には、「静電気シ
ミュレータ」という検査装置を使います。これは高電圧
を充電しては放電ガンで火花を飛ばすもので、試験に際
には十分に広い接地板の上で行います。

\section*{141. 誘導高周波}

●誘導高周波とは
 エレクトロニクス機器で誤動作の原因となる「誘導高
周波」とは、図M-141のように2つの電子機器において、
電波を送信する機器の出力電磁波が相手に悪影響を与え
るものを言います。ここでの「誘導」とは、たとえば機
器のインターフェースケーブルの長さがちょうど電波の
波長の整数倍になって強い影響を受けたり、機器のケー
スやプリントパターンの長さが波長に合って共振するよ
うな現象を指しています。
 もともとアンテナや信号ケーブル同士を並行に置けば、
一種のトランスとして相互誘導による影響がありますか
ら、このような誤動作の原因となる周囲の機器(と周波数
帯域)を予測するのは困難です。そこで、対策としては、
「機器側のイミュニティの強化」しかありません。

●シールド的な対策
 誘導高周波に対する防衛手段としては、もっとも基本
的な対策として
 ・機器のグラウンドを強化し、接地端子をつける
 ・シールドをきちんと取って、ケースで接地する
 ・プラスチックでなく金属ケースを使う
などのシールド/グラウンド対策が有効です。
 すぐ近くに送信機・発信器が置かれるような悪環境下
では、ケースのシールド効果を高めるガスケット(電気的
密閉度を上げる)も使用します。

●周波数領域での対策
 また、回路設計的な視点では、
 ・機器で使用する周波数帯域の信号以外をカットする
  ためにLPF/HPFのフィルタ回路を設ける
 ・使用しない周波数信号を減衰させるパスコン等
 ・使用しない周波数帯域まで周波数特性を伸ばさない
などのアプローチをとります。
 また、周波数領域と表裏一体の関係になりますが、時
間領域の視点から「不要な時間領域まで性能を上げない」
ことも重要です。

\section*{142. 信号ラインのノイズ}

●信号ラインに乗るノイズ
 ここで考える誤動作対策は「データの誤り」に関する
ものです。図M-142のように、ディジタルシステムにおい
ては、ケース内部に
 ・スイッチング電源からのインバータノイズ
 ・システムクロックに由来するクロックノイズ
 ・CPU動作に伴うバスライン等からのノイズ
など、+5VとGNDの間のいろいろな電圧レベルのノイズが
充満しています。
 そして、このようなノイズは、システムから外部に出
力される信号ラインにも乗ってきます。このようなノイ
ズ成分は、出力コネクタ付近で計測できます。

●ディジタルの信号ラインの場合
 具体的に、RS-232-Cのようなディジタルのシリアル信
号ラインについて考えてみると、このような「2値通信」
は一般にノイズに対しては強い性質があります。つまり、
ノイズレベルが信号ラインよりも十分に小さければ、多
少のノイズが乗っても信号はまったく劣化しません。こ
の点では、+5Vレベルのセントロニクスの方がRS-232-Cよ
りもノイズに弱いことになります。
 ただし、最近の傾向である「電源+3V化」など、ノイズ
マージンの小さなディジタル信号ラインでは、マージン
を越えるレベルのノイズは完全にデータを誤らせてしま
うことに注意しましょう。

●アナログの信号ラインの場合
 アナログ信号ラインでは、電圧/電流などの電気信号
データそのものが情報ですから、ここに乗ったノイズは
わずかであっても、そのままデータ値を変えてしまうこ
とになります。
 この場合、システム側でデータを時間的に平均(積分)
することで交流的な変動成分をキャンセルしたり、デー
タを何度か比較することで突発的な変動を無視するよう
にします。時間軸の視点からのこのような対応で、ノイ
ズを浴びながらでも十分な結果を得ることもできます。

\section*{143. 電磁放射対策}

●電磁波/ノイズの2つの伝播経路
 システムから外部に悪影響を与える電磁波やノイズの
防止については、「伝える経路ごとの対策」として、
 ・電波の形での空間伝導
 ・信号線に乗る導体伝導
という2つの経路ごとに、それぞれ異なった最適の対策を
講じる必要があります。(図M-143)
 ここでは特に前者について検討しますが、後者につい
てはいわゆる「EMC部品」によって対応します。(後述)

●見えない電磁波を調べるための方策
 空間伝導の電磁波ノイズは、なかなか実際に視覚化で
きないところが厄介です。ケースを金属にしたり導電性
塗料で塗装したつもりでも、プラスチックのパネル部分
やケースの継目部分から漏れていた、ということもあり
ます。
 見えない電磁波の侵入・放射を調べるためには、
 ・電波暗室で外来ノイズをカットしてきちんと調べる
 ・ケース内に基準発信器を入れて外部への漏出を見る
 ・シミュレーションによって検証する
 ・シールド金属テープを次々に貼っていって比較する
などの手だてをとります。

●「モトから断つ」のが原則
 ある程度システムの開発が進んでから、不必要な電磁
放射を抑えるための対策を講じるのは、あまり得策では
ありません。もっとも基本なのは、「設計時に抑える」
ことで、
 ・システムクロックを不必要に高くしない
 ・パスコンを多用する
 ・グラウンド強化(4層基板の採用など)
といった、もっとも基礎的なノイズ対策設計に忠実であ
ることです。ノイズをあとから「抑える」のでなく、最
初から「出さないように設計」するのがポイントです。

\section*{144. シールドと接地}

●磁気シールド
 エレクトロニクスのシステムでは、図M-144のように、
電子回路にとっては外部の磁界による影響はあまり気に
しなくてもいいのですが、多くのシステムが磁気メディ
アを使用していますから、この点では磁気的なシールド
もとても重要な信頼性技術となります。
 磁力線の一般的な性質として、磁性体を貫通しないと
ころを利用して、磁気シールドのためには鉄製のケース
がよく使われています。機器の軽量化とは矛盾する部分
でもありますが、他の磁性体を含めて、このような防磁
対策はあちこちに実例を見ることができます。

●静電シールド
 磁力線と同じように、周囲に高電圧の物体が存在した
場合の影響を防ぐ「静電シールド」としては、接地した
導体で囲むことになります。よく知られたように、ここ
では完全な金属板でなく、「網(メッシュ)」状でいいた
めに、金属網による防護ケースを構成します。
 また、この静電シールドは同時に外来電磁波の影響を
防ぐためにも使用されます。いずれにしても、十分に低
い接地抵抗によってアースと結びます。

●システム内の接地と外部の接地
 システム内のいろいろな接地としては、
 ・基板内のアナログ・グラウンド
 ・基板内のディジタル・グラウンド
 ・信号ケーブルの外被アミ線
 ・電源ユニットのグラウンド端子
 ・電源ユニットのフレームグラウンド端子
 ・ケースに接続したグラウンド端子
 ・ACプラグの接地端子
などがあります。これらは画一的に接続するだけでなく、
場合によっては敢えて接続しないことがノイズ対策に有
効な場合もあります。

\section*{145. 冗長設計と信頼性}

●信頼性の理論と冗長性
 システムの信頼性についてのもっともグローバルな見
方は、図N-145にあるようなもので、
 ・トラブル/フォールトを基本的に起こさない
 ・トラブル/フォールトが起きてもフォローする
という異なった2つのアプローチからなります。
 前者をフォールト・アボイダンス技術、後者をフォー
ルト・トレランス技術といい、それぞれシステム設計・
開発時と、システム運用・稼働時に重点が置かれている
ところが特徴となっています。
 この中で面白いのは、「冗長なシステムはサービスを
低下させない」という原理で、効率ばかりを追求したシ
ステムが「いざという時」に弱い、という一般的事実と
対応しています。

●冗長システムの無停止運転
 冗長システムによってサービスを低下させない例は、
金融機関のオンラインシステムなど歴史の長いものが好
例となります。この場合、データが消えることがあって
はならないための「ミラーリングディスク」(ディスクの
二重化)、さらにCPUを二重化したデュアルシステム、そ
して3台とか5台のまったく同じ動作をするCPUによる「多
数決システム」など、いろいろな展開を見せています。
 無停止運転のためには、基本的にシステム要素を複数
持たなければならない、というのは自明のことですが、
当然ながらシステム規模とコストがかかります。「リス
ク回避をカネで買う」そのものなのです。

●非冗長システムではプライオリティをつける
 これに対して、基本的にシングルシステムである場合
には、トラブルの際に「どのサービスを低下させて修復
をはかるか」という優先度を設けることになります。
 ここでの視点としては、フェイルセーフの考え方、エ
ラー検出やエラーのリカバリーのためのフェイルソフト
などの技術を駆使していきます。(後述)

\section*{146. フォールト・トレラント・システム}

●フォールト・トレランスの基本
 コンピュータシステムの信頼性向上のための技術とし
て、大規模オンラインシステムなどで活躍してきた「フ
ォールト・トレラント・システム」の考え方は、最近で
はマイコンシステムでも使われるようになりました。
 この基本原理は、
 ・システムを多重化してトラブルに備える
 ・余分に持った「冗長さ」でサービスを低下させない
 ・途切れない連続運転を指向する
というもので、システムの構成要素を複数台並べるとこ
ろからシステム構築がスタートします。

●デュアルシステムの技術的ポイント
 もっとも簡単なシステムとして、図N-146の「ミラーリ
ングディスク」があります。これはディスク装置を二重
化したもので、CPUはまったく同じデータを両方のディス
クに持たせることで、片方のディスクがクラッシュして
もデータを失わないようにしています。ここで重要なの
は、CPUはそれぞれのディスクを次々にアクセスするので
なく、CPUからは「一つのディスクに見える」ようにする
ためのアクセス制御装置を持っていることです。
 CPUを二重化したデュアルシステムも同様に、かなり低
い「それぞれの装置の故障確率」を掛け合わせた全体の
故障確率、という高い信頼性を得ることができます。

●多数決システムの機能
 システムの信頼性がさらに要求された場合には、CPUを
含めた管理システムとして全く同一の処理を行うブロッ
クを奇数台(3台とか5台)走らせる、という「多数決シス
テム」に発展します。NASAのスペースシャトルの5台シス
テムが有名ですが、宇宙線被爆などの極限トラブルでそ
れぞれのCPUシステムの判断が相互に矛盾した場合、調停
装置のサポートで多数決に従う、という発想です。
 CPUの高機能低価格化によって、マイコンシステムでも
同様の冗長システムによって信頼性を高める事例が出て
きています。

\section*{147. チェックポイントによる検出}

●ウイルス対策・コピープロテクト
 ここでは、ソフトウェアの信頼性対策技術として、
 ・コンピュータウイルスに対するチェック
 ・不正コピーに対するコピープロテクト
に共通するチェックポイントについて考えます。この両
者はあまり縁がないように思われるかもしれませんが、
「プログラム自身が変更されることの自己チェック」と
いう視点では共通のもので、これはあらゆるソフトウェ
アの「暴走の自己検出」にも適用できるものです。

●正しくないチェックの方法
 まず、図N-147(a)の「よくない例」を調べましょう。
これは、いくつかの処理ルーチンが呼ばれる途中で、
 ・ソフトウェア領域のサイズチェック
 ・ソフトウェアのコードのチェックサム
などの方法による「ソフトウェアが正常であること」の
チェックルーチンをコールする、というものです。
 この方法の欠点は、チェックポイントの先の判定ルー
チン自体が変更されてしまって、
 ・チェックルーチンの冒頭に「正常リターン」
 ・チェックの結果に関わらず「正常」値に変更
などと元のルーチンに戻されてしまうと、まったくチェ
ック機能が骨抜きになってしまうことです。

●正しいチェックルーチン
 そこで、確実にチェックをするためには
 ・メインルーチンとは別にタイマでチェックを起動
 ・チェックルーチンをROM-BIOSに置く
 ・タイマ割り込みによってチェックした結果をメイン
  ルーチンから参照する
などの方法をとります。ソフトウェア的に解析・変更し
にくい場所に判定ルーチンを置くというわけです。
 また、基本的な方針として、チェックポイントが1種類
で共用されているとそこだけが攻撃されますから、複数
のチェックルーチンを複数箇所から参照するというのは、
チェックポイントの定石です。

\section*{148. エラートラップによる暴走対策}

●暴走対策は暴走検出から
 ソフトウェアのCPU暴走対策にはいろいろなレベルがあ
ります。たとえば、
 ・CPUの暴走を発見・検出する
 ・重要なデータを保護・確保・記憶する
 ・CPU/周辺ハードウェアをリセットする
 ・システムの状態を暴走前の状態に復帰する
 ・ユーザに異常の発生を知らせる
などの項目はそれぞれに奥の深い技術となっています。
 そのうち、ここではもっとも簡単な「暴走検出」につ
いて、WDT(ウォッチドッグタイマ)などのハードウェアを
伴う方法でない、ソフトウェアだけによる方法を考える
ことにします。

●データバスのプルアップ(古典的方法)
 まず最初に紹介するのは、図N-148(a)の「データバス
をプルアップする」という、古き良き時代の方法です。
データバスのプルアップは、ノイズマージン確保の意味
もありますが、ここでは「異常メモリアクセスの検出」
という意味も持たせています。
 つまり、CPUが暴走して、メモリを配置していないアド
レス空間をアクセスすると、出力イネーブルされるメモ
リがないためにデータバスがハイ・インピーダンス状態
となり、プルアップによって「全データがハイ」という
コードが発生します。これを「エラー発生処理ルーチン」
への無条件ジャンプに割り当てておく、というものです。

●ダミージャンプ命令の埋め込み
 もう一つの有名な方法は、図N-148(b)のようにプログ
ラムエリア(ROM)に処理ルーチンをばらまいて、途中のア
ドレス(通常はアクセスされることがない)に、エラー発
生処理ルーチンへの無条件ジャンプ、ないしソフトウェ
ア割り込みコードを埋め込んでおく、というものです。
 この場合も、異常アドレスによってエラールーチンに
飛ぶことで、とりあえずの暴走検出を簡単に実現できま
す。

\section*{149. EMC対策機構の検討}

●EMCの3つの主役
 エレクトロニクス機器の電磁的相互作用のトラブルを
考える上で重要なのは、図N-149のように
 ・ノイズを出すもの
 ・ノイズを伝えるもの
 ・ノイズを受けるもの
という3者が存在していない限り、絶対に問題は起きない
というポイントです。たとえば誰もいない密林の奥深く
では、携帯した無線機に外からのノイズが飛び込んでは
こないというわけです。

●3つの主役のトレードオフ
 この3者の関係ですが、それぞれの「性能の要求」とEMC
対策の視点とは、たいていの場合に矛盾しています。た
とえば、ノイズを減らすためにはシステムクロックを下
げるのが効果的ですが、これはシステムの性能も低下さ
せます。
 このようなトレードオフを突き詰めていくと、もっと
もEMC対策として効き目があるのは「伝送経路」、すなわ
ち「ノイズを伝えるもの」への対策であることがわかり
ます。ただし、伝送経路は「信号を伝える」という大切
な役割りがありますから、
 ・必要な信号をなるべく伝える
 ・不要な信号(ノイズ)をなるべく伝えない
という、選択的な特性が要求されることになります。

●ドメインによるEMC対策アプローチ
 この伝送経路での選択特性としては、
 ・時間ドメイン(不要な時間的特性をマスキング)
 ・空間ドメイン(指向性アンテナなど)
 ・周波数ドメイン(各種フィルタ)
 ・電圧ドメイン(高電圧ノイズをカット等)
など、対象となるノイズの特性と必要な信号の特性を考
慮して、その差を利用したいろいろなアプローチをとり
ます。必要な信号とよく似た成分のノイズほど、あとで
の除去が困難になる(発生源対策しかない)わけです。

\section*{15. ハードをソフト化するPLD}

●PLD化の第1ステップ
 専用の書き込み器によってハードウェアを自由にプロ
グラムできるPLDは、図B-15のように、当初は複数ゲート
を1パッケージに搭載できるスペースメリットとコストメ
リットから採用されました。基板が小さくなって消費電
力が抑えられることだけでなく、回路の一部がブラック
ボックス化されることで、コピー防止・解析防止という
設計上の秘密保持に役立つことも重要です。

●PLD化の第2ステップ
 さらにPLDが普及すると、システム開発の形態も進化し
ました。デバッグ段階での回路変更は、プリント基板の
パターン変更(期間・コストともに影響が大きい)の原
因となってきたのですが、回路の一部をPLD化することで、
場合によっては「PLDのプログラム変更で吸収する」とい
う新しい解決方法をもたらしました。
 さらに積極的に、「変更・調整したい部分には最初か
らPLDを使う」という設計方法も生まれました。たとえば、
回路のある部分ま信号論理を反転させるかどうか、とい
う変更は、従来ならばインバータの追加を必要としたの
に対して、PLDプログラムに「論理反転」を追加してプロ
グラミングすることで、基板変更が不要になったのです。

●PLD化の第3ステップ
 そして最近では、PLDとは「周辺回路の都合に合わせて
設計する」デバイスから、「システム全体をソフトウェ
ア的に設計した回路を具体的にハードウェアとして実現
するためのツール」になってきました。ここでは、ASIC
並に多くの回路を搭載できる大規模PLDを活用して、シス
テム全体の機能をCASEツール内に記述し、その回路をPLD
チップに分割してハード的に実現します。
 電子回路設計エンジニアにとって、従来のハード先行
型の設計だけでなく、場合によってはソフトウェア的な
システム設計をそのままハード化する、という進展に積
極的にトライすることも重要なスキルアップです。

\section*{150. EMC対策部品の採用}

●単体のEMC対策部品
 図N-150のように、EMC対策部品としてはいろいろのも
のがあります。まず、もっとも基本となる単体の部品と
しては、
 ・半導体(サージアブソーバ、バリスタなど)
 ・ハイパスフィルタとしてのコンデンサ類
 ・ローパスフィルタとしてのコイル類
 ・電磁吸収体としてのフェライト部品
などがあります。
 このうちフェライト関係では、システムクロックが高
速化されるとともに、パスコンと同じ「常備薬」となっ
てきた印象があります。基板上のクロックラインにとり
あえずフェライトビーズ、ケーブルがあればフェライト
リングを一回りしてから、という具合です。

●組み合せEMC部品
 個々の部品を並べるのはスペース的に不利であり、対
策部品メーカとしても付加価値を高めるという意味で、
「コンデンサとコイル」あるいは「コンデンサとフェラ
イトビーズ」などの、1パッケージングされたEMC対策部
品も充実してきています。
 また、コモンモードチョークコイルのように、本質的
に組み合せによって効果を表す対策部品もあります。

●システム化されたEMC対策部品
 さらに積極的にEMC対策を「システム化」させたものと
しては、
 ・各種のフィルタモジュール
 ・ラインノイズフィルタ付きACコンセント
 ・フェライト内蔵コネクタ
 ・バス用コンデンサアレイ
などがあります。コンデンサアレイで、わざとデータバ
スの信号をアナログ的に鈍らせることでノイズ発生を抑
える、という従来なかった発想の対策部品です。
 また、各種シールド関係の部品や素材もいろいろと出
回り、EMC対策のサポートに貢献しています。

\section*{151. フェイルセーフ}

●非冗長システムでの信頼性向上技術
 ここで紹介する「フェイルセーフ」とは、システムが
トラブルに遭遇することは仕方ない、とする立場からの
アプローチです。つまり、トラブルは絶対に許されない
場合にはフォールトトレラントシステム化を検討します
が、システムを多重化するコストがない場合とか、本質
的にシステムは1台でしかない場合には、万一のトラブル
を前提に「もっとも被害の少ない方向に持っていく」事
を目標とすることになります。
 システムのフェイルセーフ化の指導原理は非常に明快
で、「危険の少ない方向を指向する」に尽きます。

●簡単な入出力システムの例
 図N-151は、もっとも簡単な制御システムの例で、パネ
ルのスイッチ操作によって、モーターなどのパワー機器
を制御するシステムです。ここでもっとも重要なのは、
パワー機器のスイッチがトラブルの際に入りっぱなしに
なる(過熱・過運転)ことを避けることと、パネルのスイ
ッチ情報を安全な側に検出することです。
 このようなシステムでは、出力側での定石は「リレー
の接点の選択」です。リレーに電源が供給された時(ON)
にだけ、負荷のパワー機器がONになるように設計するこ
とで、万一システムがストップすれば、リレー内のスプ
リングによってパワー機器の電源はOFFに復帰します。こ
のように、フェイルセーフでは「スプリング」「重力」
などの自然の復元力をよく利用します。

●入力のフェイルセーフ
 パネルスイッチ入力の検出では、基本的にスイッチは
「ノンロック」タイプを使って、ここでも手を離せばス
プリングの復元力によってOFFになるようにします。
 また、スイッチまでの配線ラインが断線した場合はOFF
になり、さらに何らかのトラブルでショートされた場合
にも異常として負荷をONにしない工夫が考えられます。
ここでは電圧をON/OFFの2値から3値化して、ラインのシ
ョートをスイッチONと区別しています。

\section*{152. リスタートの考え方と修復機能}

●リスタートとリセット
 システムの「リスタート」とは、完全にシステムを初
期化から再起動するリセットではなくて、ここでは「エ
ラーや誤動作が検出されたために、強制的にシステムを
再設定(復帰)させるための特権コマンド」と解釈してい
ます。具体的なエラー検出については他の項目で触れて
いますので、ここでは「状態の修復」を考えましょう。
 CPUの「リスタート命令」といえば、特定の処理ルーチ
ンを呼び出す一種の「ソフトウェア割り込み」です。リ
セット直後のシステム設定BIOSルーチンでも、いろいろ
なソフトウェア割り込みを利用していることは多く、こ
れら一連のソフトウェアモジュールをどう構成するか、
というのはシステム修復効率にも大きく関係します。

●シングルタスクでは修復は難しい
 図N-152(a)は、簡単なCPUシステム(シングルタスク)の
ソフトウェアの構成例です。このような場合、いくつか
の処理モジュールのデータ/パラメータがRAMエリアに置
かれていますが、これらは相互に関係しているために、
突然のエラー発生に対しては、あとで
 ・どの部分のデータはそのまま利用できるのか
 ・どの部分のデータが矛盾しているか
という判定が非常に難しいのが一般的です。

●マルチタスク下での修復
 これに対して、図N-152(b)のようなマルチタスクシス
テムでは、それぞれのタスクが処理しているデータを関
連づけて、世代管理を含めてバックアップするような、
バックグラウンドタスクを走らせておくことができます。
これはOS/マルチタスクカーネルの管理下で、たとえば
タイマ起動によって一定周期でバックアップするように
しておきます。
 すると、何らかの原因でエラーが発生してシステムを
リスタートする際に、エラー発生の瞬間の最新の状況を
復元するのは無理としても、その1サイクル前の状態は確
実に復元して、正常リスタートすることができます。

\section*{153. 自己診断機能}

●自己診断ルーチン
 CPUという「頭脳」をもったマイコンシステムであれば、
CPU自身にシステムの「手足」のチェックをさせよう、と
いう発想も自然なものです。そこで、パソコンを含めた
多くのマイコン機器では、図N-153のような自己診断ルー
チンを標準の機能として豊富に搭載しています。
 自己診断機能としては、
 ・メモリの有無、メモリ空間の把握
 ・BIOS-ROMのバージョン/IDのチェック
 ・RAMの読み・書き・ベリファイのテスト
 ・周辺I/Oの存在のチェックとステータス・テスト
 ・ダミー出力信号によるインターフェースのテスト
などがあり、ディスプレイデバイスを持つ機器では、こ
の結果を刻々とメッセージ出力するのも定石です。

●自己診断機能の活用
 もともとシステム初期化の際に必要なチェックを「自
己診断機能」としてまとめただけ、というレベルから、
より積極的に活用する方法もあります。
 たとえば、工場出荷時検査モードとしての利用、ダミ
ールーチン処理によるCPU機種の自動識別、インターフェ
ース信号ラインを使った信号発生器モード、ディスプレ
イ機能を利用したフィールドデバッグ機能なども、CPUに
よる自己診断機能を拡張させたもの、と考えることがで
きます。

●自己診断機能の限界
 このように可能性を秘めた自己診断機能ですが、注意
点もあります。まず、正常でない結果となった場合の処
理については、「ユーザに不安を与えない」だけの情報
提供とドキュメント化(エラーメッセージのマニュアル)
が義務となります。
 また、自己診断と自己修復とはかなり次元の異なる技
術ですから、「異常」とわかっただけで修復できない、
というジレンマが残ることも指摘されます。

\section*{154. 出荷検査機能と検査治具}

●2種類の検査の違い
 エレクトロニクス機器に関する技術的な「検査」には、
図N-154のように大きく2種類のテストがあります。
 まず、設計・試作の段階で行われるテストでは、
 ・絶対最大定格を越えた場合の破壊条件テスト
 ・落下試験・振動試験・梱包落下など物理的テスト
 ・温度試験・湿度試験・連続運転試験(壊れるまで)
 ・電源電圧の異常に対するテスト
 ・静電気・ノイズ試験
など、基本的に検査によってそり製品(試作器)が壊れて
しまうようなストレスを与えて、メーカとして保証でき
る限度を試験(「いじわるテスト」と言う)します。しか
し、これは製品の出荷検査にはなりません。

●出荷検査の意義
 もう一つの検査が「出荷検査」で、大量生産の電子機
器では「抜取り検査」になる場合もありますが、ここで
はある程度の複雑さを持った、全数検査を行う機器を想
定しています。
 当然ながら出荷検査では製品破壊になるようなテスト
はありませんから、基本的には「ユーザが使う方法」で
正常に動作することを確認することが目標です。電源を
入れてスイッチを操作して、正常な出力やメッセージの
ディスプレイを確認する、というのが一般的でしょう。
 ただし、PL(製造物責任)の立場からも、ここでの検査
で「見落とし」を出すことは絶対に許されません。

●検査治具
 そこで活用されるのが、検査項目を自動的に効率よく
設定・計測・切り替えしてくれる「検査治具」で、これ
は開発エンジニアが自分で設計することが一般的です。
 検査治具の機能としては、
 ・出力信号の自動計測、所定値との比較・確認
 ・入力信号の自動設定・供給、切り替え
 ・テスト信号・テストデータの自動生成
などがあり、機器のコネクタなどをフルに利用します。

\section*{155. ASIC開発の手順と戦略}

●ASIC開発のトレードオフ
 ASICを開発する場合、図O-155のように、開発者である
依頼ユーザと、LSIメーカとの作業の「線引き」に、いろ
いろな可能性があります。このトレードオフを慎重に考
えて具体的な作業に進まないと、開発プロジェクトとし
ての効率が大きく変わってしまうものです。

\section*{156. 回路設計から論理チェックまで}

●回路設計の2つのアプローチ
 ASICの回路設計方法といえば、従来は「回路設計レベ
ル」といわれる、ゲートやTTL相当セルや各種のマクロセ
ル・メガセルを組み合わせていく、という手法しかあり
ませんでした。この手法については、さらに「手で方眼
紙に描いていく」という昔話がありましたが、現在はす
べてパソコン・EWS等の設計CAD上で行われています。
 ここに新しく登場してきたのが「ハードウェア記述言
語(HDL)」による回路設計で、図O-156のように、設計作
業は普通のソフトウェア開発(プログラミング)とまった
く変わらない風景になりました。ASIC全体としてはまだ
マイナーな手法ですが、人間の頭では処理しきれない大
規模な回路設計(CPUなど)で威力を見せてきています。

●回路設計の結果をチェック
 いずれの手法で設計した回路も、人間の作業ですから
ミスが皆無ということは絶対にありません。ASIC開発の
次の段階(シミュレーション)に進むためには、このよう
な基本的ミスを残しておくわけにはいきませんから、回
路設計の結果に対するチェックや、HDL設計記述の文法ミ
ス等のチェックが必要になります。
 このチェックツールは、一般に設計支援システムに標
準で含まれており、回路図レベル設計の場合には
 ・ゲート/セルの入出力仕様に対する矛盾
 ・ファンイン・ファンアウト条件の違反(過剰負荷)
 ・セル入力信号の未処理
 ・セル出力空き信号の確認(オープンでいいのか?)
などを警告したり対話的に確認して、最終的な結果がシ
ミュレーションに耐えられる、不確定・矛盾のないもの
になるようにします。

●回路設計/論理設計の結果は
 回路図レベル設計の手法では、設計結果はシミュレー
ションの入力ファイルとして「ネットリスト」という形
式に変換されます。また、HDL設計では完成したソースが
そのままシミュレーションに使われます。

\section*{157. テストプログラムの開発}

●テストプログラムの意味
 ASICのテストプログラムとは、ASICのシステムクロッ
クに従って、全てのクロックステップごとに
 ・ASICを入出力ピンから見た動作記述情報を表現
 ・全ての入力ピンに所定の入力を設定する
 ・全ての出力ピンに得られるであろう期待値を記述
といった内容を表現したデータファイルです。その究極
の目標は、「チップ内の全ゲート・配線が正しく動作す
ることを検証する」ことにあります。
 これはASIC設計段階での論理的な検証ばかりでなく、
実際のASIC生産段階での出荷検査の際にも使用されるも
ので、製品としてのASICの性能・歩留まりに大きく関係
してきます。

●テストプログラムの位置づけ
 図O-157は、回路設計/論理設計を終えた回路情報ファ
イルとテストプログラム、それにシミュレーション作業
の関係を示したものです。回路設計の段階で「実現した
つもり」の機能が、「本当に実現されているか」を検証
するためのものですから、本質的には実際に回路を設計
した本人(回路にテストプログラムを合わせてしまいがち)
でなく、同じASIC仕様書から別の人が作成した方が望ま
しいものです(実際には同じ技術者が行うことが多い)。
 ここでは、回路の内部設計を離れて、客観的にチップ
のピンについての信号情報を記述します。具体的には
 ・ウェーブ形式:グラフィカルな「波形」イメージ
 ・ベクター形式:タイミングと信号とのマップ(対照表)
 ・テキスト形式:変化点などを圧縮して言語的に記述
などのいろいろな形式で表現するシステムがあります。

●テストプログラムの重要性
 ASICの「完成」を確認するのはシミュレーション行程
ですが、その作業の「基準」となるのがテストプログラ
ムです。従って、記述に抜けがあったり、回路設計のバ
グに合わせてしまって、結果的にこれを隠すようなテス
トプログラムにならないよう、細心の注意が必要です。

\section*{158. シミュレーションのポイント}

●論理回路は原理的に簡単
 図O-158(a)は、ゲートのような論理回路のシミュレー
ションの概念を示したものです。もしASICの内部でプル
アップされている出力ピンがあれば、出力期待値は常に
"H"であり、内部でGNDとなっていれば常に"L"です。
 この考え方をゲートに拡張すると、たとえばANDゲート
の片方に"L"が入力されれば出力は必ず"L"になり、逆の
場合には、もう一方の入力が出力に現れるはずです。
 このように、論理回路(非同期回路)では、各ゲートや
セルの入力の組み合せをたどっていけば、出力ピンの期
待値は簡単に得られます。ただし、実際のCAD上回路図か
らでなく、ASIC仕様書のピン仕様から記述します。

●順序回路はちょっと厄介
 これとは対照的に、F/Fなどの順序回路を含んだ同期回
路になると、図0-158(b)のようなTTLの74相当の単純な回
路であっても、シミュレーションはぐっと本格的になり
ます。
 ここでは4つの入力と2つの出力があるASIC、と考えて
いますが、たとえば「クリア信号」に対しては、この信
号を一瞬"L"にした時に出力がクリアされるだけでは条件
として不備で、クリア信号が"L"の期間中にD入力やCK入
力をいろいろに変えても出力は変わらない、という条件
を記述する必要があります。大規模なASICであっても、
原理的にはこのようなクロックに従った記述を積み重ね
ていきます。

●「不定」は許されない
 実はこの図は、ASICのテストとしては失格なのですが
わかるでしょうか。TTLの74であれば「不定」と記述され
るだけなのですが、クリア入力とプリセット入力が同時
に"L"になった場合をテストしていないのです。
 実際のASICでは、このような場合を避けるために、こ
の2つの入力の部分に論理ゲートを入れて、「不定」条件
とならないように設計します。「常に確定している」こ
とがシミュレーションの前提条件だからです。

\section*{159. レイアウト設計は誰がするか:ファウンドリとの関係}

●ASICの開発終盤の流れ
 回路設計/論理設計、テストプログラム開発、そして
シミュレーション(論理シミュレーション、別名「仮Sim」)
まで通過してくると、ここからASIC開発は現実のチップ
化への作業となります。図O-159のように、チップ上の配
置配線(レイアウト)、それに基づく実配線シミュレーシ
ョン(「実Sim」)、そして完成したレイアウトデータを元
にLSI製造メーカでのマスク・プロセス段階へと移行して
いきます。
 ここで重要なのが、ユーザ(システム開発者)の手元で
どこまでの作業を行うか、という線引きの問題です。従
来は論理シミュレーションもメーカの大型計算機任せだ
ったのですが、最近はデスクトップのパソコンやEWSで簡
単にできるようになりました。その延長の話です。

●レイアウト/実シミュレーションまでできる時代
 パソコンやEWSのパワーアップによって、2-3万ゲート
程度までの規模であれば、レイアウトから実配線シミュ
レーションまでできる環境が、実際に出てきているのが
現状です。さらに、この作業を専業にした「デザインハ
ウス」もあり、外注も可能になっています。
 そして何より、最終的なレイアウトデータの国際的な
標準化が進んでいて、この段階まで「メーカのヒモ付き」
である必要がなくなってきています。事実、レイアウト
データを受け取ってOEM生産することに徹して、自社ブラ
ンドのLSIをまったく持たないASIC製造メーカが、アジア
NIES地域で活躍して世界中にASICを提供しています。

●ASIC開発戦略の「発想の転換」
 こうなってくると、ASICメーカ(電気系大企業)といえ
ども、マスクデータをもらって試作生産する「外注」と
してつき合えることになります。
 メーカ各社は提供するライブラリやシミュレーション
作業のサポート、そして具体的なチップの納期・価格競
争に走り、ますますASIC採用ユーザにとって有利に展開
しています。ASICも発想の転換の時代になったのです。

\section*{16. LEDを使いこなす}

●マイコン機器の表示装置
 マイコン機器・電子機器にとって、使用者である人間
とのインターフェースとして、視覚に訴える「表示デバ
イス」はもっとも重要なものです。人間の五感の中では
視覚情報が最大のアンテナであり、パネル面のたった1個
のLEDが点滅しただけで、人間は多くの情報を得ます。
 そこで、図B-16のようないろいろな視点から表示デバ
イスを検討することになります。テレビやパソコンの画
面のような膨大な情報量を扱うとなると、かなり本格的
になってしまいますが、簡単なステータス情報やアラー
ム情報であれば、LCDよりも自分から発光するLEDのメッ
セージ力はかなり強力な材料となります。

●表示デバイスの選択
 情報通信システムのように、メッセージの表示が基本
機能である場合は問題ありませんが、メッセージの表示
が補助的機能となるシステムでは、表示デバイスに対す
るコスト的・低電力消費・省スペース的な要請が強くな
り、CRTなどは脱落するのが一般的です。
 LEDのメリットとしては「暗闇でも鮮明に見える」「電
子部品として回路との相性がよい」「ダイナミック点灯
によって省エネできる」などの特徴を検討します。また、
最近では多セグメントやドットマトリクス表示のモジュ
ールも多く供給されて、「部品」として活用できます。

●デコーダ・ドライバ・ダイナミック表示
 かつては「7セグメントデコーダ」などのICを用いてい
たLED回路も、現在ではCPUソフトによってデコードする
方法が主流になっています。また、ダイナミック表示の
タイミング制御についても、CPUがソフトウェア的なタイ
マによって実現する方法が有効です。
 1チップマイコンやASICの中には、このようなLEDドラ
イバを出力ピンとして用意しているものも多いので、設
計の最初から検討することが重要です。

\section*{160. 予約ピンとテストピンの役割り}

●メーカの予約ピン
 回路設計レベルでのASIC開発では、全体のピン数とパ
ッケージを検討したところで、メーカから
 ・電源ピン(総数と位置)
 ・GNDピン(総数と位置)
 ・水晶(セラミック)振動子接続端子の位置とGND
 ・データバスの位置とGNDピン
などについての条件が示される場合がほとんどです。
 これは具体的な回路仕様・機能とは無関係なのですが、
ASICを仕様するシステムの基板パターンや実装上の条件
として影響しますから、最初から十分に理解して検討す
ることが大切です。(図0-160)

●テストピンの利用
 このようなメーカ予約ピンの要請は、
 ・電源容配線量と信号マージンの確保
 ・チップ内の基準電位の安定化
 ・クロック回路の安定した動作
 ・信号ラインの同時スイッチングに対する信頼性
などからくるものですから、絶対に守らなければなりま
せん。たとえ無理に条件を無視しても、シミュレータで
拒まれることになります。
 ここで有効なのが、テストピンの利用です。テストピ
ンはテストの際にしか使いませんから、メーカ予約ピン
の機能を強化する意味で、クロック信号の高いピンを囲
む位置や、同時スイッチングしそうなピンの中にテスト
ピンを積極的に配置します。そして、テストモードでな
い通常時にはGNDにするように設計しておくのです。

●テストバスは多重化する
 テストモード以外には積極的にGNDとして使えるテスト
ピンに対して、テストモードで外部とASIC内部の信号を
やりとりするのに必要なテストバスは、専用に持つには
あまりにもったいないピンとなります。そこで、テスト
バスはなるべくデータバス・アドレスバス等と多重化し
て、限りあるピンを有効に使うようにします。

\section*{161. テストモードとテスト回路}

●ASICのテストモード
 ASICの論理シミュレーションと出荷検査は原理的に同
等なものですが、このために一般にASICには「テストピ
ン」と「テストモード」があります。本当は、わざわざ
こんなピンやモードを設けずに、本来の入出力ピンから
内部の全ゲートをチェックできればいいのですが、実際
には不可能なための「次善の策」なのです。
 このテストモードでの仕事としては
 ・回路内部にある順序回路やF/Fのクリア
 ・回路内部のレジスタ等への初期値設定
 ・入力信号バス・出力信号バスの切り替え
 ・クロック回路の外部コントロール
などがあり、ASICのピンから直接実現するのが困難な部
分、回路の奥深い部分にとくに活用されます。

●メガセルの場合
 また図O-161のように、メーカから全体をブラックボッ
クスとして提供される、CPUコアやメモリ・乗算器などの
コンパイルドセルやメガセルでは、セル内部のテストは
メーカが行う(いろいろ秘密がある)ために、設計者とし
ては「メガセルをシステムから切り離して外部からアク
セスする」ための仕組みを、設計段階で組み込んでおか
なければなりません。
 この場合、テストプログラムとしては
 ・テストモードに入る
 ・バス等をテストモードに切り換える
 ・リセットしてクロックスタート
という最初の段階だけを作成して、そこから先のテスト
プログラムもメーカに任せます。

●テスト回路を最初から想定する
 このようなテスト回路は、ASICに不慣れな場合には戸
惑うところがありますが、「必要な機能を設計してから
テスト回路を追加する」という発想は厳禁で、最初から
テスト回路を想定して組み込んでおくことが、開発期間
や設計の確実性の点でずっと有利になります。

\section*{162. ブレッドボードとESの評価}

●ブレッドボードとは
 ASICの最大の欠点は、開発期間にあります。最近では
短納期をセールスポイントにして、数日程度で試作でき
るゲートアレイもありますが、スタンダードセル以上の
ASICでは、論理シミュレーション完了から評価用サンプ
ルチップ(Evalution Sample:ES)までの数週間のリードタ
イムがネックになります。
 そこで「ブレッドボード」の登場です。図O-162のよう
に、かつてはTTL数百個を搭載した、座布団のような基板
を何枚も重ねたブレッドボードを試作(外注すると数百万
円)して、おもに「ASICが目論見どおりに動くか」を検証
してきました。大容量電源が「暖房」になった時代です。

●現代のブレッドボード
 しかし現在では、回路動作の妥当性の検証については、
機能の進歩したシミュレータで十分に検討できるために、
「動作確認のためのブレッドボード」は激減しています。
ところが、パソコンからコンフィギュレーション・デー
タを転送できるLCAなどを多数搭載したコンパクトな形態
に進化しながら、まだまだブレッドボードは活躍の場を
広げています。
 これは、「実機での検証」「同時開発」という新しい
付加価値によるもので、ただ何もせずASICのESを待つの
でなく、その間に「受け入れ体制」を作ってしまう、と
いう発想によるものです。

●一種のCEとしてのブレッドボード
 メーカから最初に到着したESを調べてみたら動かなか
った、などというのは(少なくはないのですが)あくまで
「不慮の事態」であって、シミュレーションを通ってい
る以上、基本的には動くチップが来るはずです。そこで、
出来て来るESとコンパチなブレッドボードを使って、ES
のパターンを持った製品システム基板を開発してしまい、
ついでに制御CPUソフトまで作って待ちかまえよう、とい
うのが、最近の戦略的なブレッドボードの活用法なので
す。一種のコンカレントエンジニアリングとも言えます。

\section*{163. コストとリスクを管理するASICスケジューリング}

●ASIC開発初期のリスク要因
 システムのパフォーマンスを飛躍的に高めるASIC、と
いう一般的評価は「成功例」によるもので、そう簡単に
ASIC開発プロジェクトが進むものではありません。かな
りの金額の開発投資と長期の開発期間を必要とするだけ
に、正しいアプローチで取り組まなければなりません。
 図O-163は、ASIC開発においてリスクとなる「注意点」
を示したものですが、とくに開発の初期段階では、
 ・矛盾・不備のない明確な仕様を定める
 ・全体を見渡した的確な開発スケジュールを立てる
 ・ASICチップと全システムのコストと開発費用
に関する慎重な検討が重要です。上流での検討だけに、
ここに問題があるとプロジェクト全体が沈没します。

●設計開発段階でのリスク管理
 具体的なシステム設計から詳細な回路設計・テストプ
ログラム開発の段階では、
 ・ASICテスト用回路を最初から考慮しておく
 ・マージンを十分に確保したタイミング設計
 ・回路に合わせず仕様からテストプログラムを作る
という姿勢を守ります。また、論理シミュレーションの
段階では、どんなささいな事であっても、回路の振舞い
やシミュレータのメッセージで気になる部分は検討して
つぶしておきます。シミュレータも一種のソフトですか
ら、「シミュレータのバグ」の可能性を忘れてはいけま
せん(バグの実例は数多くあります)。

●実配線シミュレーションでのエラー
 もっとも困る現象の一つは、論理シミュレーションを
通過したのに実配線シミュレーションでエラーが出るケ
ースです。理論的には「あってはならない」のですが、
種々の原因で遭遇してしまった場合には、「急がば回れ」
の姿勢で、落ち着いて回路を変更します。基本的にはマ
ージンの不足で、論理シミュレーションの最悪値をわず
かに越えたものですから、ちょっとした手直し、あるい
はテストプログラムの条件を検討して対応できます。

\section*{164. 最短時間のASIC応用システム開発計画}

●最短記録への挑戦
 図O-164は、ASICを新規開発するマイコン機器の開発計
画です。ここでの目標は、なるべく短い開発期間で確実
にシステムを完成させることで、当然ながら各種の開発
作業を並行して進め、関連した作業をオーバラップさせ
るようにしています。
 このようなプロジェクトでもっとも重要なのは、ある
程度の時間をかけても、最初のミーティングを全員で徹
底的に詰めることで、多人数ならではのアイデアも知恵
も出て来ることと、意識高揚に役立ちます。

●開発作業の並列化のポイント
 開発期間を短縮させるための原則は「リードタイムの
ある工程で待たない」ということに尽きます。そこで、
コンピュータによる支援をフルに活用します。具体的な
作戦としては、
 ・ASIC開発がもっとも期間がかかるもの、と想定する
 ・ソフトウェア開発とデバッグもなるべく先行させる
 ・ケースや検査工程も並行して進めておく
 ・時間をカネで買う(外注も活用する)
などがあります。
 ここの例ではASICブレッドボードを製作して、先行し
て開発したシステム基板に接続し、CPUソフトウェアをか
なり早い時期から開発・デバッグしています。

●コンカレント・エンジニアリング
 このプロジェクト例はまさしく「コンカレントエンジ
ニアリング」であり、仮想的な夢物語ではありません。
このようなプロジェクト進行はもちろんリスクの多いも
ので、もしASICのESが何らかの不具合を持っていた場合
には、通常なら使える「CPUのソフトでフォローする」と
か「基板を変更してハード的にマスクする」といった対
応が(すぐには)できません。
 しかし一方で、順調に行った場合のメリットは計り知
れないものがあり、開発競争の厳しい分野では現在でも
刻々と進行しているのも事実なのです。

\section*{165. 製品企画から機能仕様の検討まで}

●ニーズ指向製品企画の材料
 「作れば売れた時代」が過去のものとなったために、
製品企画の段階からプロジェクトにエンジニアが参加す
ることが増えています。その一つの要因として、図P-165
のような各種情報(ドキュメント)から効果的に企画情報
を抽出する、という一種の「技術」が期待されています。
 まず、「ニーズ」指向の観点からは、国内・海外の市
場調査情報として、
  ・一般消費者(購買層の予備軍)
  ・購入ユーザ(次回購入の可能性が高い)
  ・支社・営業所・代理店・販売店の情報
などが収集され、分析・検討の対象となります。

●シーズ指向製品企画の材料
 また一方で、自社独自の優位性・特異性を生かした積
極的な企画も重要で、この領域はまさにエンジニアが中
心となって検討されます。ここでの材料としては、
  ・自社保有技術
  ・自社特許
  ・自社従来製品からのノウハウ・蓄積
  ・関連・提携企業の技術情報・ノウハウ
などがあります。
 「価値観の多様化」「高付加価値の要求」などの要請
は時代の流れであり、他社のモノマネだけでは製品が受
け入れられなくなっていますから、着実なシーズ指向は
手堅い戦略なのです。

●アイデア・コンセプト・ターゲット
 ニーズ/シーズの情報をもとに、具体的な製品企画に
おいては、「アイデア・コンセプト・ターゲット」など
を合言葉に、さらにポイントを絞って行きます。
 ここでは、図にあるようないろいろな視点を検討して
いきますが、パソコンの「アイデアプロセッサ」「シミ
ュレータ」「プロトタイピングツール」などを駆使して、
紙の上だけでない検証を行うことも重要です。

\section*{166. 基本システム構想からシステム設計まで}

●基本的システム検討のポイント
 仕様検討の段階を受けて、具体的にシステム構想から
システム設計の段階に移っていきますが、ここでエンジ
ニアによって参照されるドキュメントとしてもっとも重
要なのが「特許関連文献」です。これには大きく3つの性
格があり、
  ・自社特許:積極的に利用していく
  ・他社特許:対策(後述)を検討する
  ・公知技術:慎重に検討して利用する
という異なった戦略が必要になります。

●他社特許への対策
 システム検討の段階で候補に上がった技術と、特許情
報データベースや特許情報オンラインサービスなどから
の情報との照合から、同業他社の特許として問題になる
ものが何十件も出て来るのは一般的なことです。
 ここでの対応としては、
  ・その特許を迂回するような設計を試みる
  ・ライセンス交渉を申し入れて「使用権を買う」
  ・自社特許とのクロスライセンスを申し入れる
  ・まだ登録されていなければ「攻撃する」
などの戦術があります。
 この最後の「攻撃」というのは言葉が過激ですが、ど
うしてもその特許出願の存在がネックになる場合には、
古今東西のあらゆる先行特許・技術文献・学会論文など
を収集検討して、「出願の時点で公知な技術であったか
ら特許の新規性がない」という主張を申し立てる作戦で
す。これは公告・登録されていても審判・裁判という形
で対抗できる可能性がありますが、かなりの物量作戦と
リスクを伴うものであることは事実です。

●システム設計は特許出願のチャンス
 システム構想を受けて、ハード/ソフトの線引きを含
めた基本システム設計に移ります。この段階では、アイ
デア的な基本特許出願につながることが多いので、実際
に採用しなかったアイデアは出願しておきたいものです。

\section*{167. 詳細設計:ハード/ソフト/機構/コスト}

●コンカレントエンジニアリングを支えるもの
 システム設計の段階を受けて、図P-167のような詳細設
計の段階に移っていくと、これは「コンカレント・エン
ジニアリング」そのものと言えます。ここではエンジニ
アの扱う「ドキュメント」に注目していますから、それ
ぞれの作業が対象としているドキュメントの関連に注意
して検討してみることが大切です。
 たとえばハードウェア設計では、「新しくASICを作る」
という大きな基本方針があった場合には、
  ・ASIC開発チームの流れ
  ・CPUシステム回路設計チーム
  ・CPUソフトウェア開発チーム
という3つの大きなグループに分化していきます。しかし、
各グループはそれぞれが別個に作業していくのではなく、
「システム仕様書」「インターフェース仕様書」「ASIC
仕様書」「部品データベース」などを共通のものとして
それぞれアクセスしていくのです。

●部品データベースの役割り
 開発段階でのドキュメントで重要なのが、社内標準の
「部品データベース」というドキュメントです。この利
用目的としては、
  ・汎用部品の型式指定(標準部品が安価で安定供給)
  ・コスト計算の基準
  ・プリント基板設計の基準データ(サイズ、熱設計)
  ・量産設計時の自動挿入機用制御データ
  ・ソフトウェア用ROMの機種選定
  ・検査仕様書の基準データ参照
などがあります。

●詳細設計からも特許出願を
 特許出願には、基本システムのような全体的なものと、
詳細設計や量産設計の段階でアイデアが出て来る具体的
なものとがあります。日常のスケジュールに追われてな
かなか困難ですが、実際の現場から出た特許は他社の追
随を許さない、手堅い特許が多いのも事実なのです。

\section*{168. 開発プロジェクト管理とデバッグ}

●開発プロジェクトはドキュメント化作業
 多くのエンジニアの代表的な「誤解」に、「開発は最
終的なモノが出来上がればよい」というものがあります。
アマチュアの日曜大工であれば、これでも十分なのです
が、プロの仕事としては「モノの完成」は、成果の半分
にもならない中途半端な段階なのです。
 図P-168のように、開発プロジェクトをドキュメント化
の作業として眺めてみると、順調に進んでいる時のプロ
ジェクトから出力・蓄積されるドキュメントには、
  ・定期的な報告(対外的なもの)
  ・経過レポート・連絡文書(内部的なもの)
  ・設計資料・仕様書・技術情報など
  ・情報交換(電子メイル・電子会議室のログ等)
があります。なお当然ながら、電子化されていない「書
類」の形態はここでは論外です。これらのドキュメント
の最大の目的は「再利用」なのです。

●プロジェクトが遅延した場合
 どんなに綿密な計画を立てても、プロジェクトが不慮
の要因で遅延することはよくあります。ここでも、開発
環境をドキュメント化によって支援していれば、的確な
対応を迅速にとることができます。
 たとえば、ある部品の調達上の問題や仕様上の問題が
起きた場合には、部品データベースや関連業者情報が完
備していれば、代替品や仕様変更への対応はすぐに手配
できます。また、開発途上で抵触しそうな他社特許が発
見された場合(非常によくある)にも、いろいろな対応策
をとるためには戦略的な特許データベースの存在が前提
となります。

●プロジェクトの完了とは
 当然ながら、「プロジェクトの完了」は製品の出荷で
はありません。図にあるような各種のドキュメントを完
備して、自社の関連製品開発・量産時対応・特許対応、
さらにはPL対策として万一のトラブルの備える意味も持
つ、重要なドキュメント化が待っているのです。

\section*{169. マニュアルとレポートと特許出願}

●開発ドキュメントとマニュアル
 開発プロジェクトが生み出すいろいろなドキュメント
類は、そのまま蓄積されるだけでなく、図P-169のように
いろいろな場面で活躍していきます。
 たとえば、対象を「ユーザ」と考えてみると、製品に
添付されている各種のマニュアル類、リファレンスマニ
ュアルやデータシートなどの資料、カタログやパンフレ
ットなどのPR資料、さらに新聞や雑誌の紹介記事の原稿
などもありますが、これは的確にドキュメント化されて
いる場合には、適当なコンピュータ上の支援ツールを活
用して、開発エンジニア自身が容易に製作できるもので
す。中身を知っているために、間違いもありません。

●開発ドキュメントとレポート
 また、一般でなく社内向けのドキュメント化作業とし
ては、
 ・開発レポート(技術的報告、プロジェクト報告)
 ・生産移行関連資料(部品表、工程仕様、検査仕様)
 ・ノウハウの記録
などが重要で、トレードシークレット対策やPL対策の上
からは、単に技術情報たけでなく、開発過程そのものの
記録・保存も重視されています。
 たとえば他社技術との知的財産権紛争や、事故などに
対するPL紛争などの場合、どのように開発してどのよう
に生産・試験してきたか、を正確に立証する「証拠」と
なるのです。

●開発ドキュメントと特許出願
 そして対象を「同業他社」と考えてみると、ある意味
でもっとも重要な「特許出願」というドキュメント化作
業が控えています。本当は開発の終盤よりもなるべく早
い時期に済ませたい「儀式」ですが、生産技術や品質管
理に関するノウハウの特許などは、実際に製造・生産し
てみた者だけが書ける、とも言われています。開発完了
でもまだ遅くない、特許のネタを再検討するのは重要、
ということなのです。

\section*{17. LCDモジュールを部品として使う}

●液晶によるディスプレイ
 表示デバイスとしての液晶(LCD)の最大の特長は、省エ
ネルギーと低コストにあります。電卓や腕時計に使われ
た液晶パネルはこの典型で、ゲームボーイやノートパソ
コンでもこのメリットを最大限に生かしています。
 従来の液晶パネルといえば、必要な情報パターンをマ
スク化して、カスタムのパネルを製造していましたが、
半導体メーカ各社の提供するLCDコントローラLSIによっ
て、最近ではドットマトリクスのLCDパネルそのものを使
用することが一般的になってきました。

●LCDモジュールの選択
 ここでは図B-17のように、必要な表示情報の要求に応
じていろいろな選択を行います。ドットマトリクスLCDパ
ネルといっても、「キャラクタジェネレータを内蔵して
文字(テキスト)情報コードを指定する」「全ドットを自
在に指定してグラフィックも描画できる」ものとでは、
機能もコストも大幅に異なります。
 また、LCDコントローラのバスが制御システムに開放さ
れていて、具体的にLSI制御をプログラムする必要のある
ものと、RS-232-Cのような汎用インターフェースでコマ
ンドを送るだけにインテリジェント(CPU内蔵)されたもの
とでも、コストとともに本体システムの開発効率に与え
る影響は大きく変わります。

●LCDモジュール使用の注意点
 LCDの最大の欠点は応答性の遅さにあります。そこで、
パネル側のコントローラLSIには、「コマンド発行からの
表示遅延」「ウェイト時間のあるコマンド」など、通常
の周辺LSIとは異なった条件がつく場合があります。画面
クリアなども、システムCPU側で相当に「待つ」ことを必
要とするケースがあります。
 また、LCDパネルとハンドシェークをして、多量データ
に対するパネルのエラーのためにロックしないように、
ポーリングによる制御とし、さらにハング時にはソフト
的にポートからLCDリセットを行う対策も一般的です。

\section*{170. データベースの活用術}

●データベースの共有
 いろいろな部署でいろいろなデータベースソフトを使
うことは常識となっていますが、データベースの効用は
「統合化」によって、新たな価値を生み出すところにあ
ります。図P-170はよく引合いに出される「統合生産シス
テム」の模様ですが、これは単に複数のパソコンをネッ
トワークで結ぶことに目的があるのではなく、共有して
いるデータベースの「情報を共有」することで、初めて
戦略的に有効なシステムとなります。
 ネットワークの初期の段階は、接続されたターミナル
間の情報交換だったのですが、これではそれぞれのパソ
コンに情報が重複して散在し、統一がなくなるだけなの
です。極端な例では、この図の全てのターミナルがディ
スクレス、という形態こそが理想です。

●共有情報参照の例
 データベースの有効活用の例として、製品に使われる
何かの「部品」の情報を具体的に考えてみましょう。こ
の情報はもともと、
 ・設計部門からの過去の設計情報の登録
 ・購買部門からの過去の詳細情報の登録
というプロセスでデータベースに置かれています。これ
が新しいプロジェクトでは、
 ・設計部門「使える部品リスト」としての請求
 ・調達部門「代替品・セカンドソース」情報の追加
 ・生産部門「工程仕様」・検査部門「試験データ」
などの形で参照・追加・利用されていきます。このよう
に、共通に持っていること自体が「価値」となります。

●データ保護だけは慎重に
 データベースを活用するメリットが出て来るほど重要
になってくるのが、「データの保護」「バックアップ」
「秘密保持(トレードシークレット)」です。これはコン
ピュータシステム全体に関わる問題ですから、企業活動
全体としての本格的な取り組みが必要な規模となります。

\section*{171. システムのリスク分析}

●不可避的なトラブル
 コンピュータシステムに対するリスク要因を分析して
みると、図Q-171のように大きく3種類に分類されます。
その第一は「自然災害などの不可避的トラブル」で、あ
る程度までは被害を最小限に食い止める対策を事前に講
じておけるものの、規模によってはシステムが致命的に
破壊されてしまうものです。
 ここで重要なのは、災害に伴う火災を消化するための
スプリンクラや消火器の機能が、コンピュータシステム
にとっては「二次災害」として漏電・メディア破壊をも
たらすところです。
 この分類に対する基本的な対策としては「データのバ
ックアップ」しかなくて、それも東京のデータは近郊で
なく、大阪や札幌に置いておく必要があります。

●障害・ミス・エラー
 第二のリスク項目は、おもに意図していない人為的な
原因によるものです。人間には誰でもミスがあり、責任
の追求や損害賠償請求も可能ですが、失われたデータは
保険会社も補償しない(面責)ことになっています。
 この分類に対する対策としては、システム設計の面で
はあらゆるヒューマンエラー対策を組み込むことと、デ
ータの多重化、システム運用の面では「フールプルーフ」
の考え方で人間の注意を喚起すること、などがあります。

●意図的な脅威
 もっとも厄介なのがこの第三項目で、意図的にコンピ
ュータシステムに対する悪事をはたらくケースです。物
理的なシステムへの破壊行為や、本格的な金融関係のコ
ンピュータ犯罪は特別のものとしても、
 ・多くのケースで内部者が関係しているのが事実
 ・パソコン開放で世界中のウイルスが来日してきた
という部分は看過できないものがあります。
 ソフトウェア不正コピーのはびこる日本では、コンピ
ュータ従事者の職業モラルと知的財産権意識の徹底から
始めないと、根本的には改善されないでしょう。

\section*{172. セキュリティ対策を考える}

●防犯対策としてのセキュリティ対策
 セキュリティ対策でもっとも効果的なのは「人間に
対する対策」である、というのはちょっと皮肉な事実
です。図Q-172のように、
 ・コンピュータ(電算部門)への入室管理
 ・端末/メディアの使用管理
 ・通信アクセスに対するアクセス管理
などを徹底することで、故意の侵入だけでなくヒューマ
ンエラーに対しても効果があります。
 具体的には、パスワードやID付与による個別管理を徹
底することと、確実な記録システムがセキュリティ対策
の基本方針となります。

●防災対策としてのセキュリティ対策
 不慮の事故や自然災害などに対する防災対策としては、
一般的な「避難訓練」に相当する「防災訓練」「非常時
対応訓練」が役だっています。この場合、システムにも
精通した「リスクマネージャ」を置いている企業で効果
が上がることが報告されています。
 このような対策というのは手間もコストもかかるもの
ですが、停電・通信途絶などの突然の事故に対する「対
応マニュアル」を完備して訓練しておくことで、データ
消滅という最悪の事態を避けることが最大の目標です。

●信頼性対策としてのセキュリティ対策
 パソコンの無停電電源装置や非常用自家発電装置に代
表される「信頼性対策」は、さらに
 ・システムの二重化・三重化
 ・データベースの二重化
 ・同じデータを東京と大阪に保存して通信で交換
 ・データ保管業者によるデータ保護
などのデータ保護対策に向かいます。
 なお、最近では保険会社による「情報セキュリティ保
険」などもありますが、基本的に壊れたパソコンを買い
直せるだけで、失われたデータは戻ってきません。

\section*{173. コンピュータ・ウイルスは恐くない}

●ウイルスの入手経路
 MacintoshとIBM-PC互換機のDOS/Vが定着して、いよい
よ日本も世界中のコンピュータウイルスの洗礼を受ける
時代となりました。データベース・OA部門などでの被害
は影響も大きく、個人レベルだけでなくビジネス分野で
のウイルス被害が社会問題化しています。
 コンピュータウイルスは、何らかの経路から入手され
ることでシステムに入ってきますから、もっとも重要な
対策は「入れない」ことにあります。現在は、
 ・不正コピーによる正体不明ディスクからの感染
 ・通信・ネットワークによる入手
 ・市販ソフトや書籍の附属ディスクが感染していた
などのルートが主なものです。

●感染は「実行・起動」によって
 ウイルスに感染したディスクは、他のディスクと並べ
て置いておいても、パソコンのハードディスクやフロッ
ピーディスクにコピーしても、それだけでは何も「悪さ」
をしません。感染の引金は、人間による「起動」「実行」
という積極的な行為によるのです。
 図Q-173のように、コンピュータウイルスが感染するた
めには、ウイルスの含まれたプログラムにシステムが制
御を移して、プログラムがメモリ内に展開されるという
ステップが必要です。
 ここでは、具体的に実行を指示する以外に、感染ディ
スクをセットしたパソコンを起動/リセットすることも
含まれます。面白そうなゲームと誤解させるタイトルの
実行ファイル名であることも多いようです。

●感染先はいろいろある
 ウイルスがいったん実行されてしまうと、図のように
あちこちに感染したりファイルを消したりします。
 ウイルスに感染したパソコンは、基本的にFDやHDを全
て消去してシステムを再構築すれば完治します。ノート
パソコンでは、バックアップメモリも一旦は消去するこ
とを忘れないようにしましょう。

\section*{174. コピー・解析に対するプロテクト}

●ソフトウェアの解析対策
 ここではパソコンのソフトウェアに対する解析やコピ
ーに対するセキュリティ技術を検討します。MS-DOSの普
通の実行ファイル(****.EXE)については、デバッグツー
ルとしてDEBUG.EXEやSYMDEB.EXEといったプログラムがあ
り、アマチュアでも簡単に解析することができます。
 そこで図Q-174のように、デバッガの逆アセンブラ機能
による解析を困難にする手法としては、
 ・データの暗号化
 ・逆アセンブルトラップコードの埋め込み
がよく知られていて、解析の手間を大幅に増やす「簡易
プロテクト」対策として取られます。

●ソフトウェアのコピー対策
 市販ソフトの不正コピー対策としては、オリジナルフ
ロッピーディスクをプログラム起動時に要求する「キー
ディスク方式」がもっとも一般的ですが、マスターディ
スクが壊れてしまった時の対応などに問題もあります。
また、キーディスクのチェックルーチンを起動時だけに
コールする方式は、チェック出口にダミーリターンを置
くだけで無意味化できますから注意しましょう。
 この他のコピープロテクトとしては、LHAのように逆変
換も簡単なものでない「実行ファイル圧縮ソフト」を利
用することや、パソコンに特別なハードウェア(キー装置)
を取り付ける方法もとられています。

●本格的な手法
 さらに本格的な方法としてゲームソフトなどで取られ
ているテクニックとしては、ディスクのIPL自体からオリ
ジナル化して、通常のMS-DOSの土俵に乗せない、という
方式があります。プログラム本体をメモリ上に展開した
段階では通常の実行プログラムと変わらないのですが、
MS-DOSの解析ツールも使えず、ファイルも通常の方法で
は「読めない」ために、プロテクト効果は高まります。
 ただし、人間の作ったプロテクトは、時間さえかけれ
ば人間によって解析できる、というのも一つの真理です。

\section*{175. データ保護は超重要技術}

●「中間ファイル」の意義
 プログラム開発処理系のコンパイラやアセンブラでは、
大切なソースプログラムを絶対に失わないような仕組み
を使っていて、一般的なソフトウェアやマイコンシステ
ムでの「データ保護」の技術にとって、参考となるもの
も多くあります。
 図Q-175の「中間ファイル」はその好例で、ファイルの
内容を書き換える場合の定石として、エディタでもコン
パイラでも活用されています。
 ここでは、元ファイルを読み込んでデータを変更・修
正して、結果を同じファイルに書き込む、という処理で、
「ファイルの移動」処理も同様のものです。

●処理途中のトラブルに備える
 図の「悪い例」といっても、普通の状態では何も問題
がなく、簡単なマイコン機器でのファイル処理はこの通
りの処理をしているものも多くあります。
 ところが、データ変更・編集処理の結果を同じファイ
ルに書き込もうとしている時に停電したりリセットされ
ると、肝心の元データファイルも結果ファイルも正常に
存在いないまま、メモリ中のデータが消えてしまう瞬間
が存在しているのです。単純なデータファイルの扱いで
すが、このような可能性を許すことは厳禁です。

●作業ファイルとバックアックファイル
 この対策としては、ディスク空間としては余分なエリ
アを必要としますが、作業用の中間ファイルを利用して、
 ・元ファイルをまず作業ファイルにコピーする
 ・元ファイルはそのまま残しておく
 ・作業ファイルに対して処理を実行する
 ・処理結果は作業ファイルに書き込む
という手順をとります。
 ここからはよくある方法として、元ファイルをバック
アップファイルにリネームして、その後に作業ファイル
を元ファイル名にリネームすると、確実に処理できます。

\section*{176. データ暗号化の最前線}

●暗号化のいろいろな手法
 コンピュータシステムでは、プライバシー保護や企業
情報の秘密保持のために、いろいろなデータ圧縮方式と
ともに「暗号化」を行っています。暗号方式には
 ・個々の文字を置換する「換字」
 ・各文字の順番を入れ替える「転置」
 ・換字方式と転置方式を組み合わせた「合成暗号」
 ・端から順に暗号化する「逐次暗号」
 ・ブロックごとに暗号化する「ブロック暗号」
などがあり、場合によっては複数の手法をさらに組み合
わせて暗号化しています。
 また、遠隔地の秘密通信(大使館や金融情報)の暗号化
としては、
 ・慣用暗号系(秘密鍵暗号系、対称暗号系)
 ・公開鍵暗号系(非対称暗号系)
という2種類の方式が研究され、利用されています。

●「DES」の例
 DES(Data Encryption Standard)とは、図Q-176(a)のよ
うな慣用暗号系の一種で、アメリカ商務省標準局が決め
た暗号方式です。
 DESでは64ビットのデータブロックと64ビットの鍵を使
って、転置と換字を繰り返して複雑な暗号化を行い、最
終的に64ビットの暗号を生成します

●「RSA」の例
 RSAとは、それぞれを頭文字とするアメリカの3人の研
究者(R.Rivest,A.Shamir,L.Adleman)}によって提唱され
た、図Q-176(b)のような公開鍵暗号系の一種です。DESと
違って、暗号解読のための「鍵」を公開して、通信回線
など一般のメディアで伝達できるところが特徴です。

\begin{picture}(0.0,0.0)(-80.0,120.0)
\put(40,90){\makebox(120,20){安全な通信路}}
\thinlines\put(190,60){\vector(0,-1){50}}
\thinlines\put(140,60){\line(1,0){50}}
\thinlines\put(10,60){\vector(0,-1){50}}
\thinlines\put(60,60){\line(-1,0){50}}
\thinlines\put(60,50){\framebox(80,30){鍵 {\sf K}}}
\put(200,0){\makebox(70,30){受信者}}
\put(-80,0){\makebox(70,30){送信者}}
\put(290,-180){\makebox(40,20){{\sf M'}}}
\put(290,-60){\makebox(40,20){{\sf M}}}
\put(-140,-60){\makebox(40,20){{\sf M}}}
\put(290,-160){\makebox(40,20){平文}}
\put(290,-40){\makebox(40,20){平文}}
\put(-140,-40){\makebox(40,20){平文}}
\thicklines\put(260,-160){\vector(1,0){30}}
\thicklines\put(260,-40){\vector(1,0){30}}
\thicklines\put(-100,-40){\vector(1,0){30}}
\put(60,-70){\makebox(40,30){{\sf C}}}
\put(60,-40){\makebox(70,30){暗号文}}
\put(150,-190){\makebox(100,30){{\sf D'}}}
\put(150,-160){\makebox(100,30){暗号解読者}}
\put(150,-110){\makebox(100,30){{\sf D(C) = M}}}
\put(-60,-110){\makebox(100,30){{\sf E(M) = C}}}
\put(150,-70){\makebox(100,30){{\sf D}}}
\put(150,-40){\makebox(100,30){復号}}
\put(-60,-70){\makebox(100,30){{\sf E}}}
\put(-60,-40){\makebox(100,30){暗号化}}
\thicklines\put(100,-160){\vector(1,0){40}}
\thicklines\put(100,-40){\line(0,-1){120}}
\thinlines\put(140,-200){\dashbox{5}(120,80)[tl]{}}
\thicklines\put(50,-40){\vector(1,0){90}}
\thicklines\put(140,-80){\framebox(120,80)[tl]{}}
\thicklines\put(-70,-80){\framebox(120,80)[tl]{}}
\end{picture}

\begin{picture}(0.0,390.0)(-80.0,-230.0)
\put(50,100){\makebox(80,20){公開鍵 {\sf e}}}
\put(180,40){\makebox(80,20){秘密鍵 {\sf d}}}
\thinlines\put(20,100){\vector(0,-1){90}}
\thinlines\put(150,100){\line(-1,0){130}}
\thinlines\put(180,80){\vector(0,-1){70}}
\put(160,90){\makebox(80,30){鍵の対:{\sf e,d}}}
\thicklines\put(150,80){\framebox(100,50)[tl]{}}
\thicklines\put(-70,-80){\framebox(120,80)[tl]{}}
\thicklines\put(140,-80){\framebox(120,80)[tl]{}}
\thicklines\put(50,-40){\vector(1,0){90}}
\thinlines\put(140,-200){\dashbox{5}(120,80)[tl]{}}
\thicklines\put(100,-40){\line(0,-1){120}}
\thicklines\put(100,-160){\vector(1,0){40}}
\put(-60,-40){\makebox(100,30){暗号化}}
\put(-60,-70){\makebox(100,30){{\sf E}}}
\put(150,-40){\makebox(100,30){復号}}
\put(150,-70){\makebox(100,30){{\sf D}}}
\put(150,-110){\makebox(100,30){{\sf Dd(C) = M}}}
\put(-60,-110){\makebox(100,30){{\sf Ee(M) = C}}}
\put(150,-160){\makebox(100,30){暗号解読者}}
\put(150,-190){\makebox(100,30){{\sf D'}}}
\put(60,-40){\makebox(70,30){暗号文}}
\put(60,-70){\makebox(40,30){{\sf C}}}
\thicklines\put(-100,-40){\vector(1,0){30}}
\thicklines\put(260,-40){\vector(1,0){30}}
\thicklines\put(260,-160){\vector(1,0){30}}
\put(290,-160){\makebox(40,20){平文}}
\put(290,-40){\makebox(40,20){平文}}
\put(-140,-40){\makebox(40,20){平文}}
\put(290,-180){\makebox(40,20){{\sf M'}}}
\put(290,-60){\makebox(40,20){{\sf M}}}
\put(-140,-60){\makebox(40,20){{\sf M}}}
\put(200,0){\makebox(70,30){受信者}}
\put(-80,0){\makebox(70,30){送信者}}
\end{picture}

\section*{177. 特許はエンジニアの勲章}

●特許制度の流れと戦術
 エンジニアであれば常に意識しているのが「特許」に
代表される「知的財産権」でしょう。ある程度の経験を
積んだエンジニアには、プロジェクトごと、あるいは定
期的な特許出願をノルマ化している企業も多いのです。
 特許に関する手続きの流れは、図R-177のような基本的
な時間軸に従って進みますが、実際には
 ・公開しただけで審査請求しない(公開で十分)
 ・出願と同時に審査請求(製品に使っている場合)
 ・出願もしないで企業秘密にしておく
 ・市場である海外でだけ特許出願しておく
など、いろいろな戦略がとられます。

●特許制度の目的と意義
 もともと特許制度の目的とは、
 ・発明(技術的進歩)を促進するために独占権を与える
 ・一般に普及させるために技術を公開する
という2つの相反したところを求めたものです。そこで、
 ・特許出願によって技術の権利を確保する
 ・同業他社のコピー製品化を抑える
 ・他社特許を落とす(意義申し立て)証拠として出願
 ・特許使用料やロイヤリティで儲ける
などの目的が交錯した、複雑なビジネスとなります。
 そしてもう一つの重要なポイントは、「先に出願した
者が権利者となる」というところで、開発終盤でなくて
最初から出願を奨励するのは、このためです。

●エンジニアであれば特許を出そう
 特許に関する事務手続きと技術的なアプローチは、特
許庁を相手とした法律に基づくものであって、なかなか
エンジニアが近寄りにくい部分があります。
 しかし、具体的な文書化や手続きは「弁理士」という
事務手続きのプロが代行しますから、中心となる技術そ
のものが確固としたものであれば、特許を取得すること
はそれほど難しいことではありません。一種のレポート
ぐらいに考えて、積極的に特許を出したいものです。

\section*{178. 著作権の正しい戦略}

●著作権のいろいろ
 特許・実用新案・意匠・商標などの「工業著作権」と
並んで重視されてきている「著作権」には、
 ・コンピュータプログラムの著作権
 ・商品化権、編集著作物の権利
 ・公表権・氏名表示権・同一性保持権
 ・複製権、貸与権
 ・上演権・演奏権、放送権・有線放送権
 ・口述権・展示権、上映権・頒布権
 ・翻訳権・翻訳案権、出版権
 ・隣接著作権
など多くの規定があります。(著作権法)
 特許権は出願しなければ最終的に登録されないのに対
して、著作権は「創造」によって自動的に発生します。

●特許権と著作権:ソフトウェアの場合
 著作権として保護されるもは、あくまで「表現」であ
るために、ソフトウェアの「アイデア」「アルゴリズム」
については、ソフトウェア特許として守る必要がありま
す。この他に著作権の保護対象とならないものには、
 ・プログラム言語そのもの(コンパイラは保護対象)
 ・規約(プロトコル、インターフェース規約)
 ・解法(アルゴリズム、アイデア)
とされています。BASICやC言語自体は保護されませんが、
この言語で書かれたプログラムは「表現」として保護さ
れる、という仕組みです。

●先行者と後継者との関係
 図R-178は、著作権の考え方から見た、先行者と後継者
との難しい関係を示しています。著作権法の規定からは、
特許制度のように明確に両者を区別しにくいこと、後継
者の業績を先行者と関連づける部分が「解釈」によるも
のである点など、特許戦略とはまた別のアプローチが必
要となるようです。

\subsubsection*{著作権の考え方と問題点}

特許の場合には、それぞれの権利を「特許請求の範囲」として切り分けて、
明確に規定している。
そして1件ごとにこの権利を出願して、公開・審査・公告・(異議)・登録と
いったプロセスで確認していく。
この結果、{\bf 先行者の権利} と {\bf 後続者の権利} との関係が明確に
なっている。

これと違って、著作権の場合には、以下のように3つのパターンに解釈が
分かれる。
これらは結論だけを見ると {\bf 相互に矛盾} したもので、
いろいろな問題(紛争)が発生した場合に、このいずれのパターン
になるかの {\bf 明確な基準がない} という、本質的な問題点を
もっている。

\item 後続者の業績が先行者の {\bf 複製} と解釈される場合
	\begin{enumerate}
	\item 先行者の権利 = すべて
	\item 後続者の権利 = ナシ
	\item 後続者の業績は無視される
	\item 後続者は先行者の許諾を得ないと権利侵害となる \\
	\end{enumerate}

\item 後続者の利用した先行者の業績が {\bf 引用} と解釈される場合
	\begin{enumerate}
	\item 先行者の権利 = ナシ
	\item 後続者の権利 = すべて
	\item 先行者の業績は無視される
	\item 先行者は後続者に対して権利を主張できない \\
	\end{enumerate}

\item 先行者の業績が {\bf 原著作物}、後続者の業績が {\bf 二次著作物} と
	解釈される場合
	\begin{enumerate}
	\item 先行者の権利 = 部分的にあり
	\item 後続者の権利 = 部分的にあり
	\item 後続者は先行者の許諾を得ないと権利侵害となる可能性がある
	\item 先行者は後続者に対して全面的な権利を主張できるわけではない
	\end{enumerate}

\section*{179. トレードシークレットに注意}

●トレードシークレットとは
 国内では、改正不正競争防止法第1状第3項に、「秘密
にして管理せらるる生産方法、販売方法その他事業活動
に有用なる技術上または営業上の情報にして公然知られ
ざるもの」と定義されているのが、いわゆる「営業秘密」
(トレードシークレット)です。
 かつては「産業スパイ」が他社の情報を盗むケースが
問題になっていましたが、最近では「転職した人が以前
の会社で知り得た情報」「企業情報ごと人材を引き抜く」
といったケースが問題となっています。

●トレードシークレットの3要件
 図R-179にあるように、その情報がトレードシークレッ
トであって、不正に持ち出された場合には、差止命令・
損害賠償請求・刑事的訴追などを行えるのは、
 ・きちんと秘密に管理されていた
 ・客観的に企業活動において有用な情報である
 ・公知(公然知られている)情報ではない
という3つの要件を全て満たしていなければなりません。
 逆に、このような情報については、その企業を退職し
てからも情報提供できない、というところもエンジニア
にとっては理解が必要になります。

●トレードシークレットの権利
 特許権や著作権とトレードシークレットのもっとも大
きな違いとしては、「無期限のノウハウ保護」がありま
す。たとえばコカコーラの原液の製法・成分については、
特許出願してしまうと一定期間後に公開されてしまい、
企業活動においては追随者が出てきてマイナスです。そ
こで特許を出さずに、トレードシークレットとして保護
しておく、という戦略がとられています。
 また、社員のノウハウ持ち出しを差し止めできたり、
同業他社への転職の際にはノウハウ流出を防ぐために、
一定の条件(競業制限の期間・場所・対象など)をつける
権利が認められています。

\section*{18. GNDは電子回路の基本}

●GNDは電子回路の基準点
 エレクトロニクスに関するあらゆる回路は、電気信号
の基準点としてGND(グランド)を用いています。回路図上
では特に表記されない部分でも、どこでも接地記号によ
ってGNDという共通の土台の上に構築されます。
 アナログ回路では、「GNDは一点アースがよい」という
ノイズ的な視点からの格言があります。図C-18(a)はこの
様子を示したもので、回路図にない入出力信号のGND電位
とか、電源ラインのパスコンの接地側を含めて、なるべ
くOPアンプの近くに、それも1点でまとめた方がノイズ的
に良好な結果となります。

●ディジタル・アナログ混在回路の基板
 マイコンシステムにA/Dコンバータが加わったような、
ディジタルとアナログの混在したシステムの基板では、
図C-18(b)のように、ディジタル部を囲むGNDパターンと
アナログ部を囲むGNDパターンを別々に設けて、基板の一
点だけで結び付けるようにします。
 この場合、A/DコンバータやD/Aコンバータのように、
チップ自体がアナログ信号とディジタル信号を扱ってい
るものも同様にして、それぞれのグループをGNDパターン
で囲んで、なるべく分離するようにします。
 信号ラインのノイズに対しては、プリント基板のGNDパ
ターンでつながっている部分同志をさらに太い電線でつ
なぐと、低ノイズ・安定動作になることもあります。

●信号ケーブルとGND
 ケース内などで信号線を引き回す場合にも、ディジタ
ル回路では両端をGNDとした接地線とでツイストペアにし
ますが、アナログ信号ではシールド線を使います。
 この場合、シールドの両端を接地するよりも、一端だ
けをGNDにつないで、もう一端は開放するようにした方が
一般的にノイズに対して良好です。ただし、ケースから
外部と接続するケーブルの場合には、当然ながら両方と
も接地することになります。

\section*{180. リバースエンジニアリングの問題点}

●互換機と海賊版(デッドコピー)
 エレクトロニクスの分野では、工芸作品のような職工
さんの手練を必要とせずに、まったく同じ部品を使うと
まったく同じものが複製できてしまう特性があります。
そこで、市場に出回った製品(ハード/ソフト)に他メー
カが追随するのは日常的な現象になっています。
 もっとも正式な方法としては、セカンドソースの製造
契約を結んで、本家にロイヤリティを支払って製造する
場合がありますが、ここでは本家からノウハウやソース
プログラムの提供までを「買う」ことになります。
 ところが、本家に無断で「互換機」や「複製機」を製
造するのは難しく、明かなデッドコピーによる海賊版は
論外の「犯罪」なので、ここでは合法的に互換機を作る
技術(リバースエンジニアリング)について考えます。

●リバースエンジニアリングの手法
 互換機を開発する際にオリジナル機を不正にマネした
ことがない、という事実を裁判などの客観的な場で立証
するためには、図R-180の「クリーンルームによる開発」
という手法がよく行われます。
 これは、いったんオリジナル機を解析して「仕様書」
にまとめる部隊と、具体的に互換機を設計開発する部隊
との情報交換を厳しく制限し、とくに設計・開発部隊が
オリジナル機とまったく接点を持たない(接点があれば、
部分的にでもマネしてしまう可能性が発生する)ように運
用されるものです。

●著作権との関係
 ところが、最近の世界的な傾向としては、クリーンル
ームの開発に対しても警鐘を鳴らしています。というの
も、仕様書を作る解析部隊の仕事の中で、著作権法で禁
止されている「許可のない複製(ファイルのコピー等)」
をどうしても行うことになるために、このようなアプロ
ーチ自体が著作権侵害だ、という立場です。まだ制度・
法律とともに変動しますが、注意は必要です。

\section*{181. 創造的な発想法の開発}

●個人とチームの創造性開発
 プロフェッショナル技術者には、与えられたテーマの
仕事をするだけでなく、エンジニアリング側からの新し
い発想・技術を生み出す「創造性」が求められています。
知的財産権意識が世界中を支配していくこれからの時代
にこそ、オリジナリティとアイデアの勝負はより激化し
ていくのは間違いありません。
 「創造性開発」といっても、実際には
  ・エンジニア一人一人の独創性を伸ばす
  ・チーム全体としてアイデアを創造する
という2つのアプローチがあり、具体的な手法もそれぞれ
に研究され、実践されています。

●「創造技法」のメリット
 図R-181(a)は、いろいろな「創造技法」について分類
したもので、図R-181(b)は具体的な名前の一部を順不同
で羅列したものです。
 このような「創造技法」を用いるメリットとしては、
 ・問題解決の効率を高め、迅速化できる
 ・新しいアプローチやユニークな視点を与える
 ・頭の柔軟性を高める/想像力を刺激する
 ・アイデアに多面性をもたせる/行き詰まりを打開
 ・創造プロセスをスムーズにさせる
 ・情報や知識の新しい組み合せを発見する
などの点が知られています。

●ツールを活用した創造性開発
 このような技法のうち、歴史のある従来のものは「円
卓会議」「黒板」「メモ用紙」などの小道具を使ったり
してきましたが、現在であればコンピュータ技術が大き
な援軍となります。
 電子メイル・電子掲示板・電子黒板などをネットワー
クで共有し、ハイパーカードを駆使してちょっとしたア
イデアをチームで検討してふくらませるなど、実現の方
法はいろいろとあります。うまい「創造性開発環境」を
作れれば、それ自体が「売れる商品」となるでしょう。

\subsubsection*{創造技法の分類}
\begin{enumerate}
\item 発散技法:事実やアイデアを発散的に {\bf 出す} ための技法 \\

	\begin{enumerate}
	\item 自由連想法:思い付くままに自由に発想する
	\item 強制連想法:各種のヒントに強制的に結び付けて発想する
	\item 類比発想法:テーマの本質に似たものをヒントに発想する \\
	\end{enumerate}

\item 収束技法:事実やアイデアを {\bf まとめあげる} 技法 \\

	\begin{enumerate}
	\item 空間型
		\begin{enumerate}
		\item 演繹法:データを既存の分類で集める
		\item 帰納法:類似のデータを集めて新分類を作る \\
		\end{enumerate}

	\item 系列型
		\begin{enumerate}
		\item 因果法:原因と結果でまとめる
		\item 時系列法:時間の流れでまとめる \\
		\end{enumerate}
	\end{enumerate}

\item 統合技法:発散と収束を繰り返していく技法 \\

\item 態度技法:問題解決より、{\bf 創造的態度} を身につけるための技法 \\

	\begin{enumerate}
	\item 瞑想法:自律訓練、ヨガ、禅、瞑想など
	\item 交流型法:精神分析によるカウンセリング
	\item 演劇型法:小集団の演劇カウンセリング
	\end{enumerate}
\end{enumerate}

\subsubsection*{代表的な創造技法名リスト}

\item チェックリスト法
\item ブレーンストーミング法
\item ブレーンライティング法
\item デルファイ法
\item シネクティクス法
\item NM法
\item KJ法
\item マトリックス法
\item シナリオライティング法
\item フューチャーテーブル法
\item 関連樹木法
\item デシジョンツリー法
\item ガントチャート法
\item PERT法
\item 形態分析法
\item 図書分類法
\item クロス法
\item 因果分析法
\item 特性要因図法
\item ストーリー法
\item ハイブリッド法
\item ワークデザイン法
\item 自律訓練法
\item ヨーガ法
\item ヒペックス法
\item カウンセリング法
\item TA法
\item 心理劇法
\item ロールプレイング法
\item 特性列挙法
\item 欠点列挙法
\item 親和図法
\item 希望点列挙法
\item ゴードン法
\item 入出法
\item 焦点法
\item システム合成法
\item ZK法
\item ケプナー・トリゴー法
\item 禅・瞑想法
\item イメージコントロール法
\item カードBS法
\item バイオニクス法
\item こざね法
\item BD法
\item メディテーション法
\item エンカウンター・グループ法
\item クリエイティブ・ドラマティクス法
\item 対比法

\section*{182. 製造物責任(PL)}

●PLとは
 最近もっとも話題となっているのが、「製造物責任」
PL(Product Liability)の問題です。これは従来から欧米
では定着してきた制度ですが、ようやく日本でもメーカ
にとって「必須の条件」になってきました。
 PLの基本は「製品のトラブルについてメーカが責任を
もつ」という当然のことですが、被害者が原因をつきと
めなくても補償される、という点が画期的なものです。

●PL先進国:アメリカの例
 アメリカてせのPLに関する裁判が話題になりますが、
日本のメーカにとっては最大の市場でもあり、ひと事で
はありません。ただし、アメリカに特徴的な要因として
 ・国民性:権利意識・消費者保護意識が強い
 ・弁護士数:人口360人に一人(日本は9000人に一人)
  と多く、ビジネスチャンスを求めて事件探しに躍起
 ・訴訟費用:訴額に関係なく数十ドルと低額
  (日本ではたとえば訴額10億円ならば約500万円)
 ・弁護士報酬:成功報酬で賠償金の3-5割と高額
 ・陪審制度:一般市民から選ばれた陪審員が判断する
 ・賠償金額の算定:標準的な算定基準がなく、悪質な
  事例に対する懲罰的賠償額は高額になる場合がある
といった状況もあります。

●PL対策の指針とISO9000
 万一、PL問題でのトラブルが発生した場合のマニュア
ルとして、図S-182のような行動指針があらかじめ完備し
ていることは最低条件です。このようなシステムが順調
に稼働している場合、もともとのトラブルも少なくなり、
もっとも基本的なPL対策となります。
 また、企業が「ISO9000シリーズ」の認証を得ることで
PLに対する認識もしっかりしている、と評価されること
もあって、ISO9000シリーズ取得に向けて努力することは
そのままPL対策にもなります。

\subsubsection*{PLの視点からの「トラブル対応指針」}

\item トラブル発生の「現在」の処置
	\begin{enumerate}
	\item 現物に対する速やかな対応
	\item 該当する機関への届出
	\item 同種製品に対する告知と警告
	\item トラブル発生に関する速やかな広報・広告
	\item 量産製品では生産ストップに躊躇しない
	\end{enumerate}

\item 「過去」に遡った措置
	\begin{enumerate}
	\item ロット管理情報による該当ロットのチェック
	\item 他ロットの製品のチェック
	\item 販売経路、流通経路の確認
	\item 同種トラブルの調査と告知
	\item 関連システム・機器メーカに対する連絡
	\item 該当する機関への届出
	\end{enumerate}

\item 原因の追求(現在)
	\begin{enumerate}
	\item 開発スタッフ、製造スタッフ、サポートスタッフ等をフル動員
	\item シミュレータ・ツールを活用する
	\item トラブルの再現性を重視
	\item システムがらみの複雑な原因は該当企業が共同で検討する
	\item 推定でなく応急対策による具体的効果を確認する
	\item 客観的第三者による監査・評価
	\end{enumerate}

\item 暫定的な応急措置(近未来)
	\begin{enumerate}
	\item フェイルセーフを再優先する
	\item 回収・交換は積極的・徹底的に行う
	\item 修理・交換のコストは惜しまない
	\item 該当する機関への届出
	\end{enumerate}

\item 恒久的な対応・対策の実施(未来)
	\begin{enumerate}
	\item 設計レベルから基本的に対応する
	\item 二次災害を避けるために、試験・評価・検査を再度徹底する
	\item 対応をドキュメント化して、ノウハウとして継承する
	\item 完全に確信できた上で一般に告知する
	\item 該当する機関への届出
	\end{enumerate}

\item 対応・対策の効果確認
	\begin{enumerate}
	\item 定期的・継続的なモニタリングの徹底
	\item 「フォローアップあっての対策」が基本原則
	\end{enumerate}

\section*{183. 地球環境と二酸化炭素・フロン}

●地球環境破壊の原因は
 図S-183は、最近もっとも話題となっている「地球環境
問題」についての関連を示したものです。そして、この
元を正すと、実は「人類の存在そのもの」がすべて環境
破壊の根元であることが判明します。
 このような状況はエンジニアリングの世界にとって無
関係ではありません。かつて「安定な冷媒」「無害な洗
浄液」として活用されたフロンでさえ、今では人類の敵
として消え去ろうとしています。
 とくにエレクトロニクス関連で地球環境に対して考慮
するポイントとしては、
 ・機器の省エネルギー化(電力消費の低減)
 ・半導体・プリント基板のフロン洗浄工程の見直し
 ・「廃棄しやすい」設計(材料のリサイクルを含む)
などの点で、今からすぐにできることもあります。

●「地球にやさしい」戦略
 地球環境の視点から、具体的にエンジニアとして貢献
していくためには、
 ・リサイクルを考慮した部品を優先して採用する
 ・リサイクルしやすいような機構設計を行う
 ・多くの試作を作っては捨てることの改善
  (シミュレーションによって試作段階を減らす)
 ・なるべくバイポーラ半導体よりもCMOS半導体を使う
などの項目が考えられます。また、
 ・製品の過剰梱包・過剰包装をやめる
 ・カタログ・マニュアル等の印刷物を過剰にしない
といった点も、地味ながら全体として効果があります。
実際の貢献はほんの少しずつであっても、「心がけ」と
して頭に置いておきたい視点です。

\section*{184. 代替フロンと洗浄}

●フロンと代替フロン
 地球環境問題で世界的に全廃が決まった「フロン」の
利用領域のうち、エレクトロニクス分野では「冷媒」よ
りも「洗浄」が最重点課題となります。この場合、従来
のプリント基板のハンダ付けの後工程のフラックス除去
にフロンが利用されていたために、この変更方法がもっ
とも問題となります。
 当面はオゾン層への悪影響が比較的少ない「代替フロ
ン」を利用して、
 ・フロン回収装置
 ・洗浄剤除去装置(オゾンで酸化させる)
といった方法をとりますが、これはあくまで一時的な対
策でしかありません。

●無フロン洗浄のアプローチ
 フロンに代わる洗浄の技術としては、まず「洗浄剤」
「水に溶かす」「拭き取る」という点に着目して、
 ・純水洗浄(まず純水を生成する)
 ・ロジン石鹸化剤による洗浄(界面活性剤)
 ・親水性フラックス(水に溶ける)
 ・ワイピング液(拭き取るだけ)
などがあります。さらにフロンよりも洗浄効率が落ちる
ための対策として、
 ・ジェット水流による洗浄(高圧水流を吹き付ける)
 ・熱湯ジェットによる洗浄
 ・超音波洗浄(メガネ屋さんと同じ)
などが提案され、あちこちで実施されています。

●「無洗浄」のアプローチ
 さらに進んだ対策としては、はんだ付けの原点に戻っ
た方法として、
 ・無洗浄はんだ(残っても酸化しない)
 ・無洗浄フラックス(酸化・科学変化しない)
なども開発され、洗浄技術とともに「脱フロン」を協力
に推進しています。

\section*{185. 省エネルギーは至上命題}

●Energy Star政策の波紋
 アメリカ環境保護局(EPA)が適用した「Energy Star」
と呼ばれる省エネ政策では、
  ・コンピュータ本体
  ・ディスプレイ
  ・プリンタ
の待機時の消費電力を30ワットと定めており、多くのメ
ーカがこの水準をクリアするようになりました。この流
れはヨーロッパでも日本でも追従しているために、VCCI
のように「業界標準」の省エネ規定ができるのは時間の
問題となっています。

●動作モードの解析がカギ
 マイコン機器で徹底的に省エネを実現するためには、
相手をしている人間の行動を検討する必要があります。
スクリーンセーバのように一定の時間が経過すると動作
をストップするだけの2段階モードでなく、
  ・完全にフル動作できる状態
  ・操作者の命令を待っているアイドル状態
  ・新しい指示があるまで待機するスタンバイ状態
  ・処理終了で再起動されるまで待つスリープ状態
などに細かく分類して、人間が感じる操作性を低下させ
ずに、必要なサービスを提供できるようにすることが重
要な「技術」となります。(図Q-185)

●電気的な省エネ策と注意点
 省エネのための電子回路的な方法としては、
  ・半導体のCMOS化
  ・スイッチング電源の採用
  ・電源・信号電圧のレンジを小さくする
  ・ディジタルシステムのクロックを下げる
などがあります。
 なお、ここで注意しなければならないのは、電圧レベ
ルを圧縮することはノイズマージンを低下させ、クロッ
クを下げることは性能を低下させる、というデメリット
も付随する、というトレードオフの存在です。

\section*{186. オブジェクト指向とGUI}

●GUIの進展
 コンピュータの世界で着々と進んでいるGUI(グラフィ
カル・ユーザ・インターフェース)技術は、基本的に
 ・見た目の分かりやすさ・使いやすさ
 ・誰にでも使える操作性の簡明さ
が目標となっていますが、実はこの陰に隠れた
 ・ファイルの階層化構造
 ・オブジェクト指向の考え方
という情報処理技術によって花開いた、といえるのです。
 パソコン版のWindowsがいくら改訂されてもMacintosh
にはかなわない、とよく言われます。GUIをずっと以前か
ら追求・実現してきたApple社の先見性は誰もが認めると
ころでしょう。

●GUIでユーザの負担が減る
 図T-186のように、パソコンのユーザインターフェース
は最初は「テキストベース」からスタートしました。Unix
の基本的システムもこのようなテハストベースですが、
細かい情報を同時に指定するためには都合のいい部分も
あり、この方式がなくなることはなさそうです。
 この次世代としては、上下左右のカーソルキーで画面
内のカーソルを移動させてリターンキーで決定する、と
いう「メニュー方式」が続きました。現在のWindowsの環
境でも、一部にメニューが残っているのも、階層構造を
理解しやすい「メニューの利点」のためなのです。
 そしてオーバラップ・ウインドウ式のマウス操作の時
代となりました。ここでは、マウスは単に入力を選ぶた
めのポインティングデバイスではなく、クリック&ドラ
ッグなど、同時にいろいろな処理をするためのマルチコ
ントローラとして機能しています。

●オブジェクト指向のメリット
 そして、ウインドウ方式では「オブジェクト指向」の
考え方で、対象を指定しながらその対象に処理を命じる、
という人間にとって自然なアクションを実現していると
ころが、現在の普及の理由となっているのです。

\section*{187. 人間工学とヒューマン・インターフェース}

●人間工学とは
 機器を設計する上で考えなければならないことは、そ
れを扱う人間との関係です。たとえば、長時間の機器使
用の際になるべく疲労を感じないように検討する、とい
う「人間工学」は、もともと効率重視の軍用規格として
検討されたものです。しかし現代では、あらゆる機器が
より広がった人間工学によって設計されています。
 もっとも最近の動きとしては、図T-187にある「医学的
・生理学的」視点によるアプローチで、
  ・CRTからの電磁波被爆の防止
  ・CRTのちらつきに由来する眼精疲労の防止
などの改良が進んでいます。

●ヒューマン・インターフェース
 とくにマイコン機器やエレクトロニクス機器では、人
間が親しみをもって接することを目標にした「ヒューマ
ンファクタ」の視点が重視されています。これは、
  ・パソコンに向かう姿勢が疲れないような椅子と机
  ・両手の指をまんべんなく使うキーボード入力方式
などの物理的/機構的なものと、
  ・ウインドウとマウスによるポインティング
  ・メニュー表示による選択入力方式
  ・現在の状態メッセージのディスプレイ
  ・オンラインヘルプ機能
といったコンピュータ技術とがあり、いずれも機器を長
時間にわたって使用する人にとっては、大きな作業効率
の差となってくるものです。

●人間は「慣れる」動物
 現在では誰も不自然さを感じませんが、ファミコンが
出現した時には、十字ボタンのコントローラは違和感の
あるヒューマンインターフェースでした。ここでは、人
間がコントローラに慣れたのと、コントローラの操作に
適したインターフェースのゲームが増えたことの両方で、
現在のような市民権を得てきたものなのです。

\section*{188. マルチメディア}

●テキストメディア
 コンピュータシステムと人間、あるいはコンピュータ
システムを介して人間同士がコミュニケーションするた
めの「情報媒体」として、ここでは「マルチメディア」
を構成する3つの形態について考えます。(図T-188)
 まず、もっとも歴史の古いのが「テキストメディア」
で、ここでは文字情報(テキストコード)によって情報交
換が行われます。「意味」の伝達においてはまだまだ健
在で、今後も消えることはないでしょう。なお、メッセ
ージの扱いで障壁であった日本語が、DOS/Vなどによって
クリアされている事実も重要です。

●画像メディア
 人間の感覚器官としては圧倒的に多量の情報を扱える
「視覚」をメディアとして用いるのは、コミュニケーシ
ョンシステムとしては最大の要請です。ところが静止画
情報でもテキスト情報の数百倍のデータ量が必要になり、
動画情報となると、圧縮技術やネットワーク技術が向上
しても、まだまだ課題が多く残っています。
 しかしコンピュータ技術の進展は、
  ・3次元表示/モデリング
  ・リアルタイム表示/描画の処理能力
  ・高速ネットワークでの情報伝達(→テレビ会議)
に向かって、さらに画像メディアを活用しています。

●音響メディア
 もう一つ、「聴覚」に訴える音響メディアには、
  ・人間の話す「音声」情報
  ・BGMやメッセージ音、音楽などの「音楽」情報
とがあります。音声情報では、低レベルの音声合成音で
あっても、人間の知覚能力は内容を聞き取れます。とこ
ろが音声認識の方はなかなか難しく、国際電話の中継所
に「自動翻訳(リアルタイムで音声認識して、意味を解析
して、音声合成する)」システムが登場するのは、まだ先
のことのようです。今後の音響メディアと画像メディア
は、一体のものとして人間の感性に訴えてくるでしょう。

\section*{189. 認知科学と感性情報処理}

●人工知能(AI)の2つのアプローチ
 これまで何度かブームになったAIですが、最近では過
度の期待もなくなって、ようやく地に足のついた研究が
進んでいます。基本的には図T-189のように、AIシステム
に対する外界からの入力と、システムからの出力の関係
が、「あたかも人間のように」行われることが一つの目
標となっていますが、ここにはまったく異なる、
 ・ブラックボックスとして、外部から見たときに知的
  に振舞えば、内部の仕掛けは不明でもよい
 ・人間の脳の働きを心理学・認知科学などで分析して、
  同じモデルをシステムにインプリメントする
という2つのアプローチ方法があります。

●ブラックボックス派
 人間の知覚・認知・思考・記憶・学習などの機能は非
常に複雑で当面は解析・理解できそうもないから、ブラ
ックボックスとしてとりあえず知的に振舞うシステムを
作ろう、という立場でもっともわかりやすいのは、ニュ
ーラルネットワークのシステムです。
 ニューロ内部の詳細な説明ができない場合でも、実際
にニューロのシステムでこれまでできなかった高度な制
御・判断ができた事例は非常に多く、ある種の説得力を
持っています。

●認知−モデル化派
 これに対して、生理学・心理学・認知科学などの領域
では、少しずつではあるものの、人間の「脳」の働きを
解明しようとしています。理解された部分はコンピュー
タ上のモデル/エージェント(それぞれ独立の機能をもち
ながら他のエージェントと協調する一要素)としてインプ
リメントされ、この振舞いは明確に定義・分析できます。
 理詰めで人間の行動を理解していくための正統的なア
プローチなのですが、なかなか「人間の理解」という難
問の壁は厚く、これからも少しずつ進んでいくのでしょ
う。

\section*{19. アンプ/ゲートはエネルギー源ではない}

●新人エンジニアのミス
 電子回路の初心者であるフレッシュマンは、時にはア
ッと驚く回路を「設計」することがあります。図C-19(a)
はそんな一例で、「LEDを点灯させる」「白熱電球(ハン
ダごて)の電力制御を行う」といった目的のために設計し
た「迷回路」の例です。
 OPアンプやTTLゲートの「出力電圧」というのは、確か
にLEDを点灯させる電圧レベルですが、発光エネルギーを
供給する「電池」ではありませんから、これでは問題で
す。アンプやゲートはエネルギー源や電池ではなく、あ
くまで「電源から供給されたエネルギーを変化させてい
る」という本質が身に付いていないための失敗です。
 また、100V白熱電球の調光装置を、なんでもマイコン
化すればいいと「100VをA/D入力して、CPUで演算して、
D/Aから出力する」という発想にも驚きました。これも、
電気信号と電気エネルギーの混同があります。

●ゲートの出力は「電圧を下げる」こと
 実際には、インバータの出力に図のようにLEDを接続し
ても、CMOSであれば点灯しないことはありません。しか
し図C-19(b)のように、本来はゲート内部のトランジスタ
スイッチがONとなって電流を吸い込む状態を"L"といい、
トランジスタスイッチがOFFで電流が流れ込まない状態を
"H"というのですから、LEDは電源ラインとゲート出力と
の間に入れるのが正しい使い方です。
 つまり、ゲートの出力は「"H"レベルの電圧を生み出す」
のではなくて、「"L"レベルに引き下げる」ものなのです。

●オープンコレクタ/オープンドレイン回路
 これは、かつてのバスラインを構成していた「ワイア
ードOR」回路を考えるとよくわかります。いずれかのゲ
ートがONになるというのは、電圧を発生するのでなく、
電源にプルアップされた信号ラインから電流を吸い込む
ことで"L"レベルにしています。このアナログ的な電子回
路の基本を確認しておきましょう。

\section*{190. インタラクティブ・システム}

●インタラクティブ性とは
 マイコンシステムやパソコンによるシステムでは、対
話的(インタラクティブ)なマンマシンインターフェース
が花盛りです。ここには、
  ・コンピュータの高速化・演算能力向上
  ・リアルタイム処理能力の向上
  ・個々のセンサ技術と多重センサ処理技術
  ・ヒューマンインターフェース/人間工学
などの関連技術が大きく進展してきたという背景があり
ます。
 図T-190のように、かつてはシステムへのコマンドや問
い合わせに対するレスポンスは非常に遅く、「バッチコ
マンドを入力したらコーヒーを一杯飲んでくる」といっ
た習慣もありましたが、現在では見かけなくなりました。

\begin{verbatim}
●リアルタイムOSとオブジェクト指向
 インタラクティブシステムを実現するためには、CPUや
センサ等のハードウェアだけでなく、ソフトウェアの面
でも、
  ・オブジェクト指向による自然な「作業性」
  ・リアルタイムOSによる高速な優先度処理
といった要素が貢献しています。
 人間がシステムと対峙して「対話的」と感じるために
は、機械としての速さだけでなく、人間の思考特性を考
慮したソフトウェア技術も必要なのです。

●フォースディスプレイの時代へ
 センサ技術やVR(仮想現実感)の技術とともに進展した
技術に「フォースディスプレイ」があります。これは、
たとえばデータグローブというセンサで人間がシステム
に「力」を与えると、システムがグローブの「反発力」
を人間に返して来る、というものです。実際に人間が使
ってみると、抵抗のない場合に比べて、格段に良好な精
度と速度で制御できることが実証されています。

\section*{191. センサ・フュージョンとバーチャルリアリティ(VR)}

●バーチャル・リアリティ(VR)
 ゲームセンターではすっかり主役になってしまったVR
ですが、より巨大な市場である「産業用」「家庭用」は
まだまだこれからのビジネスです。VRの基本的な考え方
は図T-191のように、人間と仮想世界の間にコンピュータ
システムが介在し、しかも介在していることを感じさせ
ずに人間に自然な仮想世界を体験させよう、というもの
です。
 ここにはセンサ技術、シミュレーション技術、モデリ
ング技術、広義のディスプレイ技術などが結集して、さ
らにリアルタイムの情報処理が要求されています。

●センサ・フュージョン
 VRを支えているのが、人間からのアクションをいろい
ろな物理量として検出するセンサ群です。これまでに数
多くのセンサが研究開発されてきましたが、人間の微妙
な動作を一つのセンサで検出することは不可能なために、
多くのセンサからの情報を統合して多種のパターン認識
を行う「センサフュージョン」が主流となっています。
 また、センサに対応するアクチュエータ(フォースディ
スプレイを含む、広義のディスプレイ)についても、セン
サと一体化して小型軽量化、さらに人間の個人差に対応
する知能化・学習機能化が進んでいます。

●シミュレーションとモデリング
 VRを支えるもう一つの大きな要素が、自然界のリアク
ションを実現するためのモデリング技術と、具体的にリ
アクションを人間に返すシミュレーション技術です。高
速化された3次元映像や空間音響のシミュレーションによ
って、HMD(Head Mount Display)やヘッドホンから人間に
「自然な」世界像のリアクションが返されます。
 このようなVR技術の応用分野としては、
  ・遠隔地とのVR電子会議
  ・極限環境(宇宙・原子炉内)のロボット操作
などが検討されていて、少しずつ実用化されています。

\section*{192. ファジィ}

●「ファジイ」とは
 掃除機や洗濯機の名前からは、すでに「ファジイ」が
消えてしまいましたが、これは非ファジイに戻ったので
はなくて、たいていの製品がファジイを常識として採用
しているためです。つまり、ファジイ技術は民生分野で
は「全自動」「マイコン制御」などと同じように、空気
のような存在(目に見えないがなくてはならない)になっ
てしまったのです。
 このファジイのもっとも基本的な原理は、図T-192にあ
る「ファジイ集合」にあります。従来の判定(クリスプ集
合)では、判定基準を境界として「いずれか一方」を強制
していたために、境界付近で振動したり大きな誤差が生
まれました。ところがファジイ集合では、なめらかな裾
野を持つ曲線(メンバシップ関数)を重複させて判定する、
という画期的な方法で、より信頼度の高い判定ができる
ようになっています。

●マイコンシステムでの応用
 もっとも簡単な応用である家電機器のファジイの場合
には、漸近線をもつ複雑なメンバシップ関数でなくて、
直線を組み合わせた台形状の関数を利用しています。こ
のような関数では重ね合わせ演算も単純化され、さらに
ROMテーブルとして最初からデータを持つことで高速化を
実現するのが容易なのです。台形とはいってもクリスプ
集合に比べればずいぶんとなめらかで、数ビット程度の
精度の制御にはかえって最適です。

●ファジイの関連領域
 ファジイ技術の応用分野としては、
  ・ファジイ論理(信頼度の高い予測・判定)
  ・ファジイモデリング(予測に基づくモデル化)
  ・ファジイ数学(論理表現そのものをファジイ化)
  ・ニューロファジイ/ファジイニューロ
などがあります。ニューロと組み合わせた例では、学習
の高速化や連想記憶への応用が報告されています。

\section*{193. ニューラルネットワーク}

●「ニューロ」とは
 ニューラルネットワーク、略して「ニューロ」のブー
ムも終わってしまいましたが、ファジイと同様に基礎的
技術として多くの場所で活躍しています。もともとは、
人間の神経細胞(ニューロン)をまねて組み合わせたネッ
トワークが、BP(Back Propagation)学習によって柔軟に
「成長」して、個人差やノイズに強い情報処理(パターン
認識・補間・修正)を行うものだったのですが、中身の仕
組みは説明できなくてもなんらかの良好な結果が得られ
る、というブラックボックス的な曖昧さが根強く嫌われ
続けているという、ちょっと面白い技術です。

●ニューロン・ボード
 パソコンのソフトウェア上にニューラルネットを構成
したり、処理を高速化するために専用のDSPを使ったりし
てニューラルネットを実現するのが一般的ですが、ここ
では図T-193のような、ボードマイコンによるニューラル
ネットを考えてみましょう。
 ニューロの特性として、それぞれの単位となるシステ
ム(ニューロン)は、まったく同じ構成をとることができ
ます。これは小型でローコストなボードマイコンにとっ
ては好都合で、共通のプログラムROMを使用できます。こ
の例では、入力に対するシグモイド関数としてファジイ
論理まで活用することを考えています。

●ニューラルネットワークへ
 このようなニューロンボードを、図のように多数結合
してネットワークを構成します。それぞれのニューロン
ボードに注目してみると、入力に対する所定の重み付け
によって単純に出力しているだけなのですが、システム
全体としてみると、出力に対する評価フィードバックで
重み付けを少しずつ変更するだけで、次第に「学習」が
進行していきます。
 このように「学習」されたシステムでは、未知(未学習)
の予期しない入力に対しても、かなり「妥当な」出力を
得られるところがメリットです。

\section*{194. フラクタルとカオス}

●「フラクタル性」の神秘
 フラクタルとは、自然界のあらゆるところに見られる
「自己相似」の状況をいいます。たとえば図T-194のよう
に、正方形に内接する正方形を次々に描いていっただけ
の図形でも、一部を拡大してみると再び自分自身と同じ
構造が繰り返されている、というものです。また、半径
方向に対数的に増加する「螺旋」も、どの部分を取り出
して拡大しても元の図形に重なることで、フラクタル構
造をもった図形であることがわかります。
 コンピュータグラフィクスで有名な「マンデルブロ集
合」「ジュリア集合」などにおいても、一部分を拡大す
ると元の図形と同様の繰り返しが続いていることが知ら
れていますが、これも「フラクタル」の典型です。

●「カオス」
 最近では、フラクタルと親戚関係にある「カオス」も
話題になってきました。これは、
 ・前回の状態によって今回の状態が決まる
 ・漸化式の表現は厳密に正確(明瞭である)
という明確な数学的定式化ができているにもかかわらず、
 ・ある時点での振舞いが予測できない
 ・初期値によって状態は鋭敏に変化してしまう
という不思議な特性をもっているものです。
 カオス現象の具体的な例としては、
 ・神経細胞のパルスのゆらぎ/脳波のゆらぎ
 ・補食関係にある動物の個体数の変化
 ・経済市況データ/株価の時間的変化
 ・植物の年輪に見られる成長変化の特性
など、工学的な分野だけでなくいろいろな領域にわたる
ことが報告されています。

●カオス情報処理
 カオスの応用としては、「情報の高次記憶」「発想の
転換」「推論機構」などへの利用が研究されています。
まだまだ新しい「何か」が生まれそうな分野と言えるで
しょう。

\section*{195. 遺伝アルゴリズムと人工生命}

●遺伝アルゴリズムとは
 遺伝的アルゴリズム、あるいは遺伝アルゴリズムと言
われるGA (Genetic Algorithm)は、情報処理の分野では
「最適化問題」への応用が期待されている手法です。こ
れは具体的には図T-195のように、どこに最良の状態があ
るかわからない場合の探索に用いられます。
 アルゴリズムとしては、探索する「個体」に
 <1>ランダムに探索ポイントを指定して結果を見る
 <2>「GA操作」によって次の世代を決定する
 <3>再び<1>に戻って探索し、再び<2>を行う
という繰り返しを続けるもので、<2>の「GA操作」に
ユニークな点があります。

●「GA操作」とは
 GA操作は一般に3種類があります。その第一は「選択」
(または「再生」)で、成績の良かった個体は次世代でも
そのまま探索を続行し、成績の悪かった個体を捨てる、
という作業です。
 第二は「交叉」で、それぞれの探索条件の「遺伝子」
を組み合わせて、部分的に遺伝情報の交換された個体を
生み出す作業です。これは一定の割合で行います。
 そして第三は「突然変異」で、ごく少数の個体につい
ては、ビット反転のような処理で例外的なものを作ると
いうもので、生物の進化を想像させます。

●GAとAL
 このような単純な処理でも、人工知能の有名な難問の
「セールスマン問題」をうまく解けることが報告されて
います。また、GAのパターン認識への応用も検討が進め
られています。
 このような考え方は、人工生命AL(Artificial Life)の
考え方につながります。ALは、かつての「セル・オート
マトン」と同様に、コンピュータ内に人工的に生命モデ
ルを置いて、いろいろな条件での世代・行動の進展を見
るものですが、GAやエージェントモデルの考え方ととも
に再び脚光を浴びてきています。

\section*{196. 情報収集・活用テクニック}

●情報は集められるだけ集める
 エンジニアにとって、現代は「情報が多すぎて困る」
という贅沢な悩みをもつ時代です。しかし、以下に述べ
る情報活用テクニックを駆使して、なるべく多くの情報
から的確な情報収集を行う、という姿勢は重要です。
 図U-196はいろいろな情報源の一例ですが、このように
広範囲にアンテナを張って、とりあえずは可能なだけの
情報を集めることです。もし、入口の段階で情報の収集
を絞っているとしたら、それは自らのアイデアやスキル
アップを閉ざしている行為なのです。

●情報をバッサリと捨てられるか
 意識的に多量に集めた情報をそのまま保存・保管する
ことはまったく無意味なことです。とりあえずタイトル
やアブストラクトだけを見て、
 ・不要なのですぐ捨てる
 ・あとで読みたいので机の上に積んでおく
 ・保存が必要なのでインデックスを付けて書庫へ
という「判定」を、1件につき数秒でできるようにトレー
ニングしてみましょう。
 多量の情報を入力するからには、一瞬の判定で多量に
情報を捨てる能力が必要なのです。書類をイメージする
と資源の無駄のようですが、電子情報なら大丈夫です。

●情報の「差分」「補間」「外挿」
 エンジニアが扱う技術情報の「料理法」としては、
<差分>
 以前の情報との微妙な違いから、裏で進んでいる技術
 動向を嗅ぎ付ける
<補間>
 一見無関係に見える2つの技術情報を結び付けることで、
 その間に隠れている技術を類推する
<外挿>
 ある技術的な発表があれば、実際には「その先」まで
 研究が進んでいるので、その先を予測する
といったテクニック(視点)があります。

\section*{197. 学会と産学交流・共同研究}

●産学交流スタイル
 いわゆる「共同研究」というのは、
  ・異種の人材/技術の交流による新技術の開発
  ・新しい雰囲気による双方の活性化
  ・研究への経済的支援と製品開発の利益とが一致
というメリットがあり、いろいろなスタイルで実現され
ています。メーカのエンジニアにとっても、このような
共同研究グループに参加することは自分を大きく成長さ
せるチャンスとして活用したい機会です。
 この共同研究の中でもっとも多いのは図U-197のように、
産業界と学界(大学)が結び付いたもので、「冠講座」や
研究員の派遣、といったスタイルも多くとられています。

●官民協力スタイル
 また、国や自治体の「行政」にとっては、地域の産業
を振興しないと税収が確保されませんから、ここでも税
金を使った民間企業の支援策がとられています。
 具体的には、
  ・中小企業の研究開発に対する補助金の交付
  ・行政の研究機関への派遣・共同研究
  ・研究開発型企業への政策的支援
などで、ここでも「お役所に書類を書く」という大変な
苦労さえ突破できれば、談合とか贈賄などに頼らずに、
正々堂々とかなりの支援を獲得することができます。

●産官学共同スタイル
 最近もっとも多いスタイルとしては、産業界・行政・
大学がそれぞれ参加・協力して「第3セクター」の会社な
り研究機関を形成する、という方式です。ここでは、従
来の枠組み(協力・助成に関する法律・制度的ないろいろ
な制約)で無理であったような活動が、フリーの立場で実
現できるもので、参加企業も大学も積極的にヒトとカネ
を提供して、モノを生み出しています。
 ただし、このスタイルで注意すべきことは、研究開発
の成果の帰属についてで、とくに特許は共同保有になる
のが一般的で、占有は難しいのが現状です。

\section*{198. 異業種交流とヒューマンネットワーク(人脈)}

●異業種交流の必要性
 「作れば売れた」時代が終わって、大小を問わずメー
カが「技術力の勝負」に入る時代となりました。ここで
は、同じ業種の中での厳しい競争とともに、他の業種と
の関係も重要になっています。
 図U-198は「異業種交流」の図式ですが、同じ業界内で
の戦略的共同戦線でなく、まったく異なる業種のメーカ
同士が提携して、それぞれの技術を出し合って研究開発
を行い、どちらも関係していない別の業種に進出するケ
ースが多くなっています。

●異業種交流のコーディネータ
 このような交流は全体として産業を活性化させるため
に、自治体などの行政でも積極的に支援していますが、
未知の分野に乗り出すために、かなり腰の重い企業も少
なくありません。
 そこで重要なのが、自分の技術領域だけに縛られずに
なんでも新しいものを吸収できる、柔軟な発想のエンジ
ニアなのです。異業種交流ともなれば立派なプロジェク
トですから、担当者は「コーディネータ」として、まず
は自社の技術を的確に把握して交流に臨み、相手の技術
を理解・吸収できるだけの「エンジニアとしての大きさ」
が要求されます。しかし、コーディネータを志すことで、
自分自身の技術力も飛躍的に拡大していくのです。

●ヒューマンネットワークの時代
 そしてコーディネータのもう一つの魅力は、狭い自分
の業界に縛られずに、広い領域のエンジニアとの人的ネ
ットワークを構築できるところにあります。
 会社同士がライバルで、それぞれの役員は相手を嫌悪
しているケースでも、学会や業界の会合を通じて、それ
ぞれのエンジニアは良好な友人関係のネットワークを作
っている例は多いものです。
 もちろんここでは、トレードシークレットに関するよ
うな話題は出ないのがプロです。たまたまの「所属企業」
という「仮の住処」と人的な交流とは別の問題なのです。

\section*{199. 通信ネットワークの活用}

●通信とFAXと電話と会議の違い
 パソコン通信やインターネットなどの通信ネットワー
クの活用は、現在ではエンジニアにとって必須のもので
す。この「通信」というメディアの特性を、従来型のFAX
や電話や会議と比較してみると、
 ・FAXでは受信したデータを再利用できない(読むだけ)
 ・電話は相手が不在だと連絡できない
 ・会議ではそれぞれの発言が正確に記録に残らない
というメリットがあり、これだけで「即時性がない」と
いうデメリットをカバーするに十分です。

●国内よりもアメリカの方が近い
 通信による情報交換をしてみるとわかりますが、日本
国内よりも欧米の方が近い、という実感を持ちます。つ
まり、電子メイルを発信して、相手がそれを読んで返信
を返すのに、同じ生活時間帯の国内では、タイミングが
前後すると2日後のリプライ(返信)になるのに対して、欧
米に出したメイルはこちらが寝ている間に読まれて返信
されるので、確実に毎日、やりとりできるからなのです。
 電子的に転送された情報は劣化せずにそのままデータ
として再利用できますから、日本とアメリカの先生同士
が共同執筆した本が異常に速く完成した、という事実も
このメリットによるものです。

●大手パソコン通信はビジネスを支える
 図U-199は、筆者もあるフォーラムのスタッフをしてい
る「Nifty-Serve」という大手パソコン通信の簡単な紹介
です。ここでは、特定のテーマごとに「フォーラム」と
いう「自治体」みたいなものがあり、その中に
 ・電子掲示板(誰でも情報を提供できる)
 ・チャット(オンラインで「会話」する)
 ・データライブラリ(過去の会議室ログやツール等)
 ・電子会議室(さらに話題を細分化、誰でも読み書き)
というメニューが揃っています。
 この他にも電子メイル機能、個人で開設するプライベ
ート電子掲示板、企業の「隠しフォーラム」があります。

\section*{2. ICソケットは注意しながら活用する}

●ICソケットを使う場合
 民生機器など量産される電子機器では、部品コスト削
減のためにICソケットをなるべく使わないようにします。
もちろん実験・試作の場合にはフルに活用しますが、こ
こでは量産製品にICソケットを積極的に使う領域を検討
します。これには、
 ・ICをヒューズとして使う:インターフェースIC(外部
  のノイズでICが壊れ、システム内部へのダメージを
  防ぐ)など、ICを交換する可能性のある場合
 ・プログラムROM:ファームウェアの変更やバージョン
  アップのために、一般にROMにはソケットを使う
 ・拡張性:データRAMをソケットにすることで、容量の
  大きなRAMチップやメモリモジュールに拡張できる
 ・フィールドデバッグ用:通常はLSIやショートピンを
  挿入し、フィールドデバッグや検査時にのみ、ソケ
  ットケーブルを介して外部に接続する
などのケースがあります。

●ICソケットを使う場合の注意点
 ICソケットでも、信頼性とコストはトレードオフの関
係にあり、もっとも高品質の「金メッキ丸ピン」タイプ
は膨大なコスト高となります。注意点としては、
 ・何度も抜き差しする場合には、丸ピンや金メッキを
  採用して「信頼性をカネで買う」こと
 ・板バネタイプの廉価版は、基本的に「万一の場合に
  しか差し替えない」場合に採用する
 ・ソケットが推奨する「適合ピン径」であることを確
  認しないと、接触不良を起こす場合がある
 ・実験・試作であっても、ICソケットのハンダを外し
  て再利用することは厳禁(信頼性が大幅に低下)
などを心がけます。

●アーム付きソケット(TEXTOOL)の注意点
 プログラムROM用のTEXTOOLソケットはよく活用します
が、図A-2のようなポイントに注意しましょう。

\section*{20. コンパレータの活用はディジタル化への架け橋}

●OPアンプとコンパレータ
 アナログ回路の主役であるOPアンプは、図C-20(a)のよ
うに「差動増幅回路」の帰還抵抗を無限大にしたもの、
と考えることができます。この回路は、入力側がアナロ
グ信号で、出力側が2つの値だけをとる、一種のD/A変換
回路になっていますから、もっとも基本的なディジタル
化ということができます。
 ただし、この回路には抵抗R1を「保護抵抗」として入
れるのを忘れないことと、出力がほぼ±電源電圧に振れ
ている(+VとGNDではない)ことに注意します。

●ゼロクロス付近での現象
 実際には、このような単純なコンパレータには、基準
電圧と等しい入力電圧となった瞬間に、図C-20(b)のよう
な出力の振動を発生します。これは、高速・高ゲインの
OPアンプであるほど問題になりますから、スイッチ接点
のチャタリングと同様に、ハードウェア的またはソフト
ウェア的に対応しなければなりません。

●実際のコンパレータ回路
 そこで、図C-20(c)のように、実際のコンパレータ回路
では、出力から正入力(基準電圧)のところに帰還抵抗R2
を用います。これによって、入力に対する不感帯を持っ
たヒステリシス特性が得られて、入力電圧の上昇時と下
降時のスレショルド電圧の差Wが設定でき、ゼロクロス付
近での出力の振動を抑えられます。
 また、内部的にはOPアンプを同様に組み合わせて、さ
らに入力保護抵抗や出力電圧の変換(+5VとGNDで出力)回
路を持ったような、各種の専用「コンパレータIC」が提
供されています。
 マイコン機器や電子回路が外界のアナログと接する、
といっても、いつでもA/Dコンバータを使う必要はなく、
このようなコンパレータによる2値検出で十分な場合も多
いものですから、ぜひとも持ち駒にしたいICです。

\section*{200. キャリアアップとスキルアップのマネジメント}

●キャリアアップの計画
 ここでは、エンジニアのキャリアアップについて考え
ます。一般の企業では、事務職と違って技術職では、
 ・一定の段階で事務的管理職(マネージャ)になる
 ・研究開発の責任者(主任研究員など)になる
といういずれかのルートの選択を迫られるようです。
 また、ここからさらに企業のトップに進んで行くと、
 ・役員(ジェネラルマネージャ)になる
 ・専門研究技術者(フェロー)になる(自由に研究できる)
というルートがあるようですが、エンジニアリングの歴
史が浅いために、なかなか「バラ色の未来」を実現して
見せてくれる先輩は多くありません。
 将来を夢みる若手エンジニアであればこそ、このよう
な将来的なキャリアのルートについて、早いうちから十
分に広い視点で考えておくことも重要です。

●スキルアップの計画
 キャリアというのは会社が評価して決まるものですか
ら、それ以前に自分で心がけることは「スキルアップ」
ということになります。これは完全に自分の責任で実現
することであって、「会社が仕事ばかりで勉強させてく
れない」などと言うのは問題外の逃げ口上です。
 会社は基本的に、向上したいエンジニアを支援してく
れます。逆に言えば、現状で止まっている技術者は本人
が悪いのであって、不要になれば捨てられるのも自業自
得なのです。自分から積極的に機会を作っては提案し、
学会・研究会に参加したり、文献を購入してもらって勉
強したり、業務に直接関係ないような「アイデア実験」
の試作開発を行うことを、会社は禁じてはいない筈です。
 スキルアップとは、あくまで貪欲に前向きに、エンジ
ニア自身の心がけによって実現される、ということを肝
に銘じておきましょう。

●「10年フェーズ」理論
 ここで最後に、筆者の「10年フェーズ理論」を紹介し
ておきましょう。人間の人生を約10年で区切ってみて、
それぞれの「節目」で自己再検討してみよう、という提
案です。
 最初の2フェーズは、義務教育と自発的教育の期間で、
誰でもほぼ同じ土俵です。エンジニアとしてもっとも重
要なのは次の第3フェーズ、つまり社会に出てからの最初
の10年間であると思います。どのような環境でスタート
したにしても、とりあえずはその領域の技術をマスター
して、さらに周辺の技術領域まで興味を持てるような成
長をする10年間であれば、その後の発展は確実なものと
なります。
 そして30歳前後に、第3フェーズ完了の句切りがやって
きます。ここでは自分の人生設計も含めて、
  ・エンジニアとしての現在の自分のスキル
  ・エンジニアとしての現在のキャリア
  ・自分がやりたいこと
  ・自分ができること
などを真剣に考えてみましょう。第3フェーズを前向きに
過ごしたエンジニアにとっては、いろいろな持ち駒を獲
得していますから、選択肢も相当にある筈です。

\section*{21. パッシブフィルタによる微分積分}

●パッシブフィルタとアクティブフィルタ
 受動部品であるC/L/Rは、それぞれの交流特性を組み合
わせると、高域通過型(ハイパス)フィルタ、低域通過型
(ローパス)フィルタ、帯域通過型(バンドパス)フィルタ
として基本的に利用できます。これらをパッシブフィル
タと呼びますが、見方を変えると「微分回路」「積分回
路」とも言えます。すなわち、信号の時間的変化成分を
取り出す微分回路がハイパスフィルタで、信号を時間的
に平均(積算)しているのがローパスフィルタです。
 いずれにしても受動部品だけでは信号が減衰しますか
ら、実際にはOPアンプなどの能動素子と組み合わせて増
幅し、多段にわたって受動フィルタを組み合わせたもの
が、「アクティブフィルタ」です。

●微分・積分回路の応用
 信号に対して積極的に微分積分・フィルタリングを行
う回路でなくても、アナログ回路のあちこちに、パッシ
ブフィルタとして活用されている回路を見ることができ
ます。
 たとえば図C-21のように、アンプ同志をケーブルで接
続する回路には、たいていカップリングコンデンサが入
っていますが、これは直流成分による素子破壊を防ぐた
めの直流成分カット(ハイパス)フィルタで、一種の微分
回路(1回微分すると定数項が消える)です。
 また、センサ入力回路に置かれるCRローパスフィルタ
は、信号ラインに乗って来る瞬間的なインパルスノイズ
を圧縮する平滑(ローパス)フィルタで、電源の平滑回路
と同様の、一種の積分回路(時間的平均)です。この場合、
信号として必要のない高い周波数帯域の信号・電磁波な
どの成分は、時間平均されることで信号成分としてはカ
ットされています。

●CとRがあればフィルタと思う
 このように見ると、ICの電源パスコンもフィルタ、フ
ラットケーブル(配線のL成分と線間のC成分)もフィルタ
など、回路のどこにも同じ視点を生かすことができます。

\section*{22. アクティブフィルタは精度が命}

●アクティブフィルタの構成
 CRによるパッシブフィルタに、理想的特性のOPアンプ
を組み合わせた「アクティブフィルタ」は、アナログ信
号の段階でいろいろな周波数特性を実現するために必須
のものです。
 図C-22は、もっとも基本的なローパスフィルタとハイ
パスフィルタの例で、ここではOPアンプはボルテージフ
ォロワ(ゲイン1倍)として機能しています。この式で明か
なように、カットオフ周波数fとレゾナンスQを与えると、
簡単な計算式で回路定数C/Rが決定されるために、基本的
にはかなり容易に高度なフィルタを実現できます。

●フィルタの精度を上げるには
 しかし、このような計算式から得られるC/Rの数値は、
一般に出回っているC/R部品シリーズの数値として存在し
ない場合がほとんどで、実際には複数個の抵抗やコンデ
ンサを用いて設計することになります。
 そこで問題となるのが、「C/Rの誤差」「多数接続」の
問題点です。たとえば、いくら正確に数値計算しても、
実際に異なった抵抗値が用いられれば、回路特性はそれ
だけ理想的特性からずれてきます。全部を精度1%の抵抗
で組み上げても、コンデンサの精度が5%であれば、全体
の精度としては5%よりも悪化します。単体部品の精度、
複数個を組み合わせても理論的数値からずれる誤差、そ
の両方の影響を十分に検討します。

●多段フィルタでの注意点
 また、実際にはこのような1段構成でなく、チェビシェ
フ式やバターワース式など、より高度・複雑な構成のフ
ィルタも多く用いられます。この場合、それぞれのOPア
ンプの特性のばらつきも誤差として累積されてきますか
ら、なるべく1パッケージに多数のOPアンプを入れたタイ
プ(デュアル、クワッド)を用いることで、相対誤差と温
度変化に対して有効です。

\section*{23. 乗算と変調:アナログ信号処理}

●アナログコンピュータ
 現在のコンピュータはディジタルであるのが当然です
が、「アナログコンピュータ」というものもありました。
これは、アナログ入力電圧に対する演算処理を全てアナ
ログ的に行おうというもので、もともとOPアンプ(演算増
幅器)というのは、そのための理想的アンプだったのです。
この中心部にあるのが各種のアナログ演算回路で、加算
減算だけでなく、乗算除算、指数対数変換、データメモ
リなども全てアナログ回路によって実現しようとしたの
ですが、IC技術とともにディジタルコンピュータ全盛の
時代となり、過去のものとなりました。

●変調:アナログとディジタルの接点
 それでは、現在ではアナログ的な信号処理は消えたか
というと、事実はまったく逆です。ディジタル化するほ
どの精度が必要ない分野、DSP処理システムでも難しい高
速処理の分野などでは、まだまだ専用のアナログ演算IC
が活躍しています。
 図B-23(a)はアナログ乗算ICの例で、2つの入力信号電
圧の積が出力されますから、振幅変調(AM)回路を構成す
る場合、2つの入力にキャリア信号と被変調信号を入力す
るだけで、簡単に変調回路ができてしまいます。

●ディジタル・アナログ混在のハイブリッドAM回路
 変調としてのAMを乗算回路で実現するとき、キャリア
信号の振幅は一定、そして周波数も一定でした。ところ
が、「一定の振幅と周波数」を考えてみると、これは2値
をとるディジタルクロックそのものです。
 そこで、図C-23(b)のように、キャリアの部分はディジ
タル回路としてクウォーツ精度で発生させて、乗算に相
当する部分をアナログスイッチとして正負の振幅をスイ
ッチングすると、同様のAM回路が構成できます。これは
ディジタル(高精度クロック)とアナログ変調のメリット
を生かした回路で、実際にあちこちで使われています。

\section*{24. S/HとA/Dの原理を理解しよう}

●離散化
 アナログ信号をディジタル信号に変換するA/Dコンバー
タについては、まず図C-24(a)のような原理的な理解が必
要になります。アナログ信号は刻々と変化していきます
が、ディジタル回路は一定のクロック時間ごとに動作し
ていきますから、入力アナログデータをクロック時間ご
とに確定させて取り扱います。これが「離散化(サンプリ
ング)」で、サンプリング周波数の1/2までの信号成分を
取り扱うことができます(サンプリング定理)。

●量子化
 サンプリングされた個々の瞬間のデータは、A/Dコンバ
ータによってディジタル数値化されます。これが「量子
化(クオンタイズ)」で、たとえば8ビットデータであれば
256段階、16ビットデータであれば65536段階の値のどれ
かに「丸められる」ことになり、ここに「量子化誤差」
が発生することになります。
 実際のA/Dコンバータ内部では、同じビット精度のD/A
コンバータに基準値をセットして、コンパレータで比較
してビットごとに「越えた」「越えない」の判定を行っ
た結果をディジタル出力するものが多くあります。

●変換時間とS/H
 サンプルホールド(S/H)回路は図C-24(b)のような原理
で、実際には多くの専用IC(高速・高精度)が出ています。
ホールドコンデンサへ入力信号を伝えるアナログスイッ
チの制御信号は、A/DやD/Aのシステムクロックと同期さ
せます。
 このようなS/H回路は、一般にはA/Dコンバータの入力
段に設けて、A/D変換時間の期間にデータが変化すること
を防止しますが、パラレル方式のD/A変換回路の後段に置
いかれて、データ変化時の「グリッチノイズ」を吸収す
るための「アナログ値ラッチ」としても活用されます。
これは「デグリッチャ回路」と呼ばれています。

\section*{25. D/Aコンバータはアイデアの宝庫}

●抵抗によるD/Aコンバータ
 ディジタル回路からアナログの世界への出力として電
圧を取り出すD/A変換回路には、いろいろな可能性があり
ます。図C-25(a)は、抵抗による代表的なD/Aコンバータ
の回路例で、「重み抵抗型」「ラダーネットワーク型(は
しご型)」と呼ばれています。
 重み抵抗型はもっとも単純な構造をしていますが、実
際にはそれぞれ2倍ずつに増えていく抵抗値を精度よく揃
えることが困難で、4ビット程度の簡易型として使われま
す。この場合、アナログスイッチのON抵抗(100Ωから300
Ωのオーダ)が馬鹿にならないので、抵抗Rの値はあまり
小さくできないのです。

●ラダー型はLSI化にも向いている
 これに対してラダー型のD/Aコンバータは、登場する抵
抗値がRと2Rの2種類で揃っているために、誤差の少ない
上等ランクの抵抗を使うことで、8ビット程度までは簡単
に実現できます。また、この回路では抵抗Rの絶対値とし
ての精度でなく、それぞれのRと2Rの抵抗値の相対誤差が
問題となりますが、同じICチップ上に構成された抵抗器
(相対誤差は極めて小さい)を用いると、相当の精度と特
性の揃った温度変化を実現することができます。D/Aコン
バータ専用チップや、A/Dコンバータ内部のD/Aコンバー
タでも、このタイプが数多く使われています。

●アナログ的なD/Aコンバータを考える
 D/Aコンバータには、これ以外にもいろいろなアイデア
が考えられます。図C-25(b)は伝統的な方法で、ディジタ
ルシステムの出力として「クロック周波数」を用いるも
ので、時間あたりのパルス数をアナログ化します。
 ここでは、各クロックに対応して一定のパルス幅の細
かいパルス列を発生させて、検波回路または整流回路と
してダイオードを通して、積分回路によって平滑化しま
す。コンデンサに大きな抵抗を並列接続して放電路とす
ると、比較的低速のD/Aコンバータとして機能します。

\section*{26. データ表現からディジタルは始まる}

●10進数と2進数と16進数
 ディジタルの世界で多くの人が最初に直面するカルチ
ャーショックは、おそらく1と0しかない2進数のデータ表
現で、次にマイコン技術者を襲うのが16進数表現でしょ
う。これは慣れてしまえばまったく自然なものですが、
人間の扱う10進法とのギャップは多くの新人エンジニア
をいつも苦しめています。
 しかし、図D-26(a)のようないろいろな数値表現につい
ては、「人間が機械に合わせる」だけのものではありま
せん。「2進数や16進数で考える」こと自体が、ディジタ
ル的な情報処理・システム設計の助けとして役立つこと
も非常に多いものです。最近では2進化10進数(BCD)や8進
数はあまり使わなくなくなりましたから、いずれは16進
数も不要になるかもしれませんが、2進数の考え方だけは
絶対に残る「標準語」でしょう。

●データ表現の拡張
 ディジタルデータは、全て基本的には2進数で表現され
ますが、これはそのままでは正の整数値でしかありませ
ん。そこで、図D-26(b)のように「符号ビット」を定義し
て正負の整数データに拡張したり、指数部と仮数部とに
分けて任意の実数を表現するような、データ表現の拡張
が行われます。これは、定義に従って「見方を変える」
だけのことですから、回路設計・解析の際には、つねに
「データ表現の定義に帰る」ことが重要です。

●データ表現の使い分け
 符号付き整数には、「1の補数」「2の補数」という異
なった表現形態があり、ここでも混乱の原因となります
が、それぞれの使われる場面をよく考えてみると、納得
のいく場合が多いものです。つまり、「必要にせまられ
て定義された表現方法」ですから、その背景と原理を納
得して活用するようにします。
 また、実数表現と整数表現も、扱うデータのダイナミ
ックレンジに応じて最適の形式を検討することが重要で
す。

\section*{27. システムクロックの作り方と与え方}

●クロックモジュールのメリット
 システムクロック発生回路をインバータと水晶/セラミ
ック振動子の組み合せで設計するのは一般的ですが、こ
こでは図D-27(a)のような、モジュール化された「クロッ
クジェネレータIC」の採用について考えてみましょう。
これは専業メーカの製品として提供されていますから、
もちろん個別の部品を購入して組み立てるよりも高価な
のですが、それを補うメリットも数多くあります。
 まず、クロック発振や周波数精度、温度変化補正など
の安定性がメーカによって保証されています。さらに、
DIPやSIPによる省スペース性、DIPソケット互換パッケー
ジによる交換のしやすさ、そして大量生産時には量産効
果によってかなりの低コストで使用できます。また、付
加価値として多段の分周回路を内蔵しているものもあり、
うまく活用すると十分にモトの取れる機能ICなのです。

●クロック信号の供給法(1)
 システム各部でいろいろなタイミング信号を必要とす
る場合、図D-27(b)のように、大きく分けて2種類のクロ
ック供給方法があります。その第一の方法は、システム
(ここでは基板、またはASICのチップを考える)の一部に
クロック生成回路をまとめてしまうもので、システム各
部に必要なタイミング信号をまとめて最適化した論理回
路で実現メリットがありますが、クロックラインの配線
が複雑になるデメリットがあります。

●クロック信号の供給法(2)
 もう一つの方法は、クロックジェネレータとマスタ分
周回路の出力をシステム全体に対する「クロックバス」
として引き回すものです。それぞれのブロックで必要な
タイミング信号はブロックの近くで発生させるために、
論理ゲートは無駄がでる場合も多いのですが、タイミン
グ信号の引き回しがないために、全体としてはむしろス
ッキリします。ASICでは、タイミング(信号の遅延)対策
のために、この方法がよく使われます。

\section*{28. EXORは意外に幅広く使える}

●EXORの基本機能
 EXOR(エクスクルーシブ・オア)とは「排他的論理和」
のことで、図D-28(a)のように、2入力に対する論理出力
は、いずれか一方だけが"H"のときに"H"になります。見
方を変えれば、「同じ値をとる時だけ"L"になる」という
ことにもなります。
 このEXORは、ANDやORに比べてあまり目立たない存在で
すが、実はディジタル回路のあちこちで活躍するゲート
なので、十分に理解して活用したい筆頭のゲートです。
 EXORを実現するためにいろいろな種類のゲートを組み
合わせてみると、正論理・負論理の視点とともに、その
動作の仕組みがピンとくるようになります。

●加算器の基礎を担当するEXOR
 コンピュータによる演算処理のもっとも基本である、
「加算」演算は、キャリ出力のないハーフアダーを2つ組
み合わせたフルアダーが基本の要素となります。ところ
で、このハーフアダーを分解してみると、2入力1出力の
加算(Σ)出力のビットがEXORそのもの(キャリはAND)なの
です。そこで、ASICやDSPの演算回路を設計する場合には、
あちこちでEXORが登場してきます。
 また、EXORの2入力を対等なものと見る代わりに、1入
力1出力の通過型ゲートと見なして、もう一つを制御入力
端子とする視点も重要です。この場合、制御入力が"L"な
らば入力は素通しされ、制御入力が"H"ならば入力がイン
バータとして反転されます。つまり、信号の反転制御と
してもEXORは活躍するのです。

●符号付き演算回路での活躍
 1ビットだけを反転させるのではあまり面白くありませ
んが、図D-28(b)のような加算器との組み合せでは、EXOR
は大活躍することになります。ここでは数値表現に1の補
数を用いて、絶対値の乗算器の前後で符号を変えるため
の共通符号変換回路としてEXORがずらりと並んでいます
が、このような使い方は、より一般的な2の補数ベースで
も同様に重宝します。

\section*{29. デコーダ設計はパズル感覚で楽しもう}

●メモリ・マップとデコーダ
 CPUシステムを設計する場合、CPUのアーキテクチャや
使用メモリデバイス・周辺LSIとの相談で、メモリマップ
を検討していきます。ここで重要となるいくつかの視点
としては、「デコード回路のコンパクト化」「I/Oの増設」
「システムの拡張性」などがあり、一種のパズルとして
設計しながら楽しめるステップとも言えます。
 アドレスデコーダを工夫してコンパクトにまとめるこ
とは、ICの数や基板上の占有スペースを抑えるだけでな
く、信号の遅延による悪影響を避けるためにも重要なこ
とです。ところが、メモリや周辺LSIが占有するアドレス
空間はそれぞれ異なるのと、デコーダ簡略化のためにデ
コードに使うアドレス線を省略することで、「イメージ」
「ゴースト」と呼ばれる重複アドレスが発生し、この検
討が必要になります。

●最適化と拡張性のトレードオフ
 デコーダ回路の設計は、138や139タイプのゲートをい
ろいろに組み合わせてみると、最少のチップでシステム
を実現する技巧的な名解答を発見することもありますが、
このような場合、たいていは仕様追加(I/O追加)のような
変更の余裕がまったくなくなり、最悪は「空中配線」を
することにもなります。
 「プロの設計」としては、最適化していながら、緊急
のI/O追加にも対応できるような最低限の余裕は確保して
おくことも重要でしょう。

●設計パズルでセンスを磨こう
 新しい設計のたびにデコーダ周辺をいろいろ実験する
のも限度がありますから、図D-29(b)のように、「ある条
件のもとでいろいろ考えてみる」というトレーニングで
センスを磨くことは有意義なものです。ついでに、「も
っとも優秀なものを判定するアルゴリズム」をプログラ
ム化して、実際に検討してみるのもいいでしょう。

\section*{3. 受動部品の常識:R / C / L}

●受動部品の基本的理解
 抵抗(R)・コンデンサ(C)・コイル(L)の基本的受動部品
については、まずは図A-3のような「定性的理解」を確認
しておきます。アナログだけでなく、ディジタル回路に
おいてもあらゆる信号は交流波形として、これら受動部
品の交流特性による影響を受けます。
 LC回路、あるいはRC回路の時定数による振舞いは、微
分・積分回路、あるいはフィルタ回路の基本となります
から、理想的な微分方程式によって回路電流を記述する
(どんな電磁気学の教科書にもある)ことも重要です。

●実際の回路での受動部品
 理想特性や定性的な議論は、実戦的な電子回路ではそ
のまま通用しません。最近のエレクトロニクス回路の特
徴から注意点をあげると、
 ・クロックの高速化:プリント基板の分布容量や配線
  の誘導成分の影響が大きい
 ・高速ディジタル:波形が理想的な2値信号でなく、ア
  ナログ的に変化する影響が非常に効いてくる
 ・ノイズ関係:抵抗のL成分、コンデンサのL成分、コ
  イルや抵抗のC成分に相当する等価的R/C/L成分を考
  慮して設計する必要がある
 ・電源の低電圧化・省電力化:ノイズ成分が相対的に
  大きくなり、また負荷変動マージンが低下する
などがあり、エンジニア同志の経験的なノウハウを共有
することの重要性が指摘されています。

●製品設計上のポイント
 コストとスペックを考慮する製品設計の場面では、
 ・最大定格と熱設計:連続使用や電源変動、システム
  全体の発熱や使用温度環境などを検討する
 ・標準部品の採用:規格や寸法の標準化、メーカの統
  一、互換部品の確認、数値の共通化など
 ・精度:精度の必要な部分と低コストで粗い部分とを
  区別し、品質検査・品質管理にも反映させる
などの点に注意して設計することになります。

\section*{30. タイマのいろいろな役割り}

●8ビットCPUの相棒:8253
 マイコンシステムでは、CPUの周辺LSIとして、図D-30
の8253(改良型は8254、CMOS版は71054)がタイマの定番で
す。これは正確には「プログラマブル・タイマ」という
LSIで、内部に16ビットのカウンタを3本持っていて、い
ろいろな動作モードをサポートしています。システムク
ロックとしてCPUと同レンジの数MHzを供給できるので、
16ビット精度の高度なタイミング処理を実現できます。
 8253のカウンタはそれぞれ別個のクロック入力とゲー
ト入力を持つために、まったく独立した(非同期)タイミ
ングを生成することができ、CPU回路とは離れたアナログ
回路の基準クロックを発生されるためにも使います。

●標準的な使い方
 タイマのもっとも標準的な使い方は、CPUシステムに定
期的に割り込みをかけることで「システム時間」を実現
する基準とすることです。CPUのソフトウェア・タイマで
は処理量によってカウンタ動作が不整脈になることがあ
りますが、タイマで強制的に基準時間を作れば、処理の
重さが変わってもシステムの「時計」は安定します。
 また、ちょっと贅沢な使い方ですが、シリアルI/O等の
LSIの基準クロックを発生する回路の使用して、ソフトウ
ェア的にクロックを変える場合にも使われます。

●より高度な使い方
 また、CPUの暴走検出のためのウォッチドッグ・タイマ
として使ったり、2つのイベントの時間差を自動的に計測
するために使う場合にも、外付けの部品はかなり少なく
て済みますから、ロジックICでカウンタを並べるよりも
簡単に設計できます。
 そして、16ビット・プログラマブルタイマの速度と精
度を活用した使い方としては、信号発生器として活用す
ることもあります。ゲート信号による制御をうまく組み
合わせると、「可変デューティ発生回路」「トーンダイ
アラ発生回路」など、いろいろと応用できるものです。

\section*{31. PIOは外界への標準的な働きかけの接点}

●8255は単なるラッチバッファ?
 8ビットCPUファミリの周辺LSIとしては、図D-31(a)の
8255(CMOS版は71055)がもっともポピュラで、インテル系
だけでなくモトローラ系のCPUシステムでも、苦労して制
御信号を合わせてよく使われてきました。
 8255は基本的には、8ビットの出力ラッチと8ビットの
入力ポートが1ブロックに共存して、これを1ビット単位
で入出力まで指定できるものです。完全にCPUの手足とし
て使う場合には、3個の574と3個の245を持っていて、こ
の中から自由に24ビットを使えるLSI、という見方です。
これだけでも、量産効果によってロジックICを揃えるよ
りもローコストになる場合もあります。

●さらに優れた機能
 実際に数十本のI/Oラインのために数個の8255を並べた
CPUボードも各社から出ていますが、さらに8255の出力ポ
ートは、「以前に設定した値を後で読み出せる」ところ
も重要です。いちいちRAMにデータをコピーしなくても、
前回の出力値をチェックできるメリットは大きいのです。
 そして3ポートの中には、外部との高速なパラレル通信
をサポートした「ハンドシェーク」制御モードもあり、
うまく使うと相当なパフォーマンスを得られます。

●メーカ各社のPIO戦争をチェックする
 どのようなCPUであっても外界とインターフェースする
必要があり、インターフェースの基本はパラレル入出力
にあります。つまり、8255のようなPIOはCPUシステムの
周辺LSIとしては、かなり大きな市場となる可能性があり、
実際に多くのLSIメーカが新しいPIOによって参入を繰り
返しています。(図D-31(b))
 ただしPIOといえば、基本的には単純なディジタル入出
力ポートですから、仕様の競争は「豊富なパッケージ」
と「多ポート内蔵」の競争になります。そこで、常に新
しい最適なチップをチェックすることも、重要な設計テ
クニックとなります。

\section*{32. システムバスを活用して一挙両得}

●システムバスの活用
 新しくマイコンシステムを設計する場合、システムが
複数の基板にブロック化されて、これらを組み合わせて
全体として動作させることは一般的な作戦です。ところ
で、この場合の基板同志の接続は、いちいちコネクタと
ケーブルを使うことよりも、共通のマザーボードに各基
板(コネクタ)を取り付けるのが常識です。これはCPUクロ
ックが高速化するほど必要なことで、信号伝送路で発生
するあらゆるトラブルを未然に防いでくれます。
 このようなシステムバスをまったく新規に定義して製
作することは得策ではなく、一般に用いられているいろ
いろな標準バス(STDバス、VMEバス、PC98バス、ATバス等)
に合わせて基板を設計することが重要です。

●開発コストのメリット
 汎用のシステムバスを採用することの最大のメリット
は、あらゆる意味で開発コストを抑えるところにありま
す。市販のラックや実験用ユニバーサルボード、さらに
ラックから引き出すエクステンションボードなどは、汎
用だからこそ容易に入手でき、開発期間を大幅に短縮で
きます。(図D-32)
 また、汎用基板で過不足なくちょうど要求に合ったボ
ードがある場合には、わざわざプリント基板をカスタム
開発するよりも、「部品」として使用した方がコスト的
にも有利なことも多くあります。ボード専業メーカは大
量生産していますから、この逆転現象は一般的です。

●信頼性のメリット
 そして重要なのが、汎用バスが広く各領域で使われて
いるのは、基本的に信頼性が高いからです。これは重要
なポイントで、汎用バスを使えばデバッグもテストも簡
単に行え、市販ボードを活用して治具や計測装置も揃え
ることができます。
 デバッグやトラブル対策は、現象を調べることが基本
ですから、プラットフォームとして安心できるバス上に
あることが、解決への近道ともなるのです。

\section*{33. 標準インターフェースの活用法}

●いろいろな標準インターフェース
 パソコンや計測器などに使われている「標準インター
フェース」には、図D-33(a)のように、モデムなど通信に
使われるシリアル形式のRS-232-C、計測器などに多いパ
ラレルのGPIB、パソコンの周辺機器に多いSCSIなどがあ
ります。また、もともと電子楽器の演奏情報を伝えるた
めに作られたMIDI(Musical Instruments Digital Interface)
という標準インターフェースも、マルチメディア化の進
んだ最近では、プロトコルを拡張して画像・映像機器や
照明機器の同期制御用として世界的に使われています。

●「標準」のメリット
 歴史的には、メーカ独自のいろいろなインターフェー
スが提案されてきたのですが、このように「標準化」さ
れてきたのは、理由があってのことです。
 同じマイコン技術を活用したエレクトロニクス機器で
あれば、それぞれのシステムの間で情報伝達・情報交換
するためのインターフェースとしては、なるべく汎用性
・互換性があった方が、ユーザとしては便利です。そし
てメーカの側からしても、ケーブルやコネクタが共通で
あればコスト的にも有利で、システムアップのためにも
都合がいいことになります。また、新しく開発する場合
にも、インターフェースの相手として標準規格のものを
使えば、デバッグやテストに実績のある安定した「標準
機」を用いることで、確実に検証することができます。

●MIDIの例
 パソコン周辺の標準インターフェースの解説は多くの
本にありますから、ここでは図D-33(b)のMIDIを例にとっ
て検討してみましょう。MIDIは31.25Kbpsのカレントルー
プ・シリアル通信で、機器はMIDI出力とMIDI入力のコネ
クタを別々に持っています。ケーブルの断線・ショート
・入力同志の接続・出力同志の接続などのトラブルがあ
っても機器は壊れないようになっています。また、フォ
トカプラでの絶縁によって、漏電など一方の異常電圧が
相手に伝わらない保護システムになっています。

\section*{34. ハードとソフトのトレードオフは永遠の課題}

●「トレードオフ」はプロのキーワード
 プロフェッショナル・エンジニアの誰もが直面するの
が、あらゆる局面での「トレードオフ」です。一般に、
あちらを立てればこちらが立たず、という状況は多いも
ので、たとえば「性能を追求するとコストが高くなる」
「開発期間を短縮するには余分に開発コストがかかる」
など、どのような場面でも高度な判断を要求されます。
 そして、プロジェクトが大きくなるほど、トレードオ
フの判断を誤った場合の影響が大きく、あとでリカバー
することが大変(膨大なコストが必要)となります。

●マイコン技術者の最大のトレードオフは
 ところでマイコンシステム設計エンジニアにとって、
最大のトレードオフは「ハードとソフトの切り分け」と
言われています。図E-34は「マイコンシステムがファジ
イ処理を行う」ための設計トレードオフの例ですが、こ
こでは3つの大きな設計方針が考えられます。
 第一の方法は「ソフトウェアが全て行う」もので、変
更が容易なメリットの反面、処理速度が遅く、他のCPU処
理にも影響を与えます。
 また第二の「ファジイ処理のハードウェア回路を作る」
方法は、処理速度は最高ですが、アルゴリズムを変更で
きない、部品・基板スペース・消費電力などのデメリッ
トが発生してしまいます。

●専用チップの検討も欠かせない
 そこで第三の方法として「CPUソフトのファジイ処理の
一部を専用LSIに演算させる」という方法も検討します。
ここではCPUソフトの中で時間のかかりそうな演算部分を
DSPに担当させるとか、あるいはファジイ演算専用LSIを
使うことを考えますが、これによって処理速度アップと
容易なアルゴリズム変更の可能性を獲得できます。
 これは、LSIメーカが「汎用」として提供する専用LSI
の高度な機能をうまく活用しようというものですが、場
合によっては専用LSIによってシステムコストを大幅に上
昇させる可能性もあり、万能というわけではありません。

\section*{35. CPUの動作を分解して理解する}

●ノイマン方式コンピュータ
 現在のマイコン(CPU、マイクロプロセッサ)はすべて、
「ノイマン方式コンピュータ」です。これは図E-35のよ
うに、基本的な動作をステップに分けて追って行ける、
というものです。このようなCPU内部の動作の概要を理解
することは、マイコンシステム設計の際には必要です。
 CPUはまず最初に、「プログラムカウンタ(PC)」の内容
をアドレスとして、メモリの格納された1行の命令を読み
に行きます。PCの値は原則として順番に進んでいきます。
メモリは指定されたアドレスの「データ」を、データバ
スに乗せます。メモリにとってこのデータの中身は「プ
ログラム」なのか「データ」なのかは関係ないことに注
意しましょう。

●プログラムフェッチとインストラクション・デコード
 このようにしてCPUがメモリ中のプログラムを取り込む
ことを「フェッチ」と言います。そして、このデータを
内部のインストラクション・デコーダで「解読」して、
必要な動作モード・制御信号を生成します。この際、ロ
ジックによるデコーダだけでなく、CPU内部の高速ROMを
アクセスするものを「マイクロプログラム方式」と呼び
ます。
 解読の結果、ここではメモリにデータを書き込む命令
と解釈された場合、メモリアドレスやデータ本体がバス
に供給され、同時にメモリ書き込みタイミングに合わせ
て「ライトパルス(書き込み信号)」も出力されます。

●CPUサイクルとプリフェッチ
 データバス上のデータは、アドレスバスによって指定
されたメモリアドレスに書き込まれて、次のCPUサイクル
に移ります。CPUとは、このような単純な繰り返しをして
いるだけなのです。
 また、最近では高速化のために、CPU内部でインストラ
クションをデコードしている最中に、次のプログラムを
フェッチしに行く「プリフェッチ」も多く行われてきて
いますが、いずれも動作原理は同様に分解できます。

\section*{36. システムの時間スケールのとらえ方}

●CPUは「速い」デバイス?
 「マイコンシステムの中核にあるCPUは非常に高速であ
り、ソフトウェアによってどんな処理でも瞬時にできる」
という先入観のある人は、ここで考え方を改めましょう。
確かにCPUは8ビット→16ビット→32ビットと進化し、CPU
クロックも数MHzから数10MHzオーダにと高速化されてい
ます。しかし、CPUのプログラムやデータを格納するメモ
リICのアクセスタイムは一般に100nsのオーダであり、CPU
のサイクルタイムは200nsから1μs程度のオーダです。こ
れを「1秒間に200万サイクルなんてスゴイ」と感じるの
は自由ですが、エレクトロニクスの時間スケールから見
れば、「CPUとはどうしようもなく遅いチップ」なのです。

●ゲートICとの比較
 ごく普通のTTLやHS-CMOSの論理ICは、ゲート遅延が15ns
とか20nsのオーダで、ASICの中のゲートになると1nsを切
るのが普通です。このような論理ゲートを組み合わせた
ハードウェアは、システムに同期させた回路を構成した
場合、システムクロックとして30nsとか50nsのパフォー
マンスを得ることができますが、システム内のCPUの遅さ
に合わせて「待ち合わせ」をすることがほとんどです。
 たとえば、ASIC内に「CPUコア」を持った例として図D-36
の具体例について見てみると、ゲートによるランダムロ
ジック部分は十分に速く動作しても、CPUのサイクルタイ
ムに合わせて待つことになり、CPUのリセット信号などは、
さらに100倍オーダの時間が必要なのです。

●人間の時間感覚との比較
 このようにゲートとCPUの時間には大きなスケールの違
いがありますが、システムはさらに「人間の時間感覚」
とも整合させなければなりません。秒・分・時間といっ
た時間スケールを、そのままディジタル回路のクロック
で計数したら何ビットを必要とするか、いちど計算して
みることは重要で、「時間スケールの検討」の視点、と
いうセンスを養うことができます。

\section*{37. ファームウェア:CPUソフトとは無限ループのこと}

●ファームウェアとは
 エレクトロニクス機器にCPUが使われている場合、この
CPUソフトウェアの形態として「ファームウェア」という
分類があります。図E-37(a)のパソコンを例にとると、CPU
へのリセットとともに、BIOSと呼ばれるROM内の起動プロ
グラムによって外部記憶装置(フロッピー、ハードディス
ク等)が読み出され、この中身がシステム内のRAMエリア
に転送されます。そしてCPUのプログラム制御がRAM上の
ソフトウェアに移管され、目的の処理を開始します。
 ところが一般の電子機器に組み込まれたCPUの場合には、
CPUプログラムはマスクROMなどの形で固定していて、単
一の動作を行うだけです。これを「固定されたソフトウ
ェア」ということで「ファームウェア」と呼びます。

●ファームウェアの長所と欠点
 CPUのプログラムがファームウェア化されるのは、機器
組み込みで仕事が固定していること、RAMや補助記憶媒体
のコストが不要なこと、ROMなのでプログラムエリアが破
壊されないこと、などのメリットによります。しかし、
欠点として「プログラム変更はROM交換」が必要です。
 これに対してパソコンでは、いろいろなソフトウェア
を切り替えて実行する必要がありますから、起動時や周
辺ハードウェア制御など最低限のプログラムだけをROM化
して、メインメモリ(主記憶:プログラムもデータも置か
れる)はRAMで、それも電源が切れれば消えてしまうDRAM
(大容量ながらコストが安い)で構成されています。

●全てのプログラムは無限ループ
 ところで、ファームウェアにしてもソフトウェアにし
ても、図E-37(b)のように、基本的には「無限ループ」で
人間からのアクションを待っている、という原理だけは
忘れないようにしましょう。割り込みやマルチタスクに
よるバックグラウンド処理、あるいは「電源OFFプログラ
ム」を除けば、どんなプログラムもこれが基本です。フ
ローチャートの「終わり」は、あくまで下の階層(の無限
ループ)に戻ることなのです。

\section*{38. BIOSは使うもの? / 作るもの?}

●パソコンのBIOSを活用する
 一般にDOS(MS-DOS)の環境でパソコンを使っている場合、
あまり目立たないのが、システム内部のROMに用意されて
いるBIOSです。しかし図E-38のように、パソコンの機種
に依存するBIOSは、機種依存性を軽くしたいDOSからは常
時アクセスされているのが一般的で、プログラムが一見
「DOSコール」をしているようでも、その中身ではBIOSコ
ールの嵐となっているのです。
 高級言語プログラミングのレベルでも、たとえばC言語
によるプログラムの中から直接DOSコールすることはでき
ますし、レジスタ渡しのパラメータによってBIOSコール
を行えるようになっている場合も多くあります。

●BIOSを解析してオリジナル化する
 一般にDOSコールのような汎用ルーチンは、多くの動作
モードに対応したり、入出力のパラメータ処理などに豊
富なサービスを提供しています。そして必要な処理のた
めだけにハードウェアをアクセスするより、かなりの手
間をかけていて、処理時間が相当にかかるものです。
 そこで、特定の処理だけに限れば、DOSがさらに呼び出
しているBIOSルーチンを必要な部分に限ってコールする
ことで、かなり高速化されます。
 また、デバッガ等でBIOSを解析して、BIOS処理の中で
も余分なサービスをカットしたモジュールを作って、空
いているソフトウェア割り込みのベクターアドレスに登
録すると、より高速で無駄のない処理となります。

●階層化とオリジナルBIOS
 筆者の経験でも、キーボードスキャンのBIOSルーチン
が重くてシリアル通信ポートのデータを落とすことがあ
ったために、キーボードBIOSを解析して必要な処理だけ
を切り出したところ、見事に解決したことがあります。
 このようなアプローチによって、組み込みCPUのプログ
ラムであっても、「I/O処理をBIOSの形にまとめる」とい
う構造化設計のテクニックが身についてくるでしょう。

\section*{39. ラベルの付け方にセンスが光る}

●ソースプログラムでのラベルの役割り
 プログラムを開発する場合にもっとも重要なのは「可
視性」だと言われます。可視性とは、そのプログラムを
別の人が解読しやすくすることでもあり、またプログラ
ムを作った本人が、ずっと後で再びプログラムを読んだ
場合に理解できるか、という意味もあります。
 プログラムのあちこちに「コメント行」を入れて説明
することは、このプログラムの可視性に大きく貢献しま
すが、忘れてならないのが「ラベル」「モジュール名」
「変数名」などのプログラム要素のネーミングです。
 現在進行形でプログラムを開発している期間はなんで
もなかったのに、半年後にバグが発覚して修正する必要
があって自分のプログラムを眺めてみると、コメントよ
りもこのネーミングで混乱することが多いものです。

●処理系に応じたネーミング
 図E-39はこのようなネーミングのポイントをまとめた
ものですが、もっとも重要なファクタは「処理系の許容
限度」です。高級言語や強力なマクロアセンブラなどで
は、64文字とか256文字など、現実的には無制限の仕様の
ものも多く、この場合には「_」(アンダーバー)でいくつ
もの単語を並べて、ラベルや関数名だけで意味が十分に
伝わるようにします。
 一方、簡単なアセンブラでは今でも6文字とか8文字と
いう制限を持つものも多いのですが、この場合にはアプ
ローチを正反対にします。つまり、規則的な文字列と数
字(先頭にゼロを入れて長さを揃える)にしてしまって、
別にコードブック(解読辞書)を用意するようにします。

●短縮形・圧縮ラベルに注意
 その場で自分では分かっているつもりでも、限られた
文字数に無理に短縮・圧縮したラベルは、何の意味も持
たない名前以上に、誤解釈によるトラブルの原因となる
ことが多いことに注意します。また、関連したラベルは
あとでソートするために最初の文字のアルファベットを
揃えるのもうまいテクニックです。

\section*{4. 内部抵抗と電圧降下は見過ごせない}

●内部抵抗の影響
 新人エンジニアが起こす設計ミス(見落とし)に多いの
が、電源(電池)の内部抵抗の効果です。図A-4(a)のよう
に、電池には化学的エネルギーによる起電力部分ととも
に、必ず内部抵抗成分があります。これは電池の種別や
経時変化によっても変わるパラメータです。
 内部抵抗は起電力に直列に接続され、「最大電流の制
限」「電源内部での発熱(エネルギー消費)」「実効電源
電圧の低下」などの影響をもたらします。とくに電力回
路では、電力が電圧の2乗で効いてくるために、わずかな
内部抵抗の存在が大きな意味を持ちますから注意します。
 また、ディジタル回路は「TTLの5V電源」の長い時代か
ら、「3.3V」「3V」の時代に移行しようとしています。
これは「省電力」「高速度」のメリットの反面で、
 ・ノイズマージンの低下:同じレベルのノイズに対し
  てより弱くなる
 ・誤動作・リセットレベルのマージン低下:わずかな
  電圧降下でもリセットICのスレショルドに達する
などのデメリットもある進展ですから、電源の内部抵抗
に対する注意は、より重要になっていきます。

●電圧降下の影響
 半導体は基本的にかなり高い抵抗を持っていますが、
もっとも単純な半導体であるダイオードでも、複雑な電
圧降下の特性をもっています。図A-4(b)のように、
 ・順方向:電圧が増えるとともに電流も増える、等価
  的な抵抗による電圧降下がある
 ・逆方向:きわめて大きな抵抗でほとんど電流を流さ
  ないが、「降伏電圧」を越える逆電圧がかかると、
  ほとんど抵抗成分がゼロとなる
という特性を理解して、最大定格や電圧降下を検討した
設計をする必要があります。
 具体的には、整流ダイオードやLED回路の電流計算や、
ロジックICのスレッショルド設計の際に注意します。

\section*{40. アドレシングモード:CPUの個性と戦略}

●CPUのアドレシングモード
 マスクROMタイプの1チップマイコンを使う組み込み機
器では、CPUのプログラムを限られたメモリ容量に格納す
るために、アセンブラ言語によっていろいろなテクニッ
クを駆使する伝統があります。最近ではROM容量の増大と
Cコンパイラの最適化機能でかなり状況は改善されていま
すが、「CPUの個性を生かした作法」による最適化はまだ
まだ人間の仕事です。

●CPUアーキテクチャの検討
 ここで重要なのは、CPUのアーキテクチャを考慮して、
CPUに応じたデータ構造・メモリ構造を考えることです。
たとえば図E-40(a)の3種類のCPUの場合、65C02は見るか
らにシンプルで、レジスタはデータバッファにも使えそ
うもない印象があります。しかし、実はZ80などより数段
優れたアドレシングモードを持っており、ファミコンで
立証されている素晴らしいパフォーマンスを持ちます。
 また、Z80とTLCS-90では、見たところ同じレジスタモ
デルですが、実はアドレシングモードには雲泥の違いが
あります。このように、レジスタモデルとアーキテクチ
ャの十分な理解がスタートラインになります。

●アドレシングモードとテーブル選択ジャンプ
 この3種類のCPUで比較する処理として、図E-40(b)のよ
うな例について考えます。これはもっとも単純な数値判
定処理で、C言語のサンプルのように逐次比較していくの
が、もっとも単純な考え方です。
 ところが、あまり高速でない8ビットCPUでは、このよ
うな逐次比較は時間のロスが大きく、またプログラムも
だらだらと長くなります。そこで図E-40(c)のリストのよ
うに、テーブルに置かれた処理ルーチンのアドレスを呼
び出して、そこにジャンプするテクニックがあります。
 この場合、TLCS-90では簡単にテーブルをアクセスで
きるのに対して、Z80はアドレス計算の手間が必要です。
そして、もっともシンプルな65C02がもっともスマートに
この処理を実行できるのです。

\section*{41. SMT:これからの実装技術}

●SMTとは
 SMT(Surface Mount Technology)とは「表面実装」のこ
とで、現在ではビデオカメラ・ノートパソコンなど、小
型軽量の電子機器では標準的なプリント基板への部品実
装方法です。たとえばICの場合、従来の0.1インチのピン
間隔のDIPから「シュリンクDIP」とパッケージを狭くし
たのに続いて、SOP・QFP・PLCCなどの小型・薄型パッケ
ージへと進化することで、多ピンパッケージへの対応を
実現してきたのですが、この流れが基板の小型化ととも
に他の受動部品にも広く波及しました。
 さらに、今ではチップ部品は「1608」(16ミリ×8ミリ)
から「1005」へと進化を続けて、抵抗やコンデンサだけ
でなく、コイル・トランス・スイッチ・EMIフィルタなど
も出そろってきています。(図F-41)

●SMTの利用方法
 現在のところでは、「まだSMTはコスト高」というのは
事実ですから、それなりのメリットがなければなかなか
採用できません。そこで、大量生産される家電製品以外
の分野での利用方法について検討してみましょう。
 まず最初に検討されるのは、LCDパネル・ELパネルなど
の機能モジュール基板としての使用です。ここでは「薄
さ」が最大のポイントになり、コスト高でもSMTを導入す
るメリット(付加価値)があります。

●SMT小型CPUボードのメリット
 また、CPUブロック部分だけをSMT基板としてメーカに
製造してもらって、一種の「部品」としてそのままシス
テムに組み込むアプローチもあります。これは、多機能
を持った最近のCPUが100ピンとか120ピンのQFPなどで供
給されるようになったために、人間の手作業で不安定な
ハンダ付けをするよりも、CPUメーカの保証があるCPUボ
ードの方が信頼性に優れているからです。ボードマイコ
ンを「部品」として使うのと同様に、SMT対応のボードや
機能モジュールの活用を選択肢に入れておきましょう。

\section*{42. オンボード・レギュレータの効能}

●3端子レギュレータはますます活躍する
 電子回路には安定した直流電源が必要ですが、これを
支えているのが「3端子レギュレータ」のICです。最近の
電子機器ではケース内部に電源を持たずに、ACアダプタ
から電源を供給するものも増えてきましたが、これはCMOS
化による低消費電力のおかげで、システム内部は簡単な
3端子レギュレータを持つだけですみます。
 従来の電子回路であれば放熱についての配慮も必要で
したが、ローパワー回路ではトランジスタと同じ形状の
小型のものも活躍しています。

●アナログ・ディジタル混在回路の電源を分離する
 図F-42(a)は、アナログとディジタル(CPU)の同居した
システムで、3端子レギュレータが効果を上げた例です。
一部に大電流が必要なため、ケース内には+5Vと+12Vの2
出力のスイッチング電源がありましたが、CPUボードへの
+5Vラインに外部からのノイズが影響を与えるのと、アナ
ログ信号ラインにCPUボードの高いクロックが混入する現
象が起きました。電源の共用が原因でした。
 そこで、CPUボードに対してスイッチング電源の+5Vを
与えるのをやめて、アナログラインと同じ+12Vを供給し、
CPUボード上のCPUのすぐ近くに3端子レギュレータを置い
てみました。当然、大容量のケミコンと積層セラミック
のパスコン、さらにフィルタとして簡単なチョークコイ
ルも用いたのですが、面白いようにノイズをカットして
正常動作を実現できました。

●静電気ノイズに対する耐性も大幅アップ
 また、図F-42(b)のように、このシステムの静電気ノイ
ズ(誤動作)試験をしたところ、+5V共用の時には500Vほど
の静電気ノイズで暴走していたものが、CPUの間近のオン
ボードレギュレータを入れると、1300Vまで暴走しなくな
り、ノイズ耐性は大幅に改善されました。
 CPUはますますローパワー化されて、CPUの隣に小型の
3端子レギュレータを置くことはますます容易になってい
ますから、信頼性技術として活用しましょう。

\section*{43. センサのデータを取り込むまで}

●シグナルコンディショニングとは
 「マイコンシステムがセンサの情報をA/D変換して取り
込む」と簡単に言いますが、実際にはこの過程に多くの
重要なアナログ技術が隠れています。図F-43はその様子
を示したもので、「センシングアンプ」の周辺が回路設
計のポイントとなります。この領域は「シグナルコンデ
ィショニング」とも呼ばれますが、ここではまず、
 ・計測したい物理量と、それに対するセンサとの接点
  に関する物理的配置
 ・一般に微小出力であるセンサ出力の増幅
 ・センサの周囲温度変化に対する補正の方法
 ・電源供給の必要なセンサの場合、安定でノイズの乗
  らない電源の供給方法
などが検討されます。

●センシングアンプからA/Dシステムまで
 理想的なセンシングアンプは、温度補正のためにはセ
ンサとなるべく近い場所に(同じ半導体チップ上が最高)
あり、独立した電池を電源として、オンボード(オンチッ
プ)トリミングできるものです。
 この出力を実際のA/D変換−CPU処理システムにもって
くるまでが次の関門です。センサ出力が電圧出力である
と、長いケーブルでの電圧降下とノイズを拾うデメリッ
トがあるために、一般に電流出力かパルス列に変換して
転送されます。ここでは、
 ・電流出力では「データがゼロ」の時にも一定の電流
  が基準として流れるように値の範囲を定義する
 ・パルス出力では「パルス数」「パルス幅」など、測
  定したい量のダイナミックレンジと時間的変動特性
  に応じて設計する
というポイントをおさえます。

●ケーブルのシールドにも注意
 シグナルコンディショニングの領域では、センシング
アンプの低出力インピーダンスを高インピーダンスで受
けることと、ケーブルのシールドにも注意します。

\section*{44. ユニークなOPアンプを活躍させよう}

●汎用OPアンプと特殊なOPアンプ
 現在のアナログ回路の主要部分は、ほとんどはOPアン
プによって構成されています。ローコストな汎用OPアン
プでも、一般的なアナログ信号の回路では十分な性能を
引き出すことができますから、ブラックボックスとして
今後もますます活躍していくでしょう。
 ところで、半導体メーカでは、OPアンプのラインナッ
プとして汎用品だけでなく、いろいろユニークなものを
提供しています。これは、それぞれに優れたスペックを
盛り込んで機能の差別化を目指したものですが、うまく
採用することで、システムの性能を向上させるために有
効な作戦ともなるものです。

●「売り」のスペックに注目する
 図F-44は、このようなユニークにOPアンプの特徴をい
くつかの視点からまとめてみたものです。具体的には、
 ・パッケージ:1パッケージに特性の揃ったOPアンプを
  2つ(デュアル)とか4つ(クワッド)を持っていて、チ
  ップ内部のレイアウトを対称にして相補的動作の誤
  差を極力抑えたもの(高性能差動増幅向き)
 ・パッケージ:フラットパッケージやチップ部品化し
  たパッケージにより、高密度実装を可能にしたもの
 ・電源:単一電源タイプ、低電圧タイプなど、システ
  ムの電源回路を簡単・電池対応にできるもの
 ・信号出力:電源電圧まで完全にフルスイングできる
  もの、あるいは大電流出力のドライバを内蔵したも
  の
 ・高性能:汎用OPアンプよりも2桁から3桁、ローノイ
  ズ、ハイゲイン、直線性、高入力インピーダンスを
  実現したもの
などのスペックが競われています。

●コストと性能のトレードオフによって検討
 これらのユニークに特性の中には、汎用OPアンプを組
み合わせて実現できるものと、このチップでないと不可
能なものがあり、「性能を買う」判断も重要です。

\section*{45. インターフェースICを活用する}

●インターフェースはシステムアップの近道
 マイコンシステムなどでは、もっとも簡単な仕事はス
タンドアロンで行えますが、ある程度の処理量になった
場合や複数の場所での処理を統合する場合などには、情
報のインターフェースが重要になります。ここでは、イ
ンターフェースに関連した専用ICを考えましょう。

●RS-232-Cのインターフェース専用IC
 パソコンにも標準インターフェースとして採用されて
いるシリアル通信のRS-232-Cですが、従来は図F-45(a)の
ように±12Vの電源を必要とする、マイコンシステムとは
あまり相性のよくない規格でした。
 しかし、MAXIM社のMAX230シリーズが筆頭となって、+5V
単一電源で送信・受信バッファを複数回路にわたって格
納した一連のインターフェースICが登場すると、メーカ
各社もこれに従って各種のICを発表し、現在ではローコ
ストで簡単にRS-232-Cが使えるようになりました。この
ICは、内部にチャージポンプ型のDC-DCコンバータを内蔵
して、自分で通信規格の電圧を発生してくれるもので、
システム設計者はたんに+5Vのディジタル電源のプラック
ボックスとして活用できるものです。

●システム間通信専用IC
 図F-45(b)にあるのは、ステップテクニカ社のMKY28と
いうユニークなインターフェースICです。これは、複数
のマイコンシステムを有機的に結び付けてシステムアッ
プするための強力な武器となるもので、イメージ的には
2つのCPUシステムが「デュアルポートRAM」をそれぞれの
メモリマップ中に共有した状態を作るものです。
 ところが、実際には2つのMKY28はたった2本のシリアル
信号線で遠くに離すことが可能なのです。必要に応じて
光ファイバを使えば、それこそ数百メートルも可能で、
このシリアル信号ラインで独自のプロトコルの双方向通
信を行うことで、両方のCPUシステムのRAMの一部の領域
の情報をほぼリアルタイムに交換する、というものです。

\section*{46. シリアルDACと周辺技術}

●パラレルDACとシリアルDAC
 ディジタルシステムの出力をアナログ信号に変換する
ために必要なD/Aコンバータは、大別してパラレルインタ
ーフェースのタイプとシリアルインターフェースのタイ
プの2種類があります。(図F-46(a))
 パラレルバスのタイプは8ビットや12ビットのものに多
く、システムからの出力をパラレルのラッチに保持して、
そのままアナログ出力が得られます。
 シリアルのタイプは、CD・DATなどで普及したディジタ
ルオーディオのD/Aコンバータに多く、16ビットから18ビ
ット・20ビットの高性能のものを中心としています。ま
た、オーディオ用途のために、基本的にステレオの2チャ
ンネル仕様となっています。

●シリアルD/Aのインターフェース
 シリアルD/Aコンバータでは、データラインとして1ビ
ットの他に、システムクロック・L/Rクロック・ワードク
ロックの3本のタイミング信号を一般的に用いています。
 クロック(SYNC)信号は、D/Aのサンプリング周波数の整
数倍に規定されて、シリアルデータの同期の基準となり
ます。ワードクロックの立ち下がりを1組のデータの基準
として、LRクロックのそれぞれのエッジからLとRのステ
レオデータの基準位置をとって、シリアル16ビットのデ
ータ列がD/Aに解釈されます。
 このようなインターフェース仕様は完全に互換ではな
いものの、メーカ各社でほぼ標準となっていますから、
規格に合うように送りデータを揃えます。DSPであれば、
マイクロプログラミングによってフォーマット化します。

●シリアルD/Aの拡張性
 図F-46(b)に示すように、16ビットシリアルD/Aコンバ
ータのインターフェース規格は、まったく同じ形式で将
来的に18ビット・20ビットに性能アップした場合にも互
換性が取れるようになっています。ローコスト機器は16
ビット、高性能機器は20ビットといった対応を可能にし
ている柔軟なフォーマットは、参考になります。

\section*{47. PIOによるハンドシェーク通信}

●ポーリング
 おもにパラレル信号ラインによるシステム間のデータ
通信方法には、「ポーリング」と「ハンドシェーク」が
あります。ポーリングとは、マスタとなる側が自分のシ
ステムタイミングでスレーブ側のステータスフラグを定
期的に見にいって、「送るべきデータがある」というス
テータスであればデータを読みにいく、というものです。
またデータ書き込みの場合には、スレーブ側が「データ
受け入れ可能」のステータスであることを確認してから
データを書き込む、というものでした。

●ハンドシェーク
 このポーリングの欠点は「遅さ」です。そこで図F-47
のように、データラッチに対する書き込みやデータの読
み出しによってセット/リセットされるフリップフロッ
プ(F/F)を設けた方法が「ハンドシェーク」です。
 ここでは、スレーブ側がデータの受け取り完了の信号
を出すと、ハンドシェーク通信のF/Fがセットされてマス
タ側に割り込みをかけ、マスタは次に送るべきデータが
あればすぐさま書き込みます。この書き込みパルスはハ
ンドシェーク通信のF/Fをセットしてスレーブに割り込み
をかけるようにしておくと、スレーブ側はすぐさまデー
タを読み出してシステム内に格納し、再びホストに次の
データを要求する、というものです。

●PIOによるハンドシェーク
 このようなハンドシェーク通信は、高速・多量のデー
タ転送方法として有効ですが、インターフェース用のF/F
などを別個に設ける手間があります。
 ところが、インテル系CPUの周辺LSIである8255PIOは、
このようなハンドシェーク動作をサポートするモードを
特別に持っています。8255の3つの動作モードのうち、ハ
ンドシェーク片方向のデータ転送には「モード1」が、双
方向のデータ転送には「モード2」(タイミング設計を慎
重にする必要あり)が対応しています。

\section*{48. SIOによるシリアル通信}

●シリアル通信をソフトやハードで作る
 シリアル通信の最大のメリットは「信号線が少なくて
よい」ことで、デメリットとしては「データ転送に時間
がかかる」「通信フォーマット・プロトコルに合わせる
必要がある」ということになります。
 図F-48(a)は、CPUシステムでRS-232-Cのようなシリア
ル通信を行うために、あえてソフトウェアやハードウェ
アだけで考えた例です。このように方法では大変な手間
がかかる上に、十分なパフォーマンスを得られません。
 そこで、UARTのような「シリアル通信専用LSI」を用い
ます。インテル系でいえば8251になりますが、この周辺
LSIはRS-232-CやMIDIのような単なるシリアル通信だけで
なく、もっと高度なプロトルもサポートしているもので、
通常の通信でも「エラー修正」などに使えます。

●シリアル通信のポイント
 8251のようなブラックボックスを使うことで設計上は
ずいぶんシンプルになりますが、マイコンシステムがUART
を十分に活用するためには、ハード的にUARTを使ったと
いうだけでなく、これに対応したソフトウェア設計をき
ちんと行うことが重要です。
 具体的には、シリアル通信によってデータ送信・デー
タ受信を行うトラフィックとデータ密度を検討して、
 ・CPUとUARTとの関係をポーリングにするのかハンドシ
  ェークにするのか
 ・データのバッファリングの方法
 ・データあふれ、データ落しへの対策
などを検討します。FIFOバッファも活用しましょう。

●各種UARTの選択もポイント
 もう一つ重要なポイントは、UARTの選択です。最近の
1チップCPUはシリアルポートを持つものも多く、さらに
図F-48(b)のように、メーカ各社が熾烈な新製品(高機能)
のUARTを続々と発表しています。この中からパフォーマ
ンスを引き出せる適切なUARTを選ぶのも「技術」です。

\section*{49. MMUは使い方が大切}

●MMUの考え方
 8ビットCPUのシステムは、一般に16ビット・64キロバ
イト程度のアドレス空間を持っています。ところが、最
近はCPUの高速化とアドレシングモードの充実、さらに大
容量メモリが普及してきたために、可能であればCPUのア
ドレス空間をもっと拡大したい要請が強くなっています。
ここでは、
 ・複数のプログラム・サブルーチン・BIOSを置く
 ・多量のデータテーブルを置いて、テーブル参照によ
  って瞬時に「演算」結果を得てしまう
 ・マルチタスク化して、複数のタスクごとにメモリバ
  ンクを切り替える
などの目的が求められていますが、CPUのアーキテクチャ
が基本的に変わらない以上、周辺回路としてアドレス変
換を管理するMMU(メモリ・マネジメント・ユニット)が必
要になってきます。

●MMUの動作
 図F-49は、代表的な2種類のMMUの動作を示したもので、
もっとも簡単にはラッチによって上位アドレスを生成し
ます。ただし、これはあくまで基本ブロックであり、実
際にはCPUのプログラムエリアに対するアクセスは強制的
にプログラムエリアに指定させる、といった処理が必要
になります。
 また、このラッチを多数並べて、その選択に16ビット
アドレスの上位の何ビットかを用いる、という発想を延
長させると、高速RAMをアドレスページのマッピングに使
用したMMU、という方式が考えられます。このMMUは一部
のCPUの内部で実際にマルチタスク用に使われています。

●1チップCPUの内蔵MMUを活用する
 MMUはこのようにロジックとしても構成できますが、
もっとも多いのは1チップCPUなどに内蔵されているMMUブ
ロックを活用したアドレスマネジメントです。それぞれ
の仕様をよく検討した上で活用したい機能です。

\section*{5. AC電源と電池を賢く使う}

●電源あっての電子回路
 電子回路が動作するためには、どうしても直流電源が
必要になります。ディジタル回路の+5V電源やOPアンプの
プラスマイナス15Vの2電源など、標準化のために多くの
電圧は共通のものになっています。しかし、コンセント
から供給される電源は交流であり、ここに電源回路が必
要となります。
 現在の電源回路は、スイッチング電源とレギュレータ
電源に大別されていますが、メーカから供給されている
電源装置を「部品」として使うのか自社製造するのか、
さらに電源を内蔵するのかACアダプタとして外部に出す
のか、等について、図A-5のような視点から適切な方法を
十分に検討して採用することが大切です。

●ノイズ・発熱・信頼性の視点
 スイッチング電源は電力効率の良さと電圧の安定度の
点でディジタル回路に最適ですが、AC電源ラインに高調
波電流を発生するノイズ的な問題点、さらにアナログ回
路にノイズを乗せる弊害もあります。
 レギュレータ電源はオーディオなどアナログ回路では
一般的ですが、回路設計の上では放熱について十分に検
討する必要があり、連続運転の試験なども必要です。
 最近では多くの電子機器がACアダプタ方式にしていま
すが、ノイズや熱設計の点でのメリットに加えて、アジ
アNIES諸国のメーカからOEMで入手するのがもっともコス
ト的に有利になっている、という状況もあります。

●電池もいろいろに活用できる
 軽薄短小化によって、ポータブル性のメリットを生か
せる電子機器では、電源として電池を活用したいもので
す。回路の消費電力を抑えて乾電池駆動とした場合には、
動作条件にマージンを乗せて実際に連続試験をして、確
実な連続動作時間を測定してカタログデータとします。
 また、各種の充電式電池も活用できますが、ACアダプ
タを連続使用した場合の充電回路をよく検討しないと、
発火事故の原因となり、PL問題の危険性もあります。

\section*{50. DMAをうまく活用する}

●DMAによる高速データ転送
 マイコンシステムの内部やシステム間のデータ転送に
ついては、比較的情報量が少ない場合にはポーリングや
ハンドシェークでも十分ですが、一定時間内にまとまっ
た情報を転送したい場合には、「CPUが一旦取り込んでか
ら書き込む」という繰り返しが著しく非効率になること
もあります。たとえば「ハードディスクからメインメモ
リにファイルを読み込む」という処理の場合、CPUがその
ファイルの内容を使うのは別の時ですから、このデータ
転送にいちいちCPUが介在する必要はありません。
 このような場合には、図F-50(a)のようなDMA(Direct
Memory Access)転送が強力なパフォーマンスを実現しま
す。DMAにはいろいろな種類がありますが、原理としては
「CPUのバス占有権を受け継ぐ」ことで実現されます。CPU
はDMAのバスリクエストに対して「アクノリッジ」を出し
てバスを解放し、DMSコントローラがI/Oやメモリのアド
レス管理・読み書き制御を行います。

●DMAの注意点
 1チップCPUに内蔵されているDMAコントローラなどでは、
システム動作に合わせたものが用意されるのであまり問
題はありませんが、汎用のDMACとCPUを組み合わせた場合
には、バス占有権のやりとり(CPUに制御が戻るタイミン
グ)やDRAMのリフレッシュ期間の確保に注意します。
 また、一度に転送するブロック長によって、システム
のパフォーマンスが大きく影響されますから、扱う情報
量を十分に検討します。

●サイクル・スチールDMA
 また、図F-50(b)のように、CPUの動作サイクルの半分
ごとにハードウェアがCPUバスを使用する「サイクル・ス
チールDMA」というものもあります。これはモトローラ系
CPUでのみ可能な方法ですが、DSPとCPUコアとを共存させ
るシステムでは極めて強力な手法で、たった2MHzのクロ
ックで超強力な旧ファミコンの秘密はここにあります。

\section*{51. I/O命令とWAIT:タイミング設計のポイント}

●CPUと周辺I/Oのタイミング
 CPUからメモリをアクセスする場合には、CPUアドレス
からのアクセスタイム、そしてリード信号とライト信号
のタイミングをデータシートで調べて確認する、という
設計作業になりました。ところがCPU周辺LSIとのインタ
ーフェースの場合には、もう少し状況がややこしくなり
ます。
 図F-51のように、
 ・アドレスバスのデータ確定とデータバスのデータ確
  定とのタイミング条件
 ・デコーダを経てチップセレクトが確定するまでの遅
  延(セットアップ時間)
 ・リード/ライトパルス幅
などのように、CPUからI/Oをアクセスするまでの期間の
条件がいろいろと規定されています。

●よりシビアなホールドタイム条件
 そしてもっと重要なのが、リード/ライトパルスのエ
ッジからチップセレクトやデータバスが確定したまま残
っている「ホールド時間」の条件です。これは、CPU周辺
LSIはCPUとのインターフェースのために内部にラッチを
もっており、確実にラッチされてLSI内部に取り込まれる
ために必要な時間の条件で、ギリギリの設計では「まれ
にデータを落とす」という最悪の現象を起こします。
 最新のCMOSタイプの周辺LSIでは、この部分が改良され
て「ホールド時間はゼロでOK」という簡単なものもあり
ますが、機能的には互換なのに旧モデルのNMOSタイプは
一定の時間(だいたい十数nsec)を要求するものもあり、
場合によってはF/Fによるタイミング回路を必要とします。

●「必要悪」のWAIT信号
 どうしても周辺LSIとCPUとがタイミング的に合わない
場合には、CPUに対してWAIT信号を返して、CPUが「待ち
合わせ」をすることになります。規格ギリギリで不安を
残すよりは、確実なWAITを採用する決断もケースバイケ
ースで必要になります。

\section*{52. FPGA/LCAはプロのための援軍}

●ランダムロジックのカスタム化
 従来はTTLなどで組んでいたランダムロジック回路です
が、最近ではPLD/FPGA/LCAなどのユーザ・プログラマブ
ルICによって、設計者が手元でカスタム化することも一
般的になってきました。
 これは単に新しいデバイスを活用する、ということ以
上に、システム設計において「与えられたハードを組み
合わせる」というだけの姿勢から、「必要ならばハード
をプログラムして出現させる」設計へと進化している、
という重要な進歩があります。

●ハードのカスタム化のための作戦
 図F-52は、PLD/FPGA/LCAという代表的なユーザ・プロ
グラマブルICの選択についての、いくつかの視点をまと
めたものです。まず最初の選択ですが、
 ・ある程度のロジック規模がある
 ・あとで(デバッグ・テスト・バージョンアップ・仕様
  変更等)回路の一部を変更する可能性がある
 ・せっかくの機会に体験してみたい
というような場合には、迷わず採用したいところです。
 そして、回路規模によってPLDかFPGAか、あるいはCPU
からソフト的に回路を変更したければLCA、などと検討し
ていきます。

●特徴を生かした活用を考える
 一般的にいえることですが、PLDプログラミングの場合
にもトレードオフがいろいろあります。たとえば、
 ・あとあとASIC化するような本格的な回路に発展する
  場合には、プログラミングツールも本格的なCADを使
  って、シミュレーションを徹底する
 ・回路の秘密保持にヒューズタイプのものを採用する
 ・生産用・実験用に応じて、紫外線消去タイプ(高価)
  とマスクタイプ(低価格・量産時)とを使い分ける
などのいろいろな条件を考えて、付加価値を効果的に利
用できるような選択を検討します。

\section*{53. データフロープロセッサとDSP}

●データフロープロセッサ
 ここで紹介するデバイスは、ずっと筆者が応援してき
たNECの「データフロープロセッサ」というLSIです。デ
ータフローというユニークな考え方と、図F-53(a)のよう
なスマートなアーキテクチャを持つ「美しい」LSIなので
すが、残念ながらメジャーになることも改良されること
もなく存在している、という独特のチップです。
 ノイマン方式の一般のCPUとはまったく違って、ここで
は外部16ビット、内部は60ビットもある幅広いデータバ
スの中にデータもインストラクションもステータスも同
時に流れる、というユニークな動作を行います。

●データフローは難しいのか
 最近ではシャープから、数チップ構成の同様のデータ
フローシステムが出てきましたが、こちらもあまり目立
ちません。最大の原因は、おそらく「データフローとい
う概念」が壁となって、なかなかうまいアプリケーショ
ンが思い付かないのと、NECのこのチップが、実際的には
あまりパフォーマンスを上げられないからなのでしょう。
しかし、画像処理やパターン認識などで、何かうまい応
用があるような気がしてなりません。

●DSPはどんどん進歩している
 これに対して、いろいろな局面でDSP(Digital Signal
Processor)はどんどん進歩しています。DSPをCPUと比較
してみると、図F-53(b)のように内部に各種の専用バスを
持つ「ハーバードアーキテクチャ」がポピュラですが、
その他にもデータ入出力ブロック、演算ブロック、マイ
クロプログラミングメモリなどをいろいろと取り揃えて
います。
 最近はマルチメディアの流れに乗って、画像処理や音
声処理の用途に特化したDSPが各種発表され、いろいろに
活用されています。CPUのソフトウェアで不可能な処理を
実現するDSPは、必要に応じてぜひともトライして欲しい
ターゲットです。

\section*{54. 導電ゴム接点スイッチのスキャン回路}

●導電ゴムスイッチ
 最近のマイコン内蔵機器では、金属接点を用いた本格
的なスイッチを使う部分は電源のON/OFFなどに限定して、
よりローコストな導電ゴムによるスイッチをパネルに並
べるものが増えています。(図G-54(a))
 これは、プリント基板に櫛状のスイッチパターンをそ
のまま作って、その上に導電ゴム片を持ったドーム状の
ゴムスイッチ部を配置するもので、ゴムのドームが防塵
とスイッチの復帰作用を同時に実現するものです。

●スイッチのスキャン回路
 電卓やリモコンなど、多くのスイッチが並ぶマイコン
機器では、図G-54(b)のようにスイッチをマトリクス状に
配置して、CPUから行アドレスデータを出力して、列デー
タをスキャン入力して判定することが一般的で、入出力
ポートのビット数を低減することができます。
 ところが、このようなスイッチマトリクスに導電ゴム
スイッチを使った場合には、金属接点のスイッチとは別
の注意が必要になります。
 理論的にはON/OFFのスイッチですが、導電ゴム接点は
かなり高いオン抵抗(数百Ωから1KΩ程度)があるために、
ラッチ出力ラインのプルアップ抵抗と、スキャン入力ラ
インのプルアッフ抵抗との関係で、正しいデータを得ら
れなかったり、ノイズを受けて誤データとなる確率が高
くなります。

●出力ポートと入力ポートの選択が重要
 この場合には、基本的にCMOSゲートによるスイッチマ
トリクス回路を採用することが重要です。スキャンアド
レスのドライバ出力にTTLゲートを使うと、ハイレベルが
十分に確保しにくく、またデータ入力にTTLゲートを使う
と、スレショルド電圧がCMOSよりも低いので、スイッチ
を弱く押した場合(オン抵抗がかなり大きくなる)に正し
いオン情報を検出できない場合があります。
 CPUや周辺LSIがTTLレベルであれば、抵抗値を調整する
よりもCMOSゲートを追加する方が確実な対策です。

\section*{55. 「リセット」の周辺:リセットは奥が深い}

●リセットはディジタル回路のスタートライン
 CPUやSIOなどのシステムクロックに従うLSIだけでなく、
PIOやDMACなどのクロックを使わないLSIにとっても、バ
スラインとの関係を規定する動作(読み出し・書き込み)
の基準はリセット信号から始まります。
 一般的には、図G-55(a)のように「システムリセットIC」
という、電源電圧の低下も監視してくれる便利なICを使
って、CPUや周辺LSIのリセット信号をまとめて供給する
ことが多いのですが、リセットの論理は正論理と負論理
のものがありますから、反転回路に注意します。

●CPUからポートでリセットするメリット
 場合によっては、図G-55(b)のようにCPUのリセット回
路を簡単にCR時定数回路で構成して、周辺LSIのリセット
はCPUの出力ポートから別々に与えることもあります。
 これは、LSIによって必要とされるリセット信号ホール
ド時間が異なり、CPUよりもかなり長いリセット時間を必
要とするLCDモジュールなどを使う場合や、周辺LSIだけ
が誤動作した場合にCPUから別個に強制的なリセットを行
う場合に有効な手法です。
 また、CPUと同じリセット信号で同時に動作を開始する
と、タイミングによってはバス占有信号によってCPUと競
合するようなLSIに対しても、この方法を採用します。

●マルチCPUシステムのリセットは要注意
 リセットの扱いでもっとも問題となるのは、図G-55(c)
のように、複数のCPUシステムが共同して作業するシステ
ムのリセットの場合です。たとえばパソコンに拡張スロ
ットにCPUシステムのインテリジェントボードを挿入する
場合、パソコンがホストとなってリセットをボードに与
えるだけでなく、ボードの初期化信号によってパソコン
をリセットしたい場合もあります。
 また、パソコンにはリセット信号ラインをハードウェ
ア的にアクティブにしないで初期化する「ホットリセッ
ト」があり、この対応について十分に検討することも重
要です。

\section*{56. ウォッチドッグタイマによる暴走検出}

●ウォッチドッグタイマの原理
 CPUシステムにとって、システムが自分でCPUの暴走を
検出して自動的にCPUにリセットをかける、という機能は
信頼性を高めるうえで重要なものです。図G-56(a)の「ウ
ォッチドッグタイマ」はこのための代表的な回路で、シ
ンプルでありながら強力な暴走監視機能を持っています。
 この回路はアナログによる原理的なもので、基本は
  ・CR時定数回路による充電回路(常に電圧が上昇)
  ・アナログスイッチによる放電回路(電圧をクリア)
  ・コンパレータによる電圧比較回路(→CPUリセット)
の3要素からなっていて、回路がディジタル化されてもこ
の原理は変わりません。
 充電回路は刻々と出力電圧を上昇させ続けて、コンパ
レータが基準電圧を越えたと検出すると、CPUに強制的な
リセット信号を発生します。CPUはメインルーチンから定
期的に放電させて、正常に動作していればリセットが発
生しない、という単純な動作を続けるものです。

●ディジタルWDTと専用IC
 図G-56(b)は、このWDTの原理をディジタル回路で構成
したもので、一定のクロックでアップカウントを続ける
カウンタがWDTとなります。CPUはメインルーチンから定
期的にカウンタをクリアしますが、CPUが暴走してクリア
が停止すると、カウンタがオーバーフローして、このMSB
がCPUに強制的リセットをかけます。
 また最近では、図G-56(c)のような「WDT専用IC」が各
社からローコストで提供されています。これは同時に電
源ON時のリセット機能や、電源電圧低下時のリセットな
どもサポートしており、幅広く使用されています。

●リセットの本質を検討することが重要
 このように重宝するWDTですが、システムの信頼性を考
える上では、とりあえずWDTでリセットがかかるだけでな
く、「本当にリセットだけでいいのか」という疑問を検
討することも必要です。暴走検出に対するフォローはリ
セットだけではないからです。

\section*{57. データセレクタ vs 3ステート}

●多ビットデータの多重切り換え回路
 ディジタル回路基本の一つである「データセレクタ」
は、セレクト(選択)信号とその反転信号のそれぞれに対
して入力データと論理積をとった論理和を求める、とい
うものです。(G-57(a))
 この単純なデータセレクト回路を実際的な回路に拡大
するためには、
  ・多数の入力から複数ビットの選択信号で選択する
  ・多数のビットのセレクタを並べて同時に選択する
という、「多入力化」と「多ビット化」の2種類の方向が
あり、いずれも多くの場合において登場してきます。
 とくにASICのような大規模回路では、ビット幅が10数
ビットから20--30ビット、また入力選択も4回路とか8回
路という相当な規模のセレクタがずらりと並ぶことも多
く、データセレクタの適切な設計がシステムの成否にも
関わるほど重要になります。

●データセレクタによる構成
 図G-57(b)は、このような本格的な回路をデータセレク
タを多段接続して構成した例です。一般にASICでは多く
のセレクタをマクロライブラリとして用意しており、う
まくシステム分割して大規模なセレクタをマクロ定義す
ることで単純化できる場合もあります。ただし、それぞ
れのセレクタの遅延が合計されることになり、タイミン
グ設計に注意が必要です。

●3ステートゲートによる構成
 図G-57(c)は、ASIC内部に3ステートバスを持って、そ
れぞれの入力信号を通過させる3ステートバッファによっ
てデータセレクタを構成した例です。ある程度の規模を
越えると、データセレクタよりもゲート効率がよくなり、
データ選択の論理もバスイネーブル信号を供給する論理
回路によって自在に設定できるメリットがあります。
 ただし、同時にイネーブルされるゲートを作らないこ
と、どのゲートもイネーブルされないハイインピーダン
ス状態を許容しないASICへの注意も必要になってきます。

\section*{58. データバスと瞬間的バス・ファイト}

●データバスの3つの状態
 データバスは、「3ステート・バス」と呼ばれるように、
次の3種類の信号状態をとります。
  ・ハイレベル、またはローレベルの信号状態
  ・ハイ・インピーダンス(フローティング)状態
  ・バス・ファイト状態
 第一の「信号の乗っている」状態にも2つあって、バス
に接続された出力ゲートのいずれか一つが信号を出力し
ている場合だけでなく、接続された全ての出力ゲートが
ハイ・インピーダンス状態にあって、バスラインがプル
アップまたはプルダウンされている時も該当します。

●フローティング状態はなるべく避ける
 第二のハイ・インピーダンス状態とは、バスに接続さ
れている出力ゲートのいずれもイネーブルされていない
場合に発生します。この場合、バスラインがプルアップ
もプルダウンもされていないと、バスラインは高インピ
ーダンスの「ノイズアンテナ」としてシステムに悪い影
響を与えることがあります。また、ASIC内部のバスをこ
の状態にすると、シミュレーションエラーによって警告
されることもあり、設計の際に避けることが重要です。

●バスファイトと瞬間的バスファイト
 第三のバス・ファイト状態とは、同時に2つ以上の出力
ゲートがイネーブルになるもので、素子破壊や誤動作の
原因となる致命的な問題です。開発中のディジタル回路
でバスファイトしている場合、オシロではハイレベルと
ローレベルの中間的な電圧を示す場合もありますが、た
またま衝突している出力ゲートの論理が一致していると
発見しにくく、また長時間この状態を続けると、出力ゲ
ートICが静かにパンク(昇天)したりします。
 また、図G-58のようにCPUバスラインに入れた双方向バ
ッファと周辺LSIとの間で、制御信号の与え方によっては
瞬間的にバスファイトしつづけるケースもあります。こ
れは素子破壊には至りにくいのですが、設計においては
なるべく避けたい(イネーブル端子も使う)ものです。

\section*{59. 乗算器を設計してみよう}

●加算器から乗算器へ
 ディジタル演算回路を設計するステップとしては、も
っとも基本となる加算回路を使って、図G-59(a)のように
乗算回路を構成することからスタートします。
 複数ビットの数値表現による乗算といっても、基本は
2つのデータをビットごとに乗算することに相当し、さら
にこれは、
  ・被乗数を乗数のビットに相当するだけ左シフト
  ・被乗数をビットごとに乗数のビットと乗算する
  ・各ビットシフトの乗算結果を足し合わせる
という筆算による演算と同様の処理に帰結します。

●正直で高速な並列乗算器
 この処理をそのまま正直に実現すれば、入力の被乗算
データをビットごとにシフトして、乗数の各ビットと論
理積をとった結果を次々に加算していく形式の乗算回路
が考えられます。
 これは実際にASICの高速乗算マクロセルで用意されて
いるもので、正直であるだけに正確であり、また高速な
乗算演算を実現するものですが、回路規模はかなり大き
くなるために、自動レイアウト配線のコンパイルド・セ
ルでは効率があまりよくありません。

●コンパクトな同期式シフト乗算器
 これに対して、図G-59(b)は11回の乗算のために加算器
をデータのビット数だけループさせる、同期式シフト乗
算回路の構成例です。ここでは入力の被乗数データはシ
フトレジスタによって、システムクロックごとに1ビット
ずつアップシフトされて論理積ゲートに供給されます。
 また、入力乗数データもシフトレジスタを経由して、
こちらはシステムクロックごとに1ビットずつダウンシフ
トして論理積ゲートに供給されます。この結果は加算器
によってビット数だけ累算され、最終的な乗算結果が得
られますが、ループを繰り返す時間がかかる代わりに、
回路規模は相当にコンパクトとなります。

\section*{6. 外界とシステムとの接点:センサ}

●外界の物理量とシステム内の情報
 電子機器やマイコン機器にとって、人間からの働きか
けを含む外部の情報をシステムに取り込むためには、外
界の物理量を電気信号に変換するためのセンサが必須の
構成要素となっています。(図A-6(a))
 ON/OFFの電気信号を直接発生する「スイッチ」はこの
典型ですが、他の物理量については一般にアナログ量と
なるために、「センサによる電気信号への変換」と「A/D
変換によるディジタル情報化」がペアとなってきます。

●センサの検討と選択
 センサを利用して「ある量」を計測したい場合、どの
ような物理量に着目するか、が最初のカギとなります。
たとえば「運動状態」を検出したい場合、
 ・加速度センサ・角速度(ジャイロ)センサを使う
 ・等速度での通過を赤外線ビームの遮断時間で測る
 ・停止させる時の衝撃・変形(歪ゲージ)のセンサ
などの可能性があり、具体的な計測対象に合わせて最適な
センサを検討することが大切です。
 また、それぞれの物理量をどのような「電気的情報」
に変換するか、という作戦がこれに続きます。たとえば
周期的に変動する現象の周期を計測する場合、わざわざ
連続的な電圧に変換してA/D変換するよりも、現象に応じ
た周波数のアナログ発振器の周期をカウンタで検出する
ほうがシンプルで正確なセンサシステムとなります。

●センサ活用の注意事項
 センサを活用するためには、図A-6(b)のように、コス
ト・精度・環境などの視点に注意します。高性能のセン
サを1個使って検出するか、ローコストなセンサを複数種
組み合わせて必要な情報を得るのか、はコスト・性能と
も大きく関係してくる要因です。
 また、データの校正・補正・環境変化・寿命などにつ
いての検討も重要で、ハードウェア的な補正をCPUソフト
の側に吸収するのも有効なシステム構築戦略です。

\section*{60. プロならば時分割ディジタル回路を目指そう}

●多チャンネル基準クロック発生回路
 大規模なディジタル回路を構成したい場合の最後の切
札がPLDやゲートアレイ等のASICですが、いくらでも回路
を詰め込める、というものでもありません。
 図G-60(a)は実際にあった例ですが、8253のようなプロ
グラマブルカウンタを多数(たとえば16個)搭載した回路
が必要になったケースです。それぞれのカウンタは共通
のシステムクロックで動作するものの、別個のデータが
ロードされ、また別個のタイミングでクリアされるとい
うもので、多チャンネルの制御回路などでは一般的な要
請です。

●ASICによる物量作戦
 このような回路は、同じパターンが繰り返されるので、
CADによって同一の回路をコピーしていくことで、ASICの
ように多数のゲートを置ける設計環境では簡単に実現で
きるように思われます。事実、この手法で実際に設計し
てみると、テスト回路を共通化することで、面白いよう
に設計できてしまうのですが、残念ながら非常にゲート
数が必要となり、現実的なコスト(チップサイズとパッケ
ージ)に収まることはなくなります。
 ASICのゲート物量作戦も、より高密度な汎用LSIには負
けるのも当然で、この設計方針は、単純に8253を何個も
並べた回路基板に完敗してしまったのです。

●非同期回路から同期式多重化回路へ
 この欠点は、非同期式に必要な回路をそのまま並べた
ところにあります。そこで図G-60(b)のように、システム
を同期式ディジタル時分割回路として、まったく新しく
設計してみると、驚くほど回路規模がコンパクトになり
ました。もちろんシステムクロックを高速化して多重化
すめ設計は慣れるまでは厄介ですが、この設計手法の転
換はプロにとっては必須のものなのです。
 同期式・時分割方式の設計手法は本書でもあちこちに
述べられていますから、ぜひとも理解してマスタし、実
際の設計に活用していきましょう。

\section*{61. パイプラインの設計と動作}

●パイプライン回路
 ディジタル時分割回路では、図G-61(a)のようにデータ
に対する処理をそれぞれのステージに分割することから
設計を始めます。いろいろな演算処理をこれらのステー
ジに分割するための指針としては、
  ・時分割の上限となるタイムスロットを定める
  ・タイムスロットにマージンを確保した処理に分割
  ・高速で終わる処理を統合できないか検討する
  ・各ステージを共通クロックのラッチで区切る
という点に注意した設計になります。
 この結果、データは各ステージを次々に移って行く、
「パイプライン」が完成します。

●パイプラインの動作
 図G-61(b)が、このパイプライン回路の動作を示したも
ので、システムクロックごとに各ラッチに保持されたデ
ータが、それぞれ次段の演算処理を受けて、次クロック
までのマージン時間をもって確定してラッチされていく
ことがわかります。
 この回路例では、あるデータが入力されてから演算処
理を受けて出力に現れるまでに5段のステージがあり、こ
れだけでは500nsの遅延のように思われますが、実際には
画像処理のように次々とデータが連続して与えられれば、
最終的な平均遅延時間はシステムクロックと同じ100nsと
考えることができ、高いパフォーマンスを実現できます。

●DSP回路はパイプラインの展示場
 この例のように、パイプライン回路がメリットを持つ
のは、画像信号・音声信号など、時間的に連続して一定
のトラフィックを持っている信号処理の領域が顕著です。
最近いろいろと登場している信号処理用DSPでは、内部で
このようなパイプライン処理を多用しています。
 市販のDSPを専用チップとして使うだけでなく、場合に
よってはこのパイプラインの考え方をASICやディジタル
回路の設計に導入すると、思わぬシステム効率を上げる
ことができるかもしれません。

\section*{62. マイクロプログラムの考え方}

●DSPやCPUの内部を考える
 一般にCPUやDSPなどの高機能LSIは、ブラックボックス
として「中身を考えない」で扱うことがメリットとなっ
ています。しかしここでは、ディジタル回路技術力の向
上のために、敢えてCPUやDSPの中身を考えてみましょう。
 CPUやDSPのデータブックには、図G-62のようなブロッ
ク図が必ず示されていますが、これは論理的な理解のた
めだけでなく、実際の回路構成として動作を理解するこ
とも重要なのです。内部に基本的なALUや乗算器が並んで
いて、どうしてもそちらに目が行ってしまいますが、実
は「マイクロプログラムメモリ」がポイントです。

●マイクロプログラムとは
 マイクロプログラムメモリとは、CPUのプログラムROM
やDSPの外部データRAMと変わることのない、一種のメモ
リです。ただし、高速のCPUやDSPの動作を内部的に時分
割動作によって実現するためのものですから、一般にか
なり高速(アクセスタイムが十数ナノ秒程度)のメモリと
なっています。
 このメモリは、システム内部の高速カウンタ(マイクロ
プログラムカウンタ)によって読み出されますが、このカ
ウンタはCPUのPCと同様に、内部制御語によってジャンプ
や分岐を行っています。そして、このカウンタに読み出
されたデータというのは、CPUやDSP内部の制御信号その
ものになっています。つまり、マイクロプログラムとは、
ハードウェアの論理回路の代わりにプログラムとして記
述された制御回路ということになります。

●マイクロプログラムのメリット
 制御信号を具体的なハードロジックで設計することは、
ある規模を越えると著しく困難になり、また修正が大変
になります。このため、数千ゲートを越える同期システ
ムの設計には、パイプライン設計とともにマイクロプロ
グラム設計手法が重要な武器となります。このメリット
を理解して、積極的に活用したいシステム技術です。

\section*{63. S/HとA/Dのタイミング設計}

●アナログ--ディジタル変換の流れ
 「A-D変換とD-A変換」と簡単に言いますが、実際の回
路ではA-Dコンバータのチップだけが仕事しているわけで
はなく、「離散化」「量子化」という変換原理に従った
いろいろな機能が活躍しています。
 図G-63(a)はその基本ブロックを示したもので、アナロ
グの入力信号はバッファを経て、まずLPF(ローパスフィ
ルタ)によって、サンプリング周波数の半分より高い周波
数成分がカットされます。これは「サンプリング定理」
からの要請で、この成分が残っていると「折り返しノイ
ズ」が信号の周波数帯域に侵入して、後段での修復が困
難な悪影響を受けてしまいます。

●サンプル・ホールドによる離散化
 サンプリング(離散化)によってデータを刻々と変換
するのはA-Dコンバータですが、実際にアナログデータを
サンプリングのタイミングで切り刻んでいるのが、S/Hの
ICです。このS/Hチップは、内部的には高入力インピーダ
ンスのOPアンプ回路と、入力部分にコンデンサとアナロ
グスイッチが組み合わされた構造をしています。
 入力データはサンプルパルスでONされたアナログスイ
ッチによって、小さな入力コンデンサの端子電圧として
追従され、ホールド時間は保持されます。実際の回路で
は、A-D変換回路としてのスペックに合致したS/Hをまず
捜して、ICごとに規定されたタイミングを満足するよう
に具体的に設計します。(図G-63(b))

●A-Dコンバータによる量子化
 S/HとA-Dコンバータとは密接に関連して、タイミング
設計が行われなくてはいけません。逐次比較方A-Dコンバ
ータの場合には、S/Hのホールド時間にデータが変換され
ますが、出力データはビットごとに次々と得られるので、
次のサンプルパルスの直前のタイミングで出力をイネー
ブルするか、次段の入力をラッチするようにします。
 出力として得られる信号の最高周波数成分は、このサ
ンプリング周波数の1/2であることに注意しましょう。

\section*{64. 可変クロックを発生する}

●レートマルチプライア方式
 システム制御回路で、ディジタル的に制御できるクロ
ック発生回路が必要になることは多いものです。ここで
は、3種類の可変クロック回路方式を紹介します。
 図G-64(a)は「レートマルチプライア」回路で、必要な
ゲート数がきわめて少なく、広範囲の周波数帯域を扱え
る簡易可変クロック回路として重宝します。
 入力基準クロックは多段のフリップフロップで分周さ
れて2の累乗の周波数系列ができますが、上段の出力を排
他的に下段の論理積入力とすることで、「重複しないパ
ルス群」を作るところがミソです。あとはそれぞれのビ
ットごとに選択すると、疑似的に平均化されたパルス密
度の可変クロックを得ることができます。

●プログラマブルカウンタ方式
 図G-64(b)は「プログラマブルカウンタ」方式の例で、
8253には16ビット版のこの回路が3本入っています。
 内部的にはアップカウンタまたはダウンカウンタがあ
って、設定データと比較してクリアするか、キャリの瞬
間に設定データをロードすることでプログラマブル動作
を実現しています。この方式では、出力パルスは完全に
一定のペースなので、ROMデータテーブルを連続して読み
出す用途などに適しています。

●位相累算方式
 図G-64(c)は、筆者が「位相累算方式」と呼ぶシステム
で、時分割パイプライン設計に適した強力な回路方式で
す。回路要素はアダーとラッチだけですが、システムク
ロックごとにこのループをデータが回っていくことで、
設定値ずつ累算されてデータが増加し、これがそのまま
出力データとなります。
 この方式の場合、出力データとして上位ビットを使う
と、「小数点以下」の任意の精度でデータを設定できる
メリットがあり、さらに2つのラッチをRAMにすることで
多チャンネルの時分割回路へと容易に拡張できます。

\section*{65. ハイブリッド変調方式のいろいろ}

●情報の多重化と変調
 アナログ時代の「変調」とは、信号を遠隔地に伝達す
るための「通信手段」として進展してきましたが、最近
ではディジタル通信が一般化して「伝達」の点は克服さ
れつつあり、「変調」の新しい意義が重視されるように
なってきました。それは「情報の多重化」です。
 いろいろな通信手段が確保されてくると、そこで伝送
される情報量の要請は一気に増加するのが常で、限られ
た信号線や限られた周波数帯域・通信時間にいかに多量
の情報を乗せるか、がカギとなり、ここでアナログ的な
各種「変調」が再び注目されてきています。

●ディジタルシステムのアナログ回帰
 なんでもディジタル化するばかりが能ではないのか、
変調や情報の多重化にはアナログ的なアイデアがいろい
ろと駆使されています。たとえば、
  ・多値ディジタル化(2値でなく3値とか4値をとる)
  ・量子化しても時間的にはアナログとする(PWM)
  ・離散時間だがデータ値はアナログとする(PAM)
などの方式による、一種の情報の圧縮が使われています。
 具体的にはディジタルシステムとして実現するにして
も、電子回路技術の歴史を築いたアナログ回路的な発想
はアイデアの宝庫として、今後も活躍していきそうです。

●ハイブリッド変調の例
 図G-6(a)は、このようなアナログとディジタルを組み
合わせたハイブリッド変調回路の例で、AM(振幅変調)を
実現したものです。もっとも簡単には、アナログスイッ
チをディジタルのキャリアでスイッチングします。
 また、マルチプライングD-Aコンバータを使って、逆に
ディジタル表現のデータをアナログクロックでAMするこ
ともできます。
 また図G-65(b)はFM(周波数変調)をハイブリッド化した
例で、ここでも変調信号・被変調信号のどちらをアナロ
グとするかでいろいろな方式が考えられます。

\section*{66. 疑似SRAMのインターフェース}

●PSRAMの経済学
 CPUシステムにメモリはつきものですが、RAMの選択は
常に流動している状況にアンテナを立てて対応したいも
のです。基本的には、
  ・コストとメリットのバランスを考える
  ・主流となっているメモリに注意する
  ・メーカのプロセスの進展状況を読む
  ・こなれてきたメモリには要注意
というポイントがあります。
 最初のポイントは、いわば「メモリの経済学」ともい
うべきもので、一般に
  ・SRAMのビット当りのコストはDRAMの2倍から4倍
  ・PSRAM(疑似SRAM)は1.5倍から3倍
という、メーカのプロセスの進展や主流となっているDRAMの
世代によって、刻々と変化するコスト評価を検討します。

●PSRAMのメリット
 DRAMは安いのですが、簡単な組み込み機器ではリフレ
ッシュ回路やリフレッシュ操作が大変だと敬遠されます。
そこで、図G-66のようにメーカによっていろいろな「セ
ルフリフレッシュ機能」をサポートされたPSRAMというの
は、SRAMよりも安いコストで、ほぼSRAM並の使い勝手で
大容量のメモリ空間を確保するために活躍します。
 具体的には、各メーカごとに推奨している簡単なタイ
ミング回路を加えることで、通常のCPUサイクル(メモリ
フェッチ)によって自動的にリフレッシュされて、SRAMの
ように使うことができる場合がほとんどです。

●PSRAMの注意点
 このように便利なPSRAMですが、当然ながらバッテリバ
ックアップはできませんから注意して下さい。また、ど
うしてもメーカ固有の方式があって、なかなか互換性が
ありませんから、量産に際しては数量の確保とともに、
将来的に安定に供給される「寿命」についての確認が絶
対に必要になります。

\section*{67. カードマイコンを「部品」として使う}

●1チップCPUとカードマイコン
 システムの大幅な「軽薄短小」化を実現するための作
戦をハードウェアの視点から列記してみると、
  ・ASICによるハードウェアの1チップ化
  ・1チップCPUの採用による周辺ポートの吸収
  ・カードマイコンの採用によるモジュール化
という順序になります。ここでは上の項目ほど「大量生
産」向けであり、カードマイコンの採用は「少量多品種
・高付加価値」型の製品開発に向いています。
 CPUの周辺LSI機能をいろいろ取り込んだ1チップマイコ
ンの最大の弱点は「ある程度のロット数量を必要とする」
ところで、ボードメーカから提供されるカードマイコン
は、この面をより高い視点からクリアしたものです。

●部品としてのカードマイコン
 かつては各種の「ボードマイコン」が競争していまし
たが、システムに組み込む目的のプロ分野では、図G-67
のようなカードサイズ(実際にはそれ以下のサイズも多い)
が主流になりました。チップは東芝の「Z80シリーズの1
チップCPU」が圧倒的に多く、ここにCPU周辺回路をいろ
いろと盛り込んだ「部品」として利用されています。
 図※※は、アマチュア向けのもっともローコストなカ
ードマイコンのキット(秋月電子のAKI-80)ですが、基本
的な機能は十分に完備していて、適用するシステムに応
じた特殊入出力回路だけを増設すれば、十分にプロ用途
(試作・実験など)でも使えます。

●部品として実装・部品として使い捨て
 このようなカードマイコンは、システム基板とケーブ
ルで接続するためにコネクタを設ける、というような発
想では失格です。システム基板に直接実装すれば接触不
良の心配もなく、信頼性の点でも安心です。
 また、システム基板から取り外して再利用、などとい
う手間をかけず、部品として新しく次のものを使う、と
いう割り切った発想でいきたいものです。

\section*{68. マイクロLANの構築}

●「LAN」を柔軟に考える
 ダウンサイジングとネットワークの時代になって、あ
らゆるコンピュータシステムがLANによって結び付けられ
ています。ところで、LANというのはコンピュータ用の大
規模なものだけでなく、マイコンシステムでも見方によ
っては活用できる、重要なヒントを与えてくれます。
 複数のCPUによつてシステムが構築され、その情報交換
のために使われるのがLANである、と考えてみると、シス
テムのコストパフォーマンスや開発効率の上で、マイコ
ン版のマイクロLANが有力な戦力として浮上してきます。

●マイクロLANの例
 図G-68(a)は、実際にあったマイクロLANのシステム例
です。ある計測制御システムで、機能仕様としては
  ・ホストのパソコンと通信して情報交換を行う
  ・複数のセンサからデータを自動計測する
  ・パネルのLCDモジュールとLEDに情報を表示する
  ・パネルのスイッチによる制御入力に対応する
  ・パワーコンセントのリレーを制御する
というもので、量産されるのでなければパソコンを使っ
て実現したいほどの処理量がありました。
 そこで1つのCPU(32ビット級?)に全てを担当させるので
なく、複数のCPUの分散処理としてシステムを構築しまし
た。具体的にはカードマイコンを活用し、システム内の
情報交換にRS-232-CによるマイクロLANを使ったのです。

●仕事に応じたCPUを使い分ける
 図G-68(b)はこのシステムの情報の流れですが、マイク
ロLANにしてみて効果的だったのは、それぞれのCPUとし
て「適材適所」を活用できたことです。センサ処理には
A-Dコンバータを多ポート持っているCPUを使い、パネル
にはLEDドライブ能力のある出力ポートに対応した1チッ
プCPUを使いました。パワーリレーの部分の4ビット1チッ
プCPUはソケットを使って、破損した場合の交換に備えま
した。ソフトウェアがCPUごとに完結したために、モジュ
ール化によって開発効率もアップしました。

\section*{69. システム設計指針(トップダウンとボトムアップ)}

●システム設計の最初の一歩
 数百人でオンラインシステムを開発する、といった大
規模なシステム開発はともかく、数人規模の開発プロジ
ェクト、あるいはたった一人でハードからソフトまでを
設計するような「開発」も、プロの世界には存在します。
たとえば最終製品の開発だけでなく、予備実験や試作と
いうのも立派な「開発」であり、どんなに小規模であっ
ても「開発手法の検討」は重要な「最初の一歩」です。
 最近はASICなどのハードウェア、そしてソフトウェア
の開発支援システムも機能が向上して、一人で開発する
といっても昔の技術者の数十倍から数百倍の規模になっ
ていますから、作戦しだいで効率がグンと変わります。

●トップダウン手法による開発
 トップダウンによる開発手法では、図H-69(a)のように
まず最初に機能仕様が明確にあります。典型的なニーズ
指向であり、システム設計はこれを具体的にブレイクダ
ウンしていく作業になります。
 CASEなどの開発支援システムによるサポートによって、
この手法では少人数でもかなりの規模のシステムを開発
できるようになっています。技術者の重要な視点は、具
体的に機能を実現するためにハード/ソフトに関してど
のように分業するか、というトレードオフの決定です。

●ボトムアップ手法による設計
 これに対して、図H-69(b)のボトムアップ設計では、も
ちろん最終的な開発の目標はあるのですが、技術者の仕
事はより創造的になります。つまり、具体的な要素技術
を「持ち駒」として把握した上で、新しい付加価値を生
み出すプラスアルファを捜し出し、従来技術と組み合わ
せてシステムを実現していくことになります。
 ここでは個々の要素技術を理解し、最新の技術状況を
とらえた感性が重要です。場合によっては実験・試作に
よってボトムラインを探索し、新しい技術を発見してト
ップレベルに実現するのは、手ごたえのある仕事です。

\section*{7. OPアンプは全ての基本ブラックボックス}

●トランジスタからOPアンプへ
 アナログ電子回路の基本といえば「増幅」です。かつ
て真空管からトランジスタに交代したその主役は、現在
ではOPアンプが全ての領域でトップとなりました。図A-7
(a)のように、OPアンプの回路動作は基本的に外部抵抗の
比によって簡単に設計できるために、ある程度までのア
ナログ回路設計は、理想的なOPアンプ特性のブラックボ
ックスとして容易に実現することができます。

●OPアンプ使用の注意点
 OPアンプを活用するためには、使用する回路の特性と
して「電源電圧(単一電源か±2電源か・電圧のレンジ)」
「信号電圧レンジとノイズ条件(S/N比)」「オフセット・
温度補正」「基板スペース」などの要求項目とともに、
最適なOPアンプを選択します。
 また、一般にOPアンプ単体は非常にゲインが高いので、
電源ラインとパスコンに注意します。パッケージの電源
ピン付近に、全てのOPアンプに最短距離ででパスコンを
用いるのはアナログ回路の「定石」です。

●より高度な活用をめざして
 OPアンプにはこの他にも、理想的な高ゲインを生かし
た「コンパレータ回路」や、CR時定数回路と組み合わせ
た図A-7(b)のような「積分回路」「微分回路」、さらに
電流−電圧変換回路、インピーダンス変換回路、タイマ
回路、フィルタ回路などの応用回路群があります。
 OPアンプの特長である差動増幅回路にとっては、一つ
のパッケージに特性の揃った2回路や4回路が内蔵された
機種が有効で、トランジスタ回路では困難な特性補正を
容易に実現できます。
 さらにFET入力の高入力インピーダンス・小信号増幅ロ
ーノイズ機種、大電流・大電力のドライブ可能な機種、
動作温度範囲の広い耐環境タイプ、民生分野での超ロー
コスト対応の標準汎用タイプなど、さまざまなOPアンプ
を選択でき、プロの腕の見せどころと言えます。

\section*{70. ソフトウェアの階層化(サブルーチン)}

●メインルーチンはシンプルに
 多くのマイコン組み込みプログラムだけでなく、パソ
コンのDOSやBASICインタプリタを含めて、ソフトウェア
とは基本的に「無限ループ」であることがほとんどです。
つまりCPUはリセット(電源ON)とともに走り続けている状
態であり、たいていの場合は人間のオペレーション(コマ
ンドの発行など)を待っているのです。
 ソフトウェアを開発する場合には、図H-70のように、
このメインルーチンをなるべくシンプルに構成するよう
に心がけるのが重要です。組み込みCPUのソフトであれば、
リセット後にシステムの初期設定をしたあとで、外部か
らの働きかけ(タイマによる時間的トリガを含む)を待っ
ているメインルーチンを、基本的にはサブルーチンコー
ルだけで記述しておく、というのがプロの手法です。

●サブルーチンを活用するメリット
 一般に、サブルーチンというと「同じような処理が何
度も繰り返される場合に共通化するもの」と言われてい
ますが、たった一度しか呼ばれないルーチンであっても、
サブルーチンとして設計するメリットはあります。
 たとえば、図のメインルーチンがサブルーチンコール
群だけでできていれば、あるサブルーチンを変更してバ
グが発生した場合、そのサブルーチンコールをリマーク
(注釈行としてプログラムから外す)した場合と簡単に比
較実験できます。原因が全てそのサブルーチンとは限り
ませんが、デバッグの手法である「差分による比較」に
適したプログラムとなるメリットは大きいのです。

●ソフトウェアの階層化
 もちろん、サブルーチンの最大のメリットは「ワンパ
ターン処理」です。この場合、与えるデータや結果デー
タの回収の方法として、いろいろなパラメータ引渡し方
法がありますから、なるべく一般化された記述を心がけ
ましょう。サブルーチンを活用して階層化したしたプロ
グラムは、時間がたってからも自分で「読める」のです。

\section*{71. ソフトウェアの構造化(モジュール)}

●同じ水準の記述を集めたモジュールを作る
 サブルーチンコールを階層化の視点から「縦に」眺め
る視点とともに重要なのが、ソフトウェアの機能に着目
して「横に」眺める構造化の視点です。
 図H-71は階層的なサブルーチンコールの状況とも言え
ますが、それぞれの階層で横に並んだ各ルーチンの関係
に注目してみると、
  ・各階層には同じような水準のモジュールが並ぶ
  ・同じ階層に同じ処理のモジュールを重複させない
というルールがあることに気付きます。

●モジュール化とプログラミング
 ハードウェアに対する直接のアクセスは、プログラミ
ングの上位水準のモジュールでは絶対に禁止です。パソ
コンのBIOSのように、ハードウェアにアクセスする低水
準のモジュールは専用に用意して、共通フォーマットで
まとめておきます。
 これら低水準基本ルーチン群は、さらにいろいろな用
途のための中間的な水準として用意した「サービスルー
チン群」から呼びます。パソコンであればDOSの機能呼び
出しのイメージで、ここでもプログラム本来の機能でな
く、抽象化された汎用ルーチンとして記述します。
 この上に、機能仕様に合わせた実際のソフトウェアを
記述する水準がある、というのがプロのプログラムです。

●再帰的モジュールには注意
 ここでは基本的なモジュール構造を紹介しましたが、
自分自身をさらにコールできる「再帰的モジュール」だ
けは、このように簡単には行きませんから注意しましょ
う。普通のモジュールを自己コールすると、無限ループ
やスタックがあふれて暴走してしまいます。
 再帰的構造のためには、パラメータやリターンアドレ
スのための処理として、マルチタスク的なバッファ管理
手法が必要になります。まずは再帰コールせずに処理を
記述できないか検討するのも大切な「設計」です。

\section*{72. 機能分割とソフトウェア部品化}

●機能分割はトレードオフ
 ソフトウェアの設計においては、あらゆる局面で階層
化・構造化による機能分割(モジュール・サブルーチン・
関数などへの分割)が必要となります。しかし、
  ・機能分割によってシンプルになるメリット
  ・呼び出し・復帰のオーバヘッドによるデメリット
という両面があり、いくらでも分割すればいい、という
ものではありません。
 この機能分割については、まず図H-72のように、どの
ような単位であっても機能仕様を客観的にまとめるとこ
ろから始まります。この作業は「フローチャートを書く」
ことにも似ていますが、
  ・処理機能(仕事の内容)を記述する
  ・受渡しのデータ・パラメータを規定して記述する
という二つの内容をもつことに注意しましょう。

●機能分割のポイント
 ある作業モジュールを分割するためのポイントは、試
しにその地点で分割してみたらどうなるか、という視点
から検討します。
 処理の途中で無理に分割してみて、前後で処理を引き
継ぐために多くのパラメータを用意しなければならない
部分は、「モジュール間の結合が密」な部分です。これ
は当然ながら分割ポイントとしては避けなければなりま
せん。
 これに対して、動作に必要な基本的パラメータ(より上
位のモジュールから渡される変数など)しか必要ないポイ
ントであれば、これは積極的にモジュール分割します。

●ソフトウェア部品としての活用
 このようにモジュール分割されたルーチンは、手続き
が抽象化されていて、パラメータも一般的な形式で汎用
性があるように心がけることで、「ソフトウェア部品」
として再利用できることになります。低位のモジュール
を設計するための指針として活用しましょう。

\section*{73. グローバルとローカルの情報交換}

●データの交換方法
 ソフトウェアが大規模になって階層化・構造化されて
くると、アルゴリズムとしての動作・手続きの記述より
も重要なファクタとして、「データの扱い」が浮上して
きます。ここではデータベースや計測システムのように、
データそのものを対象とした分野でなく、一般的にソフ
トが走る際に必要になるデータについて考えます。
 複数のモジュール間でデータの交換をするには、
  ・グローバルなRAM領域にデータを置いて参照する
  ・所定のレジスタにデータを置いてコールする
  ・呼び出しの際に自動的にスタックにデータが入る
などの方法があります。最後の例は、C言語でいえば
        x = data_send(y);
として変数 y にデータを入れてサブルーチン(関数)を呼
び出すと、自動的にこのデータが引き渡され、最後に
        return(z);
としてサブルーチン(関数)が終了すれば、 z という変数
の値が呼び出し元の x という変数に返されるものです。

●低水準サービスルーチンはローカルデータを使う
 ある部分でしか使われない変数をグローバルな位置に
定義して並べてもあまり意味はありません。基本的には
「システムの各部で利用されるデータをグローバル化す
る」という指針が重要です。
 図H-73はこの様子を示したもので、メインルーチンや
メインから呼ばれる高水準(実際の機能仕様に直結してい
る部分)のモジュールでは、場合によってグローバル変数
としてデータを利用します。
 これに対して、DOSのサービスルーチンやBIOSなどの基
本ルーチンでは、一般性のためにメモリを使わずに、基
本的には「レジスタ渡し」でデータをやりとりします。

●スピードと汎用性のトレードオフ
 このように、データ交換はいろいろなケースによって
形式を変えることも重要で、スピード(処理の簡単さ)と
汎用性(ソフト部品としての再利用)を検討します。

\section*{74. DOSシステムコールの活用}

●まずはMS-DOSのシステムコールを理解する
 現在では「すでに練れた技術」としてあまり注目され
ませんが、パソコン用MS-DOSというのは、なかなか強力
な機能とサービスを提供する優れたシステムです。ここ
では温故知新の意味も含めて、図H-74のような流れによ
って「MS-DOS再確認」を行ってみましょう。
 まず最初に必要なのは、「DOSシステムコール」の理解
です。ここには、
  ・「ソフトウェア割り込み」の考え方
  ・割り込みベクトルの獲得と設定
  ・ファイルのアクセス方法(FCB)
  ・DOS割り込みと機能呼び出し(INT 21h)の手法
などの重要な概念と技術が盛り込まれていて、本当に理
解して活用できるためには、かなりの技術力が必要です。

●MS-DOSシステムコールを実験してみる
 次のステップとしては、まずはマニュアル通りの機能
呼び出しを実験してみましょう。現在ではアセンブラで
なくても、C言語がインラインアセンブルやDOS割り込み
関数をサポートしていますから、実験環境は充実してい
るはずです。
 そして新たな実験・挑戦として、
  ・未定義/予約エリアを実行(呼び出し)してみる
  ・規約にない(イリーガルな)パラメータを使う
というアプローチもいいことです。新たな「隠しコマン
ド」を発見するかもしれませんし、イリーガル対策の保
護システムに関する発見があるかもしれません。

●目標は「オリジナルOS」
 このような実験の目標は、単に「MS-DOS機能のプロ」
になることではありません。自分のソフトウェアを開発
する際に、MS-DOSの体系から学んだ方法論を応用するこ
とが本当の目標なのです。
 サブルーチンや関数とのインターフェースにしても、
新しく登録したオリジナル・サービスルーチンにしても、
作ってみることで本当の技術力として確認できます。

\section*{75. オリジナルBIOSを作ろう}

●BIOSはメーカ製の低水準サービスルーチン
 パソコンで多くのソフトやDOSがハードウェアをアクセ
スする場合、直接にI/O命令でハードウェアを叩くことは
ほとんどありません。これは一般のプログラミングにお
いても「常識」と言える、最低限のマナーです。
 パソコンのシステムROMには、このような低水準サービ
スのためのBIOSが格納されていて、たとえばMS-DOSで機
種に依存する部分では、このBIOSアクセスの部分だけを
DOSに共通の機能と分離して提供しています。
 ところで、実際のターゲットシステムを検討する際に、
どうしてもBIOSの機能が不満となる場合があります。た
とえばシリアル通信と同時にキーボードアクセスを行っ
た際の処理手順やデータ落ちなど、あまりに汎用サービ
スに対応しているための「遅さ」が表面化する場合です。

●BIOSを解析して問題を検討する
 そこで図H-75のように、BIOSで不満のある部分はオリ
ジナル化してしまう、という方策をとることも有効です。
たとえば上記のような場合(筆者が体験した実例)、
  ・BIOSを解析して必要な部分の処理内容を理解する
  ・その部分だけオリジナル化して試してみる
という作業によって、必要な部分に関してはBIOSの過剰
なサービスをカットしたり、処理の優先度を変更したり
することができます。
 具体的には、デバッガを使ってBIOS機能の部分を捜し
て逆アセンブルして解析します。かなりの技術力を必要
としますが、MS-DOSの理解のためにも役立つ実験です。

●オリジナル化の2つの方法
 BIOSは非常に巨大なプログラムモジュールですから、
全体を完全にオリジナル化できるものではありません。
必要な機能の部分を試作してみたら、割り込みベクトル
に登録して使う方法もありますが、まずはその部分だけ
でも専用サブルーチンとして利用し、その次の段階とし
て汎用の「ソフトウェア部品」化を目指しましょう。

\section*{76. リモートプロセシングを実験する}

●リモートプロセシングの要素技術
 「ネットワーク化」と「分散処理化」は同じ技術領域
にあって、いずれも21世紀に向けてますます拡大してい
きます。ここでは、2台のパソコンを使ったリモートプロ
セシングを実験台として、この新技術を理解しましょう。
 図H-76が、ここでのシステムの概略を示しています。
ホスト側とターミナル側はRS-232-Cで離れた位置に置か
れています。これはモデムを介することで電話回線を隔
てた遠隔地からのリモート化という現実的な展開、さら
に原理的には無線回線を介して人工衛星のコントロール
にも適用される、もっとも基本的な考え方なのです。

●ターミナル側の動作
 まず、ターミナル側には外部との入出力としてセンサ
入力とリレー出力のポートがあります。そして、このパ
ソコンはMS-DOSの環境で、
  ・RS-232-Cポート入力を監視する常駐部
  ・普通は何もしないでループする実行プログラム
が走っています。遠隔地となるターミナル側には、本来
の仕事のためのプログラムが置かれていないことに注意
しましょう。
 ターミナルプログラムでは、ホスト側から通信データ
が届くとこれを解釈して、
  ・ターミナルプログラムのロード
  ・ターミナルプログラムの子プロセス実行/終了
という判定・実行制御を行います。

●ホスト側の動作
 ホスト側では、ターミナルソフトの本体を開発して転
送(ロード)します。また、通信マネジメントのためのソ
フトが別に用意され、本来のデータ転送処理だけでなく、
プログラムのロードや実行・終了も制御します。
 このようなシステムでは、ターミナル側でどのような
状況が新しく発生しても、それに対応した改訂プログラ
ムをホストから送れる柔軟性が最大のメリットです。

\section*{77. プリフェッチは双刃の剣}

●CPUのプリフェッチ機能
 ノイマン方式のCPUであれば、いずれも
  ・プログラム(命令)のフェッチ(アクセス)
  ・プログラムの解釈・実行
という二つのフェーズを繰り返しています。そこで、高
速化を目指すCPUでは、簡単な8ビットCPUであっても、内
部をパイプライン化して「プリフェッチ」を行います。
 これは図H-77(a)のように、命令を実行するフェーズで
はプログラムアクセスのためのバスが空いていることに
着目して、ある命令を実行しているフェーズに、次の命
令をあらかじめフェッチしてしまおう、というものです。
このような動作をするためには、CPU内部の回路を2段の
パイプラインとして構成する必要があります。

●プリフェッチCPUの効果が上がる方法
 このような動作を理解すると、プログラミングにおい
て「CPUの高速性を引き出す書き方」があることに気付き
ます。プリフェッチのメリットは、せっかくフェッチし
た命令が次に使われることで生かされますから、ジャン
プ命令などで別のところに飛んでいってしてしまうと、
フェッチした命令を捨てて新たにアクセスが必要です。
 そこで、このようなCPUでは「なるべくパイプラインを
崩さない」、つまり条件ジャンプなどの分岐を抑える書
き方が有効になります。構造化のためにジャンプを多用
する癖のある人は注意が必要です。

●プリフェッチCPUの弱点
 プリフェッチCPUには、もう一つの重要な注意点があり
ます。システム開発ツールのICE(In Circuit Emulator)
を使う場合、図H-77(b)のように普通のICEはCPUのアドレ
スバスなどを監視してブレークポイント処理を行ってい
ます。すると、CPUのプリフェッチによって「次の」アド
レスが出た瞬間にトリガがかかってしまい、必要な処理
モジュールでうまくブレークできない、という現象が起
きる場合があります。このような時は、ツールとCPUをよ
く理解して、デバッグ条件と環境から検討します。

\section*{78. モニタは古くて新しい技術}

●ICEがなくても開発できる環境
 マイコン組み込み機器の開発ツールといえばICEですが、
  ・オリジナルCPUでICEメーカが対応していない
  ・CPUメーカ製のICEにはバグがあって使えない
などの理由で、ICEを使わない開発を行う場合もあります。
すると、伝統的な技術である「モニタ」を活用する、と
いうことになります。
 モニタは一種の簡単なソフトで、図H-77(a)のように、
ターゲットシステムのCPUのソフトの一部として走るのが
一般的で、プログラム開発用のパソコンとは、RS-232-C
などで通信して所定の情報交換を行います。

●モニタに必要な機能
 もっとも基本的なモニタの機能としては、
  ・転送データのエコーバック
  ・プログラムのダウンロード
  ・プログラムの実行と停止
  ・データのダンプ、レジスタの表示(返送)
  ・データのエディット
などということになります。もちろん、さらに強化する
のであれば、
  ・逆アセンブル表示
  ・シングルステップ動作
  ・I/Oポートの直接操作
なども機能としてよく見かけます。

●モニタとRS-232-Cとの組み合せ
 図H-77(b)(c)は、このようなモニタの中のRS-232-C受
信ルーチンの扱いを2種類の方法で示したものです。この
ように、開発用のモニタとはいっても格好の実験材料で
あり、ターゲットCPUを理解する上でも役立つものです。
 この考え方を発展させて、モニタ機能を含めた簡単な
リアルタイムカーネルを構築して、機能仕様に応じたプ
ログラムはタスクとして登録する、という手法もあり、
フィールドデバッグなどで思わぬ効果を発揮します。

\section*{79. マルチタスクとスーパバイザモード}

●マルチタスクとは
 組み込み機器のCPUソフトでは、一般に処理内容が固定
しているために、プログラム部分がROMに固定された「フ
ァームウェア」となる場合が多く、内容としては複数種
類の仕事をしていても、基本的にシングルタスクとシス
テムとなっています。
 これに対して、マルチタスクのシステムというのは、
  ・一般にシステムの規模がもう少し大きなもの
  ・処理が多く、イベントに対して柔軟に対応したい
  ・ある程度のリアルタイム性が問われる
という領域で活躍しています。それぞれの処理をタスク
として、独立に起動するところが特徴です。

●マルチタスクの特長
 図H-79は、シングルタスクのシステムとマルチタスク
のシステムを簡単に比較したものです。シングルタスク
のシステムでも、複数種類の処理モジュール(サブルーチ
ン)はありますが、基本的な呼び出し手順は固定していて、
ROMやICカードに固定できます。
 これに対してマルチタスクシステムでは、CPUのリセッ
ト後に「マルチタスク・カーネル」が走り、基本的には
この状態の無限ループ(省エネ方式ではイベントまでCPU
をスリープさせる)となります。
 それぞれの処理に対応する「タスク」の独自性は高く、
イベントや他タスクの状況に応じて必要なタスクをRAMの
メモリエリアに生成して起動し、不要になれば消滅させ
ます。これによってメモリエリアが有効に活用でき、シ
ステムとしての処理の柔軟性も高めています。

●スーパバイザモード
 さらにマルチタスク性を追求したのが「スーパバイザ
モード」を持つCPUで、ユーザエリアとシステム(スーパ
バイザ)エリアとを分離して、ユーザプログラムのバグに
よってシステム(カーネル部分)が破壊されることを防ぎ、
監視によってシステムの信頼性を高めることができます。

section*{8. 水晶とセラミックの使い分け}

●ディジタル動作の基本クロック信号
 CPUを用いたマイコン回路はもちろん、ほとんど全ての
ディジタル回路はシステムクロック信号に従って動作し
ます。このクロック回路の主役となる受動部品が水晶振
動子で、システムクロック周波数の高速化と軽薄短小化
の波にのって、どんどん小型化されています。
 水晶振動子の周波数精度はセラミック振動子よりも良
好ですが、一般にセラミック振動子の方が安価なため、
システムに必要とされる精度を考慮して選択します。た
とえば、「正確な時間情報」を必要とする場合には水晶
を、単に動作クロックを発生させるだけならセラミック
を採用する、という使い分けをします。

●高速化への対応
 水晶にしてもセラミックにしても、システムクロック
が高速化されるにつれて、「安定して動作させる」こと
と「確実に動作させる」ことが重要になってきています。
図A-8(a)のように、従来はTTLやCMOSゲートによって発振
回路を作っていましたが、最近では1チップマイコンや、
ASIC自体にクロックジェネレータ用の水晶/セラミック
端子を持つものが増えました。この場合、メーカによっ
て推奨されている規格のものを使用し、代替品の場合に
は十分に動作確認をする必要があります。
 また、図A-8(b)のように、水晶/セラミック振動子へ
の基板配線パターンは、「なるべく短く」「なるべく対
称に」を基本とするのが高速化への対応となります。

●信頼性への対応
 寄生振動モードによるオーバートーン発振や、不要な
ノイズ放射を防止するために、水晶/セラミック振動子
の両端とグラウンドの間に等しいコンデンサを並べる必
要があります。ここでは、従来の個別部品を離して配置
する代わりに、コンデンサのペアを同じパッケージに入
れた3端子セラミック振動子や、さらにフェライトのノイ
ズフィルタを付けた振動子を使います。

\section*{80. デバッグルーチンはプロの常備薬}

●デバッグルーチンとは
 ソフトウェアの中では、「デバッグルーチン」という
とあまり歓迎されない印象があるかもしれません。しか
し、プロであっても(規模の大きな仕事のプロだからこそ)
バグは絶対にある以上、強力なデバッグ手法であるデバ
ッグルーチンは今後も重要な援軍となるでしょう。
 デバッグルーチンの機能には、
  ・不正なメモリアクセス・I/Oアクセスを監視する
  ・動作の痕跡を記録するロギング機能
  ・個々の瞬間のメモリ内容・レジスタ内容の表示
  ・暴走した場合のリカバーやリセット機能
  ・データが設定値と一致しているか(正常動作確認)
などがあります。(図H-80)

●デバッグのためのデバッグルーチン
 試作・開発途上でのデバッグルーチンであれば、プロ
グラムのあちこちに埋め込んだり、メインルーチンやタ
イマによって定期的に呼び出すことも容易です。この場
合、最終製品のプログラムROMに入れたくなければ、アセ
ンブラやコンパイラのマクロ機能によって、条件アセン
ブル/コンパイルのオプションを使ってカットすること
も簡単です。ただし、デバッグルーチンの処理時間だけ
短縮されますから、カットした本番プログラムでの最終
動作確認を十分に行うことが大切です。

●生産技術的デバッグルーチン
 デバッグルーチンは開発段階だけのものではありませ
ん。たとえば「動作パラメータがが規定範囲内にあるこ
とをチェックする」という機能は、生産工場の最終検査
ラインでも欲しい機能です。
 この場合、プリント基板の所定のジャンパを一時的に
ショートすると、CPUが起動時にその状態をチェックして、
この「検査モード状態」の時にはデバッグルーチン(通常
動作時には呼ばれないだけで、ROM内プログラムとして残
して置く)をコールする、という作戦があります。

\section*{81. UNDO機能とレジューム機能の検討}

●ファイル保護のアルゴリズム
 アセンブラでもコンパイラでも、あるいはDOSのソート
機能でも、「あるファイルの内容を変換する」という操
作はもっとも基本的なものです。ところで、このファイ
ル操作の最中に停電するとか、うっかりパソコンをリセ
ットしたらどうなるでしょうか。
 図H-81(a)は、このようなファイル操作のアルゴリズム
について考えたものです。2つの実現例を並べてみました
が、よく似ているようで、実はこの両者は信頼性の点で
大きく異なっているのです。
 ここでは、処理対象のファイルをいつまで保持してい
るか、処理後のファイルとしてリネームするまでの時間
に不慮の事故が起きた場合にどうするか、という視点が
重要になります。

●UNDO機能とヒューマンインターフェース
 このようなデータ保護の考え方は、エディタなどのUNDO
(アンドゥ)機能でも活用されています。一般のエディタ
などでは、図H-81(b)のように、データエリアを二重に持
っているのが普通です。
 この場合、人間なら誰にもあるちょっとした思い違い
やミスの際に、「一つ前の状態に戻って欲しい」という
要請に応えてくれます。エディタの動作として修正を加
えるデータは、二重に持ったデータのうちの片方で、UNDO
の指令があると、ソフトウェアはもう一方の過去のデー
タ群にバンクを切り換えているだけなのです。
 この原理だと、(UNIXシェルのように)複数ステップに
わたって戻るのは不可能です。しかし、ちょっとしたミ
スを防いでくれる、ヒューマンインターフェースの典型
のような機能です。

●レジューム機能の注意点
 ノートパソコンにある「レジューム機能」も便利なも
のですが、ソフトウェアが起動時に周辺ハードをチェッ
クしに行く場合に、レジューム動作で誤動作するものも
多くあります。万能ではありませんから注意しましょう。

\section*{82. MIDIを使ったパターン認識}

●MIDIとは
 マルチメディア時代となって知られるようになりまし
たが、MIDI(Musical Instruments Digital Interface)と
いう情報通信システムの歴史は約10年になります。もと
もと電子楽器同志の情報交換のための規約でしたが、
  ・5ピンDINコネクタと2芯シールド線で15mまで可能
  ・フォトカプラにより絶縁されていて安全性が高い
  ・5V電源のカレントループでRS-232-Cよりも簡単
  ・シリアル通信ながら31.25kbpsとまずまず高速
  ・電子楽器だけでなく各種録音/照明機器も対応
といった特長によって、音楽と関係のない領域でも「汎
用インターフェース」として活用されています。

●MIDIのいろいろな使い方
 標準的なMIDIのデータフォーマットについては、世界
共通規格として決まっています。たとえば、
  ・MSB=1のバイトは基本的に「ステータスバイト」
  ・MSB=0のバイトは基本的に「データバイト」
となっていて、楽器の「ドの音程がある強さで弾かれた」
という情報は3バイトによって表現されます。
 しかし、MIDIには音程や音量だけでなく、管楽器のた
めの「ブレス(息)の量」とか「鍵盤を押し込む圧力」と
か「音が左右に位置する定位情報」など、他の情報とし
ても利用できそうなデータ表現がいろいろとあり、これ
を単なる情報伝送手段として活用することもあります。

●MIDIによるパターン認識
 また、市販の電子楽器との互換性を考えなければ、送
信側と受信側で自由にプロトコルを規定して利用できま
す。たとえば、バーチャルリアリティの多重センサシス
テムの情報転送にMIDIを使って、「腕の曲がり」「膝の
位置」「頭の回転角速度」などをMIDIで多重化して転送
し、コンピュータシステムでリアルタイムにパターン認
識するような実例が報告されています。発想の転換で、
いろいろに活用する事例の典型というわけです。

\section*{83. CPUのアーキテクチャを駆使する}

●CPUの個性を最初に理解する
 CPUプログラミングにおいては、まずデータブックの最
初にある、
  ・CPUレジスタモデル(アーキテクチャ)
  ・命令一覧表(どのような命令群が強いか)
  ・アドレシングモード
といった基本的特徴を理解することが重要です。たとえ
ば「アドレシングモード」の強力なCPUであれば、他のCPU
が何ステップもかかって処理しなければならない動作を、
たった一つの命令で実現できることもあります。

●Z80の「裏レジスタ」の例
 アーキテクチャを活用する例としては、図I-83(a)のZ80
タイプのCPUが有名です。Z80はレジスタセットとして、
完全に同じものを2セット持っていて、「表」と「裏」の
切り替え命令(EX:exchange)をサポートしています。
 プログラミングの段階では、たとえば「割り込みルー
チンでは裏レジスタを使う」などと決めておくことで、
情報退避スピードの向上や、や誤動作による情報破壊を
避けられるメリットがあります。
 ところで、このレジスタの切り替え命令では、実際に
裏と表のレジスタ間での情報転送が行われるわけではな
くて、裏と表を示すフラグ(フリップフロップ)が反転す
るだけのようで、動作ステート数の異常な短さがこれを
証明しています。回路設計のヒントにもなりそうです。

●ビット操作命令の例
 図I-83(b)は、これもZ80タイプのCPUに見られる「ビッ
ト操作命令」の例です。いろいろなパラメータの中には、
1ビットだけで十分なものも多く、1パラメータに1ワード
のメモリを割り当てるよりも、特定の1バイトの特定のビ
ットにこの情報を置きたい場合も多くあります。
 ビット操作(ビットチェック、ビットセット、ビットリ
セット)命令のあるCPUではこの操作は簡単ですが、対応
する命令のないCPUでは、かなり面倒な処理が必要になり
ます。アーキテクチャに応じたソフト作法が大切です。

\section*{84. メモリマップとI/Oマップ}

●メモリマップとI/Oマップ
 組み込み機器に使われる1チップCPUでは、いろいろな
周辺ハードウェアも活用することが多く、周辺I/Oの扱い
には注意が必要です。新しいシステム設計の最初に直面
するのは、CPUのアドレス空間にマッピングする作業で、
CPUのマッピング形態(I-84(a))によって大きく変わる、
重要なシステム設計指針です。
 CPUには大別すると、
  ・全アドレス空間でメモリもI/Oも区別なく扱う
  ・メモリアドレス空間と別に、I/O空間を持っている
という2種類があり、前者はモトローラ系CPU、後者はイ
ンテル系CPUが有名です。

●メモリマップドI/O
 I/Oリクエストのような特別のアドレシング信号を持た
ないCPUでは、図I-84(b)のように連続したアドレス空間
のどこにでも、区別なくメモリとI/Oを配置できます。
 プログラミングの点では、メモリもI/Oハードウェアも
まったく区別なく扱える、スッキリとした体系となりま
すが、見方を変えると「メモリ空間の中にI/Oが入り込ん
でメモリを圧迫・分断する」とも言えます。
 最大のメリットは、入出力命令といった特別なコード
を意識することなくメモリもI/Oも扱える同一性です。

●I/OマップドI/O
 これに対して、ハードウェアのアクセスは一般に時間
がかかるので特別の入出力命令を設けて、場合によって
は自動ウェイトを入れられるようにする、という立場が
「I/OマップドI/O」のシステムです。
 図のように、メモリ空間を完全にメモリで埋めること
ができ、I/O空間も十分に広く確保できます。ただし、最
近の周辺LSIでノーウェイトでも動く高速性がある場合で
も、入出力命令(必ずウェイトが入る)によって「足かせ」
がかかるデメリットとなるケースもあります。アドレス
デコーダが別系列になる、という面倒な点もあります。

\section*{85. リセットベクトルからメインルーチンまで}

●CPUのリセット直後の動き
 どのようなCPUにもリセット端子があり、全ての処理の
スタートはリセット信号となります。つまり、CPUのプロ
グラムカウンタ(PC)にセットされるアドレスが、リセッ
ト後の最初のプログラム番地となっているわけです。
 たとえば図I-85のように、Z80というCPUでは、「リセ
ット直後のアドレスは0000番地」と決まっています。PC
は基本的にインクリメントされていきますから、プログ
ラムは0000番地を先頭として順に記憶させていけばいい
ので、このシステムの考え方はもっとも簡単です。

●リセットベクトルの考え方
 ところが6502のようなCPUでは、リセット後に飛んでい
く「番地」は決っていません。アドレスそのものでなく、
リセット後に開始するアドレスを格納すべき場所(ベクタ
ーアドレス)だけが決まっているのです。
 このメリットは、Z80では0000番地から始まるアドレス
にプログラムメモリを配置することが強制されるのに対
して、6502では任意の位置にプログラムエリアを置ける
ところにあります。
 実際の場面では、あらかじめアセンブル/コンパイル
した時点で、プログラムの実体があるアドレスをこの最
上位ベクターとして登録することになります。
 また、MS-DOSパソコンで活躍する80*86タイプのCPUで
は、リセット後は固定アドレス(固定セグメント)と決ま
っていますが、任意の割り込みアドレスをこのベクター
形式で設定できるようになっています。

●ベクトルを工夫してCPUを騙す
 このようなベクトル方式の場合、プログラムがROMとし
て固定されていても、CPUをうまく騙して他のプログラム
を走らせることができます。ヒントを書きましょう。
 アドレスバスにベクターアドレスが出たことを検出す
るデコーダを使って、その時だけメモリを抑止して代わ
りのアドレスを出力するラッチを用意すると、任意のア
ドレスからの実行開始とできます。応用を考えて下さい。

\section*{86. 分岐処理はソフトの基本}

●ある数と一致するかどうかで分岐
 組み込み機器の制御用CPUソフトは「条件分岐のオンパ
レード」の典型プログラムですが、一般のソフトウェア
においても、「条件によって分岐する」という処理は基
本的な要素となっています。
 もっとも代表的なものとしては、リスト86-Aのような
「ある数と一致するかどうかの判定」があります。これ
はアセンブラの例ですが、リスト86-BのようにC言語のif
文でも、リスト86-Cのようにswitch文でも、よく使われ
ていることは変わりません。

●パラメータ値によって分岐
 このような「比較」による条件分岐の問題点は、比較
すべきパラメータ数が非常に多くなった場合で、一致し
て分岐せずに何十回も何百回も次々と比較を繰り返して
いると、処理の遅さだけでなく、パラメータによる処理
時間のばらつきが問題になる時があります。
 そこで、多数の値をとりうるパラメータと比較する条
件分岐の場合には、
  ・重要な処理に分岐する比較を先に行う
  ・パラメータを2種類にして2段で比較・分岐する
  ・パラメータの上位・下位4ビットずつで比較する
などの方策をとります。また、決定的な手法としては、
「デシジョン・テーブル(後述)」を採用します。

●分岐処理のまとめ方
 分岐処理はよくありますが、分岐したあとでどのよう
に「収束」するかについても、十分に検討します。これ
には大きく2つのアプローチがあり、
  ・それぞれの分岐先をリターンとする(非収束)
  ・各分岐ルーチンから1箇所にジャンプする(収束)
という異なる方針があります。
 非収束リターンの場合、再ジャンプがない分、プログ
ラムとしてはシンプルでスマートになりますが、デバッ
グ性(動作を追求しやすい)は収束型の方が優れており、
ケースバイケースで両方を活用します。

\subsection*{リスト86-A}
\begin{verbatim}
select:
        ld      a,(value)       ; Input Data
        cp	10              ; A = 10 ?
        jp      z,job_10
        cp	20              ; A = 20 ?
        jp      z,job_20
        cp	30              ; A = 30 ?
        jp      z,job_30
        jp      others          ; Other Case
job_10:
        ...........             ; Job of Data = 10
        ret
job_20:
        ...........             ; Job of Data = 20
        ret
job_30:
        ...........             ; Job of Data = 30
        ret
others:
        ...........             ; Job of other Data
        ret
\end{verbatim}

\subsection*{リスト86-B}
\begin{verbatim}
select(value)
        int value;
{
        if( value == 10 )
        {
                ...........             /* Job of Data = 10 */
        }
        else if( value == 20 )
        {
                ...........             /* Job of Data = 20 */
        }
        else if( value == 30 )
        {
                ...........             /* Job of Data = 30 */
        }
        else
        {
                ...........             /* Job of other Data */
        }
}
\end{verbatim}

\subsection*{リスト86-C}
\begin{verbatim}
select(value)
        int value;
{
        switch(value)
        {
                case 10:
                        ...........     /* Job of Data = 10 */
                        break;
                case 20:
                        ...........     /* Job of Data = 20 */
                        break;
                case 30:
                        ...........     /* Job of Data = 30 */
                        break;
                default:
                        ...........     /* Job of other Data */
                        break;
        }
}
\end{verbatim}

\section*{87. 初期化ルーチンの優先度検討}

●イニシャライズルーチンの役割り
 CPUがリセット直後に実行して、メインルーチンに至る
までの処理をまとめたものが「初期化(イニシャライズ)
ルーチン」です。ここでは一般に、
  ・RAMエリアのクリア(不定値を残さない)
  ・周辺ハードウェアのリセット(必要に応じて)
  ・周辺LSIの初期設定
  ・システムパラメータの設定(RAMエリア)
  ・データテーブルの演算設定(RAMエリア)
などの処理を行います。
 最後の「データテーブル」設定というのは、乗算除算
などの時間のかかる処理をリアルタイムで行うのを避け
るために、あらかじめ演算テーブルとして計算しておい
て、実際の動作の際にこのテーブルを参照するだけにす
るもので、8ビットCPUではよく使われる作戦です。

●ハンドシェイクと割り込みに注意
 図I-87はシステムのイニシャライズに関するポイント
を示したもので、特にマイコンシステムで注意すること
は、CPUとハンドシェイクするLSIの初期化と、割り込み
(コントローラ)の設定部分です。
 ハンドシェイクは強力な情報交換手段で、順調にスタ
ートしてしまえば問題ないのですが、最初の設定手順に
よってはデッドロックして、お互いが相手の返事を待っ
ている状態になります。また、割り込みは初期化が終了
した瞬間にイネーブルにすることが重要です。

●ポートリセットも活用する
 システムの初期化手順を単純化するためのテクニック
として、CPUリセット信号を周辺LSIと共有せずに、CPUの
出力ポートから順に周辺LSIのリセット信号を作って供給
することもよく用いられます。
 こうすると、CPUが立ち上がるよりも早く周辺がスター
トして設定処理を受けそこねたり、データバスに不定デ
ータを乗せて誤動作するような状況を避けられます。

\section*{88. 割り込みルーチンの扱い:非同期現象の理解}

●通常ルーチンと割り込みルーチン
 CPUがプログラムとして順に動作していく「通常ルーチ
ン」だけでマイコンシステムのソフトウェアが完成して
しまう、というのは非常にまれなケースで、一般のシス
テムでは「割り込みルーチン」をよく使います。
 これは、割り込みによって、
  ・CPUと非同期な事象をシステムに取り込む
  ・ポーリングよりも高速に対応処理できる
  ・ソフトウェアのモジュールとして分離できる
といったメリットがあるためで、制御用のどんなに簡単
な1チップCPUであっても、割り込み機能だけは充実して
いる、という事実を裏付けています。

●割り込みのタイミング設計は悲観的に行うべし
 割り込みシステムの設計ポイントは、図I-88のような
「時間軸」とともに考える習慣をつけることです。いく
つかの割り込みがあって、それぞれに対応する処理時間
がどれだけであるか、をまず把握します。
 そして、これらの割り込みが最悪の条件、つまり特定
の割り込み処理が終了していない時に発生し、さらにこ
の対応が終わっていないのに別の割り込みが発生する、
という状況を想定していなければなりません。
 このような非同期事象の発生を想定すれば、「割り込
みルーチン内で具体的な対応処理をする」といった誤っ
たプログラミングはできなくなるでしょう。

●割り込みルーチン内での処理
 割り込みルーチン(割り込みによって優先して処理され
る部分)では、シリアル通信データの受信など以外には
  ・レジスタ類のスタック
  ・割り込み発生フラグのセット
  ・割り込み機構のクリア/再設定(次もOK)
  ・レジスタ類のリストア
だけを行うのが定石です。
 あとはメインルーチンや定期的処理ルーチンでこのフ
ラグを見て、必要な対応処理を行います。

\section*{89. ハード割り込みとソフト割り込み}

●ハードでソフトな「割り込み」
 CPUの割り込み機構でフレッシュマンが混乱することの
一つに、ハードウェア割り込みとソフトウェア割り込み
があります。割り込みというのは「CPUの処理を中断させ
て優先的に処理を行うこと」と教科書にあっても、実際
のマイコンシステムやパソコンでは、なかなかピンとき
ません。そして、割り込みをうまく活用することで、実
質的に「多重処理」を簡単に実現できることを体得する
までには、ある程度の経験を必要とするようです。

●ハード割り込みとソフト割り込みは別ものである
 この両者を「別もの」とする考え方の場合、図I-89の
ように、ハードウェア割り込みでは、物理的にCPUの割り
込み信号として外部からの信号が与えられることで発生
する点に着目しています。
 これに対してソフトウェア割り込みでは、CPUの動作と
しては通常の処理とまったく変わらずに、プログラムメ
モリ中のプログラムに従っている、という見かたです。
事実、パソコンのBIOSコールやDOSの機能呼び出しはソフ
ト割り込みの典型ですが、これは一種のサービスルーチ
ンとして、完全にソフトウェアと考えられます。

●ハード割り込みとソフト割り込みは同類である
 これに対して、両者の割り込みが発生してからのCPUの
動作に着目してみると、いずれも特定の「割り込みベク
タ」と呼ばれるエリアのアドレスを参照して、それぞれ
の処理ルーチンに分岐していくことがわかります。
 この点ではまったく同様の処理であり、極端に言えば
ベクタの内容を書き換えるだけで、ハード割り込み処理
をソフト的に呼び出すことも、この逆の動作も、簡単に
実現できることなのです。
 このように内容を検討していくと、ハード割り込みも
ソフト割り込みも、CPUの動作領域を柔軟に広げるための
道具として、いろいろに活用できることがわかります。
「割り込みを使いこなせたらプロ」ともよく言われます
から、積極的に利用したいものです。

\section*{9. プルアップとプルダウン}

●データバスの状態
 マイコン回路では、信号ラインの「バス」構成は基本
中の基本です。信号線上の情報が複数の入力回路に供給
されるとともに、複数(不特定多数、さらに増設の可能性
あり)の出力回路が信号を供給するのがバスラインです。
入力・出力の専用ゲートだけでなく、CPUや周辺LSIでは
双方向ゲートとなっており、各チップのチップセレクト
信号やリード・ライト信号によってイネーブルされます。
 データバスの状態を知るためには、信号ラインをオシ
ロスコープで見ると、図B-9(a)のように、バスへの出力
ゲートがイネーブルされた期間だけ、バス上のデータが
確定します。イネーブルされたゲートのない「ハイ・イ
ンピーダンス状態」の時にバスに指を触れてみると、信
号ラインに人体の誘導ハム電圧が乗って、確定した電圧
レベルが入力素子に伝わりません。

●プルアップ
 そこで、TTL時代のバスラインをノイズに対して強化す
るために、図B-9(b)のような「集合抵抗」によって、バ
スラインのプルアップを行うのが一般的です。これによ
って、信号をドライブしているゲートのない期間にも電
圧は"H"レベルで確定し、特にノイズやハムによって誤っ
た信号をデータ入力とするトラブルを防げます。
 プルアップ抵抗には数KΩから10KΩ程度が使われます
が、バスドライバのICやバスの負荷容量、そしてマイコ
ンシステムではCPUクロックなどの条件によって最適のプ
ルアップ抵抗値が異なりますから、ある程度は実験的に
最適値を検討します。

●CMOS時代とプルダウン
 信号レベルがTTLからCMOSの時代となると、+5VとGNDを
ほぼフルスイングするCMOSでは、プルアップに加えて集
合抵抗のコモン端子を接地する「プルダウン」も採用さ
れるようになりました。ノイズだけでなく、高速バスラ
インでの信号反射の影響などの要素もあり、両方を試し
てみることが信頼性向上のポイントとなっています。

\section*{90. 多重割り込みのコントロール技術}

●多重割り込みとシングルタスクCPU
 マイコンシステムにハードウェア割り込みをかける外
部機器/周辺LSIは、一般にシステム内に複数個あり、そ
れぞれは独立の事象として非同期的にCPUに割り込みを発
生(要求)させます。ここで問題となるのが、この多重割
り込みの調停問題で、本質的にはマルチタスクの本格的
なOSを構築しないと解決できない、奥の深い世界です。
 しかし、組み込み機器のCPUプログラムは一般にシング
ルタスクの簡単なものですから、大規模・本格的なOSを
構築するよりも、簡易型・疑似マルチタスクのシステム
をうまく設計することも重要なことです。

●割り込みコントローラを使う/作る
 もっとも効果的な方法は、割り込みコントローラ専用
LSI(8259など)を使うことで、割り込みレベルや優先度の
調停などに柔軟なシステムを簡単に作れます。
 しかし、ここではもっと簡単に、ソフト的に割り込み
コントロールすることを考えましょう。図I-90(a)はその
一例ですが、CPUと周辺LSI(割り込みの要求元)の割り込
み信号はレベル出力(割り込みが受け付けられるまで割り
込み信号が持続する)であるようにします。
 この場合、CPUは割り込み発生の際に入力ポートから各
LSIの割り込みラインを順にチェックして、割り込み要求
元を判別して対応処理を行います。もし同時に2つ以上の
割り込み要求があっても、ソフト的に優先順位を持って
対応することが可能となります。

●多重処理を実現するには
 この方法では、割り込み受け付け処理ルーチンをなる
べく簡潔にして、他の割り込みを待たせるところがポイ
ントです。本当の多重割り込みを受け付けるために、図
I-90(b)のように割り込みルーチン中で割り込み許可とす
ると、元の処理ルーチンに復帰せずに再度割り込み発生
と解釈されて、スタックがあふれることになります。
 簡易型で多重処理を行うには、「割り込み処理ルーチ
ンはフラグセットだけ」という定石が大切なのです。

\section*{91. スタックによるバッファリング}

●スタックは便利なデータバッファ
 「スタック」というバッファを利用していないマイコ
ン技術者は、存在していません。CPUは本質的にスタック
動作を行っていますから、意識することはなくても、常
にスタックのお世話になっているのです。そこで、せっ
かくのスタックをもっと理解して活用してみましょう。
 図I-91(a)は、スタックの動作を簡単に示したものです。
スタックは、メモリ(RAM)中に一定のスタックエリアを確
保して、ここに動的にデータを格納します。このアドレ
スは「スタックポインタ」に置かれていて、スタックポ
インタは常に「現在の最新のデータの位置」を示してい
ます。

●スタックのうまい使い方
 スタックバッファの活用ポイントは、「一時的なデー
タの置き場所」という扱い方です。わざわざデータエリ
アとして確保するほどもない、一時的に保持していたい
(他で参照されることのない)データというのは多くあり
ます。近距離であればレジスタに置くのですが、いくつ
ものサブルーチンを利用するプログラムでは、レジスタ
を駆使するのはよくない作法とされています。
 そこでリスト91-Aのように、サブルーチンの呼び出し
前後にpush命令とpop命令を置いて、この間だけ保持する
ことが一般的です。なお、スタックに変数を置いて、呼
ばれたサブルーチンがこれを読み出して使う、という手
法はC言語の(内部的)定石ですが、アセンブラレベルでは
ミスを誘うので避けたほうが賢明でしょう。

●スタックの危険な使い方
 スタックは図I-91(b)のように、スタックポインタの扱
いを誤ると、簡単にCPUを暴走させる危険性も持っていま
す。リスト91-Bはこれを逆手にとった「プロテクト手法」
なのですが、正常(マスター製品)であれば、プログラム
中のNOPコマンド置かれたの1バイトをリターンに変える、
というものです。もしNOPのままであれば、スタックの活
躍(?)によって、ソフトが確実に暴走します。

\subsection*{リスト91-A}
\begin{verbatim}
        ld      a,(data1)
        ld      b,a             ; data1 --> [b]
        ld      a,(data2)
        ld      c,a             ; data2 --> [c]
        ............            ; operation : [bc] change
        push    bc              ; [bc] --> Stack
        call    sub_001         ; other subroutine (using [a],[bc],[hl])
        pop     hl              ; Stack --> [hl]
        ............            ; operation : [hl] --> [bc]
        ld      a,b
        ld      (data1),a
        ld      a,c
        ld      (data1),a
\end{verbatim}

\subsection*{リスト91-B}
\begin{verbatim}
protect:
        ............
        ............
        ............
        ............
dummy:
        nop                     ; THIS ADDRESS !!!
        call    dummy
\end{verbatim}

\section*{92. FIFOによるバッファリング}

●FIFOバッファとは
 マイコンシステムのデータバッファといえば、リング
バッファ、別名FIFO(First In, First Out)バッファが定
番です。これは図I-92(a)のように、データバッファエリ
アを(仮想的に)閉じたループのように構成して、
  ・次に書き込むデータを示す書き込みポインタ
  ・次に読み出されるデータを示す読み出しポインタ
という2つのポインタを用いてアクセスするものです。
 一般にメモリ空間はリニアに広がっていますから、ル
ープ状につながるためには、「ポインタが最上位アドレ
スに達したら最下位アドレスに変換する」という処理を
プログラムの方でサポートすればいいことになります。

●FIFOバッファの活躍する場所
 FIFOバッファの最大のメリットは、「処理を時間的に
分散する」ところにあります。図I-92(b)は、シリアル通
信データの受信バッファリングにFIFOを使った場合の例
です。ここでは、ときどき時間的に連続して届く受信デ
ータをとりあえず割り込みルーチン内で速やかにFIFOに
積んで、データの解釈と処理はメインルーチンなど、処
理の空いている時に行う、というものです。
 これはシリアル通信では重要なポイントで、一般にシ
リアル通信用のUARTは内部的に2段か3段程度のバッファ
しか持ちませんから、CPUへの割り込みによってバッファ
・フル(データ落ち)を避けることが最重要なのです。

●FIFOのうまい組み方
 リスト92-Aは、このFIFOを256バイトのサイズとして、
さらに下位アドレスをゼロとなる位置に配置した例です。
これはシリアルデータを送信する処理ですが、内部的に
多くの送信データが発生した時に、このサブルーチンを
コールしてFIFOに積んでおきます。
 リスト92-Bは、メインルーチンから定期的にコールさ
れる、実際にシリアルポートに出力するサブルーチンで、
送るべきデータがあった時にだけ、一度に1バイトずつ送
信します。簡易型FIFOですが参考にして下さい。

\subsection*{リスト92-A}
\begin{verbatim}
                org     4000h
        tx_fifo ds      256
        tx_top  ds      1
        tx_end  ds      1

        tx_data_set:
                ld      hl,tx_fifo
                ld      a,(tx_top)      ; write pointer
                ld      l,a
                inc     a               ; pointer increment
                ld      (tx_top),a
                ld      (hl),b          ; [b] = transmit data
                ret
\end{verbatim}

\subsection*{リスト92-B}
\begin{verbatim}
        tx_data_check:
                ld      a,(tx_end)      ; read pointer
                ld      b,a
                ld      a,(tx_top)      ; write pointer
                cp      b
                ret     z               ; equal --> NOP
                ld      hl,tx_fifo
                ld      l,b
                ld      a,(hl)
                out     (uart),a        ; Data Transmit !!
                ld      a,b
                inc     a               ; pointer increment
                ld      (tx_end),a
                ret
\end{verbatim}

\section*{93. 間接アドレッシングを活用しよう}

●CPUのアドレシング・モード
 CPUが扱う「アドレス」というのは、一般の8ビットCPU
でいえば単なる16ビットデータということになります。
このアドレスを指定する方法が、CPUの「アドレシング・
モード」と呼ばれるものなのですが、CPUによって実にい
ろいろな種類があります。特定のCPUだけがサポートして
いるアドレシングというのは、
  ・活用すると他のCPUにないパフォーマンスを生む
  ・他のCPUに移った時に使えなくて欲求不満になる
という両面の性質があるのですが、新しいアドレシング
の概念を知ることはいい勉強ですから、新しい方法をな
るべく使ってみる、という姿勢が重要です。

●直接と間接のアドレッシング
 図I-93(a)は、代表的なアドレシングモードを示したも
ので、こんな簡単なアドレシングでも、CPUによってはサ
ポートしていない事に驚くものもあります。
 実際にプログラミングすることを想像すれば容易にわ
かりますが、アドレシングにおいて「直接指定」をなる
べく避ける、というのは好ましいマナーです。ソフトウ
ェアの移植性・互換性・汎用性(ソフト部品化)の点から
みても、具体的なアドレスやレジスタが明示されない方
が、より抽象度の高い(ブラックボックス化された)プロ
グラムとなるからです。

●オフセット付きのアドレシングがプロの武器
 図I-93(b)では、間接アドレシングの中でも重要な、オ
フセット指定を伴う「インデックスト・アドレッシング」
の例を3つほどあげてあります。最後の2つはなかなか混
乱しそうになりますが、アキュムレータ以外にXとYとい
うたった2つのレジスタしか持たない6502CPUが、他のCPU
を越える「ファミコンの処理能力」を発揮しているのは、
このアドレシングモードの活躍によるところが相当に大
きいのです。後述する「テーブル」処理においては、こ
のアドレシングモードがもっとも重要になります。

\section*{94. パラメータ・テーブルのテクニック}

●テーブルと配列
 プログラミングにおいては、一般的にいろいろな配列
を扱いますが、ここではデータベースのような「データ
そのものが目的」でない、組み込みマイコンのような制
御CPUレベルでも活用できるポイントを検討します。
 まず最初に、ROMに固定データテーブルとして置かれる
パラメータテーブルの例です。図I-94(a)の16バイトのテ
ーブルは、"0"から"F"までの16種類の文字に相当するASCII
コードが入っています。このテーブルは、RS-232-Cのモ
ニタなどで、受信データをディスプレイする場合などに
活用されます。LCDモジュール内のコントローラLSIが持
っている「キャクタジェネレータ」も同じ原理です。

●特性変換テーブル
 図I-94(b)に示したのは、256バイトのアドレスを持つ
8ビットデータのテーブル(256段階)です。入力と出力が
完全にリニアであるものは別に何もしませんが、データ
特性がいろいろな曲線になっていると、複雑な数値計算
をCPUが行わなくても、入力データをこのテーブルのアド
レスオフセットとして与えれば、瞬時に変換後のデータ
を得ることができます。
 このようなデータ変換テーブルは、たとえばセンサか
らの非線型特性データを100段階にリニア化する、といっ
た処理で活躍します。また、乗算命令を持っていないCPU
であれば、あらかじめ乗算結果をテーブル化しておいて
参照すると、乗算命令を持つCPUとほとんど変わらない時
間に演算結果を得ることもできます。

●RAMに置かれるパラメータテーブル
 簡単な組み込みCPUプログラムで、イニシャライズルー
チンの最後に「パラメータテーブルを作る」という処理
が置かれることもあります。CPUがソフト的にシステムパ
ラメータを演算するには時間がかかりすぎる場合、あら
かじめ計算しておいてテーブル化し、実際の処理ではテ
ーブル参照で高速化する、という手法です。

\section*{95. デシジョン・テーブルによるスピードアップ}

●再び条件分岐の問題
 図I-95(a)は、ある入力データが1から99までの値を持
っていて、この値に応じた99種類のサブルーチンにジャ
ンプしたい、という長い条件分岐の様子です。このプロ
グラムを馬鹿正直に作るとリスト95-Aのようになり、こ
の場合にはデータが終わりの方(95とか97)であれば、比
較してジャンプしていくまでに相当の時間がかかります。
そして時間とともに、「入力データによって処理の所用
時間が大きく変わる」というデメリットも深刻です。

●同じ処理時間でジャンプしたい
 この場合、希望仕様としては図I-95(b)のように、入力
データに対して「ある簡単な処理」を行い、その結果と
して99種類のどのサブルーチンにも同じタイミングでジ
ャンプして欲しい、ということになります。
 これを実現するのがデシジョン・テーブル(筆者はこれ
を「テーブル選択ジャンプ」と名付けました)の手法です。
CPUの持っているアドシングモードのうち、「インデクス
ト間接アドレッシング」機能が、この手法を支えます。
 リスト95-Bは、このプログラム例です。入力データを
2倍するのは、アドレスは2バイトで表現されているから
で、テーブルとしては各処理サブルーチンの先頭アドレ
スを並べておくと、アセンブラは自動的にアドレス計算
して、正しいデータがここに置かれます。あとは実行時
に、入力データの2倍をオフセットとしてこのテーブルの
内容をアクセスして、そこにジャンプしていきます。

●割り込みルーチンでの活用
 この手法がもっとも効果的なのは、割り込み処理ルー
チンでの利用です。複数の割り込み要因からの信号ライ
ンの論理和がCPUに与えられると、CPUは入力ポートから
この情報を取り込み、それぞれのデータからなる入力コ
ードによってジャンプテーブルをアクセスすれば、自動
的に優先度判定まで実現できます。あまり知られていま
せんが、反応性と柔軟性を大幅にアップします。

\subsection*{リスト95-A}
\begin{verbatim}
select:
        ld      a,(value)       ; Input Data
        cp	1               ; A = 1 ?
        jp      z,job_1
        cp	2               ; A = 2 ?
        jp      z,job_2
        cp	3               ; A = 3 ?
        jp      z,job_3
        cp	4               ; A = 4 ?
        jp      z,job_4
        cp	5               ; A = 5 ?
        jp      z,job_5
        cp	6               ; A = 6 ?
        jp      z,job_6
        cp	7               ; A = 7 ?
        jp      z,job_7
            |
            |
            |
            |
            |
\end{verbatim}

\subsection*{リスト95-B}
\begin{verbatim}
select:
        ld      a,(value)       ; Input Data
        add     a,a             ; * 2
        ld      c,a
        ld      b,0
        ld      hl,jump_table   ; Get Address
        add     hl,bc
        jp      (hl)            ; Jump !!

jump_table:
        dw      job_nop
        dw      job_1
        dw      job_2
        dw      job_3
        dw      job_4
        dw      job_5
        dw      job_6
        dw      job_7
            |
            |
            |
            |
            |
\end{verbatim}

\section*{96. マクロをフルに活用する}

●アセンブラはマクロによって高級言語を目指す
 組み込みマイコンの開発言語はだいぶCになってきまし
たが、まだまだアセンブラに愛着を持っている人も多い
ようです。この理由の一つに、強力なマクロ機能のサポ
ートがあります。事実、開発の過程で得られたノウハウ
をつぎ込んでマクロをカスタマイズしていくと、へたに
高級言語に乗り換えるよりも、アセンブラの方が開発効
率も開発結果のプログラムも良い、という場合もありそ
うな勢いです。
 ここではマクロを「開発ツール」として、その可能性
と将来性を考えてみましょう。

●6502系CPUアセンブラでZ80を開発する
 リスト96-Aは、ロックウェルの6502(モトローラ系アー
キテクチャ)で実際に稼働したプログラムの一部の、マク
ロ定義の部分です。プログラマは6502らしく書いて、6502
用のアセンブラが出力するコードはZ80用になっている、
という「Z80ボードマイコン」のためのプログラムです。
 プログラマとしては、慣れた6502のニモニックを使い
たいために、よく使われるニモニックは全てマクロで定
義して、定義の中身としてZ80の機械語を置いています。
 リスト96-Bは、このヘッダファイルと一緒にアセンブ
ルした本体プログラムの一部ですが、マクロ定義しなか
ったコードは直接に記述してしまう、という荒技です。

●Z80用アセンブラで6502風に開発する
 リスト96-Cは、この逆に、同じZ80システムのZ80を、
6502風の記述マクロを使って開発した例です。こちらは
Z80用のアセンブラなので、マクロ定義の記号も違ってい
ますが、基本的には同様にマクロ定義を活用しています。
 プログラムの一部だけなので全体の動作はわかりませ
んが、このように別のCPUの体系での経験をふまえて新し
いCPUに接してみると、そのアーキテクチャの思想や特徴
がよく理解できるものです。一度ぜひ試してみて下さい。

\subsection*{リスト96-A}
\begin{verbatim}
;-------------------------------------
;       Z80 --> 65C02 Cross Assembler  File
;-------------------------------------
org     ram_area
        rxfifo          ds      256
        txfifo          ds      256

;#####  Macro Defines #####
        macro   &push
                db      0f5h    ; push af
                endmac
        macro   &pop
                db      0f1h    ; pop af
                endmac
        macro   &ex
                db      008h    ; ex af,af'
                db      0d9h    ; exx
                endmac
        macro   &stack
                db      031h    ; ld sp,nn
                db      .low.\0
                db      .high.\0
                endmac
        macro   &lda
                db      03ah    ; ld a,(nn)
                db      .low.\0
                db      .high.\0
                endmac
        macro   &sta
                db      032h    ; ld (nn),a
                db      .low.\0
                db      .high.\0
                endmac
        macro   &movi
                db      03eh    ; ld a,n
                db      \0
                db      032h    ; ld (nn),a
                db      .low.\1
                db      .high.\1
                endmac
        macro   &move
                db      03ah    ; ld a,(nn)
                db      .low.\0
                db      .high.\0
                db      032h    ; ld (nn),a
                db      .low.\1
                db      .high.\1
                endmac
        macro   &movex
                db      03ah    ; ld a,(nn)
                db      .low.\0
                db      .high.\0
                db      0eeh,0ffh ; xor a,0ffh
                db      032h    ; ld (nn),a
                db      .low.\1
                db      .high.\1
                endmac
        macro   &jsr
                db      0cdh    ; call xx,nn
                db      .low.\0
                db      .high.\0
                endmac
        macro   &jsrnz
                db      0c4h    ; call nz,nn
                db      .low.\0
                db      .high.\0
                endmac
        macro   &jmp
                db      0c3h    ; jp xx,nn
                db      .low.\0
                db      .high.\0
                endmac
        macro   &beq
                db      0cah    ; jp z,nn
                db      .low.\0
                db      .high.\0
                endmac
        macro   &bne
                db      0c2h    ; jp nz,nn
                db      .low.\0
                db      .high.\0
                endmac
        macro   &rts
                db      0c9h    ; ret xx
                endmac
        macro   &and
                db      0e6h    ; and a,n
                db      \0
                endmac
        macro   &eor
                db      0eeh    ; xor a,n
                db      \0
                endmac
        macro   &ora
                db      0f6h    ; or a,n
                db      \0
                endmac
        macro   &cmp
                db      0feh    ; cp a,n
                db      \0
                endmac
        macro   &inc
                db      03ch    ; inc a
                endmac
        macro   &dec
                db      03dh    ; dec a
                endmac
        macro   &seth
                db      026h    ; ld h,n
                db      .high.\0
                endmac
        macro   &setl
                db      03ah    ; ld a,(nn)
                db      .low.\0
                db      .high.\0
                db      06fh    ; ld l,a
                endmac
        macro   &gethl
                db      07eh    ; ld a,(hl)
                endmac
        macro   &puthl
                db      077h    ; ld (hl),a
                endmac

        macro   &nop
                db      000h    ;
                endmac
\end{verbatim}
\newpage
\subsection*{リスト96-B}
\begin{verbatim}
;##### Program Start ( <-- Power ON Reset ) #####
org     program_area
        &stack  stack_pointer
        db      0f3h            ; 
        db      0edh,56h        ; 
        &jmp    main_routine

;##### RS232C INT Sequence #####
org     int_area
        &ex
        &setl   rxtop
        &lda    rs232c
        &puthl
        db      2ch             ; 
        db      7dh             ; 
        &sta    rxtop
        &ex
        db      0fbh            ; 
        db      0edh,4dh        ; 

;##### Main Program Area #####
main_routine:
        &jsr    io_initial
loop:
        &jsr    rs232c_rx_check
        &jsr    data_tx_sequence
        &jmp    loop

rs232c_rx_low_data:
        &movi   0,hlflag
        &lda    hlbuf
        db      47h             ; 
        &lda    databuf
        db      0b0h            ; 
        &sta    databuf
        &seth   txfifo
        &setl   txtop
        &lda    databuf
        &puthl
        db      2ch             ; 
        db      7dh             ; 
        &sta    txtop
        &rts

data_tx_sequence:
        &lda    txend
        db      47h             ; 
        &lda    txtop
        db      0b8h            ; 
        &bne    data_tx_data_found
        &rts
data_tx_data_found:
        &lda    uart1
        &and    00000001b
        &cmp    0
        &bne    data_tx_uart_ok
        &rts
data_tx_uart_ok:
        db      78h             ; 
        &inc
        &sta    txend
        db      68h             ; 
        &seth   txfifo
        &gethl
        &sta    uart0
        &rts

;##### System I/O Initialize #####
io_initial:
; 
        &ex
        &seth   rxfifo
        &ex
; 
        &movi   0,work
        &seth   work_area
ram_clear_work:
        &setl   work
        db      3eh,00h         ; ld a,#0
        &puthl
        &lda    work
        &inc
        &sta    work
        &cmp    0
        &bne    ram_clear_work
; 
        db      0fbh            ; 
        &rts
\end{verbatim}

\subsection*{リスト96-C}
\begin{verbatim}
;##### MACRO #####
        macro   %lda
                ld      a,(\0)
                endmac
        macro   %sta
                ld      (\0),a
                endmac
        macro   %movi
                ld      a,\1
                %sta    \0
                endmac
        macro   %move
                %lda    \1
                %sta    \0
                endmac
        macro   %inc
                ld      hl,\0
                inc     (hl)
                endmac
        macro   %dec
                ld      hl,\0
                dec     (hl)
                endmac
        macro   %send_i
                ld      h,.high.tx_fifo
                %lda    tx_top
                ld      l,a
                ld      a,\0
                ld      (hl),a
                %inc    tx_top
                endmac
        macro   %send_a
                ld      b,a
                ld      h,.high.tx_fifo
                %lda    tx_top
                ld      l,a
                ld      (hl),b
                %inc    tx_top
                endmac
        macro   %send_m
                ld      h,.high.tx_fifo
                %lda    tx_top
                ld      l,a
                %lda    \0
                ld      (hl),a
                %inc    tx_top
                endmac
        macro   %put_command
                ld      b,\0
                call    mpu_put_command
                endmac
        macro   %put_data
                ld      b,\0
                call    mpu_put_data
                endmac

;##### RESET #####
        org     reset_vector
        ld      sp,stack_pointer
        di
        im      1
        call    initialize
        jp      loop

;##### NMI #####
        org     nmi_area
        ex      af,af'
        exx
        ld      h,.high.rx_fifo
        %lda    rx_top
        ld      l,a
        inc     a
        %sta    rx_top
        %lda    uart
        ld      (hl),a
        exx
        ex      af,af'
        retn

;##### Program #####
        org     program_area
loop:
        call    rx_rs232c_check
        %lda    dump_flag
        cp      0
        jp      nz,loop
        call    tx_rs232c_check
        call    mouse_sw_check
        call    mouse_point_check
        call    cpu_end_check
        call    led_display
        call    remain_counter_check
        jp      loop

;##### [A] ---> Bank Set , Dump Counter Set #####
dump_pointer_set:
        ld      c,a
        ld      b,a
        srl     b
        %lda    bank_buffer
        and     11111100b
        or      b
        %sta    bank_buffer
        %sta    bank_port               ; New Bank is set !!
        %movi   dump_counter,0ffh
        ld      a,c
        rrc     a
        rrc     a
        or      10111111b
        %sta    dump_counter+1
        ret

;##### [A] ---> Bank Set , Pointer Set ---> [DE] #####
bank_pointer_set:
        ld      l,a
        ld      b,a
        srl     b
        %lda    bank_buffer
        and     11111100b
        or      b
        %sta    bank_buffer
        %sta    bank_port               ; New Bank is set !!
        ld      h,.high.track_counter
        sla     l
        ld      e,(hl)
        inc     l
        ld      d,(hl)
        ret

;##### CPU Data Get Subroutine #####
cpu_get_data:
        %lda    comm_port
        and     dsr
        cp      0
        jp      nz,cpu_get_data
        %move   cpu_data,data_port
        ret

;##### CPU Data Put Subroutine #####
cpu_put_data:
        %lda    comm_port
        and     drr
        cp      0
        jp      nz,cpu_put_data
        ld      a,b
        %sta    data_port
        ret

;##### CPU Command Put Subroutine #####
cpu_put_command:
        %lda    comm_port
        and     drr
        cp      0
        jp      nz,cpu_put_command
        ld      a,b
        %sta    comm_port
        ret

;##### [A]register ---> ASCII Code [H],[L] Conversion #####
hex_conversion:
        ld      b,a
        ld      l,a
        srl     l
        srl     l
        srl     l
        srl     l
        ld      h,.high.hex_table
        ld      a,(hl)
        %sta    high_nibble
        ld      a,b
        and     00001111b
        ld      l,a
        ld      a,(hl)
        %sta    low_nibble
        ret

;##### RS232C Transmit Check Routine #####
tx_rs232c_check:
        %lda    tx_end
        ld      l,a
        %lda    tx_top
        cp      l
        ret     z
        %lda    uart_control
        and     00000001b
        ret     z
        ld      h,.high.tx_fifo
        ld      a,(hl)
        %sta    uart
        %inc    tx_end
        ret

;##### HEX Table #####
        org     hex_table_add
hex_table:
        defm    '0123456789ABCDEF'
\end{verbatim}

\section*{97. サブルーチンと関数の利用}

●階層化・構造化の切札
 「サブルーチン」と「関数」の実質的な違いは、プロ
グラミングの領域ではあまりなくなってきていて、
  ・呼び出す時に値を与える(こともある)
  ・戻って来る時に値を返す(こともある)
  ・固定アドレスに関する情報は使わない(汎用化)
  ・通常は、再帰的な使い方は基本的にできない
というような性質のどれを見ても、実際のプログラミン
グではあまり違いを意識することはありません。
 システムを構築するプログラムを、どのようなサブル
ーチンや関数に分解して実現するか、というシステム設
計のポイントは、受渡しされるデータに注目して分割を
行うことです。このデータ規約がサブルーチンや関数の
一般性や便利さのかなりのウエイトを占めるのです。

●データの渡し方いろいろ
 図I-97に示したのは、サブルーチンや関数に対する、
呼び出し側からのデータの渡し方の例です。この方法は、
そのまま呼び出し側にデータを返す場合にも使えます。
 レジスタ渡しは一般に局所的な場面で活用しますが、
MS-DOSの機能呼び出しのように、メモリを使わない一般
性を利用した例もあります。また、スタックを利用した
データの受渡しはC言語コンパイラが用いている方法で、
プログラミングする側には「見えない」形で実現してい
ます。
 もっとも感覚的にわかりやすい「グローバル変数」は、
パソコンの世界ではメモリ効率の悪さからあまり歓迎さ
れませんが、組み込みマイコンのプログラムでは、変数
リストとして明示的に宣言することがデバッガビリティ
を上げるために、積極的に利用されています。

●汎用モジュールを目指す
 このようなサブルーチンや関数を開発する上での指針
としては、とにかく「一般性を持たせるように書く」と
いうのがポイントで、再利用性だけでなく、あとあとの
保守性においても効果を発揮してきます。

\section*{98. 共通メモリのアクセスは要注意}

●共通メモリはインターフェースの鍵
 ソフトウェアの中で、複数のモジュールが協同して仕
事を進めていくためには、モジュール相互の情報交換が
不可欠です。このために使われるのが「共通メモリ」と
呼ばれる、インターフェースのためのデータエリアです。
 この場合、同じ共有メモリにアクセスするモジュール
が図I-98(a)のように普通のルーチンであれば、別に問題
はありません。各モジュールはそれぞれにメモリをアク
セスして、変化を読み出したりデータを変更します。

●割り込みルーチンが入ると要注意
 ところが図I-98(b)のように、共通メモリにアクセスす
るモジュールの中に割り込みルーチンがあると、状況は
一変します。ここではモジュールAは共通メモリデータを
インクリメントして、256回に1回だけ、ソフトタイマ的
にイベントを作り、モジュールBは共通データの大幅な変
化によってイベント発生ルーチンをコールしています。
また、割り込みルーチンは共通メモリをクリアしてイベ
ント発生を伝える、という(仮想的な)システムです。
 ここでの問題は、たまたまモジュールAが共通データを
読み込んでから書き込むまでの瞬間に割り込みがかかっ
た時だけ、イベント発生の情報が無視されるところにあ
ります。つまり、モジュールAでは問題の期間、「割り込
み禁止」処理を追加する必要があるのです。

●非同期事象には注意を払う
 この例はあまりに単純なものですが、実際のプログラ
ミングの際にも、原理的には似たようなミスを起こす事
はよくあります。また、割り込みはもともと非同期現象
であるために、問題の発生頻度が低くて、デバッグでも
なかなか発見できない「難所」となっています。
 基本的な姿勢として、割り込みや他システムとのイン
ターフェースなどの非同期動作については、「設計上の
ウイークポイントとなる最悪のタイミング」を想定して
かかることが大切です。

\section*{99. フラグ操作の盲点}

●フラグの利用
 共通メモリよりもよく使われるシステム共有情報とし
て、「フラグ」という概念があります。これはもともと、
メモリ容量の小さな時代にコンピュータのメモリを節約
するところから生まれた概念のようにも思いますが、現
代でもまだまだ現役の重要なプログラム要素です。
 フラグは一般的には図I-99(a)のように、メモリ中の特
定アドレスのメモリ(8ビットないし16ビット)の中身を、
1ビットずつ別々に意味付けしたものです。もちろん、隣
接した2ビットで4状態((00,01,10,11)を表したり、3ビッ
トで8状態を表すフラグもあります。また、CPUも「フラ
グレジスタ」という、プログラムからは読み出し専用の
レジスタを持っています。

●フラグ操作の注意点
 フラグは本質的に、「独立した情報を同じアドレスに
置いている」というデータ改変の危険性を持っています。
そこで、フラグ操作のための特別な命令をサポートして
いるCPUは別として、一般の論理演算でフラグ操作を実現
する場合には、かなりの注意が必要です。
 たとえば図の例では、3ビットでチャンネルを表してい
る部分の情報を次々にスキャンしていく時に、3ビットデ
ータのインクリメントがオーバーフローした瞬間、上位
のビットが反転してしまう可能性を考慮しなければなり
ません。

●CPUのメモリ直接演算機能は危険な性能
 図I-99(b)で示したのは、CPUがフラグ操作を行う時の
処理例ですが、ここでは「メモリ空間内のデータを直接
変更できる」CPUについて考えます。この便利な機能を使
うと、アルゴリズムはかなり簡単(直観的)なものになり
ますが、たとえばデータ変更中に割り込みでフラグをア
クセスした場合などに、フラグ情報が破壊される可能性
も生まれてきます。なるべくならば「フラグを書き込む
人は一人だけ」というルールを徹底したいものです。