หน่วยควบคุมคืออะไร: ส่วนประกอบและการออกแบบ

ลองใช้เครื่องมือของเราเพื่อกำจัดปัญหา





หน่วยควบคุมเป็นส่วนประกอบหลักของหน่วยประมวลผลกลาง (CPU) ในคอมพิวเตอร์ที่สามารถสั่งการการทำงานระหว่างการทำงานของโปรแกรมโดย โปรเซสเซอร์ /คอมพิวเตอร์. หน้าที่หลักของชุดควบคุมคือการดึงข้อมูลและดำเนินการคำสั่งจากหน่วยความจำของคอมพิวเตอร์ รับคำสั่ง / ข้อมูลอินพุตจากผู้ใช้และแปลงเป็น สัญญาณควบคุม ซึ่งจะมอบให้กับ CPU เพื่อดำเนินการต่อไป รวมเป็นส่วนหนึ่งของสถาปัตยกรรมฟอนนอยมันน์ที่พัฒนาโดย John Neumann มีหน้าที่ในการให้สัญญาณเวลาและสัญญาณควบคุมและสั่งการทำงานของโปรแกรมโดย CPU รวมเป็นส่วนภายในของ CPU ในคอมพิวเตอร์สมัยใหม่ บทความนี้อธิบายข้อมูลทั้งหมดเกี่ยวกับชุดควบคุม

ชุดควบคุมคืออะไร?

ส่วนประกอบที่รับสัญญาณอินพุต / ข้อมูล / คำสั่งจากผู้ใช้และแปลงเป็นสัญญาณควบคุมสำหรับการดำเนินการใน CPU ควบคุมและสั่งการหน่วยความจำหลักหน่วยเลขคณิตและลอจิก (ALU) อุปกรณ์อินพุตและเอาต์พุตและยังรับผิดชอบคำสั่งที่ส่งไปยัง CPU ของคอมพิวเตอร์ ดึงคำแนะนำจากไฟล์ หน่วยความจำหลัก ของโปรเซสเซอร์และส่งไปยังรีจิสเตอร์คำสั่งโปรเซสเซอร์ซึ่งมีรีจิสเตอร์เนื้อหา




แผนภาพบล็อกหน่วยควบคุม

แผนภาพบล็อกหน่วยควบคุม

หน่วยควบคุมจะแปลงอินพุตเป็นสัญญาณควบคุมจากนั้นส่งไปยังโปรเซสเซอร์และสั่งการทำงานของโปรแกรม การดำเนินการที่ต้องดำเนินการจะถูกกำกับโดยโปรเซสเซอร์บนคอมพิวเตอร์ หน่วยประมวลผลกลางส่วนใหญ่ (CPU) และ หน่วยประมวลผลกราฟิก (GPU) ต้องการชุดควบคุมเป็นส่วนภายใน แผนภาพบล็อกของชุดควบคุมแสดงไว้ด้านบน



ส่วนประกอบของชุดควบคุม

ส่วนประกอบของหน่วยนี้เป็นคำสั่ง ลงทะเบียน , สัญญาณควบคุมภายใน CPU, สัญญาณควบคุมเข้า / ออกจากบัส, บัสควบคุม, แฟล็กอินพุตและสัญญาณนาฬิกา

ส่วนประกอบของชุดควบคุมเดินสายคือรีจิสเตอร์คำสั่ง (มีฟิลด์ opcode และแอดเดรส) หน่วยจับเวลาสถานะการควบคุม เครื่องกำเนิดไฟฟ้า เมทริกซ์การสร้างสัญญาณควบคุมและตัวถอดรหัสคำสั่ง
ส่วนประกอบของชุดควบคุมที่ตั้งโปรแกรมไมโครคือตัวสร้างที่อยู่ถัดไปทะเบียนที่อยู่ควบคุมหน่วยความจำควบคุมและทะเบียนข้อมูลควบคุม

ฟังก์ชั่น

