LogiSimの非常にシンプルなCPU設計


8

現在は高校3年生で、コンピューター/電気工学、特にマイクロプロセッサーの設計に興味があります。私が読んだチャールズ・ペゾルドによってコードを、そして読み始めているマイクロプロセッサの設計Wikibook(不完全のようです。)読み取ってコードを、私はCPUの背後にある基本的なロジックを理解し、LogiSimに1を構築し始めています。コードの第17章では、構築したいCPUについて詳しく説明していますが、回路には主要なコンポーネント(クロック信号、命令のデコード)がありません。一部のクロック信号はかなり明白なようです(PCは安定したクロック信号を必要とするようです)が、他のクロック信号(RAM値をラッチする方法など)は、よく考えて動作するようにしなければなりませんでした。

単一の入力で加算と減算を切り替える動作アキュムレータを構築できます(ALUとは正確に呼ばれません。L部分がないためだと思います)。これは、計算部分に必要なすべてです。 -ジャンプオペコードが機能するようになったら、コードに乗算と除算を実装できます。私が苦労しているのは、命令のデコードです。いくつかのグーグル検索で、各オペコードを複数のマイクロ命令として解釈する必要があることがわかりましたが、これがどのように機能するのかについて迷っています。現在、私の命令デコーダは、各オペコードごとに単一のバイナリ出力を備えた組み合わせ分析回路です-全部で13です。

コードが機能する方法は、1つの8ビットコード値(私はローエンドバイトのみを使用)と、2つの別々の8ビットアドレス値を組み合わせて、RAMへの16ビットアドレス入力になるように結合することです。値をラッチするために、10bまでカウントしてから00bにリセットする別のカウンターがあります。これは、各ラッチのクロック入力です(3つのラッチには、a、b、cがあります。2番目のクロックは、aが1で、b&cが0で、bが1で、1&cが0です。 cは1で、1とbは0で、リセットされます)。しかし、ADD 000Ahなどの命令では、PCは000AHにジャンプします...これはアキュムレータに追加されることになっていますが、実際にはコードラッチにラッチされ、次のオペコードとして解釈され、全体が実行されます。クレイジー。

命令のデコードとクロック信号の実行方法に関するいくつかの大きな情報が不足しているように感じます...

LogiSimの.circファイルは次のとおりです。https ://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/8BitAdder.circ https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/8BitAdderSubtractor.circ https:// dl.dropboxusercontent.com/u/61676438/PetzoldMk5/8BitInverter.circ https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/8BitLatch.circ https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/ ID.circ https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/PetzoldMk5.circ

PetzoldMk5はメインのCPUであり、ライブラリとしてインポートされる他のファイルに依存しています。

オペコード(すべてバイナリ)のリストを次に示します。

Load                 0001
Add                  0010
Add w/ Carry         0011
Sub                  0100
Sub w/ Borrow        0101
Jump                 0110
Jump w/ Carry        0111
Jump W/ 0            1000
Jump w/o C           1001
Jump W/o 0           1010
Store                1011
Halt                 1100
Reset                1101

1
既存のLogisim CPU .circファイルを共有しますか?そして、人生をもう少し複雑にするために、「値の伝播」という見出しの下で、Logisimのヘルプを注意深く読み、理解する必要があります。まだしていなければ、もう。(すでに適用したすべての作業を考えると、あなたが持っているかもしれません。あなたがこれを採用するのを聞いてとても嬉しいです!)
jonk

@jonk素敵な言葉をありがとう。関連する.circファイルを使用して投稿を編集します。
ウィルホッジス

それで、それは全部で6つのファイルですか?(これは2011年のLogiSim 2.7.1向けだと思いますか?)
2016年

@jonkはい、それは両方の質問に当てはまります
Will Hodges

減算をどのように処理していますか?入力ラッチからALUのA / B入力の1つへの/ Qを使用して、キャリーインを変更しますか?または他の方法?
2016年

回答:


3

回答のような「リンクのみ」を投稿するのは嫌ですが、LogisimでのCPUを使用したWarren Toomeyの作業を知っておく必要があります。

彼はここでかなりシンプルなCPUに構築するいくつかのチュートリアルを持っています...

http://minnie.tuhs.org/CompArch/Tutes/

そして、それがあなたのボートを浮かばないなら、彼はここでより洗練されたCPUを持っています...

http://minnie.tuhs.org/Programs/UcodeCPU/

...これらはすべて十分に説明されており、.circファイルへのダウンロードがあります。


