「高等学校工業 ハードウェア技術」の版間の差分

削除された内容 追加された内容
クロック信号の発生方法について訂正。水晶発信器またはセラミック発信子だ。
高等学校情報 情報の科学/CPUの処理の仕組み にフリップフロップの記述を移動した事により、2013年6月20日 (木) 07:04時点における 利用者「すじにくシチュー」による版に戻す。
4 行
----
 
指導要領では次のように教育内容を定めてます。
さて、コンピューターの、CPUのような制御装置を作るために最低限 必要なものを考えよう。
章や節のページ名の命名での混乱を回避するため、各項目のページ名は、指導要領の表現に準拠した名称に統一したいと思います。
 
== 加算器が必要 ==
まず、計算機が必要である。
 
これは、半加算器や全加算器で作れる。
 
『[[高等学校情報 情報の科学/ANDとOR]]』で、半加算器の仕組みを説明した。(※ なお、リンク先の単元で、普通科範囲外の、ダイオードによるAND回路やOR回路の話題も記述しておいた。)
 
== 記憶回路が必要 ==
=== フリップフロップ ===
次に、制御のために、データを保存するのに必要なものを考えよう。パソコンでは、メモリ基板だけでなくCPUにも、データ保存のための領域がある。(メモリ基板やハードディスク) なので、まず、データを記憶できる回路をつくろう。
 
[[File:Flipflop RS.svg|thumb|300px|RSフリップフロップ]]
CPUのための記憶の回路をつくるには、'''フリップフロップ'''という論理回路を使う。
 
* [[高等学校工業 ハードウェア技術/フリップフロップ]]
 
フリップフロップでは、Qが出力である。Sは「セット」という入力である。Rは「リセット」という端子である。
 
まず、AND記号の後ろ(図では右側)についている丸は、NOT回路の略記号である。
 
Rを1にすると、下側のAND NOT の入力が(NOTのため)反転して0になり、下側ANDの入力の片方が0のためANDの出力は0に決定するので、そのため下側のAND NOT の出力が反転して1になり、下側AND NOT出力が上側AND NOT の入力につながってるので、つまり上側AND NOTの入力が1になり、そのため上側AND NOTの出力は反転して0になるので、出力Qは0になる。
 
このように、Rを1にすることで、Sの値にかかわらず出力Qを0にするため、Rを'''リセット'''という。
 
いっぽう、Rは0の場合、下側のANDの入力の片方が1になるが、しかし下側ANDの出力は、下側ANDのもう片方の入力に依存する。そして、下側ANDのもう片方の入力端子は、出力Qにつながっている。もしQが1の場合、下側ANDの出力は1であり、そのため下側AND NOT の出力は(NOTのため)反転して0になり、それが上側AND NOTの入力につながっている。上側AND NOTの入力が片方が0になったので、もう片方の値には無関係に、上側ANDの出力は0になる事が決定し、そのため上側AND NOTの出力は(NOTのため)反転して1になり、これがQの値になるが、最初のQの値と同じである。
 
よって、R=0でQ=1の場合、Qの値はQ=1として保存される。
 
同様に、R=0でQ=0の場合も、Q=0として保存される。
 
つまり、Qの値にかかわらず、R=0の場合、Qの値は保存される。よって、'''フリップフロップは1ビットのデータを記憶をできる。'''
 
なお、フリップフロップによる保存には、電力は消費される。なぜなら、NOT回路のもともとのトランジスタ回路や、AND回路のもともとのダイオード回路には、電源が必要だからである。
 
フリップフロップの種類は、RSフリップフロップの他にもJKフリップフロップやDフリップフロップなど、たくあんあるが、説明を省略する。
 
== レジスタ ==
さて、CPUで制御用にデータを保存するためのデバイスのことを、パソコン用語で'''レジスタ'''(register)という。
 
正確に言うと、演算の途中のデータを保存するためのデバイスのことが「レジスタ」である。
 
フリップフロップを数個並べれば、これにより、その個数ぶんのビットを記憶できる。
 
つまり、レジスタをつくるには、フリップフロップを必要な個数、並べれば良い。
 
市販のCPUのビット数について「64ビット」や「32ビット」、「8ビット」などと紹介されるのは、なんのビット数かというと、一般にCPU内のレジスタのビット数である。
 
== 命令レジスタと機械語 ==
なお、パソコンで「次にどんな命令を実行するか?」(「たとえば次に○○の保存を実行する。その次に、△△のコピー作業を実行する。その次に、××を移動する。」という命令など)という作業も、記憶が必要である。
 
