コントロールユニットとは:コンポーネントとその設計

問題を排除するために楽器を試してください





制御装置は、コンピューターの中央処理装置(CPU)の主要コンポーネントであり、プログラムの実行中に操作を指示できます。 プロセッサ /コンピューター。コントロールユニットの主な機能は、コンピュータのメモリから命令をフェッチして実行することです。ユーザーから入力された指示/情報を受け取り、それをに変換します 制御信号 、その後、CPUに渡されてさらに実行されます。これは、ジョンノイマンによって開発されたフォンノイマンアーキテクチャの一部として含まれています。タイミング信号と制御信号を提供し、CPUによるプログラムの実行を指示します。これは、最近のコンピューターのCPUの内部部分として含まれています。この記事では、コントロールユニットに関する完全な情報について説明します。

コントロールユニットとは何ですか?

ユーザーからの入力信号/情報/命令を受信し、CPUで実行するための制御信号に変換するコンポーネント。これは、メインメモリ、算術論理演算装置(ALU)、入力および出力デバイスを制御および指示し、コンピュータのCPUに送信される命令も担当します。から命令をフェッチします メインメモリ プロセッサのレジスタの内容を含むプロセッサ命令レジスタに送信されます。




コントロールユニットのブロック図

コントロールユニットのブロック図

制御ユニットは、入力を制御信号に変換してからプロセッサに送信し、プログラムの実行を指示します。実行する必要のある操作は、コンピューター上のプロセッサーによって指示されます。主に中央処理装置(CPU)と グラフィックプロセッシングユニット (GPU)内部部品としてコントロールユニットが必要です。コントロールユニットのブロック図を上に示します。



コントロールユニットのコンポーネント

このユニットのコンポーネントは命令です レジスタ 、CPU内の制御信号、バスとの間の制御信号、制御バス、入力フラグ、およびクロック信号。

ハードワイヤード制御ユニットのコンポーネントは、命令レジスタ(オペコードとアドレスフィールドを含む)、タイミングユニット、制御状態です。 発生器 、制御信号生成行列、および命令デコーダ。
マイクロプログラム制御ユニットのコンポーネントは、次のアドレスジェネレータ、制御アドレスレジスタ、制御メモリ、および制御データレジスタです。

機能

ザ・ コントロールユニットの機能 以下のものが含まれます。


  • プロセッサと他のデバイス間のデータシーケンスの流れを指示します。
  • 命令を解釈し、プロセッサ内のデータの流れを制御できます。
  • 受信した命令または命令レジスタからのコマンドから一連の制御信号を生成します。
  • ALU、データバッファ、コンピュータのCPU内のレジスタなどの実行ユニットを制御する責任があります。
  • フェッチ、デコード、実行の処理、および結果の保存を行う機能があります。
  • データを処理および保存することはできません
  • データを転送するために、それは入力および出力デバイスと通信し、コンピュータのすべてのユニットを制御します。

コントロールユニットの設計

これの設計は2つを使用して行うことができます コントロールユニットの種類 これには以下が含まれます。

  • ハードワイヤーベース
  • マイクロプログラムベース(シングルレベルおよび2レベル)

ハードワイヤードコントロールユニット

ハードワイヤードコントロールユニットの基本設計は上に示されています。このタイプでは、制御信号は特別なハードウェアによって生成されます 論理回路 回路の構造を変えることなく。この場合、生成された信号を変更してプロセッサで実行することはできません。

