Tải bản đầy đủ (.docx) (21 trang)

đồ án thiết kế bộ MIPS 32 từ 32 file thanh ghi sử dụng verilog

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 (751.45 KB, 21 trang )

Báo cáo Đồ án môn học: Cấu trúc máy tính
Nhóm 4 – Nhóm học phần 40

LỜI CAM ĐOAN
Chúng em xin cam đoan nội dung của đồ án này không phải là bản sao
chép của bất cứ đồ án hoặc công trình đã có từ trước.

Chữ kí của nhóm:

1


Báo cáo Đồ án môn học: Cấu trúc máy tính
Nhóm 4 – Nhóm học phần 40

MỤC LỤC
1. Tóm tắt yêu cầu của bài Lab1
2. Phần thiết kế thực hiện trên Verilog
3. Hình ảnh mô phỏng

2


Báo cáo Đồ án môn học: Cấu trúc máy tính
Nhóm 4 – Nhóm học phần 40

PHẦN MỞ ĐẦU
Lab1: Design a MIPS 32 by 32 Register File
Nội dung Đồ án:
Thiết kế bộ MIPS 32 từ 32 file thanh ghi sử dụng Verilog. 32 file thanh ghi
này là một mảng gồm 32 thanh ghi 32-bit khác nhau.


Tài liệu tham khảo: Computer Organization and Design 4th edition của tác
giả: Patterson and Hennessy.
Phương án thực hiện:
Nghiên cứu Verilog từ các tài liệu sau đó dựa vào hiểu biết của mình, thiết
kế, mô phỏng theo yêu cầu của đồ án. Dựa trên số liệu th ực tế, gi ải thích
được hình ảnh mô phỏng. Từ đó rút ra những kết luận có tính chuyên môn
sâu, nhằm phát triển hướng đề tài ra quy mô rộng hơn

3


Báo cáo Đồ án môn học: Cấu trúc máy tính
Nhóm 4 – Nhóm học phần 40

1. Tóm tắt yêu cầu của bài Lab1
1.1 Yêu cầu chung
* Register File gồm 32 thanh ghi, mỗi thanh ghi ch ứa 32 bits.
* Các thanh ghi này phải được xậy dựng từ DFF.
* Đặc biệt, thanh ghi Zero luôn có ngõ ra bằng 0 mặc cho giá trị bất kỳ nào
được ghi vào nó.
* Thiết kế dùng cấu trúc lệnh Structural.
* Các cổng logic không vượt quá 4 ngõ vào.
*Delay 50ps.
1.2 Sơ đồ khối

- Cấu tạo 1 file thanh ghi bao gồm:
+ 32 thanh ghi 32 bit, riêng thanh ghi zero luôn mang giá tr ị 0.
+ Có 2 ngõ vào chọn thanh ghi đọc (Read Register1 và Read
Register2) và 2 ngõ ra dữ liệu tương ứng (Read Data1 và Read Data2) khi
đọc file thanh ghi.

+ Có 1 ngõ vào chọn thanh ghi để ghi dữ liệu (Write Register ), 1 ngõ
vào cho phép ghi (RegWrite) và một ngõ vào dữ liệu (Write Data) khi ghi
vào file thanh ghi.

4


Báo cáo Đồ án môn học: Cấu trúc máy tính
Nhóm 4 – Nhóm học phần 40

Sơ đồ chi tiết của 1 file thanh ghi:

1.3 Cách thực hiện
Xây dựng file thanh ghi:
Mỗi thanh ghi là một mảng của 32 DFF. Ngõ vào D của DFF t ương ứng v ới
1 bit trong đường dữ liệu 32 bit. Ngõ ra Q sẽ tương ứng v ới 1 bit trong
5


Báo cáo Đồ án môn học: Cấu trúc máy tính
Nhóm 4 – Nhóm học phần 40

đường dữ liệu ra 32 bit. Giá trị của ngõ ra Q sẽ giống ngõ vào n ếu giá tr ị
cho phép ghi Enable của D_FF bằng 1. Tín hiệu cho phép ghi c ủa D_FF đ ược
kết nối với cùng 1 tín hiệu cho phép ghi WriteEnable tín hiệu ngõ vào.
DFF có tín hiệu clock để đồng bộ các thanh ghi. Tín hi ệu clock và tín hi ệu
WriteEnable là những tín hiệu riêng biệt. Clock là m ột tín hi ệu tu ần hoàn
và ổn định, do đó được dùng để điều chỉnh tín hiệu cho phép ghi, đ ảm b ảo
quá trình ghi của các thanh ghi là chính xác.
2. Nội dung thiết kế

