Logisimで単純な16ビットCPUを構築しており、ALUを用意し、必要なオペコードを用意しています。今では、コマンドの正しいコーディングを見つけるのが非常に難しいので、異なるサブ回路(ロジック、算術など)が入力としてすべての制御ワイヤ(コーディングを構築する)を必要とせず、可能な限り少なくする必要があります。効率的なオペコード設計に役立つ戦略や方法はありますか?
事前にthx
Logisimで単純な16ビットCPUを構築しており、ALUを用意し、必要なオペコードを用意しています。今では、コマンドの正しいコーディングを見つけるのが非常に難しいので、異なるサブ回路(ロジック、算術など)が入力としてすべての制御ワイヤ(コーディングを構築する)を必要とせず、可能な限り少なくする必要があります。効率的なオペコード設計に役立つ戦略や方法はありますか?
事前にthx
回答:
他のいくつかの命令セットを勉強するのは良いアプローチだと思います。
小さなものはTIのMSP430で、約22命令の16ビットプロセッサです。
http://www.physics.mcmaster.ca/phys3b06/MSP430/MSP430_Instruction_Set_Summary.pdf
また、非常に小さな命令セットを備えたAtmel AVRを調べることもできます。
私の小さなプロジェクトでは、小さな命令セット(14命令)でVHDLの単純な32ビットプロセッサを開発しようとしました。
私の現在の空き時間のため、完全には終了していません。命令は実装されていますが、2つはテストされておらず、おそらくいくつかのステータスフラグが欠落しています。
命令コーディングのARMアプローチを研究します(ただし、複製はしません)。接頭辞指向であり(Dzardaが推奨するハフマンツリーアプローチのように)、命令のレジスタ選択部分がどこにあるかという点で非常に統一されています。
想像力に欠けるが信頼できるアプローチは、おそらく16ビットを超えるすべての制御信号を列挙し、それらに対してカルノーマップスタイルのロジック最小化を試みることです。
Logisimで8ビット命令長のコアを備えた4ビットCPUを試したことがあります。実際には、CPUよりも単純なステートマシンになりました。
ランダムに探すもの
ハフマンの木についてのコンピューター愛好家に関する優れたビデオ:
私がクラス用に書いたISAには、次のような4ビットのオペレーションコードがありました。
1XXX ALU instructions
01XX jump, jump register, call etc
001X branch not equal, branch equal zero
000X 0 - load, 1 - store
これは、最適なものではなく、単一ビットの入力信号でどのロジックパスを使用するかを完全に制御できるため、ゲートの構築/設計が容易なスタイルの1つです。あるいは、最もよく使用されるシンボルをハフマンコード化し、ゼロパディングして固定長のopコードを取得することもできます。
考慮する必要があることの1つは、任意の形式のマルチワード命令を許可するか、マルチワード命令のように「動作する」ことができるものを許可するかです。その場合、メイン命令の後に追加の命令語を使用するか、その前に単語をプレフィックスするかを検討する必要があります。プレフィックスと後続の単語を許可すると、割り込み処理の複雑さが増す可能性がありますが、ほとんど使用されない命令を、一般的に使用されるものと同じオペコードスペースに収める必要がなくなります。
命令が実行前のサイクルでフェッチされる場合、次の命令ワードをスキップさせるか、その内容をプログラムカウンターに直接転送する「条件分岐」命令を使用できます。このような設計により、シーケンスの割り込みがさらに複雑になる可能性がありますが、「分岐」、「ジャンプ」、および「呼び出し」命令にオペコードスペースの大部分を使用する必要性を緩和し、より広い範囲の分岐条件を許可しますそうでなければ可能であるよりも。分岐は、アドレスがどこから来たかに関係なく、命令自体の実行後に一般にデッドサイクルを必要とするため、フェッチされたが実行されない次のワードからアドレスを取得しても、余分なコストはかかりません時間。
分岐命令からターゲットアドレスを移動すると、それらがゴブリングするオペコードスペースの量が減りますが、16ビットオペコードフォーマットはまだかなりタイトです。接頭辞の指示を使用すると、それで役立ちます。たとえば、32個のレジスタが必要な場合、レジスタをsource1、source2、destinationとして個別に指定するには、オペコードに15ビットが必要であり、合計で2つの命令が必要になります。あまり役に立たない。一方、3つのオペランドのそれぞれに32個のレジスタのいずれかを使用できると便利です。プレフィックスの前にないALU操作で8ビットを使用して16分の1のレジスタを2つ選択することで、2つの目標のバランスをとることができますが、プレフィックスのすぐ後に続くALU操作ではプレフィックスの一部のビットを使用します次の指示から8 上位レジスタを使用する命令は、1つではなく2ワード/サイクルかかりますが、場合によっては、このようなトレードオフが十分に価値がある可能性があります。プレフィックスを使用する場合の最大の難点は、プレフィックスと次の命令の間で割り込みが発生しないようにするか、割り込みが発生した場合にプレフィックスの後の命令が正しいレジスタを使用するようにする必要があることです。 -counter save logicは、最後に実行された非プレフィックス命令のアドレスを保存します。しかし、場合によっては、そのようなトレードオフは十分に価値があるかもしれません。プレフィックスを使用する場合の最大の難点は、プレフィックスと次の命令の間で割り込みが発生しないようにするか、割り込みが発生した場合にプレフィックスの後の命令が正しいレジスタを使用するようにする必要があることです。 -counter save logicは、最後に実行された非プレフィックス命令のアドレスを保存します。しかし、場合によっては、そのようなトレードオフは十分に価値があるかもしれません。プレフィックスを使用する場合の最大の難点は、プレフィックスと次の命令の間で割り込みが発生しないようにするか、割り込みが発生した場合にプレフィックスの後の命令が正しいレジスタを使用するようにする必要があることです。 -counter save logicは、最後に実行された非プレフィックス命令のアドレスを保存します。
複数ワードの命令を使用すると、設計のいくつかの側面がより難しくなりますが、他の難しい決定を行う必要性が減る場合があります。
この男は、Decoderのハードコーディングされた部分のハードワイヤリングを理解するための最良の詳細を持ってい ます。ハードコーディングされたCPUの制御ラインについて説明し ます。オペコードでの選択は、デコードロジックの複雑さに大きく影響します。