Tải bản đầy đủ (.doc) (32 trang)

Đồ án cấu trúc máy tính

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (504.36 KB, 32 trang )

Đồ án cấu trúc máy tính

GVHD: Hồ Viết Việt

Project 1: MIPS 32 by 32 Register File

1. Giới thiệu :
-

File thanh ghi có nhiệm vụ dùng để lưu giữ giá trị tạm thời để phục vụ cho các quá

-

trình tính toán xử lý sau này.
File thanh ghi gồm có 32 thanh ghi từ R0 đến R31 trong đó mỗi thanh ghi gồm có

-

32 bits.
Các thanh ghi được xây dựng từ các DFF với kích khởi sườn lên.
+ Nhiệm vụ của DFF là khi tín hiệu reset = 1 thì sẽ cho đầu
ra Q = 0
+ và đầu ra Q = d khi tín hiệu enable = 1
 Vì vậy mỗi thanh ghi 32 bits sẽ được xây dựng từ 32 bộ DFF

2. Sơ đồ khối:

5

Read
Register 1



5

Read
Register 2

5

Write
Register

32

Write
Data

Read
Data 1

32

Read
Data 2

32
RegWrite

-

Trong đó:

+ với 5 bits Read Register 1 thì xác định được thanh ghi nguồn thứ
nhất rs
+ với 5 bits Read Register 2 thì xác định được thanh ghi nguồn thứ hai rt

Nhóm: Page 1


Đồ án cấu trúc máy tính

GVHD: Hồ Viết Việt

+ với 5 bits Write Register thì xác định được thanh ghi đích rd
+ Read data 1 sẽ đọc dữ liệu ra của thanh ghi rs
+ Read data 2 sẽ đọc dữ liệu ra của thanh ghi rt
+ Write data là 32 bits dữ liệu sẽ được ghi vào thanh ghi rd khi nào bits RegWrite
-

được set = 1
Từ 5 bits để xác định được thanh ghi cần chọn thì ta sử dụng bộ giải mã 5:32
Xây dựng bộ giải mã 5:32 từ các bộ giãi mã 2:4 và 3:8

Nhóm: Page 2


Đồ án cấu trúc máy tính

GVHD: Hồ Viết Việt

Sơ đồ mạch của của các bộ giải mã 2-4 và 3-8 :
2-into-4 decoder

S1

S0
S1

S0

D0

D0

D1

D1

D2

D2

D3

D3

-

Để đọc dữ liệu từ các thanh ghi thì ta sẽ sử dụng bộ multiplex 32-32
+ Bộ mux32-32 được xây dựng từ 32 bộ mux32-1 mà bộ mux32-1 sẽ được xây
dựng từ các bộ mux4-1 và mux 8-1

Nhóm: Page 3



Đồ án cấu trúc máy tính

Nhóm: Page 4

GVHD: Hồ Viết Việt


Đồ án cấu trúc máy tính