Từ sơ đồ chi tiết cho thấy, thiết kế một file thanh ghi yêu cầu:
+ 32 thanh ghi được cấu tạo từ các DFF
+ 1 bộ giải mã 5:12 điều khiển ghi dữ liệu
+ 2 bộ Multiplexer 32x32 to 32
2.1 Thiết kế bộ giải mã 5:32
- Yêu cầu của khối mạch cần thiết kế là xuất ra tín hiệu điều khiển ghi dữ liệu vào
các thanh ghi, với đầu vào là 5 bits để chọn thanh ghi, với tín hiệu điều khiển ghi
RegWrite.
- Để thiết kế bộ giải mã 5:32, ta xây dựng từ các bộ giãi mã 2:4 và 3:8
2.1.1 Mạch giải mã 1:2

Code Verilog:
module demux1_2(out, sel, in);
input in, sel;
output [1:0]out;
buf #50 gate01(bsel, sel);
not #50 gate02(nsel, sel);
and #50 gate03(out[0], nsel, in);
and #50 gate04(out[1], bsel, in);
endmodule

6


Báo cáo Đồ án môn học: Cấu trúc máy tính
Nhóm 4 – Nhóm học phần 40

Kết quả mô phỏng trên Quartus :

2.1.2 Mạch giải mã 2:4


Sử dụng bộ giải mã 1:2 ở trên để xây dựng bộ giải mã 2:4
Code Verilog:
module demux1_4(out, sel, in);
input in;
input [1:0]sel;
output [3:0]out;
wire [1:0]tmp;
demux1_2 demux01(tmp[1:0], sel[1], in);
demux1_2 demux02(out[1:0], sel[0], tmp[0]);
demux1_2 demux03(out[3:2], sel[0], tmp[1]);
endmodule

7


Báo cáo Đồ án môn học: Cấu trúc máy tính
Nhóm 4 – Nhóm học phần 40

Kết quả mô phỏng trên Quartus:

2.1.3 Mạch giải mã 3:8

Sử dụng 1 bộ giải mã 1:2 và 2 bộ giải mã 2:4 để xây dựng bộ gi ải mã 3:8
module demux1_8(out, sel, in);
input in;
input [2:0]sel;
output [7:0]out;
wire [1:0]tmp;
demux1_2 demux01(tmp[1:0], sel[2], in);

demux1_4 demux02(out[3:0], sel[1:0],
tmp[0]);
demux1_4 demux03(out[7:4], sel[1:0], tmp[1]);
endmodule

8


Báo cáo Đồ án môn học: Cấu trúc máy tính
Nhóm 4 – Nhóm học phần 40

Kết quả mô phỏng trên Quartus:

2.1.4 Mạch giải mã 5:12

9


Báo cáo Đồ án môn học: Cấu trúc máy tính
Nhóm 4 – Nhóm học phần 40

Code Verilog:
Sử dụng 1 bộ giải mã 2:4 và 4 bộ giải mã 3:8 để xây dựng bộ gi ải mã 5:32

10


Báo cáo Đồ án môn học: Cấu trúc máy tính
Nhóm 4 – Nhóm học phần 40


module demux1_32(out, sel, in);
input in;
input [4:0]sel;
output [31:0]out;
wire [3:0]tmp;
demux1_4 demux01(tmp[3:0], sel[4:3], in);
demux1_8 demux02(out[7:0], sel[2:0], tmp[0]);
demux1_8 demux03(out[15:8], sel[2:0],
tmp[1]);
demux1_8 demux04(out[23:16], sel[2:0],
tmp[2]);
demux1_8 demux05(out[31:24], sel[2:0],
tmp[3]);
endmodule
Kết quả mô phỏng trênQuartus

2.2

Thiết kế 1 thanh ghi 32 bit:

- Theo cấu trúc của file thanh ghi ta thiết kế thì nó bao gồm 32 thanh ghi, mà
mỗi thanh ghi là gồm 32 bit, mỗi bit lại được tạo bởi 1 DFF. Do đó ta phải trải qua các
bước sau:
11