例えば、命令の種類に番号をつけて、
:かりに、データの移動命令を「1」として、
:かりに、データの保存命令を「2」として、
:かりに、データのコピー命令を「3」とすれば、
 
「たとえば次に○○の保存を実行する。その次に、△△のコピー作業を実行する。その次に、××を移動する。」という命令は、
:まず、「命令2を実行しろ。」「次に命令3を実行しろ。」「その次に命令1を実行しろ。」という命令に置き換えられる。
 
もっと単純に、「2,3,1」という数値の配列を、あるレジスタに保存しておけば済む。
 
このように、命令を保存するためのレジスタのことを'''命令レジスタ'''という。
 
つまり、我々は、レジスタの作り方の原理を理解した事になる。
 
また、CPUが命令を処理しやすいように、命令を「1」や「2」といった数字に置き換えたものが'''機械語'''(machine langurage)である。
 
なお、先ほどは「データの移動命令を「1」として」などと簡単に言ったが、実際には、「どこにあるデータを、どこに移動するか?」という情報が必要である。そのため、「どこのデータを扱うか?」という処理が必要である。
 
この、「どこのデータを扱うか?」というデータも、レジスタに記憶しとけばいい。
 
この「どこのデータを扱うか」というデータのことを、アドレスという。
 
いっぽう、「移動する」「命令する」「コピーする」などのような、アドレスのない、単なる命令の種類のことを、「命令コード」または「命令部」という。
 
つまり、命令レジスタでは、命令部とアドレスの2つを記憶する必要がある。
 
なお、「このパソコンのハードディスクにあるデータを扱え」とか「このパソコンのメモリ基板にあるデータを扱え」というデータも、アドレスの情報である。
 
つまり、CPUから見れば、ハードディスクもメモリ基板も、単なる、アドレスの情報である。
 
 
で、レジスタは要するに、フリップフロップである。
 
で、もし読者のあなたが、レジスタさえ理解すれば、命令レジスタもいろいろと分かる事になるから、CPUの命令処理の仕組みも、なんとなく分かるだろう。
 
 
説明の都合上、「移動命令」「保存命令」「コピー命令」などと言ったが、実際には、これらの命令は、さらに細かい「読み込み命令」(Load、ロード)や「書き込み命令」などの組み合わせである。
 
たとえば、データの「コピー命令」とは、「まずコピー元(メモリ上などにコピー元のデータがある)のデータを読み込み、そして読み込まれたデータをコピー先に書き込む」という命令である。(読み込みをしても、読み込み元のデータは消えない。しかし、書き込み先のデータは上書きされる。)
 
「保存命令」も、「○○に書き込んでおいたデータを読み込み、それを保存先に書き込む」という命令である。(書き込みをしても、書き込み元のデータは消えない。しかし、書き込み先のデータは上書きされる。)
 
このように、いくつかの命令は、「読み込み」と「書き込み」という2種類の命令に帰結する。
 
より正確には、機械語とは、読み込み命令や書き込み命令などの、より根本的な命令に対応するビット列の数値のことを機械語という。
 
== アセンブリ言語とは ==
:かりに、データの移動命令を「1」として、
:かりに、データの保存命令を「2」として、
:かりに、データのコピー命令を「3」とすれば、
 
などは、人間には分かりづらい。
 
たとえば、「10101011000110」とかビットの数字が並んでいても、人間には意味が分からない。
 
そこで、人間が命令を理解しやすいように、
 
:かりに、データの移動命令を「MOVE」として、
:かりに、データの保存命令を「SAVE」として、
:かりに、データのコピー命令を「COPY」とすれば、
 
のようにして、
「たとえば次に○○の保存を実行する。その次に、△△のコピー作業を実行する。その次に、××を移動する。」という命令を、
「まず命令「SAVE」を実行しろ。その次に、命令「COPY」を実行しろ。その次に命令「MOVE」を実行しろ。」と書き換えれば、人間には理解しやすいし、
 
コンピュータに実行される場合にも命令「MOVE」を「1」に置き換え、同様に命令「SAVE」を「2」に置き換え、命令「COPY」を「3」に置き換えればいい。
 
そして、この命令をハードディスクに保存するには、例えばハードディスクに「SAVE,COPY,MOVE」という文字列(コード)を保存しておけばいい。そうすれば、人間がコードを読んだとき、どんな命令を行わせるコードなのかが、理解しやすい。
 
このように、人間が命令を理解しやすいように機械語を書き換えたもののことを「アセンブリ言語」という。
 