3. Code
Code Testbench cho file thanh ghi:
`timescale 1 ps / 100 fs
module RegFileStimulus();
parameter ClockDelay = 5000;
reg [4:0] ReadRegister1, ReadRegister2, WriteRegister;
Nhóm: Page 5

GVHD: Hồ Viết Việt


Đồ án cấu trúc máy tính

GVHD: Hồ Viết Việt

reg [31:0] WriteData;
reg RegWrite, clk,reset;
wire [31:0] ReadData1, ReadData2;
integer i;

regfile reg1(ReadData1,ReadData2,WriteData,
ReadRegister1,ReadRegister2,WriteRegister,RegWrite,clk,reset);
initial reset=0;
initial clk = 0;
always #(ClockDelay/2) clk = ~clk;
initial
begin
$monitor($time, " ReadData1=%h, ReadData2=%h, WriteData=%h, WriteReg=%d,
Reg1=%d, Reg2=%d, RegWrite=%b, clk=%b",
ReadData1, ReadData2, WriteData, WriteRegister, ReadRegister1,
ReadRegister2, RegWrite,clk);
// ghi du lieu vao thanh ghi
for (i=1; i<32; i=i+1)
begin
RegWrite=1;
ReadRegister1=i-1;
ReadRegister2=i;
WriteRegister=i;
WriteData=i*32'h100+i;
#(ClockDelay);
end
// doc du lieu ra lai
for (i=0; i<=31; i=i+1)
begin
RegWrite=0;
ReadRegister1=i;
ReadRegister2=i+1;
WriteRegister=i;
WriteData=i*32'h01020408;
#(ClockDelay/2);

end
$finish;
end
endmodule

Code của file thanh ghi:
module regfile(ReadData1,ReadData2,WriteData,
ReadRegister1,ReadRegister2,WriteRegister,RegWrite,clk,reset);
input RegWrite,clk,reset;
input [4:0] ReadRegister1, ReadRegister2, WriteRegister;
input [31:0] WriteData;
output [31:0] ReadData1,ReadData2;
wire[31:0] andRW,
R0,R1,R2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,R13,R14,R15,R16,
Nhóm: Page 6


Đồ án cấu trúc máy tính

GVHD: Hồ Viết Việt

R17,R18,R19,R20,R21,R22,R23,R24,R25,R26,R27,R28,R29,R30,R31;
wire[31:0] lg0;
// phan ghi du lieu
decoder5_32 de1(WriteRegister,andRW,RegWrite);
reg32
gh0(clk,reset,1'b1,32'd0,R0[0],R1[0],R2[0],R3[0],R4[0],R5[0],R6[0],R7[0],R8[0],R9[
0],R10[0],R11[0],R12[0],R13[0],R14[0],R15[0],R16[0],R17[0],R18[0],R19[0],R20[0
],R21[0],R22[0],R23[0],R24[0],R25[0],R26[0],R27[0],R28[0],R29[0],R30[0],R31[0])
;

reg32
gh1(clk,reset,andRW[1],WriteData,R0[1],R1[1],R2[1],R3[1],R4[1],R5[1],R6[1],R7[1
],R8[1],R9[1],R10[1],R11[1],R12[1],R13[1],R14[1],R15[1],R16[1],R17[1],R18[1],R
19[1],R20[1],R21[1],R22[1],R23[1],R24[1],R25[1],R26[1],R27[1],R28[1],R29[1],R3
0[1],R31[1]);
reg32
gh2(clk,reset,andRW[2],WriteData,R0[2],R1[2],R2[2],R3[2],R4[2],R5[2],R6[2],R7[2
],R8[2],R9[2],R10[2],R11[2],R12[2],R13[2],R14[2],R15[2],R16[2],R17[2],R18[2],R
19[2],R20[2],R21[2],R22[2],R23[2],R24[2],R25[2],R26[2],R27[2],R28[2],R29[2],R3
0[2],R31[2]);
reg32
gh3(clk,reset,andRW[3],WriteData,R0[3],R1[3],R2[3],R3[3],R4[3],R5[3],R6[3],R7[3
],R8[3],R9[3],R10[3],R11[3],R12[3],R13[3],R14[3],R15[3],R16[3],R17[3],R18[3],R
19[3],R20[3],R21[3],R22[3],R23[3],R24[3],R25[3],R26[3],R27[3],R28[3],R29[3],R3
0[3],R31[3]);
reg32
gh4(clk,reset,andRW[4],WriteData,R0[4],R1[4],R2[4],R3[4],R4[4],R5[4],R6[4],R7[4
],R8[4],R9[4],R10[4],R11[4],R12[4],R13[4],R14[4],R15[4],R16[4],R17[4],R18[4],R
19[4],R20[4],R21[4],R22[4],R23[4],R24[4],R25[4],R26[4],R27[4],R28[4],R29[4],R3
0[4],R31[4]);
reg32
gh5(clk,reset,andRW[5],WriteData,R0[5],R1[5],R2[5],R3[5],R4[5],R5[5],R6[5],R7[5
],R8[5],R9[5],R10[5],R11[5],R12[5],R13[5],R14[5],R15[5],R16[5],R17[5],R18[5],R
19[5],R20[5],R21[5],R22[5],R23[5],R24[5],R25[5],R26[5],R27[5],R28[5],R29[5],R3
0[5],R31[5]);
reg32
gh6(clk,reset,andRW[6],WriteData,R0[6],R1[6],R2[6],R3[6],R4[6],R5[6],R6[6],R7[6
],R8[6],R9[6],R10[6],R11[6],R12[6],R13[6],R14[6],R15[6],R16[6],R17[6],R18[6],R
Nhóm: Page 7



Đồ án cấu trúc máy tính

GVHD: Hồ Viết Việt

19[6],R20[6],R21[6],R22[6],R23[6],R24[6],R25[6],R26[6],R27[6],R28[6],R29[6],R3
0[6],R31[6]);
reg32
gh7(clk,reset,andRW[7],WriteData,R0[7],R1[7],R2[7],R3[7],R4[7],R5[7],R6[7],R7[7
],R8[7],R9[7],R10[7],R11[7],R12[7],R13[7],R14[7],R15[7],R16[7],R17[7],R18[7],R
19[7],R20[7],R21[7],R22[7],R23[7],R24[7],R25[7],R26[7],R27[7],R28[7],R29[7],R3
0[7],R31[7]);
reg32
gh8(clk,reset,andRW[8],WriteData,R0[8],R1[8],R2[8],R3[8],R4[8],R5[8],R6[8],R7[8
],R8[8],R9[8],R10[8],R11[8],R12[8],R13[8],R14[8],R15[8],R16[8],R17[8],R18[8],R
19[8],R20[8],R21[8],R22[8],R23[8],R24[8],R25[8],R26[8],R27[8],R28[8],R29[8],R3
0[8],R31[8]);
reg32
gh9(clk,reset,andRW[9],WriteData,R0[9],R1[9],R2[9],R3[9],R4[9],R5[9],R6[9],R7[9
],R8[9],R9[9],R10[9],R11[9],R12[9],R13[9],R14[9],R15[9],R16[9],R17[9],R18[9],R
19[9],R20[9],R21[9],R22[9],R23[9],R24[9],R25[9],R26[9],R27[9],R28[9],R29[9],R3
0[9],R31[9]);
reg32
gh10(clk,reset,andRW[10],WriteData,R0[10],R1[10],R2[10],R3[10],R4[10],R5[10],R
6[10],R7[10],R8[10],R9[10],R10[10],R11[10],R12[10],R13[10],R14[10],R15[10],R1
6[10],R17[10],R18[10],R19[10],R20[10],R21[10],R22[10],R23[10],R24[10],R25[10]
,R26[10],R27[10],R28[10],R29[10],R30[10],R31[10]);
reg32
gh11(clk,reset,andRW[11],WriteData,R0[11],R1[11],R2[11],R3[11],R4[11],R5[11],R
6[11],R7[11],R8[11],R9[11],R10[11],R11[11],R12[11],R13[11],R14[11],R15[11],R1

6[11],R17[11],R18[11],R19[11],R20[11],R21[11],R22[11],R23[11],R24[11],R25[11]
,R26[11],R27[11],R28[11],R29[11],R30[11],R31[11]);
reg32
gh12(clk,reset,andRW[12],WriteData,R0[12],R1[12],R2[12],R3[12],R4[12],R5[12],R
6[12],R7[12],R8[12],R9[12],R10[12],R11[12],R12[12],R13[12],R14[12],R15[12],R1
6[12],R17[12],R18[12],R19[12],R20[12],R21[12],R22[12],R23[12],R24[12],R25[12]
,R26[12],R27[12],R28[12],R29[12],R30[12],R31[12]);
reg32
gh13(clk,reset,andRW[13],WriteData,R0[13],R1[13],R2[13],R3[13],R4[13],R5[13],R
6[13],R7[13],R8[13],R9[13],R10[13],R11[13],R12[13],R13[13],R14[13],R15[13],R1

Nhóm: Page 8


Đồ án cấu trúc máy tính

GVHD: Hồ Viết Việt

6[13],R17[13],R18[13],R19[13],R20[13],R21[13],R22[13],R23[13],R24[13],R25[13]
,R26[13],R27[13],R28[13],R29[13],R30[13],R31[13]);
reg32
gh14(clk,reset,andRW[14],WriteData,R0[14],R1[14],R2[14],R3[14],R4[14],R5[14],R
6[14],R7[14],R8[14],R9[14],R10[14],R11[14],R12[14],R13[14],R14[14],R15[14],R1
6[14],R17[14],R18[14],R19[14],R20[14],R21[14],R22[14],R23[14],R24[14],R25[14]
,R26[14],R27[14],R28[14],R29[14],R30[14],R31[14]);
reg32
gh15(clk,reset,andRW[15],WriteData,R0[15],R1[15],R2[15],R3[15],R4[15],R5[15],R
6[15],R7[15],R8[15],R9[15],R10[15],R11[15],R12[15],R13[15],R14[15],R15[15],R1
6[15],R17[15],R18[15],R19[15],R20[15],R21[15],R22[15],R23[15],R24[15],R25[15]
,R26[15],R27[15],R28[15],R29[15],R30[15],R31[15]);

reg32
gh16(clk,reset,andRW[16],WriteData,R0[16],R1[16],R2[16],R3[16],R4[16],R5[16],R
6[16],R7[16],R8[16],R9[16],R10[16],R11[16],R12[16],R13[16],R14[16],R15[16],R1
6[16],R17[16],R18[16],R19[16],R20[16],R21[16],R22[16],R23[16],R24[16],R25[16]
,R26[16],R27[16],R28[16],R29[16],R30[16],R31[16]);
reg32
gh17(clk,reset,andRW[17],WriteData,R0[17],R1[17],R2[17],R3[17],R4[17],R5[17],R
6[17],R7[17],R8[17],R9[17],R10[17],R11[17],R12[17],R13[17],R14[17],R15[17],R1
6[17],R17[17],R18[17],R19[17],R20[17],R21[17],R22[17],R23[17],R24[17],R25[17]
,R26[17],R27[17],R28[17],R29[17],R30[17],R31[17]);
reg32
gh18(clk,reset,andRW[18],WriteData,R0[18],R1[18],R2[18],R3[18],R4[18],R5[18],R
6[18],R7[18],R8[18],R9[18],R10[18],R11[18],R12[18],R13[18],R14[18],R15[18],R1
6[18],R17[18],R18[18],R19[18],R20[18],R21[18],R22[18],R23[18],R24[18],R25[18]
,R26[18],R27[18],R28[18],R29[18],R30[18],R31[18]);
reg32
gh19(clk,reset,andRW[19],WriteData,R0[19],R1[19],R2[19],R3[19],R4[19],R5[19],R
6[19],R7[19],R8[19],R9[19],R10[19],R11[19],R12[19],R13[19],R14[19],R15[19],R1
6[19],R17[19],R18[19],R19[19],R20[19],R21[19],R22[19],R23[19],R24[19],R25[19]
,R26[19],R27[19],R28[19],R29[19],R30[19],R31[19]);
reg32
gh20(clk,reset,andRW[20],WriteData,R0[20],R1[20],R2[20],R3[20],R4[20],R5[20],R
6[20],R7[20],R8[20],R9[20],R10[20],R11[20],R12[20],R13[20],R14[20],R15[20],R1

Nhóm: Page 9


Đồ án cấu trúc máy tính

GVHD: Hồ Viết Việt


6[20],R17[20],R18[20],R19[20],R20[20],R21[20],R22[20],R23[20],R24[20],R25[20]
,R26[20],R27[20],R28[20],R29[20],R30[20],R31[20]);
reg32
gh21(clk,reset,andRW[21],WriteData,R0[21],R1[21],R2[21],R3[21],R4[21],R5[21],R
6[21],R7[21],R8[21],R9[21],R10[21],R11[21],R12[21],R13[21],R14[21],R15[21],R1
6[21],R17[21],R18[21],R19[21],R20[21],R21[21],R22[21],R23[21],R24[21],R25[21]
,R26[21],R27[21],R28[21],R29[21],R30[21],R31[21]);
reg32
gh22(clk,reset,andRW[22],WriteData,R0[22],R1[22],R2[22],R3[22],R4[22],R5[22],R
6[22],R7[22],R8[22],R9[22],R10[22],R11[22],R12[22],R13[22],R14[22],R15[22],R1
6[22],R17[22],R18[22],R19[22],R20[22],R21[22],R22[22],R23[22],R24[22],R25[22]
,R26[22],R27[22],R28[22],R29[22],R30[22],R31[22]);
reg32
gh23(clk,reset,andRW[23],WriteData,R0[23],R1[23],R2[23],R3[23],R4[23],R5[23],R
6[23],R7[23],R8[23],R9[23],R10[23],R11[23],R12[23],R13[23],R14[23],R15[23],R1
6[23],R17[23],R18[23],R19[23],R20[23],R21[23],R22[23],R23[23],R24[23],R25[23]
,R26[23],R27[23],R28[23],R29[23],R30[23],R31[23]);
reg32
gh24(clk,reset,andRW[24],WriteData,R0[24],R1[24],R2[24],R3[24],R4[24],R5[24],R
6[24],R7[24],R8[24],R9[24],R10[24],R11[24],R12[24],R13[24],R14[24],R15[24],R1
6[24],R17[24],R18[24],R19[24],R20[24],R21[24],R22[24],R23[24],R24[24],R25[24]
,R26[24],R27[24],R28[24],R29[24],R30[24],R31[24]);
reg32
gh25(clk,reset,andRW[25],WriteData,R0[25],R1[25],R2[25],R3[25],R4[25],R5[25],R
6[25],R7[25],R8[25],R9[25],R10[25],R11[25],R12[25],R13[25],R14[25],R15[25],R1
6[25],R17[25],R18[25],R19[25],R20[25],R21[25],R22[25],R23[25],R24[25],R25[25]
,R26[25],R27[25],R28[25],R29[25],R30[25],R31[25]);
reg32
gh26(clk,reset,andRW[26],WriteData,R0[26],R1[26],R2[26],R3[26],R4[26],R5[26],R

6[26],R7[26],R8[26],R9[26],R10[26],R11[26],R12[26],R13[26],R14[26],R15[26],R1
6[26],R17[26],R18[26],R19[26],R20[26],R21[26],R22[26],R23[26],R24[26],R25[26]
,R26[26],R27[26],R28[26],R29[26],R30[26],R31[26]);
reg32
gh27(clk,reset,andRW[27],WriteData,R0[27],R1[27],R2[27],R3[27],R4[27],R5[27],R
6[27],R7[27],R8[27],R9[27],R10[27],R11[27],R12[27],R13[27],R14[27],R15[27],R1

Nhóm: Page 10


Đồ án cấu trúc máy tính

GVHD: Hồ Viết Việt

6[27],R17[27],R18[27],R19[27],R20[27],R21[27],R22[27],R23[27],R24[27],R25[27]
,R26[27],R27[27],R28[27],R29[27],R30[27],R31[27]);
reg32
gh28(clk,reset,andRW[28],WriteData,R0[28],R1[28],R2[28],R3[28],R4[28],R5[28],R
6[28],R7[28],R8[28],R9[28],R10[28],R11[28],R12[28],R13[28],R14[28],R15[28],R1
6[28],R17[28],R18[28],R19[28],R20[28],R21[28],R22[28],R23[28],R24[28],R25[28]
,R26[28],R27[28],R28[28],R29[28],R30[28],R31[28]);
reg32
gh29(clk,reset,andRW[29],WriteData,R0[29],R1[29],R2[29],R3[29],R4[29],R5[29],R
6[29],R7[29],R8[29],R9[29],R10[29],R11[29],R12[29],R13[29],R14[29],R15[29],R1
6[29],R17[29],R18[29],R19[29],R20[29],R21[29],R22[29],R23[29],R24[29],R25[29]
,R26[29],R27[29],R28[29],R29[29],R30[29],R31[29]);
reg32
gh30(clk,reset,andRW[30],WriteData,R0[30],R1[30],R2[30],R3[30],R4[30],R5[30],R
6[30],R7[30],R8[30],R9[30],R10[30],R11[30],R12[30],R13[30],R14[30],R15[30],R1
6[30],R17[30],R18[30],R19[30],R20[30],R21[30],R22[30],R23[30],R24[30],R25[30]

,R26[30],R27[30],R28[30],R29[30],R30[30],R31[30]);
reg32
gh31(clk,reset,andRW[31],WriteData,R0[31],R1[31],R2[31],R3[31],R4[31],R5[31],R
6[31],R7[31],R8[31],R9[31],R10[31],R11[31],R12[31],R13[31],R14[31],R15[31],R1
6[31],R17[31],R18[31],R19[31],R20[31],R21[31],R22[31],R23[31],R24[31],R25[31]
,R26[31],R27[31],R28[31],R29[31],R30[31],R31[31]);
// phan read du lieu
mux32_32
doc1(ReadRegister1,ReadData1,R0,R1,R2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,R1
3,R14,R15,R16,R17,R18,R19,R20,R21,R22,R23,R24,R25,R26,R27,R28,R29,R30,R3
1);
mux32_32
doc2(ReadRegister2,ReadData2,R0,R1,R2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,R1
3,R14,R15,R16,R17,R18,R19,R20,R21,R22,R23,R24,R25,R26,R27,R28,R29,R30,R3
1);
endmodule
module reg32 (clk, reset,enable, d_in,
d_out0,d_out1,d_out2,d_out3,d_out4,d_out5,d_out6,d_out7,d_out8,
d_out9,d_out10,d_out11,d_out12,d_out13,d_out14,d_out15,d_out16,d_out17,d_out18
Nhóm: Page 11


Đồ án cấu trúc máy tính

GVHD: Hồ Viết Việt

,d_out19,
d_out20,d_out21,d_out22,d_out23,d_out24,d_out25,d_out26,d_out27,d_out28,d_out2
9,d_out30,d_out31);
input clk, reset,enable;

input [31:0] d_in;
output
d_out0,d_out1,d_out2,d_out3,d_out4,d_out5,d_out6,d_out7,d_out8,
d_out9,d_out10,d_out11,d_out12,d_out13,d_out14,d_out15,d_out16,d_out17,d_out18
,d_out19,
d_out20,d_out21,d_out22,d_out23,d_out24,d_out25,d_out26,d_out27,d_out28,d_out2
9,d_out30,d_out31;
D_FF dff0(d_out0 ,d_in[0] ,reset,clk,enable);
D_FF dff1(d_out1 ,d_in[1] ,reset,clk,enable);
D_FF dff2(d_out2 ,d_in[2] ,reset,clk,enable);
D_FF dff3(d_out3 ,d_in[3] ,reset,clk,enable);
D_FF dff4(d_out4 ,d_in[4] ,reset,clk,enable);
D_FF dff5(d_out5 ,d_in[5] ,reset,clk,enable);
D_FF dff6(d_out6 ,d_in[6] ,reset,clk,enable);
D_FF dff7(d_out7 ,d_in[7] ,reset,clk,enable);
D_FF dff8(d_out8 ,d_in[8] ,reset,clk,enable);
D_FF dff9(d_out9 ,d_in[9] ,reset,clk,enable);
D_FF dff10(d_out10 ,d_in[10] ,reset,clk,enable);
D_FF dff11(d_out11 ,d_in[11] ,reset,clk,enable);
D_FF dff12(d_out12 ,d_in[12] ,reset,clk,enable);
D_FF dff13(d_out13 ,d_in[13] ,reset,clk,enable);
D_FF dff14(d_out14 ,d_in[14] ,reset,clk,enable);
D_FF dff15(d_out15 ,d_in[15] ,reset,clk,enable);
D_FF dff16(d_out16 ,d_in[16] ,reset,clk,enable);
D_FF dff17(d_out17 ,d_in[17] ,reset,clk,enable);
D_FF dff18(d_out18 ,d_in[18] ,reset,clk,enable);
D_FF dff19(d_out19 ,d_in[19] ,reset,clk,enable);
D_FF dff20(d_out20 ,d_in[20] ,reset,clk,enable);
D_FF dff21(d_out21 ,d_in[21] ,reset,clk,enable);
D_FF dff22(d_out22 ,d_in[22] ,reset,clk,enable);

D_FF dff23(d_out23 ,d_in[23] ,reset,clk,enable);
D_FF dff24(d_out24 ,d_in[24] ,reset,clk,enable);
D_FF dff25(d_out25 ,d_in[25] ,reset,clk,enable);
D_FF dff26(d_out26 ,d_in[26] ,reset,clk,enable);
D_FF dff27(d_out27 ,d_in[27] ,reset,clk,enable);
D_FF dff28(d_out28 ,d_in[28] ,reset,clk,enable);
D_FF dff29(d_out29 ,d_in[29] ,reset,clk,enable);
D_FF dff30(d_out30 ,d_in[30] ,reset,clk,enable);
D_FF dff31(d_out31 ,d_in[31] ,reset,clk,enable);
endmodule
module D_FF (q, d, reset, clk,enable);
output q;
Nhóm: Page 12


Đồ án cấu trúc máy tính
input d, reset, clk,enable;
reg q;
wire clock;
and a1(clock,clk,enable);
// Indicate that q is stateholding
initial
q=0;
always @(posedge clock or posedge reset)
if (reset)
q = 0; // On reset, set to 0
else
q = d; // Otherwise out = d endmodule
endmodule
module decoder5_32(x,y,regwrite);

input[4:0] x;
input regwrite;
output[31:0] y;
wire[3:0] en;
decoder2_4 z1(x[4:3],en);
decoder3_8e z2(x[2:0],y[31:24],en[3],regwrite);
decoder3_8e z3(x[2:0],y[23:16],en[2],regwrite);
decoder3_8e z4(x[2:0],y[15:8],en[1],regwrite);
decoder3_8e z5(x[2:0],y[7:0],en[0],regwrite);
endmodule
module mux321(in32,out1,sel);
input[31:0] in32;
input[4:0] sel;
output out1;
wire[3:0] ra;
mux8_1 m0(in32[7:0],ra[0],sel[2:0]);
mux8_1 m1(in32[15:8],ra[1],sel[2:0]);
mux8_1 m2(in32[23:16],ra[2],sel[2:0]);
mux8_1 m3(in32[31:24],ra[3],sel[2:0]);
mux4_1 m4(ra[3:0],out1,sel[4:3]);
endmodule
module mux8_1(in8,out1,se);
input[7:0] in8;
input[2:0] se;
output out1;
wire nse0,nse1,nse2,x0,x1,x2,x3,x4,x5,x6,x7,or1,or2;
not n0(nse0,se[0]),n1(nse1,se[1]),n2(nse2,se[2]);
and va0(x0,in8[0],nse2,nse1,nse0),
va1(x1,in8[1],nse2,nse1,se[0]),
va2(x2,in8[2],nse2,se[1],nse0),

va3(x3,in8[3],nse2,se[1],se[0]),
va4(x4,in8[4],se[2],nse1,nse0),
va5(x5,in8[5],se[2],nse1,se[0]),
Nhóm: Page 13

GVHD: Hồ Viết Việt


Đồ án cấu trúc máy tính

GVHD: Hồ Viết Việt

va6(x6,in8[6],se[2],se[1],nse0),
va7(x7,in8[7],se[2],se[1],se[0]);
or c1(or1,x0,x1,x2,x3),
c2(or2,x4,x5,x6,x7),
c3(out1,or1,or2);
endmodule
module mux4_1(x,y,c);
input[3:0] x;
input[1:0] c;
output y;
wire and1,and2,and3,and4,ca1,ca2;
not d1(ca1,c[1]);
not d2(ca2,c[0]);
and d3(and1,x[0],ca1,ca2);
and d4(and2,x[1],ca1,c[0]);
and d5(and3,x[2],c[1],ca2);
and d6(and4,x[3],c[1],c[0]);
or d7(y,and1,and2,and3,and4);

endmodule
module mux32_32(read,readata,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);
input[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;
input[4:0] read;
output[31:0] readata;
mux321 n0(r0,readata[0],read);
mux321 n1(r1,readata[1],read);
mux321 n2(r2,readata[2],read);
mux321 n3(r3,readata[3],read);
mux321 n4(r4,readata[4],read);
mux321 n5(r5,readata[5],read);
mux321 n6(r6,readata[6],read);
mux321 n7(r7,readata[7],read);
mux321 n8(r8,readata[8],read);
mux321 n9(r9,readata[9],read);
mux321 n10(r10,readata[10],read);
mux321 n11(r11,readata[11],read);
mux321 n12(r12,readata[12],read);
mux321 n13(r13,readata[13],read);
mux321 n14(r14,readata[14],read);
mux321 n15(r15,readata[15],read);
mux321 n16(r16,readata[16],read);
mux321 n17(r17,readata[17],read);
mux321 n18(r18,readata[18],read);
mux321 n19(r19,readata[19],read);
Nhóm: Page 14



Đồ án cấu trúc máy tính
mux321 n20(r20,readata[20],read);
mux321 n21(r21,readata[21],read);
mux321 n22(r22,readata[22],read);
mux321 n23(r23,readata[23],read);
mux321 n24(r24,readata[24],read);
mux321 n25(r25,readata[25],read);
mux321 n26(r26,readata[26],read);
mux321 n27(r27,readata[27],read);
mux321 n28(r28,readata[28],read);
mux321 n29(r29,readata[29],read);
mux321 n30(r30,readata[30],read);
mux321 n31(r31,readata[31],read);
endmodule
module decoder2_4(vao2,ra4);
input[1:0] vao2;
output[3:0] ra4;
wire nv1,nv2;
not x1(nv1,vao2[1]), x2(nv2,vao2[0]);
and x3(ra4[0],nv1,nv2);
and x4(ra4[1],nv1,vao2[0]);
and x5(ra4[2],vao2[1],nv2);
and x6(ra4[3],vao2[1],vao2[0]);
endmodule
module decoder3_8e(vao3,ra8,ena,regwrite);
input[2:0] vao3;
input ena,regwrite;
output[7:0] ra8;

wire nv0,nv1,vn2;
not x1(nv0,vao3[0]),
x2(nv1,vao3[1]),
x3(nv2,vao3[2]);
and x4(ra8[0],regwrite,ena,nv2,nv1,nv0),
x5(ra8[1],regwrite,ena,nv2,nv1,vao3[0]),
x6(ra8[2],regwrite,ena,nv2,vao3[1],nv0),
x7(ra8[3],regwrite,ena,nv2,vao3[1],vao3[0]),
x8(ra8[4],regwrite,ena,vao3[2],nv1,nv0),
x9(ra8[5],regwrite,ena,vao3[2],nv1,vao3[0]),
x10(ra8[6],regwrite,ena,vao3[2],vao3[1],nv0),
x11(ra8[7],regwrite,ena,vao3[2],vao3[1],vao3[0]);
endmodule

4. Kết quả mô phỏng

Nhóm: Page 15

GVHD: Hồ Viết Việt


Đồ án cấu trúc máy tính

GVHD: Hồ Viết Việt

Project 2 : MIPS ALU
1. Giới thiệu :
- Trong project này chúng ta xây dựng khối ALU 32 bits với nhiệm vụ thực
hiện các lệnh số học đơn giản như ADD, SUB , XOR , SLT .
- ALU 32 bits được xây dựng từ 32 bộ alu 1 bit

- Đây là khối xử lý mọi công việc tính toán của bộ vi xử lý .
2. Sơ đồ khối :
Bus A

32

32
32 bit ALU
Bus B

Zero

32

Overflow
CarryOut

ALU
Control

Nhóm: Page 16

Output


Đồ án cấu trúc máy tính

GVHD: Hồ Viết Việt

ALU CONTROL LINES

00
01
10
11

FUNCTION
Add
XOR
Sub
SLT

Nguyên lý hoạt động của khối ALU:
- Khối ALU có 2 đầu vào A,B mỗi đầu vào 32 bits.
- Khối ALU sẽ dựa vào 2 bits ALU Control mà sẽ xác định phép toán cần xử lý
Vd: ALU Control = 10 thì sẽ thực hiện phép A – B
- Kết quả các phép toán sẽ được đưa ra ở Output 32 bits
- Ngoài ra còn có các bits cờ :
+ Zero : sẽ bằng 1 khi kết quả ở đầu ra Output = 0 và bằng 0 khi Output
khác 0
+ Overflow : sẽ được set bằng 1 khi thực hiện các phép toán ADD , SUB có
xảy ra tràn.
+ Carryout : sẽ được set bằng 1 trong các phép toán ADD, SUB khi xảy ra có
nhớ ở bits 31
+ Negative : sẽ được set bằng 1 khi kết quả sau khi tính toán là một số âm .
3. Xác định các cờ :
3.1 Xác định cờ Negative :
- Để xác định cờ Negative ta chỉ cần dựa vào bits MSB chính là bits thứ 31 của
output . Nếu bits thứ 31 này bằng 1 thì kết quả là số âm và cờ Negative được
set thành 1 và ngược lại.
3.2 Xác định cờ Zero :

- Để xác định cờ Zero thì ta sẽ OR 32 bits của đầu ra Output nếu kết quả bằng
0 thì cờ Zero được set bằng 1 và nếu khác 0 thì sẽ set bằng 0.
3.3 Xác định cờ Overflow :
- Cờ Overflow chỉ xuất hiện trong các trường hợp sau :

Phép toán
A+B
A+B
A–B
A -- B

A
≥0
<0
≥0
<0

B
≥0
<0
<0
≥0

Kết quả
<0
≥0
<0
≥0

-


Để xác định Overflow ta chỉ cần quan tâm đến cờ nhớ vào Cin và cờ nhớ ra

-

Cout ở bits MSB tức bits thứ 31.
Khi đó cờ Overflow là phép Xor giữa Cin và Cout.

Nhóm: Page 17


Đồ án cấu trúc máy tính

A+B < 0
(-A) + (-B) > 0
A – (-B) < 0
(-A) – B > 0

A
0
1
0
1

GVHD: Hồ Viết Việt

B
0
1
1

0

Binvert
0
0
1
1

Bmux
0
1
0
1

Cin
1
0
1
0

Cout
0
1
0
1

Sum
1
0
1

0

Overflow
1
1
1
1

Cin
1
0

Cout
0
1

Sum
1
0

Overflow
1
1

Bảng thu gọn

A+B < 0
(-A) + (-B) > 0

3.4


A
0
1

B
X
X

Binvert
X
X

Bmux
0
1

 Overflow = ~A*~Bmux*Cin + A*Bmux*~Cin
Cờ Carryout :

- Cờ carryout của bộ ALU 1 bit thứ 31
4. Xác định bits slt :
- Lệnh slt $t1,$t2,$t3
+ Bit slt sẽ được set 1 nếu rs < rt và ngược lại.
+ Do rs < rt => rs – rt < 0 vì vậy bits MSB của Output sẽ bằng 1 , ta dựa vào
đây để mà xác định bits slt .
+ Có 2 trường hợp xảy ra :
Khi không Overflow thì rs –rt < 0 => MSB = 1
Khi có Overflow thì rs – rt < 0
=> MSB = 0

 Vd : 5ten – 6ten = 0101 – 0110 = 0101 + 1010 = 1111 (ok!)
-7ten – 6ten = 1001 – 0110 = 1001 + 1010 = 0011 (overflow!)
=> bit slt= MSB xor Overflow

Bảng thể hiện mối quan hệ giữa Slt và MSB , Overflow

Nhóm: Page 18


Đồ án cấu trúc máy tính

GVHD: Hồ Viết Việt

A

B

Cin

MSB

Overflow

Slt

0

0

0


0

0

0

0

0

1

1

1

0

0

1

0

1

0

1


0

1

1

0

0

0

1

0

0

1

0

1

1

0

1


0

0

0

1

1

0

0

1

1

1

1

1

1

0

1


Bảng Karnaugh

AB

AB

AB

AB

Cin

00

01

11

10

0

0

1

1

1


1

0

0

1

0

 Slt = AB + A*~Cin + B*~Cin

Nhóm: Page 19


Đồ án cấu trúc máy tính
5. ALU 1 bit :
5.1 Carry-Lookaheader

Nhóm: Page 20

GVHD: Hồ Viết Việt


Đồ án cấu trúc máy tính

-

GVHD: Hồ Viết Việt


Sơ đồ trên sử dụng Ripple Carry tức là sử dụng theo kiểu nối tiếp nên sẽ làm
chậm quá trình xử lý tính toán của khối ALU
 Vì vậy ta sẽ sử dụng phương pháp Carry Lookahead sẽ giúp cải thiện quá
trình tính toán vì cờ nhớ Carry được sử dụng theo phương pháp song song
• Ta có bộ cộng full adder 1bit :

Nhóm: Page 21


Đồ án cấu trúc máy tính



GVHD: Hồ Viết Việt

Đặt gi = ai bi

pi = a i + bi


c1 = g 0 + p0 • c0
c 2 = g1 + p1 • g 0 + p1 • p 0 • c0
c3 = g 2 + p 2 • g1 + p 2 • p1 • g 0 + p 2 • p1 • p 0 • c 0
……..
c 4 = g 3 + p3 • g 2 + p3 • p 2 • g1 + p3 • p 2 • p1 • g 0 + p3 • p 2 • p1 • p 0 • c0
-

Carry Lookaheader 16 bit xây dựng từ bộ 4 bits .
Vì vậy bộ adder 32 bit của ALU sẽ gồm 2 bộ Carry Lookaheader 16 bits


Nhóm: Page 22


Đồ án cấu trúc máy tính

GVHD: Hồ Viết Việt
CarryIn

a0
b0
a1
b1
a2
b2
a3
b3

CarryIn
Result0--3
ALU0
P0
G0

pi
gi
Carry-lookahead unit
C1

a4

b4
a5
b5
a6
b6
a7
b7

a8
b8
a9
b9
a10
b10
a11
b11

a12
b12
a13
b13
a14
b14
a15
b15

ci + 1

CarryIn
Result4--7

ALU1
P1
G1

pi + 1
gi + 1
C2

ci + 2

CarryIn
Result8--11
ALU2
P2
G2

pi + 2
gi + 2
C3

ci + 3

CarryIn
Result12--15
ALU3
P3
G3

pi + 3
gi + 3

C4

ci + 4

CarryOut

5.2 Mux 4-1 :
-

Trong bộ Alu 1 bit ta phải sử dụng bộ mux 4-1 để chọn đầu ra của một trong 4 phép
toán add , sub , xor , slt . Bộ mux sẽ dựa vào 2 bit ALU Control mà sẽ xác định đầu
ra

Nhóm: Page 23


Đồ án cấu trúc máy tính

GVHD: Hồ Viết Việt

6. Code :
`timescale 1 ps / 100 fs
module ALUStimulus();
parameter ClockDelay = 50000;
reg [31:0] BussA, BussB;
reg [1:0] ALUControl;
wire [31:0] Output;
wire zero, overflow, CarryOut, negative;
ALU alu1(Output, CarryOut, zero, overflow, negative, BussA, BussB, ALUControl);
initial