หน้าที่ของชุดควบคุม รวมสิ่งต่อไปนี้


  • มันกำกับการไหลของลำดับข้อมูลระหว่างโปรเซสเซอร์และอุปกรณ์อื่น ๆ
  • สามารถตีความคำสั่งและควบคุมการไหลของข้อมูลในโปรเซสเซอร์
  • สร้างลำดับของสัญญาณควบคุมจากคำสั่งหรือคำสั่งที่ได้รับจากการลงทะเบียนคำสั่ง
  • มีหน้าที่ควบคุมหน่วยประมวลผลเช่น ALU บัฟเฟอร์ข้อมูลและรีจิสเตอร์ใน CPU ของคอมพิวเตอร์
  • มีความสามารถในการดึงข้อมูลถอดรหัสจัดการการดำเนินการและจัดเก็บผลลัพธ์
  • ไม่สามารถประมวลผลและจัดเก็บข้อมูลได้
  • ในการถ่ายโอนข้อมูลจะสื่อสารกับอุปกรณ์อินพุตและเอาต์พุตและควบคุมหน่วยทั้งหมดของคอมพิวเตอร์

การออกแบบชุดควบคุม

การออกแบบนี้สามารถทำได้โดยใช้สอง ประเภทของชุดควบคุม ซึ่งรวมถึงสิ่งต่อไปนี้

  • ใช้ Hardwire
  • ตามไมโครโปรแกรม (ระดับเดียวและสองระดับ)

หน่วยควบคุมเดินสาย

การออกแบบพื้นฐานของชุดควบคุมเดินสายไฟแสดงไว้ด้านบน ในประเภทนี้สัญญาณควบคุมถูกสร้างขึ้นโดยฮาร์ดแวร์พิเศษ วงจรลอจิก โดยไม่มีการเปลี่ยนแปลงโครงสร้างของวงจร ด้วยเหตุนี้สัญญาณที่สร้างขึ้นจะไม่สามารถแก้ไขได้สำหรับการดำเนินการในโปรเซสเซอร์