オペコードの基本データ(命令の操作コードは、デコードのために命令デコーダに送信されます。命令 デコーダ オペコード内のさまざまなタイプのデータをデコードするためのデコーダーのセットです。これにより、コンピュータのプロセッサがプログラムを実行するための制御信号を生成するために、マトリックスジェネレータへの入力として与えられるアクティブ信号の値を含む出力信号が生成されます。

ハードワイヤーベースのコントロールユニット

ハードワイヤーベースのコントロールユニット

マトリックスジェネレータは、制御ユニットの状態とプロセッサから出力される信号(割り込み信号)を提供します。マトリックスは、 プログラマブルロジックアレイ 。行列生成器によって生成された制御信号は、次の生成行列への入力として与えられ、長方形のパターンを含むタイミングユニットのタイミング信号と結合されます。

新しい命令をフェッチするために、制御ユニットは新しい命令を実行するための初期段階になります。制御ユニットは、コンピュータのタイミング信号、入力信号、および命令の状態が変化しない限り、初期段階または第1段階に留まります。生成された信号のいずれかに変化があった場合、コントロールユニットの状態の変化を上げることができます。

外部信号または割り込みが発生すると、コントロールユニットは次の状態に移行し、割り込み信号の処理を実行します。フラグと状態は、命令の実行サイクルを実行するために必要な状態を選択するために使用されます。

最後の状態では、制御ユニットは次の命令をフェッチし、出力をプログラムカウンタに送信し、次にメモリアドレスレジスタ、バッファレジスタ、次に命令レジスタに送信して命令を読み取ります。最後に、最後の命令(制御装置によってフェッチされる)が終了命令である場合、それはプロセッサの動作状態になり、ユーザーが次のプログラムを指示するまで待機します。

マイクロプログラム制御ユニット

このタイプでは、制御ストアは、プログラムの実行中にエンコードされる制御信号を格納するために使用されます。マイクロプログラムはアドレスフィールドを制御ストアに格納するため、制御信号はすぐには生成されず、デコードされません。プロセス全体は単一のレベルです。

マイクロオペレーションは、プログラム内のマイクロ命令を実行するために実行されます。マイクロプログラム制御ユニットのブロック図を上に示します。この図から、マイクロ命令のアドレスは制御メモリアドレスレジスタから取得されます。コントロールユニットのすべての情報は、ROMと呼ばれるコントロールメモリに永続的に保存されます。

マイクロプログラムベースのコントロールユニット

マイクロプログラムベースのコントロールユニット

制御メモリからのマイクロ命令は、制御レジスタによって保持されます。マイクロ命令は制御ワード(バイナリ制御値を含む)の形式であるため、データ処理のために1つ以上のマイクロ操作を実行する必要があります。

マイクロ命令の実行中に、次のアドレスジェネレータはマイクロ命令の次のアドレスを計算し、次に制御アドレスレジスタに送信して次のマイクロ命令を読み取ります。
マイクロプログラムのマイクロ操作のシーケンスは、次のアドレスジェネレータによって実行され、シーケンスアドレスを取得する、つまり制御メモリから読み取られるマイクロプログラムシーケンサとして機能します。

コントロールユニットのVerilogコード

コントロールユニットのVerilogコードを以下に示します。

`「prj_definition.v」を含める

モジュール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_RES

//出力信号
//レジスタファイルの出力

出力[`DATA_INDEX_LIMIT:0] RF_DATA_W
出力[`ADDRESS_INDEX_LIMIT:0] RF_ADDR_W、RF_ADDR_R1、RF_ADDR_R2
出力RF_READ、RF_WRITE

// ALUの出力
出力[`DATA_INDEX_LIMIT:0] ALU_OP1、ALU_OP2
出力[`ALU_OPRN_INDEX_LIMIT:0] ALU_OPRN

//メモリの出力
出力[`ADDRESS_INDEX_LIMIT:0] MEM_ADDR
出力MEM_READ、MEM_WRITE

//入力信号
入力[`DATA_INDEX_LIMIT:0] RF_DATA_R1、RF_DATA_R2、ALU_RESULT
入力ZERO、CLK、RST

//入力信号
inout [`DATA_INDEX_LIMIT:0] MEM_DATA

//ステートネット
ワイヤー[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]状態、next_state

PROC_SM state_machine(.STATE(proc_state),. CLK(CLK),. RST(RST))

常に@(ポーズCLK)
ベギン
if(RST)
状態<= RST
そうしないと
状態<= next_state

終わり

常に@(状態)
ベギン

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

ケース(状態)

`PROC_FETCH:開始
next_state = `PROC_DECODE
MEM_READ = 1’b1
RF_ADDR_R1 = 1’b0 RF_ADDR_R2 = 1’b0
RF_ADDR_W = 1’b1
終わり

