デバイスに関係した物性研究とかする人でも、論理回路の基本を知ってたほうがいいかもしれない。どこから勉強したらいいのかわからなくて時間をつぶしたことがあるので書いときます。ぼくが思うにはなんというか大局的理解、というのが結構大事だと思います。詳細はそこまで理解できてなくてもいい。それは必要に応じて勉強すればいいんです。
-
verilog HDL(hardware discription language)をザクッと学んで簡単なテレビゲームの回路(と言ってもverilog HDLで書かれたプログラム)がどうなってるかを雰囲気理解できたらいいと思う。論理回路を勉強するのに、物理的なデバイスの知識はほとんど必要ない。プログラムがそこそこできる人なら半日でもかなり学べると思う。verilog HDLで書かれたプログラムを直接読んでも(以下ぐらいの素朴な知識だけで)結構理解できるんじゃないかと思う。正直、機械や物理の人でも(最低限レベル)は学んだほうがいい知識だと思う。が、電電でしか教えてないのかもしれない。
-
まず知るべき点:論理回路は、
1.クロック
2.組み合わせ回路(LUT、ルックアップテーブルなどと言われる)
3.メモリ
からなること。組み合わせ回路だけでは計算はできない。(大雑把には)メモリの組み込まれた回路を順序回路と言う。もちろん2進数の世界です。クロックに応じて、入力、出力、内部状態が変化していくのが論理回路。内部状態はメモリで保持されている。
1.クロック
はグラウンドレベルに対して0,1,0,1,。。。と変化します。
その立ち下がりタイミング(1->0)を利用するとします(たち上がりでもよい)。クロックは1nsecとかで動作してます。データを読んだり書いたりするのはこの立ち下がりタイミングだけでです。それ以外の時間は状態が定常状態になるのを待つのに必要な時間です。
2.組み合わせ回路
入力wire複数本と出力wire複数本からなる。
入力wire複数本に0か1の値をあたえて保って既定のクロック数だけ待てば(たとえば数クロック待てば)、出力wireにはLUTで論理的に計算された出力値が出てくる。
出力wireの値は入力wireの値の関数として決定される。組み合わせ回路では内部状態はない。出力wireの何本かは不定でも構わない。LUTは基本的には加算とかの演算回路です。大局的理解をしたいだけなら、そんなには詳細に突っ込まなくてよい。
LUTだけだと計算はできない。ステップを踏んで計算をすすめるには、入力値から、まず一旦Xを得て、それからYを得る、というような手順が必要です。以下のメモリが必要です。LUTはAND,OR,NOTがあれば作れる。わりと普通のプログラムのように書ける。入力wireの値が保持され続ける限りにおいてのみ、出力wireの値が保持され続ける点に注意が必要です。
3.メモリ
過去結果を記憶しておかないと計算はできない。メモリをverilog HDLではregと書く。regは入力wire1本、出力wire1本と、タイミング端子1本を持っていて、タイミング端子が立ち下がりのタイミングでregの出力wireの値は入力wireの値にリフレッシュされる。
組み合わせ回路Aの出力wireにreg(出力端の数だけ用意する)の入力wireを接続しておくとどうなるか?組み合わせ回路Aの入力wireの値があるタイミングで変わったとするとregの入力wireの値(=回路Aの出力wireの値)も変わるのでその出力wire値も変わるが、regに「タイミング端子立ち下がり」を与えるまでは回路Aの過去の出力wireの値がregの出力端に保持されている。「タイミング端子が立ち下がり」を起こさせてはじめてregの入力wire値をregの出力wire値に移動・保持できる。
組み合わせ回路Aの入力に対して出力を得てregへ落とし(carry out)、それを組み合わせ回路Bへいれて(carry in)結果を得る,というような順序回路ができます。
実際のところ、純粋な組み合わせ回路、というのは限定的な考え方になる。内部状態のスイッチを持ち、それに値を入れて組み合わせ回路の動作バターンを変える、というのはよくある。
-
一般に普通のプログラムはメモリと条件分岐と繰り返しがあればどんな計算でも書ける。同様に、これらだけでどんな論理マシンでも書ける。この点はそれなりに考察しといたほうがいいかもしれない。
-
ちゃんと動くかどうか?には実時間を想定し物理的な時間要件を考慮したタイミングシミュレータが必要になる。
-
CPUなどもこれらの応用。ARM,AMD,NVIDIAでもHDLを書いてるだけ(IPコア)。ソフトが物理的な実装に落としこんでくれる。
-
論理マシンを作るとは巨大なLUTを作ることだ、と言える。長い桁の加算器を単一の1桁加算器(繰り上がりあり)から作ろうとすると、どうしても繰り上がり(carryin carryout)を保持するメモリが必要。クロック数も必要になる。
-
普通の意味のプログラミングとの違いを考える。verilog HDLではwireとregという2つのタイプの変数を考慮する必要がある(wireは中間的変数。regの値は記憶されうるので普通のプログラムで使うような変数)。モジュール分割して設計するが、各モジュールには、wire入力,wire出力,reg出力、がある。また内部状態としてのregもある。普通の意味のプログラミングにおいては計算手順だけが時間軸であるが、verilog HDLではクロックを意識した計算手順を意識する必要がある。
-
論理回路を大局的に理解するには「verilog HDLをまず勉強する」というのが良いです。
-
その上で、ゲートレベルのフリップフロップの簡単な場合も理解しておけばいいと思う。フリップフロップではNANDを双安定性を持つように結線するー結果を得るには入力値を与えて定常状態になるまで待つ必要がありますー論理としてのNANDを結線しただけでは理解できないです。
-
verilogHDLで書けるRTL(レジスタートランスファーレベル)をまず理解しましょう、ということです。RTLの概念は1980ごろに打ち立てられたんだと思う。それ以前では、ゲートレベルの回路をブロックとして直接組み合わせて設計していたのかもしれない。多数のモジュールを階層的に組み合わせたCPUなどの巨大な論理回路、というのは結局(その入力はキーボードなどほんのわずかなもので)、レジスタに格納された内部情報をどう伝達し遷移させていくか?ということになります。なのでRTLと呼ぶわけです。RAMなどの外部装置は、CPU本体から見ると、外部バスに何かを書いてしばらく待つと何かが返ってくる(メモリを指定し、アドレス端子に値を書いてしばらく待つと、データ端子に値が戻る。読み書きOKかのフラグも戻る)、と言うだけのものです。
-
FPGAがどうなってるのか?の雰囲気をだいたい理解する、のはそんなにむずかしくないです。たとえば機械の制御したいだけならRTLレベルで十分です。