VBAの勉強を始めてみた

色々試しています。

CPUよもやま話(情報を書き込む・記憶する・読み出す)

今回は、情報がどのようにして記憶(メモリー)されているのかを調べてみたいと思います。
皆さんご存知のとおりコンピューターの中で情報は、0と1で表されます。コンピューターは電気回路なので、電圧が低い状態を0、電圧が高い状態を1としています(回路設計者のさじ加減で逆になることもありますが)。
メインメモリーなどでは、電源が供給されている限りは、書き込まれた情報を記憶していますが、どのようにして0と1の状態を記憶しているのでしょうか?

 

フリップフロップとは?

下の回路を見て下さい。これはフリップフロップと呼ばれるのもです(正確にはRS型フリップフロップです。専門家の方には当たり前過ぎるシロモノですが・・・・・・)
S(Set)に入力された情報がQとして出力され、入力が無くなっても自己保持するという性質の回路です。自己保持されたQの出力を解除するには、R(Reset)に入力を与えます。

f:id:kouten0430:20190211162024g:plain

真理値表

f:id:kouten0430:20190211161947p:plain

表中の「禁止」はそのような使い方をすると壊れる、という意味ではなく、通常そのような使い方をしないという意味です(意図的に使う場面もあるらしいですが)。

もうお気づきだと思いますが、この回路一つで1bitの情報を記憶することができます。
このように1bitの情報を記憶するための回路構成をモリーセルと呼びます。
言い換えれば、1bitの情報を記憶することができるのであれば、必ずしもフリップフロップである必要もないということです。
(例えば、コンデンサの充電/放電を、1/0として扱うなど)

ただし、今回は基本的(原始的)でかつ分かりやすいフリップフロップを用いて話を進めていきたいと思います。

1bitの情報を記憶する回路を理解できたのであれば、あとはそれを必要なbit数並べればメインメモリーができます。
なんて簡単!

 

メインメモリっぽいものを作ってみる

メインメモリーは、一般的には1バイト(8bit)ずつに区切って並べられ、区切りごとにアドレス(番地)が割り振られています。
先ほど作ったフリップフロップを部品化(図中のFF)して、Logisimでメインメモリっぽいものを作ってみましょう。

f:id:kouten0430:20190211162736p:plain

随分ごちゃごちゃしてますね。メモリーセルが縦一列に1バイト分並んでいるので、4GBのSRAMを作るなら、これを約40億列並べる必要がある訳です。
配線は、縦にアドレスバスが共用されており、横にデータバスが共用されています。このように配線したものをマトリクスと呼びます。
配線を共用せずに、各bitごとに配線を引き出すと、8×40億の端子が必要になるので、この方式にたどり着くのはごく自然な流れですね・・・・・・。
実際の製品では書込側と読出側の端子も共用されています。(書込みモード/読出しモードを切り替えて使用する)

回路は若干(大層?)オリジナルな部分がありますが、あくまで原理を説明するためのモデルなので我慢して下さい。
実験として、0番地を指定して01010101を書込み、次に1番地を指定して10101010を書込み、最後にn番地に11111111を書込みします。書込みが終わったら、読出しモードにして0番地を出力、次に1番地を出力、最後にn番地を出力してみます。

f:id:kouten0430:20190211163130g:plain

 見づらいかもしれませんが、FFの右上(出力Q)が明るい緑色であれば、1を記憶している状態です。(0に該当する出力が、ところどころE〔Error:信号がHでもLでもない状態〕になっていますがそこは無視して下さい。)

本当ならアドレスは二進数(00000000~FFFFFFFF等)で指定されるので、これを各アドレスバスへスイッチングする回路も搭載する必要があります。

 

CPUの片鱗を見てみる

さて、メモリーの原理っぽいものが理解できたところで、最後にメモリーの情報を読み出してCPU内で演算し、結果をメモリーに書き込むという流れを見て今回は終わりたいと思います。
まず、何らかのプログラム言語で

a=85
b=170
c=a+b

と、記述されたものを実行した時、CPUとメモリーの間ではどのようなことが行われるのでしょうか?(変数の型は仮に1バイトとする)
次の図を見て下さい。

※変数aは0番地、変数bは1番地、変数cはn番地に割り当てられたものとします。これは説明のために適当に割り当てたものです。

f:id:kouten0430:20190211164415p:plain

まず、85と170の二進数値がそれぞれの番地に格納されます。次にこの85と170がレジスタに転送され、ALUで加算が行われます。加算結果は255となり、これがレジスタに上書きされ、その後、メモリーの該当番地に格納されます。(どのレジスタがどのように使用されるかはコンパイラの気分次第です)

見たまんまなので説明の必要はなかったかもしれませんが、ここでレジスタという謎の人物が登場してきましたね(これも中身はフリップフロップです。詳細は次回以降に)。

CPUの片鱗が少しだけ見えた気がしますが、実はまだまだ謎の部分もあります。データの読み書きや、演算の命令は誰が(何が)出すのか?これらはどのようなタイミングで実行されていくのか?などなど。
次回以降、その辺りの謎の部分も少しずつ紐解いていきたいと思います。