Báo cáo Đồ án môn học: Cấu trúc máy tính
Nhóm 4 – Nhóm học phần 40

+ Xây dựng 1 bit từ DFF.

+ Xây dựng 1 thanh ghi 32 bit từ 32 DFF.
2.2.1 Xây dựng 1 bit từ DFF:

-

-

Bảng trạng thái:

Dn

Qn+1

0
1

0
1

Phương trình logic của DFF : Qn+1 = Dn

Code Verilog thực hiện 1 DFF
module D_FF(q,d,reset,en,clk);
output q;
input d,reset,clk,en;
reg q;
always @(posedge clk or posedge
reset)
if (reset) q=0;
else q=d;

endmodule
2.2.2 Xây dựng một thanh ghi 32 bit:
- Ở trên ta đã thực hiện tạo 1 bit của thanh ghi, do đó chỉ cần dùng module trên
tạo ra 32 đối tượng rồi ghép lại ta được 1 thanh ghi 32 bits:
2.2.3 Xây dựng thanh ghi zero:
- Thanh ghi zero là thanh ghi luôn luôn đọc ra giá trị 0 và không cho ghi giá trị
nào lên trên thanh ghi đó.
Code Verilog :
module ZeroReg(q, d, reset, clk);
input clk, reset;
12


Báo cáo Đồ án môn học: Cấu trúc máy tính
Nhóm 4 – Nhóm học phần 40

input [31:0]d;
output [31:0]q;
wire rst;
wire [31:0]data;
assign rst = 1'b1;
assign data = 32'h00;
genvar i;
generate
for(i = 0; i < 32; i = i + 1)
begin: reg_net2
D_FF DFFZ(q[i], data[i], rst, clk);
end
endgenerate
endmodule


Kết quả mô phỏng trên Quartus:

13


Báo cáo Đồ án môn học: Cấu trúc máy tính
Nhóm 4 – Nhóm học phần 40

2.2.4 Xây dựng 31 thanh ghi còn lại
Code Verilog:
module NormalReg(q, d, reset, clk);
input [31:0]d;
input clk, reset;
output
[31:0]q;
genvar i;
generate
for(i = 0; i < 32; i = i + 1)
begin: reg_net
D_FF D_FFN(q[i], d[i], reset, clk);
end
endgenerate
endmodule

Kết quả mô phỏng
trên Quartus
2.3 Thiết kế bộ
Multiplexor
32x32 to 32

- Bộ Multiplexor
32x32 to 32 có
32 ngõ dữ liệu
đầu vào, mỗi
ngõ dữ liệu có
14


Báo cáo Đồ án môn học: Cấu trúc máy tính
Nhóm 4 – Nhóm học phần 40

32 bit. Dữ liệu ngõ ra Read data có 32 bit bằng m ột trong số các ngõ
vào. 5 bit của Read Register sẽ quyết định ngõ dữ liệu đầu vào nào sẽ
được truyền đến đầu ra

- Để thiết kế bộ Multiplexor 32x32 to 32 đầu tiền ra phải thiết kế bộ
Multiplexor 32 to 1
2.3.1 Bộ Multiplexor 2 to1
Code Verilog
module mux_2_1(y, sel, x);
input sel;
input [1:0]x;
output y;
15


Báo cáo Đồ án môn học: Cấu trúc máy tính
Nhóm 4 – Nhóm học phần 40

// For timming problem

buf #50 buf0(bsel, sel);
// Implementation
not #50 not0(nsel, sel);
and #50 and0(b0, nsel, x[0]);
and #50 and1(b1, bsel, x[1]);
or #50 or0 (y, b0, b1);
endmodule
Kết quả mô phỏng trên Quartus :

2.3.2 Bộ Multiplexor 4 to 1
Sử dụng 3 bộ Multiplexor 2 to 1 để xây dựng bộ Multiplexor 4 to 1
Code Verilog
module mux_4_1(y, sel, x);
input [3:0]x;
input [1:0]sel;
output y;
wire [1:0]b;
mux_2_1 mux20(b[0], sel[0], x[1:0]);
mux_2_1 mux21(b[1], sel[0], x[3:2]);
mux_2_1 mux22(y, sel[1], b[1:0]);
endmodule
Kết quả mô phỏng trên Quartus

16