`PROC_DECODE:開始
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
終わり

`PROC_EXE:開始
next_state = `PROC_MEM
ALU_OP1 = 1’b1 ALU_OP2 = 1’b1 ALU_OPRN = 1’b1
RF_ADDR_R1 = 1’b0
終わり

`PROC_MEM:開始
next_state = `PROC_WB
MEM_READ = 1’b1 MEM_WRITE = 1’b0
終わり

`PROC_WB:開始
next_state = `PROC_FETCH
MEM_READ = 1’b1 MEM_WRITE = 1’b0
終わり
エンドケース

終わり
エンドモジュール

モジュールPROC_SM(STATE、CLK、RST)
//入力のリスト
入力CLK、RST
//出力のリスト
出力[2:0]状態

//入力リスト
入力CLK、RST
//出力リスト
出力STATE

reg [2:0]状態
reg [1:0]状態
reg [1:0] next_state

reg PC_REG、INST_REG、SP_REF

`PROC_FETCH 3’h0を定義します
`PROC_DECODE 3’h1を定義します
`PROC_EXE 3’h2を定義します
`PROC_MEM 3’h3を定義します
`PROC_WB 3’h4を定義します

//状態の開始
初期
ベギン
状態= 2’bxx
next_state = `PROC_FETCH
終わり

//信号処理をリセットします
常に@(ポーズRST)
ベギン
状態= `PROC_FETCH
next_state = `PROC_FETCH
終わり
常に@(ポーズCLK)
ベギン
state = next_state
終わり
常に@(状態)
ベギン
if(state === `PROC_FETCH)
ベギン
next_state = `PROC_DECODE

print_instruction(INST_REG)
終わり

if(state === `PROC_DECODE)
ベギン
next_state = `PROC_EXE

終わり

if(state === `PROC_EXE)
ベギン
next_state = `PROC_MEM

print_instruction(SP_REF)
終わり

if(state === `PROC_MEM)
ベギン
next_state = `PROC_WB

終わり

if(state === `PROC_WB)
ベギン
next_state = `PROC_FETCH

print_instruction(PC_REG)
終わり
終わり

タスクprint_instruction

入力[`DATA_INDEX_LIMIT:0] inst

reg [5:0]オペコード
reg [4:0] rs
reg [4:0] rt
reg [4:0] rd
reg [4:0] shamt reg [5:0] funct reg [15:0]即時reg [25:0]アドレス

ベギン

//命令を解析します
// Rタイプ

{オペコード、rs、rt、rd、shamt、funct} = inst

// 私はタイプする
{オペコード、rs、rt、即時} = inst
// Jタイプ
{オペコード、アドレス} = inst
$ write(“ @%6dns-> [0X%08h]“、$ time、inst)
case(opcode)// R-Type
6'h00:開始
ケース(機能)

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(“または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)
デフォルト:$ write(“”)
エンドケース
終わり

// 私はタイプする

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タイプ

6’h02:$ write(“ jmp 0X%07h”、address)
6’h03:$ write(“ jal 0X%07h”、address)
6’h1b:$ write(“ push”)
6’h1c:$ write(“ pop”)
デフォルト:$ write(“”)
エンドケース
$ write(“ n”)
終わり
エンドタスク
エンドモジュール

よくある質問

1)。コントロールユニットの仕事は何ですか?

制御ユニットの働きは、コンピュータのプロセッサによる実行のためのデータまたは命令の流れを指示することです。メインメモリ、ALU、レジスタ、入力、出力ユニットを制御、管理、調整します。命令をフェッチし、実行用の制御信号を生成します。

2)。制御メモリとは何ですか?

制御メモリは通常、制御レジスタのアドレスとデータを格納するためのRAMまたはROMです。

3)。ウィルクスコントロールユニットとは何ですか?

シーケンシャルと 組み合わせ回路 ハードワイヤードコントロールユニットの一部は、ウィルクスコントロールユニットに置き換えられています。ストレージユニットを使用して、マイクロプログラムの一連の命令を保存します。

4)。ハードワイヤードコントロールユニットとは何ですか?

ハードワイヤード制御ユニットは、回路を物理的に変更することなく、クロックパルスごとにある状態から別の状態に変化することによって制御信号を生成します。制御信号の生成は、命令レジスタ、デコーダ、および割り込み信号に依存します。

5)。制御メモリとは何ですか?

コントロールユニットの情報またはデータは、一時的または永続的にコントロールメモリに保存されます。
制御メモリには2つのタイプがあります。それらは、ランダムアクセスメモリ(RAM)と読み取り専用メモリ(ROM)です。

したがって、これはすべて、定義、コンポーネント、設計、図、機能、および コントロールユニットの種類 。 「制御アドレスレジスタの目的は何ですか?」という質問があります。