制御装置の解説:CPUにおけるコンポーネントと設計
制御装置は、プロセッサ/コンピュータによるプログラム実行時の操作を指示する、コンピュータの中央処理装置(CPU)の主要コンポーネントです。制御装置の主な機能は、コンピュータのメモリから命令をフェッチし実行することです。ユーザーからの入力命令/情報を受け取り、制御信号に変換し、CPUに与えて実行します。ジョン・ノイマンによって開発されたフォン・ノイマンアーキテクチャの一部として含まれます。タイミング信号と制御信号の提供、CPUによるプログラム実行の指示を担当。現代のコンピュータではCPUの内部部分として含まれます。この記事では制御装置について完全な情報を説明します。
制御装置とは
ユーザーからの入力信号/情報/命令を受け取り、CPUでの実行のための制御信号に変換するコンポーネント。メインメモリ、算術論理演算装置(ALU)、入出力デバイスを制御・指示し、コンピュータのCPUに送られる命令も担当。プロセッサのメインメモリから命令をフェッチし、レジスタ内容を含むプロセッサ命令レジスタに送信。
制御装置は入力を制御信号に変換し、プロセッサに送り、プログラムの実行を指示。コンピュータ上のプロセッサで実行される操作を指示。主に中央処理装置(CPU)とグラフィック処理装置(GPU)が制御装置を内部部分として必要とします。上記に制御装置のブロック図を示します。
制御装置のコンポーネント
このユニットのコンポーネントは、命令レジスタ、CPU内の制御信号、バスへの/からの制御信号、制御バス、入力フラグ、クロック信号です。
ハードワイヤード制御装置のコンポーネントは、命令レジスタ(オペコードとアドレスフィールドを含む)、タイミングユニット、制御状態ジェネレーター、制御信号生成マトリックス、命令デコーダー。
マイクロプログラムド制御装置のコンポーネントは、ネクストアドレスジェネレーター、制御アドレスレジスタ、制御メモリ、制御データレジスタです。
機能
制御装置の機能には以下が含まれます。
- プロセッサと他のデバイス間のデータシーケンスの流れを指示。
- 命令を解釈し、プロセッサ内のデータフローを制御。
- 命令レジスタから受け取った命令またはコマンドから制御信号のシーケンスを生成。
- CPU内のALU、データバッファ、レジスタなどの実行ユニットを制御する責任。
- フェッチ、デコード、実行処理、結果格納の能力。
- データを処理および格納することはできない
- データ転送のため、入出力デバイスと通信し、コンピュータのすべてのユニットを制御。
制御装置の設計
設計には2つの制御装置タイプを使用できます:
- ハードワイヤードベース
- マイクロプログラムドベース(シングルレベルとツーレベル)
ハードワイヤード制御装置
上記にハードワイヤード制御装置の基本設計を示します。このタイプでは、回路構造の変更なしに特別なハードウェアロジック回路によって制御信号が生成されます。生成された信号はプロセッサでの実行のために変更できません。
オペコード(命令の操作コード)の基本データが命令デコーダーに送られデコードされます。命令デコーダーはオペコード内の異なるタイプのデータをデコードするデコーダーのセットです。これにより、マトリックスジェネレーターへの入力として与えられるアクティブ信号の値を含む出力信号が生成され、コンピュータのプロセッサによるプログラム実行のための制御信号が生成されます。
マトリックスジェネレーターは制御ユニットの状態とプロセッサからの信号(割り込み信号)を提供。マトリックスはプログラマブルロジックアレイとして構築。マトリックスジェネレーターで生成された制御信号は、次のジェネレーターマトリックスへの入力として与えられ、長方形パターンを含むタイミングユニットのタイミング信号と結合されます。
新しい命令のフェッチのため、制御装置は新しい命令の実行のための初期段階になります。タイミング信号、入力信号、コンピュータの命令状態が変わらない限り、制御装置は初期段階または第1段階のままです。生成された信号のいずれかに変化があれば、制御装置の状態変化が発生します。
外部信号または割り込みが発生すると、制御装置は次の状態に移り、割り込み信号の処理を実行。フラグと状態を使用して、命令の実行サイクルを実行するために望ましい状態を選択。
最後の状態では、制御装置は次の命令をフェッチし、出力をプログラムカウンター、メモリアドレスレジスタ、バッファレジスタ、命令レジスタに送り、命令を読み取ります。最後に、制御装置がフェッチした最後の命令が終了命令であれば、プロセッサの動作状態に移り、ユーザーが次のプログラムを指示するまで待機します。
マイクロプログラムド制御装置
このタイプでは、プログラム実行中にエンコードされた制御信号を格納するために制御ストアが使用されます。制御信号は即座に生成・デコードされません。マイクロプログラムが制御ストアにアドレスフィールドを格納するためです。プロセス全体はシングルレベルです。
マイクロ命令の実行のためにマイクロオペレーションが実行されます。上記にマイクロプログラムド制御装置のブロック図を示します。図から、マイクロ命令のアドレスは制御メモリアドレスレジスタから取得されます。制御装置のすべての情報は、ROMと呼ばれる制御メモリに永続的に格納されます。
制御メモリからのマイクロ命令は制御レジスタで保持されます。マイクロ命令は制御ワードの形(バイナリ制御値を含む)で、データ処理のために1つ以上のマイクロオペレーションが必要です。
マイクロ命令実行中、ネクストアドレスジェネレーターが次のマイクロ命令のアドレスを計算し、制御アドレスレジスタに送って次のマイクロ命令を読み取ります。
マイクロプログラムのマイクロオペレーションシーケンスは、ネクストアドレスジェネレーターによって実行され、制御メモリから読み取られるシーケンスアドレス、すなわちマイクロプログラムシーケンサーとして機能します。
制御装置のVerilogコード
制御装置のVerilogコードを以下に示します。
`include "prj_definition.v"
module CONTROL_UNIT(MEM_DATA, RF_DATA_W, RF_ADDR_W, RF_ADDR_R1, RF_ADDR_R2, RF_READ, RF_WRITE, ALU_OP1, ALU_OP2, ALU_OPRN, MEM_ADDR, MEM_READ, MEM_WRITE, RF_DATA_R1, RF_DATA_R2, ALU_RESULT, ZERO, CLK, RST)
// 出力信号
// レジスタファイル用出力
output [`DATA_INDEX_LIMIT:0] RF_DATA_W;
output [`ADDRESS_INDEX_LIMIT:0] RF_ADDR_W, RF_ADDR_R1, RF_ADDR_R2;
output RF_READ, RF_WRITE;
// ALU用出力
output [`DATA_INDEX_LIMIT:0] ALU_OP1, ALU_OP2;
output [`ALU_OPRN_INDEX_LIMIT:0] ALU_OPRN;
// メモリ用出力
output [`ADDRESS_INDEX_LIMIT:0] MEM_ADDR;
output MEM_READ, MEM_WRITE;
// 入力信号
input [`DATA_INDEX_LIMIT:0] RF_DATA_R1, RF_DATA_R2, ALU_RESULT;
input ZERO, CLK, RST;
// 入出力信号
inout [`DATA_INDEX_LIMIT:0] MEM_DATA;
// 状態ネット
wire [2:0] proc_state;
// プログラムカウンター値保持、現在命令格納、スタックポインタレジスタ
reg MEM_READ, MEM_WRITE;
reg MEM_ADDR;
reg ALU_OP1, ALU_OP2;
reg ALU_OPRN;
reg RF_ADDR_W, RF_ADDR_R1, RF_ADDR_R2;
reg RF_DATA_W;
reg [1:0] state, next_state;
PROC_SM state_machine(.STATE(proc_state),.CLK(CLK),.RST(RST));
always @ (posedge CLK)
begin
if (RST)
state <= RST;
else
state <= next_state;
end
always @ (state)
begin
MEM_READ = 1'b0; MEM_WRITE = 1'b0; MEM_ADDR = 1'b0;
ALU_OP1 = 1'b0; ALU_OP2 = 1'b0; ALU_OPRN = 1'b0;
RF_ADDR_R1 = 1'b0; RF_ADDR_R2 = 1'b0; RF_ADDR_W = 1'b0; RF_DATA_W = 1'b0;
case( state )
`PROC_FETCH : begin
next_state = `PROC_DECODE;
MEM_READ = 1'b1;
RF_ADDR_R1 = 1'b0; RF_ADDR_R2 = 1'b0;
RF_ADDR_W = 1'b1;
end
`PROC_DECODE : begin
next_state = `PROC_EXE;
MEM_ADDR = 1'b1;
ALU_OP1 = 1'b1; ALU_OP2 = 1'b1; ALU_OPRN = 1'b1;
MEM_WRITE = 1'b1;
RF_ADDR_R1 = 1'b1; RF_ADDR_R2 = 1'b1;
end
`PROC_EXE : begin
next_state = `PROC_MEM;
ALU_OP1 = 1'b1; ALU_OP2 = 1'b1; ALU_OPRN = 1'b1;
RF_ADDR_R1 = 1'b0;
end
`PROC_MEM: begin
next_state = `PROC_WB;
MEM_READ = 1'b1; MEM_WRITE = 1'b0;
end
`PROC_WB: begin
next_state = `PROC_FETCH;
MEM_READ = 1'b1; MEM_WRITE = 1'b0;
end
endcase
end
endmodule;
module PROC_SM(STATE,CLK,RST);
// 入力リスト
input CLK, RST;
// 出力リスト
output [2:0] STATE;
// 入力リスト
input CLK, RST;
// 出力リスト
output STATE;
reg [2:0] STATE;
reg [1:0] state;
reg [1:0] next_state;
reg PC_REG, INST_REG, SP_REF;
`define PROC_FETCH 3'h0
`define PROC_DECODE 3'h1
`define PROC_EXE 3'h2
`define PROC_MEM 3'h3
`define PROC_WB 3'h4
// 状態の初期化
initial
begin
state = 2'bxx;
next_state = `PROC_FETCH;
end
// リセット信号処理
always @ (posedge RST)
begin
state = `PROC_FETCH;
next_state = `PROC_FETCH;
end
always @ (posedge CLK)
begin
state = next_state;
end
always @(state)
begin
if (state === `PROC_FETCH)
begin
next_state = `PROC_DECODE;
print_instruction(INST_REG);
end
if (state === `PROC_DECODE)
begin
next_state = `PROC_EXE;
end
if (state === `PROC_EXE)
begin
next_state = `PROC_MEM;
print_instruction(SP_REF);
end
if (state === `PROC_MEM)
begin
next_state = `PROC_WB;
end
if (state === `PROC_WB)
begin
next_state = `PROC_FETCH;
print_instruction(PC_REG);
end
end
task print_instruction;
input [`DATA_INDEX_LIMIT:0] inst;
reg [5:0] opcode;
reg [4:0] rs;
reg [4:0] rt;
reg [4:0] rd;
reg [4:0] shamt; reg [5:0] funct; reg [15:0] immediate; reg [25:0] address;
begin
// 命令の解析
// R-type
{opcode, rs, rt, rd, shamt, funct} = inst;
// I-type
{opcode, rs, rt, immediate } = inst;
// J-type
{opcode, address} = inst;
$write("@ %6dns -> [0X%08h] ", $time, inst);
case(opcode) // R-Type
6'h00 : begin
case(funct)
6'h20: $write("add r[%02d], r[%02d], r[%02d];", rs, rt, rd);
6'h22: $write("sub r[%02d], r[%02d], r[%02d];", rs, rt, rd);
6'h2c: $write("mul r[%02d], r[%02d], r[%02d];", rs, rt, rd);
6'h24: $write("and r[%02d], r[%02d], r[%02d];", rs, rt, rd);
6'h25: $write("or r[%02d], r[%02d], r[%02d];", rs, rt, rd);
6'h27: $write("nor r[%02d], r[%02d], r[%02d];", rs, rt, rd);
6'h2a: $write("slt r[%02d], r[%02d], r[%02d];", rs, rt, rd);
6'h00: $write("sll r[%02d], %2d, r[%02d];", rs, shamt, rd);
6'h02: $write("srl r[%02d], 0X%02h, r[%02d];", rs, shamt, rd);
6'h08: $write("jr r[%02d];", rs);
default: $write("");
endcase
end
// I-type
6'h08 : $write("addi r[%02d], r[%02d], 0X%04h;", rs, rt, immediate);
6'h1d : $write("muli r[%02d], r[%02d], 0X%04h;", rs, rt, immediate);
6'h0c : $write("andi r[%02d], r[%02d], 0X%04h;", rs, rt, immediate);
6'h0d : $write("ori r[%02d], r[%02d], 0X%04h;", rs, rt, immediate);
6'h0f : $write("lui r[%02d], 0X%04h;", rt, immediate);
6'h0a : $write("slti r[%02d], r[%02d], 0X%04h;", rs, rt, immediate);
6'h04 : $write("beq r[%02d], r[%02d], 0X%04h;", rs, rt, immediate);
6'h05 : $write("bne r[%02d], r[%02d], 0X%04h;", rs, rt, immediate);
6'h23 : $write("lw r[%02d], r[%02d], 0X%04h;", rs, rt, immediate);
6'h2b : $write("sw r[%02d], r[%02d], 0X%04h;", rs, rt, immediate);
// J-Type
6'h02 : $write("jmp 0X%07h;", address);
6'h03 : $write("jal 0X%07h;", address);
6'h1b : $write("push;");
6'h1c : $write("pop;");
default: $write("");
endcase
$write ("\n");
end
endtask
end module;
FAQ
1). 制御装置の仕事は?
制御装置の仕事は、コンピュータのプロセッサによる実行のためのデータまたは命令の流れを指示すること。メインメモリ、ALU、レジスタ、入力、出力ユニットを制御、管理、調整。命令をフェッチし、実行のための制御信号を生成。
2). 制御メモリとは?
制御メモリは通常、制御レジスタのアドレスとデータを格納するRAMまたはROM。
3). Wilkes制御装置とは?
ハードワイヤード制御装置の順序回路と組み合わせ回路をWilkes制御装置で置き換え。マイクロプログラムの命令シーケンスを格納するストレージユニットを使用。
4). ハードワイヤード制御装置とは?
ハードワイヤード制御装置は、毎クロックパルスで状態から別の状態へ変化し、回路に物理的変更なしで制御信号を生成。制御信号生成は命令レジスタ、デコーダー、割り込み信号に依存。
5). 制御メモリとは?
制御装置の情報またはデータが一時的または永続的に格納されるのが制御メモリ。
制御メモリは2種類。ランダムアクセスメモリ(RAM)とリードオンリーメモリ(ROM)。
以上が制御装置の定義、コンポーネント、設計、図、機能、タイプについてです。ここで質問:「制御アドレスレジスタの目的は何ですか?」
埋め込み
- 電気制御盤設計のマスター:主要原則とベストプラクティス
- 3Dプリンティングが切削加工と産業設計を変革する理由
- 産業設計プロトタイピングが製品開発に果たす重要な役割
- 数値制御(NC)の包括的概要:工作機械の自動化運転
- ケブラー(Kevlar)徹底解説:その強度と用途の全貌
- 建築設計の原理と実践:歴史・専門分化・現代建築家に求められる力
- マイクロエレクトロニクス:微小化電子技術の科学
- 品質管理(QC)の理解:一貫した卓越性を確保する仕組み
- 制御装置の解説:CPUにおけるコンポーネントと設計
- 組み込みシステムプログラミング:言語、アーキテクチャ、応用
- オペレーティングシステムの基礎:主要コンポーネントと機能