ĐỒ án cấu TRÚC máy TÍNH LAB3 DESIGN a MIPS 32 BIT SINGLE CYCLE CPU
Trang 1PHÂN CÔNG CÔNG VIỆC
ĐỒ ÁN CẤU TRÚC MÁY TÍNH LAB3: DESIGN A MIPS 32-BIT SINGLE - CYCLE CPU
1 Công việc cụ thể
ST
T
+ Tìm hiểu lại LAB 1: Thiết kế RegisterFile 32 by 32
+Tìm hiểu hoạt động và thiết kế : Khối Control, Khối dịch trái, Khối
mở rộng + Slide: phần I.
30%
+ Tìm hiểu lại LAB2: Thiết kế bộ tính toán ALU.
+Tìm hiểu hoạt động và thiết kế:
Thanh ghi PC, Khối JR_Control, Các khối Multiplexor
+ Slide: phần II 1,2.
30%
+ Tìm hiểu lại chương 4 sách COD Tìm hiểu hoạt động và thiết kế:
ALUControl, MIPS, Khối mô phỏng Stimulate
- Tìm hiểu tài liệu theo nhiệm vụ được giao.
- Thảo luận nhóm thống nhất sơ đồ khối cần thực hiện.
- Viết Code cho từng khối.
- Chia sẻ hiểu biết của từng thành viên trong nhóm về phần mình thiết kế.
- Ghép nối các khối với nhau, hiệu chỉnh thiết kế.
- Mô phỏng trên ModelSim và sơ đồ khối ở Quartus.
Trang 2Lab3: Design a MIPS 32-bit Single-Cycle CPU
I Yêu c u thi t k : ầu thiết kế: ết kế: ết kế:
1 Yêu c u chung: ầu thiết kế:
- Thi t k b x lý trung tâm MIPS chu kì đ n 32-bit th c hi n các ết kế bộ xử lý trung tâm MIPS chu kì đơn 32-bit thực hiện các ết kế bộ xử lý trung tâm MIPS chu kì đơn 32-bit thực hiện các ộ xử lý trung tâm MIPS chu kì đơn 32-bit thực hiện các ử lý trung tâm MIPS chu kì đơn 32-bit thực hiện các ơn 32-bit thực hiện các ực hiện các ện các
l nh: ện các
ADD, SUB, SLT, JR, LW, SW, BNE, XORI, J
- Các c ng logic không có quá 4 ngõ vào, v i delay 50ps ổng logic không có quá 4 ngõ vào, với delay 50ps ới delay 50ps.
- Các kh i đi u khi n logic có th dùng c u trúc l nh behavioral ối điều khiển logic có thể dùng cấu trúc lệnh behavioral ều khiển logic có thể dùng cấu trúc lệnh behavioral ển logic có thể dùng cấu trúc lệnh behavioral ển logic có thể dùng cấu trúc lệnh behavioral ấu trúc lệnh behavioral ện các
Trang 3LW rt, imm16(rs): Reg[rt] = Mem[Reg[rs] + Sign_ext(Imm16)].
SW rt, imm16(rs): Mem[Reg[rs] + Sign_ext(Imm16)] = Reg[rt].
XORI rt, rs, imm16: Reg[rt] = Reg[rs] XOR Zero_ext(Imm16).
- L nh JUMP: ện các
J target: PC = { PC[31:28], target, 00 }
Trang 4II Xây d ng SingleClock CPU: ựng SingleClock CPU:
Trang 5- T s đ kh i t ng quát c a CPU, thi t k 1 CPU đ n chu kì yêu ừ sơ đồ khối tổng quát của CPU, thiết kế 1 CPU đơn chu kì yêu ơn 32-bit thực hiện các ồ khối tổng quát của CPU, thiết kế 1 CPU đơn chu kì yêu ối điều khiển logic có thể dùng cấu trúc lệnh behavioral ổng logic không có quá 4 ngõ vào, với delay 50ps ủa CPU, thiết kế 1 CPU đơn chu kì yêu ết kế bộ xử lý trung tâm MIPS chu kì đơn 32-bit thực hiện các ết kế bộ xử lý trung tâm MIPS chu kì đơn 32-bit thực hiện các ơn 32-bit thực hiện các
c u: ầu:
+ Thanh ghi l nh PC ện các + B nh l nh ộ xử lý trung tâm MIPS chu kì đơn 32-bit thực hiện các ới delay 50ps ện các + B thanh ghi ộ xử lý trung tâm MIPS chu kì đơn 32-bit thực hiện các + B tính toán ALU ộ xử lý trung tâm MIPS chu kì đơn 32-bit thực hiện các + B nh d li u ộ xử lý trung tâm MIPS chu kì đơn 32-bit thực hiện các ới delay 50ps ữ liệu ện các + B đi u khi n trung tâm ộ xử lý trung tâm MIPS chu kì đơn 32-bit thực hiện các ều khiển logic có thể dùng cấu trúc lệnh behavioral ển logic có thể dùng cấu trúc lệnh behavioral.
+ B đi u khi n kh i ALU ộ xử lý trung tâm MIPS chu kì đơn 32-bit thực hiện các ều khiển logic có thể dùng cấu trúc lệnh behavioral ển logic có thể dùng cấu trúc lệnh behavioral ối điều khiển logic có thể dùng cấu trúc lệnh behavioral.
+ B đi u khi n l nh JR ộ xử lý trung tâm MIPS chu kì đơn 32-bit thực hiện các ều khiển logic có thể dùng cấu trúc lệnh behavioral ển logic có thể dùng cấu trúc lệnh behavioral ện các + B m r ng d u ộ xử lý trung tâm MIPS chu kì đơn 32-bit thực hiện các ở rộng dấu ộ xử lý trung tâm MIPS chu kì đơn 32-bit thực hiện các ấu trúc lệnh behavioral.
+ B d ch trái ộ xử lý trung tâm MIPS chu kì đơn 32-bit thực hiện các ịch trái + B multiplexor ộ xử lý trung tâm MIPS chu kì đơn 32-bit thực hiện các
2 B nh l nh: ộ nhớ lệnh: ớ lệnh: ệnh:
Trang 6- B nh l nh nh n ngõ ra c a PC làm đ a ch c a l nh ti p theo ộ xử lý trung tâm MIPS chu kì đơn 32-bit thực hiện các ới delay 50ps ện các ận ngõ ra của PC làm địa chỉ của lệnh tiếp theo ủa CPU, thiết kế 1 CPU đơn chu kì yêu ịch trái ỉ của lệnh tiếp theo ủa CPU, thiết kế 1 CPU đơn chu kì yêu ện các ết kế bộ xử lý trung tâm MIPS chu kì đơn 32-bit thực hiện các
always @(address)
begin
Trang 72 ngõ ra d li u (Read Data 1 và Dead Data 2) ữ liệu ện các
+ Có 1 ngõ vào ch n thanh ghi đ ghi d li u (Write register) , 1 ngõ vào ọn thanh ghi đọc (Read Register 1 và Read Register 2) và ển logic có thể dùng cấu trúc lệnh behavioral ữ liệu ện các cho phép ghi (RegWrite) và1 ngõ vào d li u (Write Data) khi ghi vào ữ liệu ện các file thanh ghi.
S đ kh i: ơ đồ khối: ồ khối: ối:
Trang 8module RegisterFile(RD1,RD2,WD,RR1,RR2,WR,RW,reset,clk); // RR : Read Register
input [4:0]RR1,RR2,WR; // WR : Write Register
input [31:0]WD ; // WD : Write Data
input RW,clk,reset; // RW : RegWrite
output [31:0]RD1,RD2; // RD : Read Data
wire [31:0]x; // x : ngõ ra cua bo decoder5_32
wire[31:0]R0,R1,R2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,R13,R14,R15,R16,R17,R18,R19,R20,R21, R22,R23,R24,R25,R26,R27,R28,R29,R30,R31;
decoder5_32 d(WR,x[31:0],RW); // chọn thanh ghi đích
mux32x32_32
m1(RD1,RR1,R31,R30,R29,R28,R27,R26,R25,R24,R23,R22,R21,R20,R19,R18,R17,R16,R15,R14,R13,R12,R11,R10,R9,R8,R7,R6,R5,R4,R3,R2,R1,R0); // chọn thanh ghi nguồn Rs
mux32x32_32
m2(RD2,RR2,R31,R30,R29,R28,R27,R26,R25,R24,R23,R22,R21,R20,R19,R18,R17,R16,R15,R14,R13,R12,R11,R10,R9,R8,R7,R6,R5,R4,R3,R2,R1,R0); // chọn thah ghi nguồn Rt
4 B tính toán – ALU: ộ nhớ lệnh:
- Cấu tạo MIPS ALU:
+ 2 ngõ vào BusA và BusB 32 bit
+ 1 ngõ ra Output 32 bit
Trang 9+ Các cờ ngõ ra: zero, overflow, carryout, negative
Cờ zero: được set khi kết quả bằng 0
Cờ overflow (tràn khi thực hiện cộng trừ với số có dấu): đươc set khi xảy ra tràn
Cờ carryout (tràn khi thực hiện cộng trừ với số không dấu): xảy ra khi có nhớ (mượn) từ MSB
Cờ negative: được set nếu kết quả âm
+ Ngõ vào điều khiển ALUcontrol gồm 2 bit xác định phép toán mà ALU cần thực hiện:
Bảng 1 Tín hiệu điều khiển ALU
module ALU(out,a,b,carry, zero, overflow,negative , AluControl);
Trang 115 Bộ nhớ dữ liệu – Data Memory:
- Nhận kết quả của bộ ALU làm địa chỉ ngõ vào.
- Nếu có thao tác đọc dữ liệu ra ( lệnh LW) thì MemRead được set 1 ( cho phép đọc dữ liệu ra).
- Nếu có thao tác ghi dữ liệu vào bộ nhớ (lệnh SW) thì MemWrite được set lên
1 ( cho phép ghi dữ liệu vào).
Code:
module DataMem(readdata, address, writedata, writeenable,MemRead,clk);
input [31:0] address, writedata;
input writeenable,MemRead, clk;
output [31:0] readdata;
reg [7:0] datamem[1023:0];
Trang 12reg [31:0] temp;
buf #1000
buf0(readdata[0],temp[0]),
buf1(readdata[1],temp[1]),buf2(readdata[2],temp[2]),buf3(readdata[3],temp[3]),buf4(readdata[4],temp[4]),buf5(readdata[5],temp[5]),buf6(readdata[6],temp[6]),buf7(readdata[7],temp[7]),buf8(readdata[8],temp[8]),buf9(readdata[9],temp[9]),buf10(readdata[10],temp[10]),buf11(readdata[11],temp[11]),buf12(readdata[12],temp[12]),buf13(readdata[13],temp[13]),buf14(readdata[14],temp[14]),buf15(readdata[15],temp[15]),
buf16(readdata[16],temp[16]),buf17(readdata[17],temp[17]),buf18(readdata[18],temp[18]),buf19(readdata[19],temp[19]),buf20(readdata[20],temp[20]),buf21(readdata[21],temp[21]),buf22(readdata[22],temp[22]),buf23(readdata[23],temp[23]),buf24(readdata[24],temp[24]),buf25(readdata[25],temp[25]),buf26(readdata[26],temp[26]),buf27(readdata[27],temp[27]),buf28(readdata[28],temp[28]),buf29(readdata[29],temp[29]),buf30(readdata[30],temp[30]),buf31(readdata[31],temp[31]);always @(posedge clk)
6 Khối điều khiển trung tâm – Control Unit:
- Tạo ra các tín hiệu điều khiển:
+ RegDst: Chọn thanh ghi đích cho RegisterFile.
RegDst = 0: Rt là thanh ghi đích, lệnh loại I.
RegDst = 1: Rd là thanh ghi đích, lệnh loại R.
+ Jump: Cho phép thực hiện lệnh nhảy JUMP.
+ Branch: Cho phép thực hiện lệnh nhảy BNE.
+ MemRead: Cho phép đọc từ bộ nhớ dữ liệu.
+ MemWrite Cho phép ghi dữ liệu vào DataMemory.
+ ALUSrc: Chọn ngõ vào thứ 2 cho bộ ALU.
Trang 13ALUSrc = 0: Ngõ vào là giá trị của thanh ghi nguồn ( lệnh loại R).
ALUSrc = 1: Ngõ vào là giá 32-bit mở rộng dấu hoặc mở rộng không + RegWrite: Cho phép ghi dữ liệu vào thanh ghi đích.
+ MemtoReg:Chọn giá trị ghi của RegisterFile là kết quả của bộ ALU hoặc dữ liệu từ Data Memory.
MemtoReg = 0: đưa về kết quả của bộ ALU MemtoReg = 1: đưa về dữ liệu từ DataMemory.
+ SignZero: Mở rộng dấu hoặc mở rộng không
SignZero = 0: Mở rộng dấu SignZero = 1: Mở rộng không + ALUop: Cho biết phép toán thực hiện là cộng (01) đối với LW và SW, trừ (01) đối với BNE, lệnh loại R (10) hoặc lệnh XORI (11).
B ng 2 Giá tr đi u khi n c a Control_Unit ảng 2 Giá trị điều khiển của Control_Unit ịch trái ều khiển logic có thể dùng cấu trúc lệnh behavioral ển logic có thể dùng cấu trúc lệnh behavioral ủa CPU, thiết kế 1 CPU đơn chu kì yêu Code:
module Control_Unit( RegDst, ALUSrc, MemtoReg, RegWrite, MemRead, MemWrite, Branch, ALUop, Jump, SignZero z,OpCode);
input [5:0]OpCode;
Trang 14output Jump,RegDst,ALUSrc,MemtoReg,RegWrite,MemRead,MemWrite,Branch,SignZero; output [1:0]ALUop;
reg Jump,RegDst,ALUSrc,MemtoReg,RegWrite,MemRead,MemWrite,Branch,SignZero; reg [1:0]ALUop;
Trang 167 ALU_Control_Unit :
- K t h p giá tr c a tín hi u đi u khi n ALUop t b đi u khi n trung tâm ết kế bộ xử lý trung tâm MIPS chu kì đơn 32-bit thực hiện các ợc thực ịch trái ủa CPU, thiết kế 1 CPU đơn chu kì yêu ện các ều khiển logic có thể dùng cấu trúc lệnh behavioral ển logic có thể dùng cấu trúc lệnh behavioral ừ sơ đồ khối tổng quát của CPU, thiết kế 1 CPU đơn chu kì yêu ộ xử lý trung tâm MIPS chu kì đơn 32-bit thực hiện các ều khiển logic có thể dùng cấu trúc lệnh behavioral ển logic có thể dùng cấu trúc lệnh behavioral.
và 6-bit Function giãi mã t l nh đ t o ra tín hi u đi u khi n ừ sơ đồ khối tổng quát của CPU, thiết kế 1 CPU đơn chu kì yêu ện các ển logic có thể dùng cấu trúc lệnh behavioral ại R: ện các ều khiển logic có thể dùng cấu trúc lệnh behavioral ển logic có thể dùng cấu trúc lệnh behavioral.
ALUControl cho b tính toán ALU ộ xử lý trung tâm MIPS chu kì đơn 32-bit thực hiện các
B ng 3 Giá tr c a ALUop và ALUControl ảng 2 Giá trị điều khiển của Control_Unit ịch trái ủa CPU, thiết kế 1 CPU đơn chu kì yêu
Trang 17- K t h p giá tr c a tín hi u đi u khi n ALUop t b đi u khi n trung tâm ết kế bộ xử lý trung tâm MIPS chu kì đơn 32-bit thực hiện các ợc thực ịch trái ủa CPU, thiết kế 1 CPU đơn chu kì yêu ện các ều khiển logic có thể dùng cấu trúc lệnh behavioral ển logic có thể dùng cấu trúc lệnh behavioral ừ sơ đồ khối tổng quát của CPU, thiết kế 1 CPU đơn chu kì yêu ộ xử lý trung tâm MIPS chu kì đơn 32-bit thực hiện các ều khiển logic có thể dùng cấu trúc lệnh behavioral ển logic có thể dùng cấu trúc lệnh behavioral.
và 6-bit Function giãi mã t l nh đ t o ra tín hi u JR_Control cho phép ừ sơ đồ khối tổng quát của CPU, thiết kế 1 CPU đơn chu kì yêu ện các ển logic có thể dùng cấu trúc lệnh behavioral ại R: ện các
th c hi n l nh JUMP REGISTER ực hiện các ện các ện các
- Đ a ch c a lênh JumpRegister chính là d li u trong thanh ghi Rs ịch trái ỉ của lệnh tiếp theo ủa CPU, thiết kế 1 CPU đơn chu kì yêu ữ liệu ện các
Trang 18module JR_Control_Unit(ALUop,Funct,JRControl);
input [5:0]Funct; // 6 bit function cua lenh
input [1:0] ALUop; // 2 bit ALU Opcode tu khoi dieu khien ALU
output JRControl; // dieu khien chon dia chi cho PC
reg JRControl;
wire [7:0]x;
assign x = {ALUop,Funct};
/* ALUop = 10 va function = 01000 => JRControl = 1
cac truong hop khac JRControl = 0 */
9 B m r ng d u – Extender: ộ nhớ lệnh: ở rộng dấu – Extender: ộ nhớ lệnh: ấu – Extender:
- T ngõ vào 10-bit m r ng thành ngõ ra 32-bit v i tín hi u đi u khi n ừ sơ đồ khối tổng quát của CPU, thiết kế 1 CPU đơn chu kì yêu ở rộng dấu ộ xử lý trung tâm MIPS chu kì đơn 32-bit thực hiện các ới delay 50ps ện các ều khiển logic có thể dùng cấu trúc lệnh behavioral ển logic có thể dùng cấu trúc lệnh behavioral SignZero.
Code:
module Extender ( out, in, select);
output [31:0] out;
input [15:0] in;
input select; // select = 0: Sign_Extend
reg [31:0]out; // select = 1: Zero_Extend
always @(in or select)
begin
if (select)
begin
Trang 1910 B d ch trái – ShiftLeft2: ộ nhớ lệnh: ịch trái – ShiftLeft2:
- D ch tín hi u 32-bit qua trái 2 bit đ th c hi n phép nhân v i 4 ịch trái ện các ển logic có thể dùng cấu trúc lệnh behavioral ực hiện các ện các ới delay 50ps.
- B multiplexor 2x5_5 ch n thanh ghi đích cho RegisterFile ộ xử lý trung tâm MIPS chu kì đơn 32-bit thực hiện các ọn thanh ghi đọc (Read Register 1 và Read Register 2) và
- B multiplexor 2x32_32 ch n ngõ vào th 2 cho b ALU, d li u ghi v ộ xử lý trung tâm MIPS chu kì đơn 32-bit thực hiện các ọn thanh ghi đọc (Read Register 1 và Read Register 2) và ứ 2 cho bộ ALU, dữ liệu ghi về ộ xử lý trung tâm MIPS chu kì đơn 32-bit thực hiện các ữ liệu ện các ều khiển logic có thể dùng cấu trúc lệnh behavioral RegisterFile và ch n l a đ a ch c a l nh ti p theo đ ọn thanh ghi đọc (Read Register 1 và Read Register 2) và ực hiện các ịch trái ỉ của lệnh tiếp theo ủa CPU, thiết kế 1 CPU đơn chu kì yêu ện các ết kế bộ xử lý trung tâm MIPS chu kì đơn 32-bit thực hiện các ược thực c th c hi n ực hiện các ện các
Trang 20
Code Verilog cho MIPS:
// MIPS 32BIT - SINGLE - CYLCE - CPU
module MIPS(clk, reset);
// KHAI BAO DIA CHI
wire [31:0] PCin,PC; // PCin: dia chi ngo vao cua thanh ghi PC
wire [31:0] PC_4, // PC_4 : Dia chi lenh tiep theo
PC_Bne, // PC_Bne : Dia chi neu thuc hien lenh Branch
PC_Jump, // PC_Jump: Dia chi neu thuc hien lenh Jump
PC_JR, // PC_JR : Dia chi neu thuc hien lenh Jump Register
Bne_Address, // Bne_Address: Dia chi Branch
Jump_Address, // Jump_Address: Dia chi Jump
JR_Address; // JR_Address: Dia chi Jump Register ( = ReadData1)
// KHAI BAO INSTRUCTION MEMORY
wire [31:0] Instruction; // Lenh dang xu ly
Trang 21assign Imm16 = Instruction[15:0];
// KHAI BAO ALU
wire [31:0] ALUin1, // 2 ngo vao cua bo ALU
wire JR_Control; // Tin hieu dieu khien lenh Jump Register
wire Bne_Control; // Tin hieu dieu khien lenh BNE
wire [1:0] ALU_Control; // Tin hieu ra cua ALU_Control_Unit
wire [31:0] Extend; // 32bit mo rong dau cua 16bit immediate
// KHAI BAO REGISTER FILE
wire [31:0] ReadData1,ReadData2; // Gia tri cac thanh ghi
wire [31:0] Reg_WriteData; // Gia tri ghi vao thanh ghi dich
wire [4:0] WriteRegister; // Thanh ghi dich
// KHAI BAO DATA MEMORY
wire [31:0] Mem_ReadData, // Du lieu xuat ra tu bo nho
Mem_Address, // Dia chi DataMemory
Mem_WriteData; // Du lieu ghi vao bo nho ( = ReadData2)
// KHAI BAO SHIFTER
wire [31:0] Bne_shift_in, // Ngo vao bo dich trai (BNE)
Bne_shift_out, // Ngo ra bo dich trai (BNE)
Jump_shift_in, // Ngo vao bo dich trai (JUMP)
Jump_shift_out; // Ngo ra bo dich trai (JUMP)
/************************************
********* CAU TRUC MIPS ************