制御ユニット
概要
- 目的: 制御ユニットは、DigiSimの8ビットコンピュータアーキテクチャの統括コンポーネントです。プログラムカウンタ、メモリ(RAM)、命令レジスタ、ALU、フラグレジスタ、およびその他のコンポーネントを協調させて完全な命令セットを実行するために必要な制御信号を生成します。
- シンボル: 制御ユニットは、各種CPUコンポーネントとインターフェースするための複数の入力および出力ピンを持つ長方形のブロックで表されます。
- DigiSim.ioでの役割: 制御ユニットは、フェッチ-デコード-実行-ストアサイクルを通じてすべてのシステムコンポーネントを適切にシーケンシングおよび制御することにより、完全に機能する8ビットコンピュータの作成を可能にします。

機能説明
ステートマシン動作
制御ユニットは、以下を循環する4状態有限ステートマシンとして動作します:
- FETCH: メモリから次の命令を取得
- DECODE: 命令をデコードし、プログラムカウンタをインクリメント
- EXECUTE: 命令で指定された演算を実行
- STORE: 結果を格納し、必要に応じてフラグを更新
入力と出力
入力(7ピン):
| ピン | ピン名 | タイプ | 説明 |
|---|---|---|---|
| 0 | CLK | 入力 | 同期動作用のシステムクロック |
| 1 | RST | 入力 | 制御ユニットを初期化するリセット信号 |
| 2 | OP0 | 入力 | 命令レジスタからのオペコードビット0 |
| 3 | OP1 | 入力 | 命令レジスタからのオペコードビット1 |
| 4 | OP2 | 入力 | 命令レジスタからのオペコードビット2 |
| 5 | OP3 | 入力 | 命令レジスタからのオペコードビット3 |
| 6 | Z_FLAG | 入力 | 条件付きジャンプ用のフラグレジスタからのゼロフラグ |
出力(18ピン):
| ピン | ピン名 | タイプ | 説明 |
|---|---|---|---|
| 0 | PC_INC | 出力 | プログラムカウンタのインクリメント |
| 1 | PC_LD | 出力 | プログラムカウンタのロード(ジャンプ用) |
| 2 | PC_OE | 出力 | プログラムカウンタ出力イネーブル(アドレスバスへ) |
| 3 | MEM_RD | 出力 | メモリ読み取りイネーブル |
| 4 | MEM_WR | 出力 | メモリ書き込みイネーブル |
| 5 | RAM_OE | 出力 | RAM出力イネーブル(データバスへ) |
| 6 | IR_LD | 出力 | 命令レジスタロード |
| 7 | IR_ADDR_OE | 出力 | IRアドレス出力イネーブル(アドレスバスへ) |
| 8 | ALU_OP0 | 出力 | ALU演算コードビット0 |
| 9 | ALU_OP1 | 出力 | ALU演算コードビット1 |
| 10 | ALU_OP2 | 出力 | ALU演算コードビット2 |
| 11 | ALU_OE | 出力 | ALU出力イネーブル(データバスへ) |
| 12 | ACC_LD | 出力 | アキュムレータロード |
| 13 | ACC_OE | 出力 | アキュムレータ出力イネーブル(データバスへ) |
| 14 | FLG_LD | 出力 | フラグレジスタロード |
| 15 | HALT | 出力 | システム停止インジケータ |
| 16 | STATE0 | 出力 | ステートビット0(2ビットステートエンコーディングのLSB) |
| 17 | STATE1 | 出力 | ステートビット1(2ビットステートエンコーディングのMSB) |
ステートエンコーディング(STATE1:STATE0):
00→ FETCH01→ DECODE10→ EXECUTE11→ STORE
命令セットアーキテクチャ
制御ユニットは、4ビットオペコードによる16命令セットをサポートします:
| オペコード | Hex | ニーモニック | 説明 | 演算 |
|---|---|---|---|---|
| 0000 | 0x0 | NOP | 無演算 | PC ← PC + 1 |
| 0001 | 0x1 | LDA addr | アキュムレータロード | ACC ← M[addr] |
| 0010 | 0x2 | STA addr | アキュムレータストア | M[addr] ← ACC |
| 0011 | 0x3 | ADD addr | アキュムレータに加算 | ACC ← ACC + M[addr] |
| 0100 | 0x4 | SUB addr | アキュムレータから減算 | ACC ← ACC - M[addr] |
| 0101 | 0x5 | AND addr | 論理AND | ACC ← ACC & M[addr] |
| 0110 | 0x6 | OR addr | 論理OR | ACC ← ACC | M[addr] |
| 0111 | 0x7 | XOR addr | 論理XOR | ACC ← ACC ^ M[addr] |
| 1000 | 0x8 | NOT | 論理NOT | ACC ← ~ACC |
| 1001 | 0x9 | SHL | 左シフト | ACC ← ACC << 1 |
| 1010 | 0xA | SHR | 右シフト | ACC ← ACC >> 1 |
| 1011 | 0xB | JMP addr | 無条件ジャンプ | PC ← addr |
| 1100 | 0xC | JZ addr | ゼロ時ジャンプ | if (Z=1) PC ← addr |
| 1101 | 0xD | JNZ addr | 非ゼロ時ジャンプ | if (Z=0) PC ← addr |
| 1110 | 0xE | LDI | イミディエイトロード | 将来用に予約 |
| 1111 | 0xF | HLT | 停止 | 実行停止 |
命令フォーマット
| ビット位置 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| フィールド | OPCODE(4ビット) | OPERAND(4ビット) | ||||||
| 説明 | 実行する演算 | メモリアドレス/値 |
マイクロコードアーキテクチャ
制御信号の生成
制御ユニットは、各命令を4つの状態にわたるマイクロオペレーションに分解するマイクロコードROMアプローチを使用します。オペコードと状態の各組み合わせが、特定の制御信号セットを生成します。
例: LDA(アキュムレータロード)命令
FETCHステート:
- PC_OE = 1(PCがアドレスバスを駆動)
- MEM_RD = 1(メモリから命令を読み取り)
- IR_LD = 1(命令をIRにロード)
DECODEステート:
- PC_INC = 1(PCを次の命令にインクリメント)
EXECUTEステート:
- IR_ADDR_OE = 1(IRアドレスがアドレスバスを駆動)
- MEM_RD = 1(メモリアドレスからデータを読み取り)
STOREステート:
- RAM_OE = 1(RAMがデータバスを駆動)
- ACC_LD = 1(データをアキュムレータにロード)
- FLG_LD = 1(フラグを更新)
バス制御とトライステート管理
制御ユニットは、各バスを同時に1つのコンポーネントのみが駆動するように注意深くバスコンテンションを管理します:
- アドレスバス: PC_OEまたはIR_ADDR_OEで制御
- データバス: RAM_OE、ALU_OE、またはACC_OEで制御
他のコンポーネントとの統合
コンポーネント互換性
制御ユニットは、DigiSimの既存コンポーネントとシームレスに動作するように設計されています:
- 8ビットALU: 演算コード(ALU_OP0-2)を受け取り、フラグ付きの結果を提供
- プログラムカウンタ: PC_INC、PC_LD、PC_OE信号で制御
- RAM(256×8): MEM_RD、MEM_WR、RAM_OE信号で管理
- 命令レジスタ: IR_LDでロードし、オペコード/アドレスの分割を提供
- フラグレジスタ: FLG_LDで更新し、条件付きジャンプ用に読み取り(Z_FLAG)
- アキュムレータ: ACC_LDおよびACC_OE信号で制御
信号タイミング
制御ユニットは、すべてのコンポーネントに対して適切なセットアップ時間とホールド時間を確保します:
- アドレスセットアップ: メモリ操作の前にアドレス信号が安定
- データ有効: ロード信号がアクティブの時にデータが有効
- クロック同期: すべての状態変化はクロックの立ち上がりエッジで発生
- リセット動作: 既知の状態への即座の非同期リセット
使用例
簡単なプログラム: 2つの数値の加算
; メモリに格納された2つの数値を加算
0x0: LDA 0x8 ; アドレス0x8から最初の数値をロード
0x1: ADD 0x9 ; アドレス0x9の2番目の数値を加算
0x2: STA 0xA ; 結果をアドレス0xAに格納
0x3: HLT ; 実行を停止
...
0x8: 0x05 ; 最初の数値(5)
0x9: 0x03 ; 2番目の数値(3)
0xA: 0x00 ; 結果の格納場所
ループの例: 1から10までカウント
; 0から10までカウント
0x0: LDA 0x8 ; カウンタをロード
0x1: ADD 0x9 ; 1を加算
0x2: STA 0x8 ; カウンタを格納
0x3: SUB 0xA ; 10を減算
0x4: JNZ 0x0 ; ゼロでなければ戻る
0x5: HLT ; 完了時に停止
...
0x8: 0x00 ; カウンタ
0x9: 0x01 ; 定数1
0xA: 0x0A ; 定数10
技術ノート
クロック要件
- 最小周波数: 教育的な観察のために1 Hz
- 最大周波数: コンポーネントの伝搬遅延によって制限
- デューティサイクル: 最適なタイミングマージンのために50%推奨
リセット動作
- 非同期リセット: 即座にステートをFETCHに設定
- 信号クリア: すべての制御信号が非アクティブ状態にリセット
- 停止からの回復: 実行再開にはリセットが必要
パフォーマンス
- すべての命令: 4クロックサイクル(フェッチ-デコード-実行-ストア)
- 1秒あたりの命令数: クロック周波数 ÷ 4
- メモリ帯域幅: 命令サイクルあたり1回の読み取りまたは書き込み