begin
$monitor($time, " ALUControl=%b, BussA=%h, BussB=%h, Output=%h, Zero=%b, CarryOut=
%b, Overflow=%b, Negative=%b",
ALUControl,BussA,BussB,Output,zero,CarryOut,overflow,negative);
/* Addition unit testing */
ALUControl=00;
BussA=32'h00000DEF; BussB=32'h00000ABC; // Should output 000018AB
#(ClockDelay);
BussA=32'h00001234; BussB=32'h00000105; // Should output 00001339
#(ClockDelay);
BussA=32'h7FFFFFFF; BussB=32'h00000001; // Should output 80000000, overflow, negative
#(ClockDelay);
BussA=32'hC0000000; BussB=32'h60000000; // output 20000000 , carry
#(ClockDelay);
/* Subtraction unit testing */
ALUControl=10;
BussA=32'h00000DEF; BussB=32'h00000ABC; // Should output 00000333
#(ClockDelay);
BussA=32'h00001234; BussB=32'h00000105; // Should output 0000112F
#(ClockDelay);
BussA=32'h80000000; BussB=32'h00000001; // Should output 7FFFFFFF, overflow
#(ClockDelay);
BussA=32'h00000003; BussB=32'h00000007; // carry , negative , fffffffc
#(ClockDelay);
BussA=32'h0000125A; BussB=32'h0000125A; // output 0 , zero
#(ClockDelay);
BussA=32'h40000000; BussB=32'hA0000000; // Should output A0000000, overflow , carry ,negative
#(ClockDelay);
/* Xor */
ALUControl=01;