ข้อมูลพื้นฐานของ opcode (รหัสการทำงานของคำสั่งจะถูกส่งไปยังตัวถอดรหัสคำสั่งสำหรับการถอดรหัสคำสั่ง ตัวถอดรหัส คือชุดตัวถอดรหัสสำหรับถอดรหัสข้อมูลประเภทต่างๆใน opcode ส่งผลให้สัญญาณเอาต์พุตซึ่งมีค่าของสัญญาณที่ใช้งานอยู่ซึ่งกำหนดให้เป็นอินพุตไปยังเมทริกซ์เจเนอเรเตอร์เพื่อสร้างสัญญาณควบคุมสำหรับการทำงานของโปรแกรมโดยโปรเซสเซอร์ของคอมพิวเตอร์

หน่วยควบคุมที่ใช้ Hardwire

หน่วยควบคุมที่ใช้ Hardwire

เมทริกซ์เจเนอเรเตอร์แสดงสถานะของหน่วยควบคุมและสัญญาณออกจากโปรเซสเซอร์ (สัญญาณขัดจังหวะ) เมทริกซ์ถูกสร้างขึ้นเป็นไฟล์ อาร์เรย์ลอจิกที่ตั้งโปรแกรมได้ . สัญญาณควบคุมที่สร้างโดยเมทริกซ์เจเนอเรเตอร์จะได้รับเป็นอินพุตไปยังเมทริกซ์เครื่องกำเนิดไฟฟ้าถัดไปและรวมกับสัญญาณเวลาของหน่วยจับเวลาที่มีรูปแบบสี่เหลี่ยม

สำหรับการดึงคำสั่งใหม่ชุดควบคุมจะกลายเป็นขั้นตอนเริ่มต้นสำหรับการดำเนินการคำสั่งใหม่ ชุดควบคุมยังคงอยู่ในระยะเริ่มต้นหรือระยะแรกตราบเท่าที่สัญญาณเวลาสัญญาณอินพุตและสถานะของคำสั่งของคอมพิวเตอร์ไม่เปลี่ยนแปลง การเปลี่ยนแปลงสถานะของชุดควบคุมสามารถเกิดขึ้นได้หากมีการเปลี่ยนแปลงใด ๆ ในสัญญาณที่สร้างขึ้น

เมื่อเกิดสัญญาณภายนอกหรือการขัดจังหวะหน่วยควบคุมจะไปยังสถานะถัดไปและดำเนินการประมวลผลสัญญาณขัดจังหวะ แฟล็กและสถานะถูกใช้เพื่อเลือกสถานะที่ต้องการเพื่อดำเนินการตามรอบการดำเนินการของคำสั่ง

ในสถานะสุดท้ายหน่วยควบคุมจะดึงคำสั่งถัดไปและส่งเอาต์พุตไปยังตัวนับโปรแกรมจากนั้นไปที่รีจิสเตอร์ที่อยู่หน่วยความจำไปยังรีจิสเตอร์บัฟเฟอร์จากนั้นไปที่รีจิสเตอร์คำสั่งเพื่ออ่านคำสั่ง สุดท้ายหากคำสั่งสุดท้าย (ซึ่งเรียกโดยชุดควบคุม) เป็นคำสั่งสิ้นสุดคำสั่งนั้นจะเข้าสู่สถานะการทำงานของโปรเซสเซอร์และรอจนกว่าผู้ใช้จะสั่งโปรแกรมถัดไป

หน่วยควบคุมโปรแกรมไมโคร

ในประเภทนี้ที่เก็บควบคุมจะใช้เพื่อเก็บสัญญาณควบคุมที่เข้ารหัสระหว่างการทำงานของโปรแกรม สัญญาณควบคุมจะไม่ถูกสร้างขึ้นทันทีและถอดรหัสเนื่องจากไมโครโปรแกรมเก็บฟิลด์แอดเดรสไว้ในที่เก็บควบคุม กระบวนการทั้งหมดเป็นระดับเดียว

การดำเนินการขนาดเล็กจะทำเพื่อดำเนินการตามคำสั่งไมโครในโปรแกรม แผนภาพบล็อกของชุดควบคุมโปรแกรมไมโครแสดงไว้ด้านบน จากแผนภาพที่อยู่ของคำสั่งไมโครจะได้รับจากรีจิสเตอร์ที่อยู่หน่วยความจำควบคุม ข้อมูลทั้งหมดของชุดควบคุมจะถูกเก็บไว้อย่างถาวรในหน่วยความจำควบคุมที่เรียกว่า 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_RULT_ ZERO_TRATA

// สัญญาณเอาต์พุต
// ผลลัพธ์สำหรับไฟล์ register

เอาต์พุต [`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

// สัญญาณเข้า
ขาเข้า [`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] state, next_state

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

เสมอ @ (วางตัว CLK)
เริ่ม
ถ้า (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
จบ
endcase

จบ
endmodule

โมดูล PROC_SM (STATE, CLK, RST)
// รายการอินพุต
อินพุต CLK, RST
// รายการผลลัพธ์
เอาต์พุต [2: 0] STATE

// รายการอินพุต
อินพุต CLK, RST
// รายการผลลัพธ์
เอาท์พุท STATE

reg [2: 0] STATE
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

// การเริ่มต้นของสถานะ
เริ่มต้น
เริ่ม
state = 2’bxx
next_state = `PROC_FETCH
จบ

// รีเซ็ตการจัดการสัญญาณ
เสมอ @ (posedge RST)
เริ่ม
รัฐ = `PROC_FETCH
next_state = `PROC_FETCH
จบ
เสมอ @ (วางตัว CLK)
เริ่ม
state = next_state
จบ
เสมอ @ (รัฐ)
เริ่ม
ถ้า (สถานะ === `PROC_FETCH)
เริ่ม
next_state = `PROC_DECODE

print_instruction (INST_REG)
จบ

ถ้า (สถานะ === `PROC_DECODE)
เริ่ม
next_state = `PROC_EXE

จบ

ถ้า (state === `PROC_EXE)
เริ่ม
next_state = `PROC_MEM

print_instruction (SP_REF)
จบ

ถ้า (สถานะ === `PROC_MEM)
เริ่ม
next_state = `PROC_WB

จบ

ถ้า (สถานะ === `PROC_WB)
เริ่ม
next_state = `PROC_FETCH

print_instruction (PC_REG)
จบ
จบ

งาน print_instruction

อินพุต [`DATA_INDEX_LIMIT: 0] อินสแตนซ์

reg [5: 0] opcode
reg [4: 0] rs
reg [4: 0] rt
reg [4: 0] ถ
reg [4: 0] shamt reg [5: 0] funct reg [15: 0] ที่อยู่ reg [25: 0] ทันที

เริ่ม

// แยกวิเคราะห์คำสั่ง
// ประเภท R

{opcode, rs, rt, rd, shamt, funct} = inst

// I-type
{opcode, rs, rt, ทันที} = inst
// ประเภท J
{opcode, address} = inst
$ write (“ @% 6dns -> [0X% 08h]“, $ time, inst)
กรณี (opcode) // R-Type
6'h00: เริ่ม
กรณี (ฟังก์ชัน)