別途、アセンブリ言語の命令「MOVE」を機械語「1」に置き換え、同様に(アセンブリ言語の)命令「SAVE」を(機械語)「2」に置き換え、同様に命令「COPY」を命令「3」に置き換える、という回路を用意しておけば、その回路を使ってアセンブリ言語を機械語に置き換えできる。
 
同様に、別途、機械語の命令「1」をアセンブリ言語の命令「MOVE」に置き換え、同様に(機械語の)命令「2」を(アセンブリ言語の)命令「SAVE」に置き換え、同様に命令「3」を命令「COPY」に置き換える、という回路を用意しておけば、その回路を使って木映語をアセンブリ言語に置き換えできる。
 
 
 
実際には、アセンブリ言語は、人間が大量のコードを読むには向いていない等の理由があるので、なので、アセンブリ言語をさらに人間が読みやすいように置き換えた'''プログラミング言語'''というものが用いられる。
 
中学で「BASIC」や「C言語」などというプログラミング言語の存在を習ったと思う。
 
BASICやC言語も、そのプログラムを実行する場合、最終的にはコンピューター内部では、そのプログラミング言語のコードを、機械語の命令に置き換えて、そしてCPUなどが機械語の命令を処理している。
 
なお、プログラム言語で書かれたコードを、機械語の命令に置き換える装置やソフトウェアのことを'''コンパイラ'''(compiler)という。
そして、コンパイラを実行すること(つまり、プログラム言語で書かれたコードを機械語の命令に置き換えること)を「コンパイルする」(compile)などという。
 
 
なお、アセンブリ言語の話に戻るが、「読み込み」命令は、仮に「上書きコピー命令」という命令を根本的な命令と考えれば(※ 「上書きコピー命令」という命令名称は仮名なので覚えなくて良い)、つまり「読み込み」命令とは「CPU外部の(メモリ上などの)読み込み元アドレスにあるデータをもちいて、レジスタのデータを上書きコピーしろ」という命令である。(読み込み元アドレスにある読み込み元データと、上書きをされた(レジスタにある)書き込み先データは、同一内容のデータになるので、コピー命令の一種である。なので「上書きコピー命令」と名付けたわけだ。)
 
そして、「書き込み」命令も、仮に「上書き」命令というのを考えれば、「書き込み」命令とは「今のレジスタのデータを用いて、CPU外部の(メモリ上やハードディスク上などの)書き込み先アドレスにあるデータを上書きしろ」という命令である。(レジスタにある読み込み元データと、上書きをされた(レジスタにある)書き込み先データは、同一内容のデータになるので、コピー命令の一種である。)
 
このように、「読み込み」命令も「書き込み」命令も、どちらとも「上書きコピー命令」命令である。単に、レジスタからCPU外部に上書きするか、それともCPU外部からレジスタに上書きするか、・・・という方向性が違うだけである。
 
このため、アセンブリ言語では「読み込み」や「書き込み」「データの移動」「データの複製コピー」、・・・などの命令を、同一のアセンブリ命令(たとえば命令「MOV」(MOVEが由来だが、作業内容は「移動」ではなく「上書きコピー」である) )で扱っている場合も多い。
 
== クロック信号の発生方法 ==
[[ファイル:Transistor Multivibrator.svg|thumbnail|200px|アナログ電子回路におけるマルチバイブレータの例]]
 
フリップフロップの教科書などを見ると、前提としてクロック信号が存在しているのだが、そもそもクロック信号は、どうやってつくるのだろうか?
 
実は、「水晶発振子」または「セラミック発振子」といった電子部品を使って、クロック信号を発生させる。(「セラミック発振子」でネット検索すれば、電子部品メーカーのホームページなどが出てくるので、それを読むのが、理解には手っ取り早い。)
 
これとは他の方式で、マルチバイブレーターという電子回路を使って、クロック信号を発生させる方式もあるが、周波数が低いのが難点である。アナログ電子回路では、コンデンサとトランジスタなどを用いて、マルチバイブレーターという回路を作れる。このマルチバイブレーターで、ギザギザしたパルス的な波を、周期的に発生できる。
 
なお、デジタル機器では、論理回路をもちいて(アナログ電子回路の)マルチバイブレーターと同様の周期的パルス波発生の現象を再現したものを使う場合もある。(このような、論理回路によるクロック発生器もまた、「マルチバイブレーター」という。)
 
 
== カウンタが必要 ==
記憶回路とタイムチャート
 
 
フリップフロップを書いて、メモリと関連づける
 
カウンタを書く。回数の記憶をメモリと関連づける。