BussA=32'h12000042; BussB=32'h51240002; // output 43240040
#(ClockDelay);
BussA=32'h0AB0F04D; BussB=32'h12EC897E; // output 185C7933
#(ClockDelay);
end
endmodule
// ALU
module ALU(Output, CarryOut, zero, overflow, negative, BussA, BussB, ALUControl);
input[31:0]BussA,BussB;
input[1:0] ALUControl;
output[31:0] Output;
output CarryOut, zero, overflow, negative;
wire [15:0] p0,p1,g0,g1;
wire[15:1] ci0,ci1;
wire gnd=0;
wire nega=1;
wire B31mux;
alu_1b f0(BussA[0],BussB[0],ALUControl[1],ALUControl[1],ALUControl,slt,g0[0],p0[0],Output[0]);
alu_1b f1(BussA[1],BussB[1],ALUControl[1],ci0[1],ALUControl,gnd,g0[1],p0[1],Output[1]);
alu_1b f2(BussA[2],BussB[2],ALUControl[1],ci0[2],ALUControl,gnd,g0[2],p0[2],Output[2]);
alu_1b f3(BussA[3],BussB[3],ALUControl[1],ci0[3],ALUControl,gnd,g0[3],p0[3],Output[3]);
alu_1b f4(BussA[4],BussB[4],ALUControl[1],ci0[4],ALUControl,gnd,g0[4],p0[4],Output[4]);
alu_1b f5(BussA[5],BussB[5],ALUControl[1],ci0[5],ALUControl,gnd,g0[5],p0[5],Output[5]);