6’h20: $ write (“ เพิ่ม 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 (“ และ 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 (“”)
endcase
จบ

// I-type

6’h08: $ write (“ addi r [% 02d], r [% 02d], 0X% 04h”, rs, rt ทันที)
6’h1d: $ write (“ muli r [% 02d], r [% 02d], 0X% 04h”, rs, rt, ทันที)
6’h0c: $ write (“ andi r [% 02d], r [% 02d], 0X% 04h”, rs, rt, ทันที)
6’h0d: $ write (“ ori r [% 02d], r [% 02d], 0X% 04h”, rs, rt, ทันที)
6’h0f: $ write (“ lui r [% 02d], 0X% 04h”, rt ทันที)
6’h0a: $ write (“ slti r [% 02d], r [% 02d], 0X% 04h”, rs, rt, ทันที)
6’h04: $ write (“ beq r [% 02d], r [% 02d], 0X% 04h”, rs, rt, ทันที)
6’h05: $ write (“ bne r [% 02d], r [% 02d], 0X% 04h”, rs, rt, ทันที)
6'h23: $ write (“ lw r [% 02d], r [% 02d], 0X% 04h”, rs, rt, ทันที)
6’h2b: $ write (“ sw r [% 02d], r [% 02d], 0X% 04h”, rs, rt, ทันที)

// ประเภท J

6’h02: $ write (“ jmp 0X% 07h”, ที่อยู่)
6’h03: $ write (“ jal 0X% 07h”, ที่อยู่)
6’h1b: $ write (“ push”)
6’h1c: $ write (“ ป๊อป”)
ค่าเริ่มต้น: $ write (“”)
endcase
$ เขียน (“ n”)
จบ
งานสิ้นสุด
โมดูลท้าย

คำถามที่พบบ่อย

1). การทำงานของชุดควบคุมคืออะไร?

การทำงานของชุดควบคุมคือการกำหนดทิศทางการไหลของข้อมูลหรือคำแนะนำสำหรับการดำเนินการโดยโปรเซสเซอร์ของคอมพิวเตอร์ มันควบคุมจัดการและประสานหน่วยความจำหลัก, ALU, รีจิสเตอร์, อินพุตและยูนิตเอาต์พุต จะดึงคำแนะนำและสร้างสัญญาณควบคุมสำหรับการดำเนินการ

2). หน่วยความจำควบคุมคืออะไร?

หน่วยความจำควบคุมมักจะเป็น RAM หรือ ROM เพื่อเก็บที่อยู่และข้อมูลของทะเบียนควบคุม

3). ชุดควบคุม Wilkes คืออะไร?

ลำดับและ วงจรผสม ของชุดควบคุมเดินสายไฟจะถูกแทนที่ด้วยชุดควบคุม Wilkes ใช้หน่วยเก็บข้อมูลเพื่อจัดเก็บลำดับคำสั่งของไมโครโปรแกรม

4). ชุดควบคุมเดินสายไฟคืออะไร?

ชุดควบคุมแบบเดินสายจะสร้างสัญญาณควบคุมโดยเปลี่ยนจากสถานะหนึ่งไปเป็นอีกสถานะหนึ่งในทุกพัลส์นาฬิกาโดยไม่มีการเปลี่ยนแปลงทางกายภาพในวงจร การสร้างสัญญาณควบคุมขึ้นอยู่กับการลงทะเบียนคำสั่งตัวถอดรหัสและสัญญาณขัดจังหวะ

5). หน่วยความจำควบคุมคืออะไร?

ข้อมูลของชุดควบคุมหรือข้อมูลจะถูกเก็บไว้ในหน่วยความจำควบคุมชั่วคราวหรือถาวร
หน่วยความจำควบคุมมีสองประเภท หน่วยความจำเข้าถึงโดยสุ่ม (RAM) และหน่วยความจำแบบอ่านอย่างเดียว (ROM)

ดังนั้นทั้งหมดนี้จึงเกี่ยวกับความหมายส่วนประกอบการออกแบบแผนภาพฟังก์ชันและ ประเภทของชุดควบคุม . นี่คือคำถามสำหรับคุณ 'จุดประสงค์ของการลงทะเบียนที่อยู่ควบคุมคืออะไร'