第8回テキスト

計算機システム設計論 担当
西
第8週
A・D 変換、D・A 変換
完全にデジタルで行うには、PWM 制御です。
一般に、D/A、A/D などアナログ部は専用の A/D 変換器、D/A 変換器を使ってください。
これは、FPGA や ASIC を含め、デジタルデバイスの I/O は高速動作を目的としており、ドライブ能力(電圧
や電流の許容量)が非常に小さく(浮遊容量も数十 pF しかない)、適していません。また、バイポーラ方式のデ
バイスを使うことで、-5V から 5V などの負の電圧も扱うことができるようになります。
PWM 制御とは?
例えば、デジタルデバイスは 0V か 5V かしか出力できませんが、0V と 5V の間、例えば 3V を出したいとき、
100 クロックの時間のうち、3/5 の時間、つまり 60 クロックの間 5V を出力し、40 クロックの間 0V を出力し
てみると?
クロック
出力
やはり 0V と 5V しか出していないが、デジタルデバイスの時定数に比して相手の時定数が十分大きい場合、
これが平滑化されて、3V に見えてしまう。
まずは、ソース
module pwmout(in, out, clk, rst);
input [9:0] in;
output out;
input clk, rst;
reg [9:0] count;
always @(posedge clk or posedge rst) begin
if(rst) begin
count <= 0;
end else begin
count <= count + 1;
end
end
always @(count or in) begin
if(count <= in) out = 1;
else out = 0;
end
endmodule
これで PWM 波形が生成できます。
このままだと実験できないので、例えばのこぎり波を作ってみましょう。
module nokogiri(out, clk, rst);
output out;
input clk, rst;
reg [9:0] count; // こちらはクロックにあわせて調節
reg [9:0] in;
pwmout pwm(in, out, clk, rst);
always @(posedge clk or posedge rst) begin
if(rst) begin
count <= 0;
end else begin
count <= count + 1;
end
end
assign slowclk = count[9]; // これも調節
always @(posedge slowclk or posedge rst) begin
if(rst) begin
in <= 0;
end else begin
in <= in + 1;
end
end
endmodule
この出力を「高性能な」オシロスコープで見ると、やはり普通の PWM 波形に見えてしまいます。
外部にコンデンサをつけてなまらせるか、時定数が大きい測定器で計測すると狙ったレベルの波形を見ること
ができます。通常、FPGA 等の動作速度はこの程度であれば 100MHz(10ns)程度は確保できるはずですから、
事実上問題がないでしょう。電流がほしい場合は OP アンプと組み合わせます。
最も単純な AD 変換
AD変換は、まずは比較することが重要です。比較する回路をコンパレータと呼びます。
LM393 などを使いますが、まずはこのコンパレータから話を起こします。
OP アンプを利用して、反転増幅アンプを構成すると、
Vin
Ra
Rb
+
Vout
Vout = Vin
Rb
Ra
となります。基準電圧 Vref を定めると、 Vout  (Vref  Vin)
Rb
 Vref
Ra
となります。さて、この回路の入出力特性を記述すると、
Vout の最大値
Rb
Ra
Vout の最小値
Vin
となります。Rb を無限大とすると、
Vout の最大値
Vout の最小値
Vin
Vref
要するに、抵抗値無限大とは、接続を切ってしまえばよいので、
Vin
+
Vout
これで十分ということになります。出力Vout は入力Vin が基準電圧 Vref を横切るのを境に+側から-側に
振り切れます。ただ、このままですと入力信号にノイズが重畳している場合に基準電圧付近の入力があるとに
おいて、出力はHレベル・Lレベルを繰り返し、不安定になります。
これを解消するために、ヒステリシス特性を持たせます。
Voutmax
Voutmin
VrefHL
VrefLH
Vin
実際には、
+
Vin
Rc
Vout
Rd
Rc 

VrefLH  Vref   Voutmax  Vref 

Rc  Rd 

Rc 

VrefHL  Vref   Voutmin  Vref 

Rc  Rd 

