Блок управления (Control Unit) в CPU: компоненты и проектирование
Блок управления — главный компонент центрального процессора (CPU) в компьютерах, направляющий операции во время выполнения программы процессором/компьютером. Основная функция — выборка и исполнение инструкций из памяти компьютера. Он принимает входную инструкцию/информацию от пользователя и преобразует её в управляющие сигналы, которые затем передаются CPU для дальнейшего исполнения. Входит в архитектуру фон Неймана, разработанную Джоном фон Нейманом. Отвечает за синхронизационные сигналы, управляющие сигналы и направляет выполнение программы CPU. В современных компьютерах включён как внутренняя часть CPU. Статья даёт полную информацию о блоке управления.
Что такое блок управления?
Компонент, принимающий входной сигнал/информацию/инструкцию от пользователя и преобразующий в управляющие сигналы для исполнения в CPU. Он контролирует и направляет основную память, арифметико-логическое устройство (АЛУ), устройства ввода-вывода, а также отвечает за инструкции, посылаемые в CPU. Извлекает инструкции из основной памяти процессора и отправляет в регистр инструкций процессора, содержащий содержимое регистров.

Блок управления конвертирует вход в управляющие сигналы и отправляет процессору, направляя выполнение программы. Операции, которые должны выполняться, направляются процессором на компьютере. Главным образом Центральный процессор (CPU) и Графический процессор (GPU) требуют блок управления как внутреннюю часть. Блок-схема показана выше.
Компоненты блока управления
Компоненты: регистры инструкций, управляющие сигналы внутри CPU, управляющие сигналы к/от шины, шина управления, входные флаги, тактовые сигналы.
Компоненты жёстко-проводного (hardwired) блока управления: регистр инструкций (содержит опкод и адресное поле), временной блок, генератор состояний управления, матрица генерации управляющих сигналов, декодер инструкций.
Компоненты микропрограммированного блока управления: генератор следующего адреса, регистр адреса управления, память управления, регистр данных управления.
Функции
Функции блока управления включают:
- Направление потока данных между процессором и другими устройствами.
- Интерпретация инструкций и контроль потока данных в процессоре.
- Генерация последовательности управляющих сигналов из принятых инструкций или команд регистра инструкций.
- Ответственность за контроль исполнительных единиц: АЛУ, буферы данных, регистры в CPU.
- Способность к выборке, декодированию, исполнению и сохранению результатов.
- Не обрабатывает и не хранит данные.
- Для передачи данных общается с устройствами ввода-вывода и контролирует все блоки компьютера.
Проектирование блока управления
Проектирование выполняется двумя типами блока управления:
- Жёстко-проводной (Hardwired)
- Микропрограммированный (одноуровневый и двухуровневый)
Жёстко-проводной блок управления
Базовый дизайн показан выше. В этом типе управляющие сигналы генерируются специальной аппаратной логической схемой без изменения структуры схемы. Сгенерированный сигнал не может быть модифицирован для исполнения в процессоре.
Базовые данные опкода (код операции инструкции) посылаются в декодер инструкций для декодирования. Декодер инструкций — набор декодеров для декодирования разных типов данных в опкоде. Результат — выходные сигналы со значениями активных сигналов, подаваемые на вход матричного генератора для генерации управляющих сигналов исполнения программы процессором компьютера.

Матричный генератор предоставляет состояния блока управления и сигналы от процессора (прерывания). Матрица построена как программируемый логический массив. Управляющие сигналы от матричного генератора подаются на вход следующего матричного генератора и комбинируются с тактовыми сигналами временного блока, содержащего прямоугольные импульсы.
Для выборки новой инструкции блок управления переходит в начальное состояние для исполнения новой инструкции. Блок управления остаётся в начальном состоянии, пока тактовые сигналы, входные сигналы и состояния инструкций компьютера не меняются. Смена состояния блока управления может быть вызвана изменением любого из генерируемых сигналов.
При внешнем сигнале или прерывании блок управления переходит в следующее состояние и обрабатывает сигнал прерывания. Флаги и состояния используются для выбора желаемых состояний для исполнения цикла инструкции.
В последнем состоянии блок управления выбирает следующую инструкцию и отправляет выход в счётчик команд, затем в регистр адреса памяти, в буферный регистр, и затем в регистр инструкций для чтения инструкции. Наконец, если последняя инструкция (выбранная блоком управления) — конечная инструкция, то переходит в операционное состояние процессора и ждёт, пока пользователь направит следующую программу.
Микропрограммированный блок управления
В этом типе память управления используется для хранения управляющих сигналов, кодируемых во время исполнения программы. Управляющий сигнал не генерируется немедленно и не декодируется, потому что микропрограмма хранит адресное поле в памяти управления. Весь процесс — однопотоковый.
Микрооперации выполняются для исполнения микroинструкций в программе. Блок-схема микропрограммированного блока управления показана выше. Из диаграммы адрес микroинструкции получается из регистра адреса памяти управления. Вся информация блока управления постоянно хранится в памяти управления, называемой ROM.

Микroинструкция из памяти управления удерживается регистром управления. Поскольку микroинструкция в форме управляющего слова (содержит бинарные управляющие значения), требующем 1 или более микроопераций для обработки данных.
Во время исполнения микroинструкций генератор следующего адреса вычисляет следующий адрес микroинструкции и отправляет в регистр адреса управления для чтения следующей микroинструкции.
Последовательность микроопераций микропрограммы выполняется генератором следующего адреса и действует как секвенсор микропрограммы для получения адреса последовательности, то есть чтения из памяти управления.
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;
// Выходы для АЛУ
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 сигнал
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_R1, RF_ADDR_R2, RF_ADDR_W;
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 list
input CLK, RST;
// output list
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;
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). Какая работа блока управления?
Работа блока управления — направлять поток данных или инструкций для исполнения процессором компьютера. Он контролирует, управляет и координирует основную память, АЛУ, регистры, ввод и вывод. Извлекает инструкции и генерирует управляющие сигналы для исполнения.
2). Что такое память управления?
Память управления — обычно ОЗУ или ПЗУ для хранения адреса и данных регистра управления.
3). Что такое блок управления Уилкса?
Последовательные и комбинационные схемы жёстко-проводного блока управления заменяются блоком управления Уилкса. Он использует запоминающее устройство для хранения последовательностей инструкций микропрограммы.
4). Что такое жёстко-проводной блок управления?
Жёстко-проводной блок управления генерирует управляющие сигналы, переходя из одного состояния в другое на каждом такте без физического изменения схемы. Генерация управляющих сигналов зависит от регистра инструкций, декодера и сигналов прерываний.
5). Что такое память управления?
Информация блока управления или данные временно или постоянно хранятся в памяти управления.
Память управления двух типов: ОЗУ (RAM) и ПЗУ (ROM).
Таким образом, это всё о определении, компонентах, проектировании, диаграмме, функциях и типах блока управления. Вопрос к вам: «Какова цель регистра адреса управления?»
Встроенный
- Блок управления (Control Unit) в CPU: компоненты и проектирование
- Программирование встраиваемых систем: языки, архитектура и применения
- Числовое программное управление (ЧПУ): комплексный обзор автоматизированных операций
- Освоение проектирования электрощитов: ключевые принципы и лучшие практики
- Кевлар: полный обзор прочности и применений
- Архитектурное проектирование: принципы, практика и влияние на среду
- Микроэлектроника: наука о сверхмалых электронных компонентах
- Понимание контроля качества: обеспечение стабильного совершенства
- Как 3D-печать меняет механическую обработку и промышленный дизайн
- Ключевая роль промышленного прототипирования в разработке продуктов