一握りのリレー。 パート3-コマンドデコーダーと制御マシン

古いコンピューターのコレクションはすぐには補充されないため、自分の手で古いコンピューターを作成します。



完全に電磁リレーで動作し、4つのブロックで構成されます。

現在までに、これらのうち3つを既に完了しています。ALU、レジスタファイル、および命令をデコードする制御モジュールは、残りのブロックに何をすべきかの指示を与えます。



時計の暖かいチューブクリック音:







建築



最初はコンピューターのハーバードアーキテクチャについて考えましたが、プログラムと同じROMからデータを入力する方が便利だと判断しました。 これで、8ビットのアドレスバスと16ビットのデータバスができました。 16ビットはすべて、命令コードを読み取り、2つのオペランドをALUに転送するために使用されます。 データは、このバスの下位8ビットを介してレジスタに読み込まれます。



すべての命令の幅は同じであるため、読み取りは非常に簡単であることが判明しました。データバスを介して送信されたものをクリックするだけです。 同時に、同じリレーはそれぞれが4つのスイッチを持っているため、デコード命令の機能を部分的に実行します。







結果として、コードのロード、保存、およびデコードに関与するリレーは46個のみであり、これはサンプルとして使用したHPRCよりも小さくなっています。



各命令は10サイクルで実行されます。 いくつかの並列入力を備えた超小型回路のように、信号のエッジに沿ってリレーをトリガーできないため、非常に多くのことが必要です。 たとえば、結果をスナップするためにビート全体を割り当てる必要があります。 チームによっては1〜2サイクル少なくする必要がありますが、スキームを複雑にしなかったため、これらの10サイクルは常に実行されます。







コマンドシステム



プロセッサコマンドはARMに似ています-計算の結果は任意のレジスタに配置できます。 たとえば、XOR PC、A、Bなどのクレイジーな操作が可能ですが、関数が呼び出されると、戻りアドレスがLレジスタ(リンクレジスタ)に格納されます。 個別のロード命令でのみメモリにアクセスします(ただし、メモリはまだありません)。



ただし、ARMとは異なり、命令コードの幅はレジスタの幅よりもはるかに大きくなります。 このため、定数、アドレス、および遷移のすべてのダウンロードは、1つの命令でエンコードされます。



遷移には条件付き実行フラグがあります-計算結果の符号、ゼロと等しい、オーバーフローを確認できます。 命令MOV、CALL、JUMPはほぼ同じようにエンコードされ、ほぼ同じことを行います。 JUMPは値をPCに転送するだけです。 したがって、快適な副作用があります-条件付き実行はMOVでも機能します。 つまり MOV NZ、A、255を満たす(または実行しない)ことができます。



ダウンロードと転送に加えて、制御モジュールはレジスタをALUに接続し、ALUから結果を取得できます。 ALUは、加算、減算、OR、XOR、AND、NOT、1ビットの異なるシフトを行います。 さらに、ALUの命令には、結果の記録を無効にするフラグがあります。 つまり、コマンドはx86でCMPまたはTESTのように機能しますが、任意の操作を選択できます。 たとえば、ORが実行されたかのようにフラグをチェックしますが、レジスタを損なわないでください。



これですべて離陸してみてください



現在、コンピューターにはレジスター以外のメモリーがないため、実行された命令はトグルスイッチを使用して入力できます。 しかし、その後、彼はそれを無限に行うことができます:







2つのクロック周波数がサポートされています。 コンピューター内部で何が起こっているかを監視するには、より遅いモードが必要です。







デバッガは必要ありません-レジスタダンプは単に目で読み取られます。







それで何?



その後、ストレージデバイスを実装します。 これで、モジュールのハウジングはすでに用意されており、その場所に配置されるため、すぐに複数の命令からプログラムを一度に開始することが可能になります。







» githubのプロジェクトページ

» 説明の最初の部分

» 説明の2番目の部分



All Articles