Báo cáo Đồ án môn học: Cấu trúc máy tính
Nhóm 4 – Nhóm học phần 40

2.3.3 Bộ Multiplexor 8 to 1

Sử dụng 2 bộ Multiplexor 4 to 1 và 1 bộ Multiplexor 2 to 1 để xây
dựng bộ Multiplexor 8 to 1
Code Verilog
module mux_8_1(y, sel, x);
input [7:0]x;
input [2:0]sel;
output y;
wire [1:0]b;
mux_4_1 mux40(b[0], sel[1:0], x[3:0]);
mux_4_1 mux41(b[1], sel[1:0], x[7:4]);
mux_2_1 mux42(y,
sel[2], b[1:0]);
endmodule
Kết quả mô phỏng trên Quartus

2.3.4 Bộ Multiplexor 32 to 1
17


Báo cáo Đồ án môn học: Cấu trúc máy tính
Nhóm 4 – Nhóm học phần 40

Sử dụng 4 bộ Muxtiplexor 8 to 1 và 1 bộ Multiplexor 4 to 1 đẻ xây
dựng bộ Multiplexor 32 to 1
Code Verilog
module mux_32_1(y, sel, x);
input [31:0]x;
input [4:0]sel;
output y;
wire [3:0]b;

mux_8_1 mux80(b[0], sel[2:0], x[7:0]);
mux_8_1 mux81(b[1], sel[2:0], x[15:8]);
mux_8_1 mux82(b[2], sel[2:0], x[23:16]);
mux_8_1 mux83(b[3], sel[2:0], x[31:24]);
mux_4_1 mux84(y, sel[4:3], b[3:0]);
endmodule
Kết quả mô phỏng trên Quartus

3. Xây dựng module Register file hoàn chỉnh:

18


Báo cáo Đồ án môn học: Cấu trúc máy tính
Nhóm 4 – Nhóm học phần 40

Sử dụng các module đã được xây dựng ở trên để thiết kế tập thanh ghi hoàn
chỉnh
Code Verilog
module regfile( ReadData1, ReadData2, WriteData, ReadRegister1,
ReadRegister2, WriteRegister, RegWrite, clk);
input [31:0]WriteData;
input [4:0] ReadRegister1, ReadRegister2, WriteRegister;
input RegWrite, clk;
output [31:0] ReadData1, ReadData2;
wire reset;
wire [31:0]WriteEn, clock;
wire [31:0]RegOut[31:0];
wire [31:0]MuxIn[31:0];
// Default

assign reset = 1'b0;
genvar i, k;
generate
for(k = 1; k< 32; k = k+1) begin: netClock
and #50 GateEnable(clock[k], clk, WriteEn[k]);
end
endgenerate
/* Block 1: 5 to 32 decoder */
demux1_32 decoder(WriteEn, WriteRegister, RegWrite);
/* Block 2: 32 register 32-bit */
ZeroReg RegisterZ(RegOut[0], WriteData, reset, clock);
generate
for(k = 1; k< 32; k = k+1) begin: netNormalReg
NormalReg RegisterN(RegOut[k], WriteData, reset, clock[k]);
end
endgenerate
/* Block 3: Multiplexer 32x32 */
generate
for(i = 0; i< 32; i = i+1) begin: netMux32
19


Báo cáo Đồ án môn học: Cấu trúc máy tính
Nhóm 4 – Nhóm học phần 40

for(k = 0; k< 32; k = k+1) begin: net3
assign MuxIn[i][k] = RegOut[k][i];
end
end
/* Multiplexer 1 */

for(k = 0; k< 32; k = k+1) begin: netMuxA
mux_32_1 MuxA(ReadData1[k], ReadRegister1, MuxIn[k]);
end
/* Multiplexer 2 */
for(k = 0; k< 32; k = k+1) begin: netMuxB
mux_32_1 MuxB(ReadData2[k], ReadRegister2, MuxIn[k]);
end
endgenerate
endmodule
4. Mô phỏng dạng sóng sử dụng ModelSim
Kết quả mô phỏng trong khoảng thời gian từ 0 đến 25000ps

Kết quả mô phỏng trong khoảng thời gian từ 25000ps đến 50000ps

20


Báo cáo Đồ án môn học: Cấu trúc máy tính
Nhóm 4 – Nhóm học phần 40

21



×