3.2.1. Giới thiệu chung
Phần này chúng ta sẽ tiếp cận một phương pháp thiết kế datapath và ựiều khiển cho các vi xử lý có kiến trúc giống RISC. để ựơn giản chúng ta chỉ thiết kế một mô hình cho một số lệnh cơ bản của kiến trúc RISC, lệnh cộng và trừ, các lệnh di chuyển dữ liệu. Các lệnh khác ựược thiết kế dựa trên mô hình cơ bản này. Hầu hết toàn bộ những gì chúng ta cần làm ựể thực thi những lệnh ựược nêu ra ở chương trước là như nhau, không phụ thuộc vào lớp (kiểu) lệnh. để thực hiện một lệnh của vi ựiều khiển, lệnh ựược chia ra làm nhiều bước thực hiện lệnh khác nhau, thường là chia ra làm bốn bước, mỗi một bước thực hiện một nhiệm vụ xác ựịnh. Việc chia nhỏ một lệnh ra làm nhiều bước khác nhau rất có lợi, vì như vậy sẽ làm cho quá trình thiết kế trở nên ựơn giản và ựặc biệt là chia nhỏ các lệnh làm nhiều bước sẽ rất dễ dành áp dụng kĩ thuật pipeline ựể nâng cao hiệu suất của vi xử lý. Số bước ựể hoàn thành một lệnh chắnh là ựộ sâu của pipeline và cũng chắnh là số lệnh có thể thực hiện ựồng thời. Vắ dụ với vi ựiều khiển này ựược chia ra làm 4 bước khác nhau như ựược trình bày trong chương trước, như vậy nếu không có lệnh rẽ nhánh, kiến trúc pipeline sẽ cho phép hệ thống thực hiện ựược bốn lệnh trong cùng một thời ựiểm. Cụ thể về vấn ựề này sẽ ựược trình bày trong phần sau. Dưới ựây ta sẽ phân tắch nhiệm vụ của vi ựiều khiển tương ứng với bốn bước thực hiện lệnh. đối với toàn bộ các lệnh của vi xử lý, hai bước ựầu tiên thực hiện lệnh là giống nhau hoàn toàn.
- Bước 1: tìm và nạp lệnh (Instruction Fetch), nhiệm vụ ựược thực hiện bởi bước này là gửi bộ ựếm chương trình (Program Counter) PC ựến bộ nhớ chứa mã lệnh (bộ nhớ chương trình) và lấy lệnh từ trong bộ nhớ ựó, nạp giá trị vừa nạp ựược vào thanh ghi lệnh và tăng ựịa chỉ của lệnh (PC) lên 1.
- Bước hai: Giải mã lệnh và ựọc thanh ghi. đọc một hoặc hai thanh ghi, sử dụng các trường trong lệnh ựể lựa chọn thanh ghi ựể ựọc. đối với một số lệnh ta cần chỉ ựọc một thanh ghi như lệnh goto, call nhưng hầu hết các lệnh ựều ựòi hỏi phải truy cập tới hai thanh ghi trong register file. Vắ dụ lệnh movwf PORTB sẽ truy cập tới hai thanh ghi W và thanh ghi chứa giá trị cổng B.
Sau hai bước trên, những bước tiếp theo ựể hoàn thành một lệnh phụ thuộc vào lớp lệnh. Một ựiều rất may mắn là ựối với những lớp lệnh này ( các lệnh hướng byte, hướng bit, lệnh ựiều khiển) thì số lượng bước ựể hoàn thành là giống nhau, không phụ thuộc vào opcode của lệnh, ựiều này rất quan trọng vì nó làm cho thiết kế ựơn giản ựi rất nhiều.
Thậm chắ ựối với những lớp lệnh khác nhau vẫn có một số ựiểm tương ựồng, vắ dụ hầu hết các lệnh khác nhau ngoại trừ lệnh goto ựều sử dụng bộ logic và số học ALU sau khi ựọc các thanh ghi từ register file. Tới ựây chúng ta thấy rằng việc thiết kế tập lệnh là rất quan trọng bởi với một thiết kế tập lệnh phù hợp sẽ làm ựơn giản quá trình thiết kế bằng việc làm cho quá trình thực thi của rất nhiều lệnh là tương tự nhau.
Sau khi sử dụng ALU ựể tắnh kết quả ựầu ra, bước tiếp theo ựể hoàn thành một lệnh là rất khác nhau ở những lớp lệnh khác nhau, vắ dụ các lệnh về số học ựòi hỏi truy cập tới các thanh ghi trong register file ựể ghi dữ liệu lên ựó, trong khi các lệnh ựiều khiển như lệnh goto lại thay ựổi giá trị của bộ ựếm chương trình tới một ựịa chỉ nào ựó, các lệnh rẽ nhánh có ựiều kiện lại phải kiểm tra ựiều kiện, nếu ựiều kiện ựúng thì sẽ nhảy tới ựịa chỉ xác ựịnh, nếu không giá trị của bộ ựếm chương trình sẽ nhận giá trị tăng lên 1.
Hình 3-2 chỉ ra hình ảnh tổng quan của một kiến trúc vi ựiều khiển, tập trung vào các khối chức năng khác nhau và kết nối giữa chúng. Mặc dầu hình này chỉ ra hầu hết các luồng dữ liệu trong bộ vi xử lý, nó ựã loại bỏ hai khắa cạnh quan trọng của việc thực thi một lệnh ựó là:
- Thứ nhất, trong một vài vị trắ hình 3-2 chỉ ra dữ liệu có thể tới một khối cụ thể như là từ hai nguồn khác nhau. Vắ dụ giá trị ghi tới bộ ựếm chương trình PC có thể ựược tới từ bộ cộng hoặc tới từ giá trị thanh ghi ựọc ra từ bộ nhớ chương trình, hai ựầu vào của bộ ALU cũng có thể ựến từ nhiều nguồn khác nhau. Trong thực tế những ựường dữ liệu này không thể ựơn giản nối với nhau như vậy, chúng ta cần phải dùng thêm một thành phần khác ựể lựa chọn ựầu vào cho chúng, việc lựa chọn này thường ựược thực hiện bởi một thiết bị ựó là bộ hợp kênh (Multiplexer). Bộ hợp kênh này sẽ lựa chọn ựầu vào thắch hợp từ nhiều ựầu vào khác nhau dựa vào tắn hiệu ựiều khiển. Những ựường ựiều khiển này ựược thiết lập cơ bản là dựa vòa những thông tin ựược lấy ra từ lệnh ựang ựược thực hiện. Chi tiết về việc
sử dụng các bộ hợp kênh này trong việc thiết kế vi xử lý có thể xem trong chương mô tả về thiết kế và mô phỏng vi ựiều khiển.
- Thứ hai, một vài mô ựun phải ựược ựiều khiển dựa vào kiểu lệnh, vắ dụ lệnh rẽ nhánh phải ghi dữ liệu từ thanh ghi lệnh lên thanh ghi bộ ựếm chương trình trong khi các lệnh logic và số học phải ghi giá trị kết quả lên thanh ghi trong register file tương ứng. Cũng giống như bộ hợp kênh, ta cũng cần phải có các ựường ựiều khiển mà tắn hiệu của nó ựược suy ra từ nhiều trường khác nhau của lệnh hiện thời. để làm ựược nhiệm vụ ựó ta cần phải có một bộ ựiều khiển, trong luận văn này ta gọi là bộ ựiều khiển.
Hình 3- 2: Tổng quan về kiến trúc của vi ựiều khiển