Nhóm: Page 24


Đồ án cấu trúc máy tính

GVHD: Hồ Viết Việt


alu_1b f6(BussA[6],BussB[6],ALUControl[1],ci0[6],ALUControl,gnd,g0[6],p0[6],Output[6]);
alu_1b f7(BussA[7],BussB[7],ALUControl[1],ci0[7],ALUControl,gnd,g0[7],p0[7],Output[7]);
alu_1b f8(BussA[8],BussB[8],ALUControl[1],ci0[8],ALUControl,gnd,g0[8],p0[8],Output[8]);
alu_1b f9(BussA[9],BussB[9],ALUControl[1],ci0[9],ALUControl,gnd,g0[9],p0[9],Output[9]);
alu_1b f10(BussA[10],BussB[10],ALUControl[1],ci0[10],ALUControl,gnd,g0[10],p0[10],Output[10]);
alu_1b f11(BussA[11],BussB[11],ALUControl[1],ci0[11],ALUControl,gnd,g0[11],p0[11],Output[11]);
alu_1b f12(BussA[12],BussB[12],ALUControl[1],ci0[12],ALUControl,gnd,g0[12],p0[12],Output[12]);
alu_1b f13(BussA[13],BussB[13],ALUControl[1],ci0[13],ALUControl,gnd,g0[13],p0[13],Output[13]);
alu_1b f14(BussA[14],BussB[14],ALUControl[1],ci0[14],ALUControl,gnd,g0[14],p0[14],Output[14]);
alu_1b f15(BussA[15],BussB[15],ALUControl[1],ci0[15],ALUControl,gnd,g0[15],p0[15],Output[15]);
alu_1b f16(BussA[16],BussB[16],ALUControl[1],ci16,ALUControl,gnd,g1[0],p1[0],Output[16]);
alu_1b f17(BussA[17],BussB[17],ALUControl[1],ci1[1],ALUControl,gnd,g1[1],p1[1],Output[17]);
alu_1b f18(BussA[18],BussB[18],ALUControl[1],ci1[2],ALUControl,gnd,g1[2],p1[2],Output[18]);
alu_1b f19(BussA[19],BussB[19],ALUControl[1],ci1[3],ALUControl,gnd,g1[3],p1[3],Output[19]);
alu_1b f20(BussA[20],BussB[20],ALUControl[1],ci1[4],ALUControl,gnd,g1[4],p1[4],Output[20]);
alu_1b f21(BussA[21],BussB[21],ALUControl[1],ci1[5],ALUControl,gnd,g1[5],p1[5],Output[21]);
alu_1b f22(BussA[22],BussB[22],ALUControl[1],ci1[6],ALUControl,gnd,g1[6],p1[6],Output[22]);
alu_1b f23(BussA[23],BussB[23],ALUControl[1],ci1[7],ALUControl,gnd,g1[7],p1[7],Output[23]);
alu_1b f24(BussA[24],BussB[24],ALUControl[1],ci1[8],ALUControl,gnd,g1[8],p1[8],Output[24]);
alu_1b f25(BussA[25],BussB[25],ALUControl[1],ci1[9],ALUControl,gnd,g1[9],p1[9],Output[25]);
alu_1b f26(BussA[26],BussB[26],ALUControl[1],ci1[10],ALUControl,gnd,g1[10],p1[10],Output[26]);
alu_1b f27(BussA[27],BussB[27],ALUControl[1],ci1[11],ALUControl,gnd,g1[11],p1[11],Output[27]);
alu_1b f28(BussA[28],BussB[28],ALUControl[1],ci1[12],ALUControl,gnd,g1[12],p1[12],Output[28]);
alu_1b f29(BussA[29],BussB[29],ALUControl[1],ci1[13],ALUControl,gnd,g1[13],p1[13],Output[29]);
alu_1b f30(BussA[30],BussB[30],ALUControl[1],ci1[14],ALUControl,gnd,g1[14],p1[14],Output[30]);
alu_1b f31(BussA[31],BussB[31],ALUControl[1],ci1[15],ALUControl,gnd,g1[15],p1[15],Output[31]);
// xac dinh cac bit g,p cua 2 bo 16b
calook_16b d1(ALUControl[1],p0,g0,ci0,gg0,pg0);
calook_16b d2(ci16,p1,g1,ci1,gg1,pg1);