となりますから、
VrefLH - VrefHL  Voutmax  Voutmin 
Rc
Rc  Rd
となり、ヒステリシスの係り具合を調整できます。
さて、これで立派な DA コンバータができました。1bit DA コンバータです。
さて、1bit はひどいので、ビット数を増やします。
先ほどの回路をひとつのモジュールとして、たくさん並べます。最大電圧、その 255/256、その 254/256 とい
った具合に順に配置すると、計測できますが、256 個ならべてようやく 8bit です。この方式をフラッシュ A/D
コンバータと呼び、非常に高速に動作しますが(10G とか)、とにかく規模が大きく測定器向けです。
コンパレータ (1)
コンパレータ (255/256)
コンパレータ (254/256)
コンパレータ (253/256)
コンパレータ (1/256)
さて、数当てゲームというのがあります。1 から 256 までの数を想像してもらい、その数を当てます。当てる
ときは、相手に対して自分の言った数よりも大きいか、尐ないかだけ答えてもらいます。最短で当てるには、
2分木探索を行えばよく、まず中間の 128 と答えて上か下を聞き、上と答えたら残りの値の中間、つまり 128
の 1.5 倍を、下と答えたら、やはり残りの数の中間、つまり 128/2 を答えればよいというものです。この方法
であれば最も比較回数が多い場合でも 8 回であたります。
この方法に従えば、256 個準備しなくとも 1 個を何回も利用して AD が作成可能になることがわかります。
コンパレータ
ステートマシン
DA 変換器
AD に DA が必要というのは、ちょっと気になりますが、DA で先ほどの手順と同様の電圧を生成して比較を
繰り返していけば、割とすばやく(bit 数と同じ回数の比較で)AD 変換可能であることがわかります。
さて、DA がそれほど高速にできるのか?ですが、PWM で生成せず、直接抵抗を組み合わせて生成すれば高
速に変換できます。
MSB
R
2R
4R
i
まず基本から、足し算の原理でつくってみます。MSB を R/1、次のビットを R/2 最尐ビットを R/2n の抵抗
で足し算します。この回路は簡単ですが 10 ビットもあるような DA 変換では最大抵抗値と最尐抵抗値の比は
1024 分の1にもなり、普通の抵抗の精度が 0.5%ですから実用化はほとんど不可能です。また抵抗の温度変化
にも大変弱い回路で、精度の良い計測ができません。
この欠点を克服したのが次の構成です。
2R
2R
R
2R
R
2R
2R
MSB のスイッチが接地されていると 2R と 2R の抵抗が並列に繋がっていますから、R の抵抗と等価です。以
下同様に各段を過ぎて LSB からみた抵抗値は 2R となります。これがミソです。入力電圧はそれぞれの
1/4,1/2,1/1 が足されたことになり(テブナンの定理)で DA 変換が成り立っています。この回路は R の抵抗値に
対する誤差が伝搬しにくいのが特徴で、同じ値の抵抗値は精度良く作りやすいことを利用しています。
以上のようにして、逐次型 AD コンバータが出来上がります。
デジタルから単純に A/D 変換器を作りたい場合、RC 時定数回路をつかって、チャージ時間を測定することで
抵抗値や電圧を測定することができます。ただ、この場合単純なデジタルデバイスの I/O ピンではなく、双方
向ピン(入力と出力が行えるピン)を利用します。
デジタルデバイスは TTL もしくは LVTTL レベルですと、ほぼ 1.3V を境に HIGH と LOW を識別します。
従って、RC 回路に電圧を加えていくと、どんどんキャパシタに電荷がたまり 1.3V を超えていきます。その
0V から 1.3V までのチャージ時間を測定してアナログ値を得ようという仕組みです。
まず、a. では HIGH を出力し、C をチャージします。その後、入力に転じて 1 が読めるまでの時間をカウン
タで計測します。b は LOW を出力し、C をリセットします。その後、入力に転じて 0 が読めるまでの時間を
カウンタで計測します。チャージ時間は、
RC (ln(Vfinal / Vinitial )
として計算できます。10K の抵抗、0.1μF のコンデンサを用い、5V から 1.4V への経過時間を計算すると、
1.273E-3 となります。
このような A/D コンバータを積分型と呼びます。積分値を定電流で放電し、必要な時間を計ってその時間で
D 値を得ます。この逆をカウンタ制御式 AD 変換と呼びます。これはホールドされた値になるようにクロック
で内部カウンタの数字を大きくしていき、その値を DA 変換してコンパレータで比較します。コンパレータの
値が反転した時点でD値を得ます。この方式はより制度をあげるための工夫である2重積分式AD変換(上り
と下りを測定する)という方法があります。この方法は昔の測定器でも利用されていました。
シグマデルタ A/D コンバータ
シグマデルタは、日本語はデルタシグマ(ΔΣ)型と呼ばれ、比較的新しい A/D コンバータの方式です。近年そ
の勢力を伸ばしています。ここでは、英語式にシグマデルタにしておきます。
その歴史は古く、もともと極めて分解能が高いことや、比較的低価格で構成できるメリットが知られていまし
たが、如何せん高速度な A/D 変換ができず特に導入するメリットが尐なかったのですが、半導体技術の進歩
により、高速な A/D 変換が可能となったため、一気に利用が広まったという経緯があります。
そして、この方式を提案したのは日本人です。アメリカの ATT ベル研の委託研究で音声信号を効率よく伝え
るために提案した方式が始まりです。
一言で言えば、シグマデルタは、微分の積分ということになります。
理想的な速度でサンプリングが行われたとしましょう。
すると、サンプリングの結果、一つ前のサンプリング値と今のサンプリング値を比較すると、
値が1つ増えるか、値が1つ減るか、変わらないかのどれかになります。
このままだと3値となりますが、値が変わらないというのは、値1つ増えて、次に1つ減るというのを繰り返
すことだと考えれば、2値になります。従って、値が増えたら1、減ったら0として表現できることになりま
す。そこで、次のように構成します。
コンパレータ
アップダウン
カウンタ
DA 変換器
結局図にすると同じようになってしまいますが、まずはこれで動作はするはずです。でも、このままでは変化
がなければ伝達ができないという欠点が残ります。丁度、通信におけるCカットと同じです。そこで、次のよ
うに変形します。
積分器
-
コンパレータ
アップダウン
カウンタ
1bitDA 変換器
入力からの信号に対して、1bitDA 変換器で作られる固定値を引くか引かないかしか行いません。積分器は結
局、その誤差を積み重ねているということになります。これをコンパレータで測り取り、ある値よりも大きく
なったら 1bitDA 変換器で 1 を生成する密度上げる、逆ならば下げるという動作を行います。
積分器とコンパレータ以外はすべてデジタルで構成できます。
また、このデルタシグマはオーバサンプリング(要求値よりも高い周波数でサンプリングを行う)とデジタルフ
ィルタ(情報を間引く)ことで精度よく D 値に変換するという工夫もなされています。
特に優れているのは、このシグマデルタ AD 変換器で得た 1bit のデジタル情報(つまり、コンパレータの出力
そのもの)を、そのまま 1bitDA 変換器で再生すると、非常に精度の良い DA 変換が可能であるという点です。
通常、デジタル信号をアナログ信号に変換しなおすと、量子化誤差による高調波成分が発生して、どうしても
デジタル臭い信号となります。1bitDA は、この高調波成分を通常の変換に比して遠くへ飛ばす(周波数の高い
ところで発生する)という特徴があり、信号再現性が高いというメリットがあります。
ということで、AD および DA の基礎を終わります。
コラム
-バグ-
バグというのは、時に非常に深刻な問題を引き起こします。
トヨタ自動車は昨年秋頃、何もしないのに警告灯が点灯し、ガソリンエンジンが突然停止するとの報告を受け、
ハイブリッド車『プリウス』約 16 万台を無償修理すると発表しました。しかし、今回のプリウスの問題は、
これまでの大規模な自動車のリコールと違い、ハードウェアが原因ではなく、ハイテクを駆使したこのスマー
トカーに組み込まれたプログラムのバグが原因でした。
今回の問題により、プリウスはバグを抱えるコンピューターの仲間入りをしてしまいました。史上初のコン
ピューター・バグは 1945 年、
『ハーバード・マーク 2』の F パネルの 70 番リレーに虫が挟まった時にまでさ
かのぼります。これがバグの由来です。乗算器と加算器のテスト中、異常に気づいた技術者が、この部分に蛾
が挟まっているのを見つけ、原因となった蛾は、「バグ(虫)が実際に見つかった最初のケース」との説明文と
ともに、業務日誌にテープで貼り付けられたという実話がしっかりと記録として残っています。
それから 60 年が経ち、コンピューター・バグはいまだに存在しつづけ、絶滅する気配はありません。バグ
の生息地は、オペレーティング・システム(OS)やアプリケーションの中にとどまらず、携帯電話やペースメー
カー、発電所や医療機器にも潜んでいます。
ここで、最悪のバグについて調べてみました。 大混乱を引き起こしたバグを調べるのは簡単ですが、その
重大性に順位を付けるのは難しいです。たとえば、ワームに悪用され、インターネットを数日間にわたってマ
ヒ状態に追い込んだセキュリティーの脆弱性と、国中の電話システムが丸一日機能不能になるきっかけを作っ
たタイプミスと、どちらがより深刻か?なんともいえません。
人命にかかわったケースは尐ないですが、1980 年代後半、放射線治療装置『セラック 25』がプログラムミ
スによる誤動作を起こし、放射線障害で死者が出たケースが実際にありました。ただひとついえることは、ソ
フトウェアが導入されなかったために命を落とす人のほうが、バグによる事故での死者よりも多くなりかねな
いということです。
では、ワースト10です。
1962 年 7 月 22 日火星探査機『マリナー1 号』
:マリナー1 号は打ち上げ時に予定のコースを外れたが、これ
は飛行ソフトウェアのバグが原因だった。地上の管制センターは大西洋上でロケットを破壊した。事後調査に
より、鉛筆で紙に書かれた数式をコンピューターのコードに置き換えるときにミスが起き、これが原因でコン
ピューターが飛行コースの計算を誤ったことが判明した。
1982 年旧ソ連のガス・パイプライン:シベリアを横断するガス・パイプラインの管理に旧ソ連が購入したカ
ナダ製のコンピューターシステムに、米中央情報局(CIA)のスパイがバグを仕掛けたことがあるという。旧ソ
連は当時、米国の機密技術を密かに購入しようとまたは盗み出そうとしており、このシステムを入手したのも
その一環だった。だが、計画を察知した CIA はこれを逆手にとり、旧ソ連の検査は問題なく通過するが、い
ったん運転に入ると機能しなくなるように仕組んだとされる。この結果起きたパイプライン事故は、核爆発以
外では地球の歴史でも最大規模の爆発だったという。
1985~1987 年¥セラック 25:複数の医療施設で放射線治療装置が誤作動し、過大な放射線を浴びた患者に死
傷者が出た。
セラック 25 は 2 種類の放射線低エネルギーの電子ビーム(ベータ粒子)と X 線を照射できるよう、
既存の設計に「改良」を加えた治療装置だった。セラック 25 では電子銃と患者の間に置かれた金属製のター
ゲットに高エネルギーの電子を打ち込み、X 線を発生させていた。セラック 25 のもう 1 つの「改良」点は、
旧モデル『セラック 20』の電気機械式の安全保護装置をソフトウェア制御に置き換えたことだった。ソフト
ウェアの方が信頼性が高いとの考えに基づく判断だった。
しかし、技術者たちも知らなかった事実があったセラック 20 およびセラック 25 に使われた OS は、正式
な訓練も受けていないプログラマーが 1 人で作成したもので、バグが非常にわかりにくい構成になっていたの
だ。
「競合状態」と呼ばれる判明しにくいバグが原因で、操作コマンドを素早く打ち込んだ場合、セラック 25
では X 線用の金属製ターゲットをきちんと配置しないまま高エネルギーの放射線を照射する設定が可能にな
っていた。これにより尐なくとも 5 人が死亡し、他にも重傷者が出た。
1988 年バークレー版 UNIX(BSD)のフィンガーデーモンによるバッファー・オーバーフロー:最初のインタ
ーネットワームとなった通称『モーリス・ワーム』は、バッファー・オーバーフローを悪用し、1 日足らずで
2000 台から 6000 台のコンピューターに感染した。原因となったのは、標準入出力ライブラリー・ルーチン
内の「gets()」という関数のコードだ。
「gets()」関数はネットワーク越しにテキストを 1 行取得するように設
計された。しかし、残念ながら「gets()」関数は入力を制限するようには作られていない。そのため、あまり
にも大きな入力があった場合には、接続可能なあらゆるマシンをワームが占拠する元凶になった。
プログラマーは「gets()」関数を使用コードから排除することで問題に対処しているが、C 言語の標準入出
力ライブラリーからこれを削除することは拒否しており、この関数は現在も存在している。
1988~1996 年ケルベロス』の乱数生成アルゴリズム:ケルベロスは暗号を使ったセキュリティーシステムだ
が、乱数発生器に与えるシード(種)が適切でなく、真にランダムな乱数が生成されていなかった。その結果、
ケルベロスによる認証を用いているコンピューターについて、非常に簡単な方法で侵入可能な状態が 8 年間に
わたって続いた。このバグが実際に悪用されたかどうかは、今も定かではない。
1990 年 1 月 15 日 米 AT&T 社のネットワーク停止:米 AT& T 社の長距離電話用交換機『4ESS』を制御する
最新版のソフトウェアにバグが入りこんだ。このため、4ESS は隣接するマシンの 1 つから、ある特定のメッ
セージを受け取るとクラッシュするようになってしまった。そしてそのメッセージとは、クラッシュした交換
機が復帰した際に、隣接する交換機に送信するものだった。
ある日、ニューヨークの交換機がクラッシュし再起動した。するとそれが原因で隣接する複数の交換機がク
ラッシュし、これらの交換機が再起動すると隣接する複数の交換機がさらにクラッシュし、この現象が延々と
続いた。しばらくすると、114 台の交換機が 6 秒ごとにクラッシュと再起動を繰り返すようになった。この影
響でおよそ 6 万人の人々が 9 時間にわたって長距離通話サービスを利用できなくなった。修復のため、技術
者たちは 1 つ前のソフトウェアをロードした。
1993 年インテル社製『Pentium』(ペンティアム)による浮動小数点数の除算ミス:米インテル社が大々的に
売り出した Pentium チップが、特定の浮動小数点数の除算で誤りを引き起こした。たとえば、4195835.0/
3145727.0 を計算させると、正しい答えの 1.33382 ではなく 1.33374 となる。0.006%の違いだ。
実際にこの問題の影響を受けるユーザーはごくわずかだったが、ユーザーへの対応から、同社にとって悪夢
のような事態につながった。概算で 300 万~500 万個の欠陥チップが流通していた状況で、インテル社は当
初、高精度のチップが必要だと証明できる顧客のみを Pentium チップの交換対象とした。しかし、最終的に
インテル社は態度を改め、不満を訴えるすべてのユーザーのチップ交換に応じた。この欠陥は結局、インテル
社に約 4 億 7500 万ドルの損害を与えた。
1995 年/1996 年『Ping of Death』
:[ピング・オブ・デス、不正なピングパケットによる攻撃]分割送信され
た IP パケットの再構成を行なうコードのチェックとエラー処理が不十分だったため、インターネット上の好
きな場所から不正な形式のピングパケットを飛ばすことで、さまざまなオペレーティング・システム(OS)をク
ラッシュさせることができた。影響が最も顕著に現れたのはウィンドウズ搭載マシンで、この種のパケットを
受け取ると、
「死のブルー・スクリーン」と呼ばれる青い画面を表示して動作が停止してしまう。しかしこの
バグを利用した攻撃は、ウィンドウズのみならず、マッキントッシュや UNIX を使ったシステムにも多くの
被害をもたらした。
1996 年 6 月 4 日『アリアン 5』フライト 501:欧州宇宙機関の開発したロケット、アリアン 5 には、
『アリア
ン 4』で使われていたコードが再利用されていた。しかし、アリアン 5 ではより強力なロケットエンジンを採
用したことが引き金となり、ロケットに搭載された飛行コンピューター内の計算ルーチンにあったバグが問題
を起こした。エラーは 64 ビットの浮動小数点数を 16 ビットの符号付き整数に変換するコードの中で起こっ
た。アリアン 5 では加速度が大きいため、64 ビット浮動小数点で表現される数がアリアン 4 のときよりも大
きくなってオーバーフローが起こり、最終的には飛行コンピューターがクラッシュしてしまった。
フライト 501 では、最初にバックアップ・コンピューターがクラッシュし、それから 0.05 秒後にメイン・
コンピューターがクラッシュした。その結果、エンジンの出力が過剰になり、ロケットは打ち上げ 40 秒後に
空中分解してしまった。
2000 年 11 月パナマ国立ガン研究所:米マルチデータ・システムズ・インターナショナル社(本社ミズーリ州)
が製作した治療計画作成用ソフトウェアを使っていたパナマの国立ガン研究所で、放射線治療で照射する放射
線量の計算を誤る一連の事故が起きた。
マルチデータ社のソフトウェアでは、健康な組織を放射線から守るための「ブロック」と呼ばれる金属製の
シールドの配置を、コンピューターの画面上に描いて決めるようになっていた。しかし、同社のソフトウェア
ではシールドが 4 個しか使えなかったにもかかわらず、
パナマ人の技師たちはこれを 5 個使いたいと考えた。
技師たちは、真ん中に穴を持つ 1 個の大きなシールドとして、5 個のシールドをまとめて表示させれば、ソ
フトウェアをだますことができることを発見した。だが、そうした配置にした場合、穴の描き方によってこの
ソフトウェアが返す計算結果が違ってくることにはまったく気づいていなかった。ある方向に向けて描くと正
しい照射量が計算されるが、違う方向に描くと必要な照射量の最大 2 倍の量を推奨してきたのだ。
尐なくとも 8 人の患者が死亡し、
さらに 20 人が過剰照射によって深刻な健康被害を受けたとみられている。
技師たちは、コンピュータによる計算結果を手作業で再チェックする法的義務を負っていたため、殺人罪で起
訴されることになった
昨年、ハリケーンシーズンを迎え、ただでさえ気がかりなことの多いフロリダ州の住民にさらに追い打ちをか
けるように、心配の種を増やす出来事があった。7 月 27 日(米国時間)、同州の住民の一部に対し、誤って放射
能に関する緊急警報が発せられたのだ。米気象庁のオペレーターが『緊急警報システム』(EAS)の定期テスト
を行なう際にキー入力を間違えたことが原因だった。
EAS は、冷戦期に作られた『緊急放送システム』(EBS)の後継として 1997 年に導入された。気象警報を自
動受信するラジオ、および一般のテレビやラジオ放送に割り込む形で、緊急情報を音声と文字情報で発信する。
EAS が発する警報の先頭には、警報の適用期間や伝達範囲を規定するデジタル信号のヘッダーがつく。ま
た、この信号に含まれる 3 文字のコードで緊急事態の内容もわかる。
今回の誤報は、気象庁のタラハシー予報所(フロリダ州)のオペレーターが、「RWT」と打ち込むべきところ
を誤って「RHW」と打ってしまったために生じた。RWT は毎週のテスト(required weekly test)、RHW は放
射能危険警報(radiological hazard warning)を意味するコードだ。
気象庁で警報のコーディネーターを務める気象学者のウォルト・ザレスキー氏によると、問題の警報は通称
「フロリダ・パンハンドル」[フロリダ州をフライパンにたとえたときの柄の部分]と呼ばれるフロリダ西部と
ジョージア州南部に発せられたという。だが、警報の音声に「これはテストだ」との内容が含まれており、ま
た、当局が誤報の打ち消しに迅速に動いたこともあり、さいわいにもパニックが起きることはなかった。
この出来事の前日、似たような事故がラスベガスのあるラジオ局で起きている。ラジオ局から 5 つの郡にあ
るケーブルテレビ局やラジオ局、テレビ局に対し、実際には存在しない国家的危機が生じたとする警報が、誤
って送信されたのだ。
誤報が流れたのは 26 日の午後だった。ラスベガスの FM ラジオ局『KXTE』(キャッチフレーズは「エクス
トリーム・ラジオ」)が、先に流した「アンバーアラート」[子供の誘拐事件が起きた際に流される緊急速報]
を取り消すメッセージを送信する際、誤って「緊急行動通知」核戦争やそれに相当する国家的緊急事態に際し
て米国大統領が使用するコードを送信してしまったのだ。