私は最近、Charles Petzold の Code というタイトルの本を読み始めました。しかし、私は最後まで読んだわけではないので、購入/借りる前にまず本を読んでください.
これは私の比較的短い答えであり、Petzolds ではありません...そしてうまくいけば、あなたが興味を持っていたことと一致しています。
私が推測するトランジスタについて聞いたことがあるでしょう。トランジスタの本来の用途は、トランジスタラジオなどでした。それは基本的に増幅器であり、空気中に浮遊する小さな小さな無線信号を受け取り、トランジスタの入力に供給します。トランジスタは、隣の回路の電流の流れを開閉します。そして、その回路をより高い電力で配線すると、非常に小さな信号を取得して増幅し、たとえばスピーカーに供給して、ラジオ局を聞くことができます(周波数を分離し、トランジスタのバランスを保つにはもっと多くのことがありますが、あなたは私が望む考えを得る)。
トランジスタが存在するようになったのは、トランジスタを電灯のスイッチのようにスイッチとして使用する方法でした。ラジオは調光スイッチのようなもので、オンからオフまでどこでも切り替えることができます。調光器のない照明スイッチは、すべてオンまたはすべてオフのいずれかであり、スイッチの中央に切り替えられる魔法の場所があります。デジタルエレクトロニクスでもトランジスタを同じように使用しています。1 つのトランジスタの出力を取り、それを別のトランジスタ入力に供給します。最初の出力は確かに電波のような小さな信号ではなく、2 番目のトランジスタを強制的にオンまたはオフにします。これは、TTL またはトランジスタ - トランジスタ ロジックの概念につながります。基本的に、高電圧を駆動する、またはそれを1と呼ぶことができる1つのトランジスタがあり、その上でゼロ電圧をシンクし、それを0と呼びましょう. そして、AND ゲート (両方の入力が 1 の場合、出力は 1)、OR ゲート (どちらか一方の入力が 1 の場合、出力は 1) を作成できるように、入力を他の電子回路と一緒に配置します。 . インバーター、NAND、ゲート、NOR ゲート (またはインバーター付き) など。以前は TTL ハンドブックがあり、1 つまたは 2 つまたは 4 つの何らかのゲート (NAND、NOR、 AND など) 内部で機能し、それぞれに 2 つの入力と出力があります。現在、プログラマブルロジックや何百万ものトランジスタを備えた専用チップを作成する方が安価であるため、それらは必要ありません。しかし、ハードウェア設計では AND、OR、NOT ゲートの観点から考えています。(通常は nand と nor に似ています)。OR ゲート (どちらか一方の入力が 1 の場合、出力は 1 になります)。インバーター、NAND、ゲート、NOR ゲート (またはインバーター付き) など。以前は TTL ハンドブックがあり、1 つまたは 2 つまたは 4 つの何らかのゲート (NAND、NOR、 AND など) 内部で機能し、それぞれに 2 つの入力と出力があります。現在、プログラマブルロジックや何百万ものトランジスタを備えた専用チップを作成する方が安価であるため、それらは必要ありません。しかし、ハードウェア設計では AND、OR、NOT ゲートの観点から考えています。(通常は nand と nor に似ています)。OR ゲート (どちらか一方の入力が 1 の場合、出力は 1 になります)。インバーター、NAND、ゲート、NOR ゲート (またはインバーター付き) など。以前は TTL ハンドブックがあり、1 つまたは 2 つまたは 4 つの何らかのゲート (NAND、NOR、 AND など) 内部で機能し、それぞれに 2 つの入力と出力があります。現在、プログラマブルロジックや何百万ものトランジスタを備えた専用チップを作成する方が安価であるため、それらは必要ありません。しかし、ハードウェア設計では AND、OR、NOT ゲートの観点から考えています。(通常は nand と nor に似ています)。現在、プログラマブルロジックや何百万ものトランジスタを備えた専用チップを作成する方が安価であるため、それらは必要ありません。しかし、ハードウェア設計では AND、OR、NOT ゲートの観点から考えています。(通常は nand と nor に似ています)。現在、プログラマブルロジックや何百万ものトランジスタを備えた専用チップを作成する方が安価であるため、それらは必要ありません。しかし、ハードウェア設計では AND、OR、NOT ゲートの観点から考えています。(通常は nand と nor に似ています)。
彼らが今何を教えているのかはわかりませんが、概念は同じです。メモリの場合、フリップフロップは、これらの TTL ペア (NANDS) の 2 つが結合され、一方の出力が他方の入力に接続されていると考えることができます。それは置いておきましょう。これは基本的に、SRAM またはスタティック RAM と呼ばれるものの 1 ビットです。sram は基本的に 4 つのトランジスタを使用します。ドラムまたはダイナミック ram コンピューターに自分で挿入したメモリ スティックは、1 ビットあたり 1 つのトランジスタを使用します。Sram ビットは、電源が切れない限り、設定した内容を記憶しています。ドラムは、あなたがそれを言うとすぐにあなたが言ったことを忘れ始めます. 充電して充電器のプラグを抜くとすぐに、放電が始まります。それぞれのガラスに小さな穴が開いた棚に並べられたグラスを考えてみてください。これらはあなたのドラムビットです。あなたはそれらのいくつかを1つにしたいので、あなたが1つにしたいグラスをアシスタントに満たしてもらいます。そのアシスタントは常にピッチャーを満たし、列を下って行き、「1」のビット グラスに十分な水を入れておき、「0」のビット グラスを空のままにしておく必要があります。そのため、いつでもデータが何であるかを確認したい場合は、中央より確実に上の水位が 1 であり、中央よりも確実に下の水位がゼロである水位を探すことで、1 と 0 を調べて読み取ることができます。電源を入れた状態で、アシスタントが 1 と 0 を区別するのに十分な量のグラスを維持できない場合、それらは最終的にすべてが 0 のように見えて排出されます。チップあたりのビット数を増やすというトレードオフです。ここでの簡単な話は、プロセッサの外側では大容量メモリにドラムを使用し、1 を 1 に、ゼロを 0 に保つアシスタント ロジックがあるということです。ただし、チップ内では、たとえば AX レジスタと DS レジスタは、フリップフロップまたは SRAM を使用してデータを保持します。そして、AX レジスターのビットのように知っているすべてのビットに対して、その AX レジスターに出入りするビットを取得するために使用される可能性がある数百または数千以上のビットがあります。また、1 を 1 に、0 を 0 に維持するアシスタント ロジックがあります。ただし、チップ内では、たとえば AX レジスタと DS レジスタは、フリップフロップまたは SRAM を使用してデータを保持します。そして、AX レジスターのビットのように知っているすべてのビットに対して、その AX レジスターに出入りするビットを取得するために使用される可能性がある数百または数千以上のビットがあります。また、1 を 1 に、0 を 0 に維持するアシスタント ロジックがあります。ただし、チップ内では、たとえば AX レジスタと DS レジスタは、フリップフロップまたは SRAM を使用してデータを保持します。そして、AX レジスターのビットのように知っているすべてのビットに対して、その AX レジスターに出入りするビットを取得するために使用される可能性がある数百または数千以上のビットがあります。
プロセッサは、最近では毎秒 2 ギガヘルツまたは 20 億クロック程度のクロック速度で動作することを知っています。クリスタルによって生成されるクロックについて考えてみてください。これは別のトピックですが、ロジックはそのクロックを電圧が高くなり、高くなり、ゼロになり、このクロック レート 2 GHz などでゼロになると見なします (ゲームボーイの進歩は 17 mhz、古い iPod は約 75 mhz、オリジナルの IBM PC 4.77MHz)。
そのため、スイッチとして使用されるトランジスタを使用すると、電圧を取得して、ハードウェア エンジニアとソフトウェア エンジニアの両方が熟知している 1 と 0 に変換することができ、AND、OR、および NOT 論理関数を提供することもできます。そして、電圧の正確な振動を得ることができるこれらの魔法の結晶があります。
したがって、たとえば、クロックが 1 で、状態変数がフェッチ命令状態にあることを示している場合、いくつかのゲートを切り替えて、必要な命令のアドレスを取得する必要があります。プログラム カウンタがメモリ バスに出力され、メモリ ロジックが MOV AL,61h の命令を出すことができます。これを x86 のマニュアルで調べると、これらのオペコード ビットのいくつかは、これが mov 操作であり、ターゲットが EAX レジスタの下位 8 ビットであり、mov のソースが即値であることを示していることがわかります。この命令の後のメモリ位置にあります。そのため、その命令/オペコードをどこかに保存し、次のクロック サイクルで次のメモリ位置をフェッチする必要があります。これでmovalが保存されました
あなたが尋ねるすべてはどのように起こりますか?数式を実行する Python 関数について考えてみましょう。変数として入ってくる式へのいくつかの入力でプログラムの先頭から始めます。ここに定数を追加したり、ライブラリから平方根関数を呼び出したりするプログラムの個々のステップがあります。答えを返す。ハードウェア ロジックも同じように行われ、今日ではプログラミング言語が使用されていますが、そのうちの 1 つは C によく似ています。主な違いは、ハードウェア関数には数百または数千の入力があり、出力は 1 ビットであることです。すべてのクロック サイクルで、AL レジスタのビット 0 は、どれだけ遠くを見たいかに応じて巨大なアルゴリズムで計算されます。数学演算のために呼び出した平方根関数について考えてみましょう。その関数自体は、いくつかの入力が出力を生成するこれらの 1 つであり、乗算または除算などの他の関数を呼び出す場合があります。したがって、AL レジスタのビット 0 の前の最後のステップと考えることができるビットがどこかにある可能性が高く、その機能は次のとおりです。そうでなければ AL[0] = AL[0]; しかし、他の入力から計算された次のビットを含む上位関数があり、上位関数と上位関数があり、これらの多くは、Python の 3 行が数百または数千に変わるのと同じ方法でコンパイラによって作成されます。アセンブラの行の。数行の HDL が、数百、数千、またはそれ以上のトランジスタになる可能性があります。ハードウェア関係者は通常、特定のビットの最下位レベルの式を調べて、可能なすべての入力と、計算に必要なすべての AND と OR と NOT を調べます。しかし、あなたが望むなら、あなたはできます。
マイクロコーディングに関する注意。ほとんどのプロセッサはマイクロコーディングを使用していません。たとえば、x86は当時としては優れた命令セットでしたが、表面的には現代に追いつくのに苦労しているため、x86に夢中になります。他の命令セットはマイクロコーディングを必要とせず、上で説明した方法でロジックを直接使用します。マイクロコーディングは、表面的に見える命令セットをエミュレートする別の命令セット/アセンブリ言語を使用する別のプロセッサと考えることができます。Mac で Windows をエミュレートしたり、Windows で Linux をエミュレートしたりするときほど複雑ではありません。中にはもっとたくさんいます。そして当然のことながら、その 1 つのアセンブリ プログラムは、1 つまたは複数のコアの複数の実行パスで何らかの方法で実行できます。目覚まし時計や洗濯機のプロセッサと同じように、マイクロコード プログラムはシンプルで小さく、デバッグされてハードウェアに焼き付けられるため、ファームウェアの更新は必要ありません。少なくとも理想的には。しかし、たとえば iPod や電話のように、バグ修正などが必要な場合があり、プロセッサをアップグレードする方法があります (BIOS またはその他のソフトウェアは起動時にパッチをロードします)。テレビのリモコンまたは電卓のバッテリー コンパートメントを開くと、3 つまたは 5 つまたは多くのベア メタル接点が一列に並んでいる穴が見える場合があります。一部のリモコンと電卓については、本当に再プログラムしたい場合は、ファームウェアを更新してください。通常はそうではありませんが、理想的には、そのリモコンは完璧であるか、テレビよりも長持ちするのに十分完璧です. マイクロコーディングにより、非常に複雑な製品 (数百万、数億個のトランジスタ) を市場に投入し、現場で修正可能な大きなバグを後で修正することができます。チームがたとえば 18 か月で作成した 2 億行の Python プログラムを想像してみてください。フィールドで更新できるコードのごく一部を除いて、同じ種類のもので、残りは石に刻まれたままにしておく必要があります。目覚まし時計やトースターの場合、バグがある場合や助けが必要な場合は、捨てて別のものを入手してください。市場に出回っている数億個のトランジスタ) を開発し、現場で修正可能な大きなバグを将来的に修正します。チームがたとえば 18 か月で作成した 2 億行の Python プログラムを想像してみてください。フィールドで更新できるコードのごく一部を除いて、同じ種類のもので、残りは石に刻まれたままにしておく必要があります。目覚まし時計やトースターの場合、バグがある場合や助けが必要な場合は、捨てて別のものを入手してください。市場に出回っている数億個のトランジスタ) を開発し、現場で修正可能な大きなバグを将来的に修正します。チームがたとえば 18 か月で作成した 2 億行の Python プログラムを想像してみてください。フィールドで更新できるコードのごく一部を除いて、同じ種類のもので、残りは石に刻まれたままにしておく必要があります。目覚まし時計やトースターの場合、バグがある場合や助けが必要な場合は、捨てて別のものを入手してください。
ウィキペディアまたは単にグーグルのものを掘り下げると、6502、z80、8080、およびその他のプロセッサなどの命令セットと機械語を見ることができます。8 つのレジスタと 250 の命令があるかもしれません。トランジスタの数から、250 のアセンブリ命令が、クロックごとにフリップフロップの各ビットを計算するのに必要な一連の論理ゲートと比較して、依然として非常に高水準の言語であることがわかります。サイクル。あなたはその仮定で正しいです。マイクロコード化されたプロセッサを除いて、この低レベルのロジックは再プログラム可能ではありません。ハードウェアのバグをソフトウェアで修正する必要があります (ハードウェアが提供され、廃棄されていない場合)。
あのペツォルドの本を調べてみてください。