* Thanh ghi bộ đếm chương trình có chứa địa chỉ của lệnh sẽ được thực thi. Giai đoạn đầu tiên trong chu trình thực hiện là đọc lệnh từ bộ nhớ lệnh. Vì vậy PC phải được kết nối với đầu vào địa chỉ của bộ nhớ lệnh.
Hình 4.24. Kết nối Datapath cho lệnh R
* Mã lệnh đầu tiên Instr 32 bit sẽ được lấy ra. Giai đoạn tiếp theo sẽ phụ thuộc vào lệnh cụ thể.
* Đầu tiên chúng ta sẽ xây dựng Datapath cho lệnh lw sau đó sẽ bổ sung và tổng quát hóa cho các lệnh còn lại.
* Đối với lệnh lw, bước đầu tiên là đọc thanh ghi nguồn là thanh ghi chứa địa chỉ cơ sở của dữ liệu cần đọc trong bộ nhớ. Từ trường rs Instr[25-21] này ta sẽ xác định được thanh ghi.
* Các bit địa chỉ thanh ghi nguồn này được đưa vào đầu vào địa chỉ A1 của tệp thanh ghi. Giá trị trong thanh ghi được đọc ra RD1.
* Lệnh lw có một địa chỉ offset, địa chỉ này được lưu ngay trong lệnh Instr[15-0]. Giá trị offset này là một hằng số 16 bit vì vậy ta phải mở rộng dấu lên 32 bit SignImm
Hình 4.25. Xây dựng khối mở rộng bit
* Sau bước này bộ xử lý cần tính địa chỉ dữ liệu cần nạp trong bộ nhớ dữ liệu bằng cách cộng địa chỉ cơ sở và địa chỉ offset.
Hình 4.26. Tính toán địa chỉ bộ nhớ
* Khối ALU nhận hai toán hạng đầu vào SrcA và SrcB. SrcA là giá trị đọc được từ thanh ghi, SrcB là giá trị sau khi qua khối mở rộng dấu từ 16 bits thành 32 bits.
* Giá trị địa chỉ offset đã được mở rộng dấu.
* ALU thực hiện nhiều phép toán số học và logic vì vậy cần có một tín hiệu điều khiển ALUControl 3 bit để xác định phép toán cần thực hiện.
* Khối ALU có 2 đầu ra là ALUResult và Zero. Đối với lệnh cộng đầu vào điều khiển ALUControl=010. Đầu ra ALUResult nối vào đầu vào địa chỉ của bộ nhớ dữ liệu.
* Dữ liệu từ bộ nhớ dữ liệu sẽ được đọc ra bus dữ liệu ReadData, sau đó được ghi trở lại thanh ghiđích vào cuối chu kỳ clock.
Hình 4.27. Xác định đường dữ liệu quay lại về Register File
* Thanh ghi đích cho lệnh lw được xác định qua trường rt Instr[20-16] và được kết nối với địa chỉ đầu vào của cổng ghi A3 của tệp thanh ghi.
* Tín hiệu điều khiển RegWrite được nối với đầu vào WE3, tín hiệu này có mức cao trong quá trình ghi do đó dữ liệu được ghi vào thanh ghi. Việc ghi dữ liệu diễn ra vào cuối sườn lên của xung clock.
* Trong khi lệnh lw đang được thực thi bộ xử lý sẽ tính toán địa chỉ của lệnh tiếp theo PC’. Trongkiến trúc MIPS, mỗi lệnh 32 bit vì vậy địa chỉ lệnh tiếp theo sẽ là PC + 4.
* Địa chỉ của lện tiếp theo được ghi vào thanh ghi PC tại sườn lên của xung clock tiếp theo.
Hình 4.28. Xác định địa chỉ của lệnh tiếp theo trong PC
* Tiếp theo, ta mở rộng thêm Datapath để thực hiện lệnh sw.
* Cả 2 lệnh lw và sw đều đọc địa chỉ cơ sở từ cổng 1 của tệp thanh ghi và có chứa trường offset nằm ngay trong lệnh.
* ALU cộng địa chỉ cơ sở và địa chỉ offset để tìm địa chỉ bộ nhớ.
* Tuy nhiên lệnh sw đọc địa chỉ từ tệp thanh ghi và ghi vào trong bộ nhớ dữ liệu.
Hình 4.29. Đường dữ liệu cho lệnh sw
kết nối với đầu vào địa chỉ A2, cổng 2 của tệp thanh ghi. RD2 là giá trị thanh ghi tương ứng với địa chỉ A2. RD2 được đưa vào đầu vào WD của bộ nhớ dữ liệu.
* Đầu vào cho phép ghi WE được điều khiển bởi MemWrite. Với lệnh sw, MemWrite=1 và dữ liệu được ghi vào bộ nhớ, ALUControl =010 để thực hiện phép cộng địa chỉ cơ sở và địa chỉ offset.
* Ngoài ra RegWrite =0 để ngăn việc ghi vào tệp thanh ghi vì dữ liệu vẫn được đọc ra từ bộ nhớ dữ liệu.
* Tiếp theo mở rộng Datapath cho các lệnh loại R như add, sub, and, or và slt. Tất cả các lệnh này đều đọc 2 toán hạng từ tệp thanh ghi, tính toán giá trị bằng ALU và ghi lại kết quả vào thanh ghi thứ 3 trong tệp thanh ghi. Chỉ có sự khác biệt duy nhất là các lệnh này thực hiện các phép toán khác nhau. Do đó ta chỉ cần thay đổi ALUControl tương ứng.
* Vì toán hạng thứ 2 được đưa vào SrcB của ALU có thể từ thanh ghi hoặc là giá trị tức thì SignImm(luôn được nối với SrcB) nên ta cần bộ MUX 2:1 để chọn.
* Bộ MUX này được điều khiển bởi tín hiệu ALUSr:
* ALUSrc =0 cho lệnh loại R để chọn SrcB từ tệp thanh ghi
* ALUSrc=1 cho các lệnh lw và sw để chọn SignImm
* Chân WD3 của tệp thanh ghi luôn nhận đầu vào dữ liệu từ bộ nhớ dữ liệu hoặc ALUResult do đóta cần một bộ MUX 2:1 thứ 2 để chọn.
* Bộ MUX này được điều khiển bởi tín hiệu MemtoReg
* MemtoReg =0 chọn ALUResult
Hình 4.30. Đường dữ liệu tăng cường cho lệnh loại R
* Bộ MUX 2:1 thứ 3 dùng để chọn trường rt hoặc rd của tệp thanh ghi.
* Bộ MUX này được điều khiển bởi tín hiệu RegDst
* RegDst =1 đối với các lệnh loại R để chọn WriteReg từ trường rd Instr[15-11]
* RegDst =0 khi thực hiện lệnh lw để chọn trường rt Instr[20-16].
* Cuối cùng ta mở rộng Datapath để xử lý lệnh beq.
* Lệnh beq so sánh 2 thanh ghi, sự kiện rẽ nhánh xảy ra nếu 2 thanh ghi có giá trị bằng nhau.
* Địa chỉ rẽ nhánh chính là tổng của PC và địa chỉ offset của lệnh rẽ nhánh.
* Địa chỉ offset này có thể dương hoặc âm và được lưu trong trường immInstr[31-26]. Địa chỉ tiếp theo nếu rẽ nhánh xảy ra sẽ là : PC’= PC + 4 + SignImm x 4.
* Khi lệnh rẽ nhánh xảy ra PCBranch được tính bằng cách dịch trái SignImm 2 bit và sau đó cộngvới PCPlus4.
* Hai thanh ghi nguồn được so sánh qua việc tính hiệu của chúng SrcASrcB sử dụng ALU.
tín hiệu điều khiển Branch=1, ALUControl =110 vì vậy ALU thực hiện phép trừ SrcASrcB.
* ALUSrc=0 để chọn toán hạng nguồn SrcB từ tệp thanh ghi.
* Các tín hiệu RegWrite và MemWrite bằng 0 vì lệnh beq không ghi vào bộ nhớ hay tệp thanh ghi.
* Một bộ MUX 2:1 được thêm vào để chọn PC’ từ PCPlus4 hay PCBranch. Bộ MUX này được điều khiển bởi tín hiệu PCSrc.
Hình 4.31. Datapath cho lệnh beq