もう1つのすばらしい、そして間違いなくより機能的なDIY CPU /コンピューターは、http://www.homebrewcpu.com/にあるMagic-1です。Logisimでは行われていませんが、写真、回路図、説明など、十分に文書化されています。また、シミュレーターの単なるCPUではありません。ANSI Cコンパイラ、OS、およびいくつかのソフトウェアが含まれています。また、実際にハードウェアに組み込まれているという明確な利点もあります。実際、それは現在稼働中で、Webページを提供しています。


最後に、Elements of Computing Systemsと関連サイトnand2tetris.orgが、私が調べるたびに自分のコンピューターをゼロから構築するための推奨情報リソースの第1 として登場します。多く(すべて?)のコンテンツは無料だと思います。YouTubeも同意します。多くの人がこの1つのソースからプロジェクトを作成しています。


1
8ビットのブレッドボードコンピューターの構築に関するBen EaterのYoutbueビデオもご覧ください。
Francis Cugler、

1

ALUがどのように機能するかの重要な側面が欠けていると思います。通常、アキュムレータの各ビットは、デマルチプレクサを介してさまざまな機能ブロックのそれぞれに接続されます。コマンドバイトを使用して、機能を選択し、アキュムレータの各ビットを機能ブロックの適切な入力に接続します。デマルチプレクサのサイズによって、ALUが処理できる機能の数が決まります。以下に示す非常に大まかな例では、4ビット入力のALUは、デマルチプレクサを使用して16の異なる関数を参照できます。

アキュムレータをALU内のさまざまな機能ブロックに接続する

ほとんどのCPUでは、この設計は混乱したゲートに最適化されており、トランジスタ数を削減しています。

コマンドレジスタを大きくすると、より多くの機能を使用できますが、コマンドをロードするために必要なクロックサイクルも多くなります。

デジタルデザインについて詳しく知りたい場合は、次の本を読むことを強くお勧めします


この回答は、ALU演算と命令を混同します。具体的には、このデマルチプレクサーは、算術命令に選択する算術演算を選択するために使用されるだけです。たとえば、8ビット命令から3ビットをデマルチプレクサに供給して、算術演算を選択します。一般に、命令をデコードしてシーケンスするには、完全に別のメカニズムが必要です。余談ですが、私が調べたほとんどのCPUは、ALUでこのようなデマルチプレクサを使用していませんが、最適化されたゲートの混乱を使用して正しい操作を実行しています。
Ken Shirriff、2017年

1
@KenShirriffわかりやすくするためにいくつか変更を加えました。必要に応じて、自由に編集してください。
滝出2017年

1

あなたは正しい道を進んでいるようです。

マイクロ命令を計画するときは、さまざまなブロックを通過するデータ移動の「トラフィック」パターンを自分の頭の中で明確に定義する必要があります。ADDを実行するには、複数のステップが必要です。2つのALUオペランド用の保持レジスタがある場合、それらはRAM、またはいくつかのレジスタまたはバスからロードする必要があります。共有内部バスがある場合は、一度に1つのオペランドをロードする必要があります。どのバイト(アドレス、即値リテラル、RAMデータ、ポインター)をどこに移動する必要があるかがわかったら、バスを介してさまざまなレジスターに出入りするバイトの移動順序を計画します。一部の中間値は次のマイクロ命令ステップまで保存する必要があるため、スタックして内部保持レジスタを追加する必要がある場合があります。

あなたが見逃していると思うのは、ロジックが命令またはオペコードを取得してCPU内の複数の状態に変換するために必要な複雑さです。複雑になることもありますが、やや単純なステートマシンを作成して、基本的なロジックの概念で拡張することができます。

たとえば、MOVE操作のマイクロ命令ステップを作成するとします。これは、3つのステップで大まかに説明できます。1)内部レジスタへのソースレジスタの内容のアサート、2)ターゲットレジスタの書き込みクロックのストローブ、3)内部バスからのソースレジスタの内容のデアサート。手順1)〜3)は、デマルチプレクサーで共有内部バスに接続されたソースレジスタとターゲットレジスタに選択的に分配できるレジスタ出力イネーブル(OE)とレジスタ書き込みイネーブル(WE)のタイミングを示しています。

有限ステートマシンを作成する練習があまりない場合は、マイクロシーケンサーから制御信号を生成するための別のビルディングブロックを提供するために、さまざまなアプローチを検討することが役立つ場合があります。

それにこだわります。あなたが取得する知識の量は驚異的です。そして、うまくいけば、あなたは多くの楽しみを持っているでしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.