// xac dinh carryout
and and0(pre_c16,pg0,ALUControl[1]);
or or0(ci16,pre_c16,gg0); // c1= g0 + p0*c0
and and1(pre_c32_1,pg1,gg0); // c2= g1+ p1*g0 + p1*p0*c0
and and2(pre_c32_2,pg0,pg1,ALUControl[1]);
or or1(carryOut,pre_c32_1,pre_c32_2,gg1);
chonb pl(carryOut,ALUControl[1],CarryOut0);
not an1(notcary,ALUControl[0]); // de loai bo carry trong xor va slt ko can hien thi
and an2(CarryOut,notcary,CarryOut0);
// xac dinh bit slt
chonb q4(BussB[31],ALUControl[1],B31mux);
sslt q1(BussA[31],B31mux,ci1[15],slt);
// xac dinh flag zero
testzero q2(Output,zero);
// xac dinh overflow
oveflows q3(BussA[31],B31mux,ci1[15],overflow0);
and t1(overflow,notcary,overflow0);
// xac dinh negative
and an(negative,Output[31],nega);
endmodule
module alu_1b(a,b,bsel,cin,opcode,slt,g,p,result);
input a,b,bsel,cin,slt;
input[1:0] opcode;
output g,p,result;
wire rxor,bchon;
chonb f1(b,bsel,bchon);
pfa f2(a,bchon,cin,g,p,sum);
xor s(rxor,a,bchon);
mux4_1 f3({slt,sum,rxor,sum},result,opcode);
endmodule

module testzero(result,zeroflag);

Nhóm: Page 25


×