Các ngoại vi
Như đã đề cập trong phần đầu của chương, ngoại vi của vi xử lý là các khối
điều khiển I/O. Ngoại vi có một số chức năng chính như sau.
Điều khiển và định thì
Giao tiếp với vi xử lý
Giao tiếp với thiết bị bên ngoài
Đệm dữ liệu
Phát hiện lỗi
Trong quá trình hoạt động, vi xử lý phải giao tiếp với rất nhiều thiết bị bên
ngoài. Các nguồn tài nguyên của hệ thống như bộ nhớ chính hay bus hệ thống được
chia sẻ để có thể hoạt động với nhiều ngoại vi. Vì vậy, các ngoại vi yêu cầu phải có
chức năng điều khiển và định thì để có thể điều khiển các thiết bị bên ngoài hoạt
động đồng bộ hoạt động đồng bộ trong hệ thống.
ta có thể thấy, các ngoại vi có hai giao diện chính.
Giao tiếp bus: dùng để giao tiếp, trao đổi dữ liệu với vi xử lý và các thành
phần khác trong hệ thống thông qua bus. Các tín hiệu trong giao diện này phải
tương thích với bus, do đó, thường giống nhau cho các ngoại vi kết nối đến cùng
một bus.
Giao tiếp với các thiết bị bên ngoài: dùng để kết nối và trao đổi dữ liệu với
các thiết bị bên ngoài. Các tín hiệu trong giao diện này hoàn toàn khác nhau giữa
các ngoại vi do thiết bị bên ngoài có các chuẩn giao tiếp khác nhau.
Tốc độ truy xuất dữ liệu của các ngoại vi và bộ nhớ không giống nhau, do đó
chức năng đệm dữ liệu là cần thiết để đảm bảo việc truyền dữ liệu giữa các thành
phần trong hệ thống diễn ra một cách đồng bộ.
Hầu hết các ngoại vi còn có chức năng phát hiện lỗi trong quá trình truyền dữ
liệu.Khi phát hiện lỗi trong dữ liệu nhận được, ngoại vi thường thông báo lỗi này
cho vi xử lý để có hướng xử lý cho phù hợp. Sử dụng parity bit là một ví dụ đơn
giản về việc dùng thêm một bit để phát hiện lỗi trong các giao thức truyền dữ liệu
nối tiếp.
88 trang |
Chia sẻ: thucuc2301 | Lượt xem: 733 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Giáo trình: Cấu trúc máy tính và giao diện - Nguyễn Phạm Hoàng Dũng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
y thường là các thanh ghi đọc/ghi được.
Trong quá trình hoạt động, các sự thay đổi của phần cứng và chế độ hoạt
động của vi xử lý thường được thể hiện trong một hoặc một vài thanh ghi đặc biệt,
gọi là thanh ghi trạng thái. Các thanh ghi này là các thanh ghi chỉ đọc (read only),
mọi tác động của người lập trình bằng cách sử dụng ngôn ngữ máy ghi dữ liệu vào
các thanh ghi này đều không có tác dụng
Trong hầu hết các vi xử lý, thanh ghi điều khiển và trạng thái là các thanh
ghi riêng biệt, có địa chỉ khác nhau. Tuy nhiên, cũng có một số trường hợp việc
điều khiển và trạng thái vi xử lý được tích hợp vào một thanh ghi chung nhằm tiết
kiệm tài nguyên thiết kế. Ví dụ với vi xử lý 8086, thanh ghi điều khiển và trạng thái
được tích hợp thành một thanh ghi chung gọi là thanh ghi cờ 16 bit như hình 4.4.
Trong đó, các bit OF, SF, ZF, AF, PF và CF là các bit chỉ trạng thái vi xử lý, các bit
DF, IF và TF là các bit điều khiển vi xử lý. Việc ghi vào thanh ghi này tương ứng là
thao tác điều khiển các chế độ hoạt động của vi xử lý, việc đọc thanh ghi này tương
ứng là thao tác lấy trạng thái của vi xử lý tại thời điểm đọc.
Hình 4.4. Thanh ghi điều khiển và trạng thái của vi xử lý 8086
56
Một thanh ghi đặc biệt, bắt buộc phải có đối với tất cả các vi xử lý, đó là
thanh ghi đếm chương trình (PC), còn được gọi là con trỏ lệnh (IP). Thanh ghi này
dùng để chứa địa chỉ lệnh tiếp theo trong chương trình thực thi, vì vậy, thanh ghi
này luôn được cập nhật sau mỗi lệnh của vi xử lý.
4.1.5. Tập lệnh
Quá trình hoạt động của một vi xử lý được quy định trong một chương trình,
được viết bằng các lệnh tương ứng của vi xử lý đó, thường được gọi là ngôn ngữ
máy. Các lệnh này được lấy từ tập lệnh của vi xử lý.
Mỗi lệnh là một chuỗi số bit nhị phân chứa các thông tin cần thiết để vi xử lý
thực hiện một chức năng nào đó. Chuỗi bit này thường được chia thành nhiều
trường nhỏ hơn, chứa các thông tin của lệnh đó.
Trường mã lệnh (còn được gọi là opcode): các bit trong trường này thể hiện
chức năng của lệnh
Trường toán hạng: một lệnh thường bao gồm nhiều toán hạng nguồn và một
toán hạng đích. Toán hạng đích như một ngõ ra chứa kết quả thực thi lệnh
với các ngõ vào là các toán hạng nguồn.
o Các toán hạng nguồn có thể là các thanh ghi, các giá trị tức thời (số
không đổi), các giá trị được lưu trữ trong bộ nhớ hoặc ngoại vi,
o Các toán hạng đích thường là các toán hạng lưu trữ dữ liệu nên
thường là các thanh ghi hoặc ô nhớ.
Trường chứa địa chỉ của lệnh tiếp theo: thường được sử dụng cho các lệnh rẽ
nhánh
Ngoài ra còn có một số trường quy định các tính năng khác của lệnh
Sau đây, ta xét một ví dụ về tập lệnh của vi xử lý ARM. Hình 4.5 là cấu trúc
các lệnh xử lý dữ liệu của vi xử lý ARM7TDMI. Ta thấy, lệnh xử lý dữ liệu của
ARM có chiều dài 32 bit, được chia thành nhiều trường nhỏ.
Hình 4.5. Cấu trúc các lệnh xử lý dữ liệu của vi xử lý ARM7TDMI
57
Trường Operand 2 có chiều dài 12 bit (từ bit 0 đến bit 11): chứa toán
hạng nguồn thứ hai của lệnh, toán hạng này có thể là một thanh ghi hoặc
một giá trị tức thời.
Trường Rd có chiều dài 4 bit (từ bit 12 đến bit 15): chứa toán hạng đích
của lệnh, trong trường hợp này toán hạng nguồn là các thanh ghi của
ARM.
Trường Rn có chiều dài 4 bit (từ bit 16 đến bit 19): chứa toán hạng nguồn
thứ nhất của lệnh, trong trường hợp này là các thanh ghi của ARM.
Trường S (bit 20): chỉ có một bit, dùng để điều khiển trường Cond.
Trường OpCode có chiều dài 4 bit (từ bit 21 đến bit 24): chứa Opcode
của lệnh. Lệnh xử lý dữ liệu bao gồm các phép toán như: cộng, trừ, AND,
OR, mỗi phép toán sẽ tương ứng với một Opcode cụ thể. Ví dụ như
0000 ứng với phép AND, 0100 ứng với phép cộng, 0010 ứng với phép
trừ,
Trường I (bit 25): dùng để xác định toán hạng thứ hai (Operand 2) là
thanh ghi hay giá trị tức thời. Nếu I = 0 thì Operand 2 là thanh ghi, nếu I
= 1 thì Operand 2 là giá trị tức thời.
Trường Cond có chiều dài 4 bit (từ bit 28 đến bit 31): chứa các mã điều
kiện của ARM.
Lệnh sau sẽ lấy giá trị thanh ghi R7 trừ giá trị thanh ghi R5 và lưu trữ kết quả
vào thanh ghi R4.
SUB R4, R5, R7
Tương ứng chuỗi bit biểu diễn lệnh này sẽ là:
0000 00 0 0010 0 0101 0100 00000000_0111
Cond toán hạng thứ
hai là thanh ghi
Phép trừ S R5 R4 R7
Vi xử lý chỉ đọc và hiểu các chuỗi số nhị phân, còn câu lệnh SUB R4, R5, R7
là ngôn ngữ trực quan của người lập trình. Vì vậy, để chuyển từ ngôn ngữ của con
người sang ngôn ngữ máy ta cần một công cụ phần mềm, được gọi là trình biên
dịch. Con người sẽ lập trình cho vi xử lý bằng những câu lệnh trực quan, dễ hiểu
58
như trên và trình biên dịch sẽ chuyển những câu lệnh này thành ngôn ngữ của vi xử
lý là chuỗi bit nhị phân biểu diễn cho những câu lệnh đó. Các vi xử lý của các công
ty khác nhau có các tập lệnh khác nhau, nên mỗi công ty sẽ có một chương trình
biên dịch riêng sử dụng cho các dòng vi xử lý của công ty đó.
Quy đinh chiều dài của mỗi câu lệnh cũng có sự khác biệt. Đối với các vi xử
lý thiết kế theo kiến trúc CISC (như 8086), các câu lệnh khác nhau sẽ có chiều dài
khác nhau. Các lệnh của CISC là các lệnh phức tạp, một lệnh có thể thực hiện được
nhiều chức năng. Tập lệnh của CISC thường có rất nhiều lệnh. Đối với các vi xử lý
thiết kế theo kiến trúc RISC (như ARM), các câu lệnh khác nhau có cùng chiều dài.
Các câu lệnh của RISC chỉ thực hiện những chức năng đơn giản, các chức năng
phức tạp hơn sẽ được thực hiện bằng lập trình. Tập lệnh của RISC thường ít hơn rất
nhiều so với CISC.
Tập lệnh của hầu hết các vi xử lý đều được chia thành những nhóm lệnh nhỏ
có cấu trúc lệnh giống nhau , ví dụ như nhóm lệnh xử lý dữ liệu của ARM đã đề cập
ở trên. Sau đây là một số nhóm lệnh cơ bản trong tập lệnh của các vi xử lý.
Nhóm lệnh xử lý dữ liệu: thực hiện các phép toán logic và số học như: cộng,
trừ, AND, OR, XOR, NOT, dịch bit, xoay bit,
Nhóm lệnh lưu trữ dữ liệu: có chức năng lưu dữ liệu vào hoặc lấy dữ liệu ra
khỏi bộ nhớ
Nhóm lệnh di chuyển dữ liệu: có chức năng chuyển dữ liệu giữa các thành
phần như thanh ghi, ngoại vi, ngăn xếp,
Nhóm lệnh rẽ nhánh: có chức năng chuyển luồng chương trình theo một
hướng khác phù hợp với trạng thái hiện tại của vi xử lý
Nhóm lệnh điều khiển: thường được sử dụng để lập trình các chế độ hoạt
động cho vi xử lý
4.2. Bộ nhớ
Bộ nhớ là thành phần lưu trữ dữ liệu của người dùng và chương trình của vi
xử lý. Một hệ thống máy tính thường có hai loại bộ nhớ: bộ nhớ trong và bộ nhớ
ngoài. Bộ nhớ trong thường dùng để lưu thông tin phần cứng máy tính, các chương
trình đang hoạt động trong hệ thống. Bộ nhớ ngoài thường sử dụng để lưu trữ lượng
59
lớn dữ liệu cá nhân. Trong nội dung chương này, chúng ta chỉ tập trung tìm hiểu về
các bộ nhớ trong.
4.2.1. Phân loại bộ nhớ
Bộ nhớ trong được phân làm hai loại cơ bản: ROM và RAM.
a. Bộ nhớ ROM
ROM (viết tắt của Read Only Memory) cơ bản là bộ nhớ chỉ đọc, tức là ta
chỉ có thể đọc dữ liệu từ ROM mà không thể ghi dữ liệu vào ROM. ROM chỉ được
ghi dữ liệu một lần đầu tiên, dữ liệu trong ROM thường chứa những thông tin cố
định, không đổi như: thông tin về các thành phần trên mainboard, chương trình khởi
động máy tính, ... Bộ nhớ ROM truyền thống thường có dung lượng nhỏ, dữ liệu
ROM đã được các nhà sản xuất nạp sẵn. ROM là bộ nhớ không bay hơi, tức là dữ
liệu trong ROM không bị mất khi ngừng cung cấp điện. Dựa vào đặc tính này, các
bộ nhớ sau cũng được xem là ROM: PROM, EPROM, EEPROM và bộ nhớ flash.
Khác với ROM, người dùng có thể nạp dữ liệu tùy ý vào các bộ nhớ này.
PROM (Programmable ROM): cũng là bộ nhớ không bay hơi và chỉ được
ghi dữ liệu một lần đầu tiên. Khác với ROM truyền thống, PROM là loại ROM
trắng, tức là chưa có dữ liệu. Người dùng có thể tùy ý ghi dữ liệu vào PROM bằng
các thiết bị nạp ROM chuyên dụng.
EPROM (Erasable Programmable ROM): là bộ nhớ có khả năng đọc và ghi
như PROM, nhưng khác với PROM, EPROM có khả năng ghi được nhiều lần. Tuy
nhiên, trước khi ghi, tất cả các ô nhớ của EPROM phải được xóa bằng tia cực tím.
Trên thân EPROM thường có một cửa sổ trong suốt (như hình 4.6), để xóa dữ liệu
trong EPROM, ta chỉ cần chiếu chùm tia cực tím vào cửa sổ này trong thời gian
khoảng 20 phút.
EEPROM (Electrically Erasable Programmable ROM): cũng có khả năng
ghi dữ liệu mới như EPROM, nhưng ta không cần phải xóa dữ liệu trước khi ghi dữ
liệu mới vào EEPROM. Việc xóa dữ liệu trong EEPROM được thực hiện ở mức
byte, tức là một lần xóa được một byte. Chính vì đặc tính đọc/ghi dữ liệu linh hoạt,
bộ nhớ EEPROM thường có chi phí đắt nhất trong số các bộ nhớ trên.
60
Bộ nhớ flash: chức năng cũng giống như EEPROM, nhưng tốc độ ghi dữ liệu
của flash nhanh hơn so với EEPROM. Bộ nhớ flash có khả năng xóa dữ liệu theo
khối, tức là ta có thể xóa một khối dữ liệu nào đó trong bộ nhớ thay vì phải xóa toàn
bộ dữ liệu trong bộ nhớ như EPROM.
Hình 4.6. Bộ nhớ EPROM
b. Bộ nhớ RAM
RAM (viết tắt của Random Access Memory) là bộ nhớ có khả năng đọc và
ghi, còn được gọi là bộ nhớ chính. Một điểm khác biệt nữa so với ROM, RAM là bộ
nhớ bay hơi, tức là dữ liệu trong RAM sẽ bị mất khi ngừng cấp điện. Do đó, RAM
còn được gọi là bộ nhớ tạm. RAM thường được sử dụng để chứa các chương trình
đang hoạt động trên máy tính, vì vậy dung lượng và tốc độ của RAM có ảnh hưởng
rất lớn đến hoạt động của toàn hệ thống. RAM được chia thành hai loại cơ bản,
được sử dụng trong các thế hệ máy tính, đó là: SRAM (RAM tĩnh) và DRAM
(RAM động). Điểm khác biệt giữa hai loại RAM này chủ yếu là ở cấu tạo của từng
bit nhớ (cell), sẽ được phân tích trong phần tiếp theo
DRAM
DRAM lưu trữ dữ liệu 0 và 1 dưới dạng các tín hiệu điện thế trên một tụ
điện. Hình 4.7a là cấu trúc cơ bản của một DRAM cell. Do tụ điện có xu hướng xả
điện nên DRAM phải nạp lại điện tích cho tụ điện sau một khoảng thời gian nhất
định để duy trì dữ liệu trong bộ nhớ. Quá trình nạp lại được gọi là quá trình làm
tươi. Cũng do đặc tính rò rỉ điện tích trên tụ điện mặc dù vẫn có nguồn cung cấp
điện nên bộ nhớ này còn được gọi là RAM động. Đường địa chỉ (address line) sẽ
tích cực làm cho transistor dẫn khi có sự truy xuất vào DRAM cell. Thông thường,
61
mức điện áp cao trên tụ điện tương ứng với mức logic 1 và mức điện áp thấp tương
ứng với mức 0.
Quá trình ghi dữ liệu, một tín hiệu điện áp được đưa vào ngõ Bit line nạp
điện cho tụ, nạp dữ liệu vào cell.
Quá trình đọc dữ liệu, mức điện áp trên tụ được đưa ra ngoài thông qua
đường Bit line và được so sánh với một mức điện áp chuẩn để xác định dữ liệu
trong cell là 0 hay 1. Việc đọc sẽ làm mất dữ liệu trong cell do tụ xả điện, vì vậy,
phải có quá trình nạp lại để hoàn thành quá trình đọc dữ liệu.
SRAM
SRAM sử dụng các transistor để lưu trữ dữ liệu. Hình 4.7b là cấu trúc cơ bản
của một SRAM cell. Bốn transistor T1, T2, T3, T4 được kết nối chéo nhau để tạo các
mức logic cố định. Mức logic 1 ứng với trạng thái dẫn của T1, T4 và tắt của T2, T3.
Mức logic 0 ứng với trạng thái dẫn của T2, T3 và tắt của T1, T4. Các mức logic này
không bị mất theo thời gian nên SRAM không cần chu kỳ làm tươi. Cũng giống như
DRAM, đường Address line sẽ tích cực làm cho các transistor T5 và T6 dẫn khi có
sự truy xuất dữ liệu vào DRAM cell. Trong quá trình ghi, bit dữ liệu được đưa vào
đường Bit line B, giá trị bù của dữ liệu sẽ được đưa vào đường Bit line B . Trong quá
trình đọc, dữ liệu được đọc ra từ đường Bit line B.
(a) DRAM cell
(b) SRAM cell
Hình 4.7. Cấu trúc một bit nhớ
62
Từ đó, ta thấy, một ô nhớ của DRAM đơn giản và nhỏ gọn hơn của SRAM.
Do đó, DRAM có khả năng tích hợp lớn hơn và giá thành sản xuất nhỏ hơn so với
SRAM. Tuy nhiên, DRAM lại cần có chu kỳ làm tươi, tốc độ truy xuất của DRAM
cũng thấp hơn so với SRAM do tụ điện phải có thời gian nạp và xả. Vì vậy, DRAM
có dung lượng lớn thường được sử dụng làm bộ nhớ chính của hệ thống máy tính,
SRAM được sử dụng làm bộ nhớ có yêu cầu tốc độ cao như cache.
4.2.2. Cấu trúc cơ bản
Tất cả các bộ nhớ trên đều là bộ nhớ bán dẫn có cấu trúc gần như tương tự
nhau. Do đó, trong phần này ta chỉ tìm hiểu về cấu trúc cơ bản của bộ nhớ RAM.
Việc truy xuất dữ liệu được điều khiển thông qua các đường địa chỉ và điều khiển.
Mỗi giá trị địa chỉ sẽ tương ứng với một ô nhớ chứa dữ liệu. Mỗi ô nhớ có thể bao
gồm: 4, 8, 16 hoặc 32 bit dữ liệu, được truy cập thông qua các đường dữ liệu.
Hình 4.8 là ví dụ về cấu trúc của bộ nhớ RAM có dung lượng 16Mb. Mỗi ô
nhớ của RAM này có 4 bit nên có 4 đường dữ liệu được ký hiệu từ D1 đến D4. Việc
truy xuất dữ liệu được điều khiển bằng nhóm tín hiệu điều khiển OEWECASRAS ,,,
và nhóm 11 đường tín hiệu địa chỉ (A0 đến A10). Với 11 đường địa chỉ ta có thể
xác định được 211 = 2048 địa chỉ. Các ô nhớ được sắp xếp theo dạng ma trận
2048x2048. Khi tín hiệu chọn hàng RAS tích cực, ta sẽ xác định được một hàng
dựa vào các đường địa chỉ (A0 đến A10). Sau đó, tín hiệu chọn cột CAS tích cực, ta
sẽ chọn được một cột dựa vào các đường địa chỉ (A0 đến A10). Từ hàng và cột ta
xác định được ô nhớ cần truy xuất. Dung lượng của RAM được xác định bằng số ô
nhớ x số bit trong một ô nhớ, trong trường hợp này là 211 x 211 x 4 = 4x220 x 4 = 4M
x 4 (16Mb). Đây cũng là cách viết cho ta biết cấu trúc và dung lượng của RAM. Ví
dụ, bộ nhớ RAM 1M x 8, nghĩa là bộ nhớ có dung lượng 8Mb, trong đó có 220 ô
nhớ, mỗi ô nhớ 8 bit tương ứng có 8 đường dữ liệu. Một số tín hiệu điều khiển còn
lại như OEWE, được sử dụng để chọn chip (RAM) và cho phép xuất dữ liệu.
Các bộ nhớ RAM được đề cập ở phần trên thường có dung lượng nhỏ. Người
ta thiết kế thêm các bộ điều khiển và giải mã để ghép nhiều bộ nhớ RAM này lại để
có được một thanh RAM (module RAM) dung lượng đủ lớn, sử dụng trong các máy
tính.
63
Hình 4.8. Cấu trúc RAM 4M x 4
4.3. Hệ thống kết nối (bus)
4.3.1. Phân loại
Hệ thống bus là thành phần có chức năng kết nối các thiết bị trong một hệ
thống máy tính. Một bus bao gồm nhiều dây dẫn, mỗi dây dẫn có thể truyền các tín
hiệu nhị phân 0 và 1. Các tín hiệu trên bus được truyền đồng thời, tập hợp các tín
hiệu này tạo thành một giá trị thể hiện thông tin mà bus cần truyền đi. Ví dụ, muốn
thể hiện giá trị A5H (giá trị tương ứng trong hệ nhị phân là: 10100101), ta cần một
bus gồm có 8 dây dẫn truyền đồng thời các giá trị 1, 0, 1, 0, 0, 1, 0, 1.
Mặc dù mỗi vi xử lý có một chuẩn bus khác nhau, nhưng tất cả đều có một
điểm chung, đó là: các bus thường được chia thành ba loại: địa chỉ, dữ liệu và điều
khiển.
Bus dữ liệu: dùng để truyền dữ liệu giữa các thành phần trong hệ thống. Độ
rộng của bus dữ liệu thường là: 32, 64 hoặc 128 bit. Một số loại bus còn chia bus dữ
liệu thành hai loại: dữ liệu đọc và dữ liệu ghi.
Bus địa chỉ: mang địa chỉ của nơi phát hoặc nơi nhận của dữ liệu trên bus dữ
liệu. Độ rộng của bus địa chỉ có thể là 16, 32 hoặc 64 bit. Một số bus chia bus địa
chỉ thành hai loại: địa chỉ đọc và địa chỉ ghi.
64
Bus điều khiển: dùng để mang một số thông tin điều khiển việc truyền dữ
liệu như: lệnh đọc/ghi dữ liệu, chiều dài và số lượng dữ liệu trong một lần truyền,
kiểu truyền,
Tập hợp các đường bus trên tạo thành khối giao tiếp bus của các thành phần
trong hệ thống (bộ xử lý trung tâm, ngoại vi). Việc kết nối được thực hiện bằng
cách nối các đường bus tương ứng của CPU, I/O, bộ nhớ, ... với bus chính như
trong hình 4.9.
Hình 4.9. Cấu trúc hệ thống bus
Việc truyền dữ liệu giữa các thành phần trong hệ thống được thực hiện một
cách đồng bộ thông qua các bus tín hiệu trên. Quá trình đồng bộ để truyền dữ liệu
được gọi là giao thức bus. Các bus khác nhau thường có giao thức khác nhau. Các
thành phần muốn kết nối đến bus phải có cùng giao thức truyền dữ liệu của bus.
Hình 4.10 mô tả một giao thức đọc và ghi dữ liệu đơn giản của CPU. Bus hoạt động
dựa trên xung nhịp Clock. Trong chu kỳ đầu tiên (T1), CPU đặt địa chỉ của ngoại vi
cần truy xuất lên đường địa chỉ Address lines, đồng thời lái đường tín hiệu điều
khiển Address enable tích cực (mức 1) để xác minh chính xác địa chỉ. Đối với giao
thức đọc dữ liệu, CPU sẽ tiếp tục phát lệnh đọc bằng cách tích cực (mức 1) tín hiệu
điều khiển Read ở ngay đầu chu kỳ thứ hai (T2). Ngoại vi hoặc bộ nhớ có địa chỉ
tương ứng trên đường Address lines sẽ trả về dữ liệu trên đường dữ liệu Data lines.
Ở chu kỳ thứ ba (T3), CPU đọc về dữ liệu này và lái tín hiệu Read xuống mức thấp,
hoàn thành chu kỳ đọc dữ liệu. Đối với giao thức ghi dữ liệu, CPU sẽ đưa dữ liệu
cần ghi lên đường dữ liệu Data lines ở đầu chu kỳ thứ hai (T2) đến khi dữ liệu này
ổn định, CPU phát tiếp lệnh ghi bằng cách tích cực tín hiệu điều khiển ghi Write. Ở
chu kỳ thứ ba (T3), ngoại vi hoặc bộ nhớ có địa chỉ tương ứng trên đường Address
lines sẽ chép dữ liệu trên đường Data lines về, hoàn thành chu kỳ ghi dữ liệu.
65
Hình 4.10. Minh họa về định thì hoạt động của bus
Các giao thức bus thường được chuẩn hóa và được các công ty công nhận
nhằm tạo sự tương thích giữa các thành phần trong hệ thống máy tính. Ngoài ra,
trong quá trình thiết kế, các công ty có thể đưa vào sản phẩm của mình các bus của
riêng công ty, không được chuẩn hóa nhằm làm cho sản phẩm có được các tính
năng mong muốn. Các bus này được gọi là bus nội (hoặc local bus), phụ thuộc vào
kỹ thuật và công nghệ của từng công ty. ALU bus (trong hình 4.1) của vi xử lý Intel
8086 là một ví dụ về bus nội. ALU bus nằm bên trong vi xử lý 8086, có chức năng
kết nối bộ ALU với các thanh ghi của 8086.
4.3.2. Chức năng
Việc kết nối các thành phần trong hệ thống đến bus như đã đề cập ở phần
trên là việc kết nối các đường tín hiệu có cùng chức năng (địa chỉ, dữ liệu, điều
khiển). Hình 4.11 minh họa các thành phần có thể kết nối đến bus. Trong đó, một số
thành phần như CPU được gọi là master, các thành phần còn lại như bộ điều khiển
66
đồ họa, bộ nhớ, được gọi là slave hoặc ngoại vi. Master là thành phần chủ động,
phát các lệnh truy xuất dữ liệu đến các slave, là các thành phần bị động. Slave sẽ
đáp ứng các lệnh này bằng các dữ liệu trả về cho master. Tại một thời điểm, chỉ có
một master được quyền kết nối (truy xuất) đến một slave. Trong trường hợp tại
cùng một thời điểm nhiều master có yêu cầu truy xuất đến cùng một slave, khi đó
bus sẽ đóng vai trò phân xử để xác định master nào được quyền truy xuất slave
trước.
Hình 4.11. Minh họa một bus của máy tính
Bus quản lý các ngoại vi trong hệ thống bằng địa chỉ. Một ngoại vi trong hệ
thống sẽ có tương ứng một địa chỉ hoặc một tầm địa chỉ. Việc phân phát địa chỉ cho
ngoại vi thường được quyết định bởi người lập ra đặc tính kỹ thuật cho hệ thống. Để
truy cập đến một ngoại vi trong hệ thống, master phải gởi địa chỉ của ngoại vi đó
qua bus địa chỉ. Mạch giải mã địa chỉ của bus có chức năng chọn chính xác ngoại vi
cần truy cập. Thông thường, ta có hai phương pháp giải mã địa chỉ.
Giải mã toàn phần: mỗi ngoại vi được gán một địa chỉ duy nhất. Khi đó ta
phải sử dụng tất cả các bit địa chỉ cho việc giải mã
Giải mã một phần: mỗi ngoại vi được gán với một tầm địa chỉ nào đó. Do đó,
ta không nhất thiết phải sử dụng tất cả các bit địa chỉ cho việc giải mã. Phương pháp
này làm cho mạch giải mã địa chỉ đơn giản hơn.
67
Tốc độ hoạt động của một ngoại vi được xác định bằng chu kỳ truy xuất dữ
liệu, nghĩa là thời gian từ khi một master đưa các yêu cầu truy xuất dữ liệu lên bus
đến khi slave trả về các đáp ứng cần thiết. Thời gian càng ngắn ứng với tốc độ của
ngoại vi càng cao và ngược lại. Trong một máy tính thường sẽ có nhiều bus được
nối với nhau thông qua các cầu chuyển bus, gọi là hệ thống bus đa cấp. Hình 4.12
mô tả một hệ thống như vậy. Các ngoại vi có tốc độ chậm như: bộ điều khiển ổ đĩa
cứng HDD, hoặc các bộ điều khiển truyền dữ liệu nối tiếp (COM, PS/2), nếu
dùng chung bus với các ngoại vi cần tốc độ cao như: bộ điều khiển đồ họa hoặc
PCIe sẽ làm hạn chế tốc độ của các ngoại vi này. Do đó, các ngoại vi có tốc độ
chậm thường sử dụng chung một bus, trong hình 4.12 gọi là bus mở rộng, còn các
ngoại vi có tốc độ cao được kết nối với bus tốc độ cao. Để cải thiện tốc độ truy cập
của vi xử lý trung tâm đến RAM, CPU và bộ điều khiển bộ nhớ chính thường sử
dụng đường bus riêng, gọi là bus hệ thống. Các bus này giao tiếp với nhau thông
qua các cầu chuyển bus. Khi đó, các cầu chuyển bus được xem như một master của
bus mở rộng và bus tốc độ cao.
Hình 4.12. Minh họa một hệ thống bus đa cấp của máy tính
68
Hiện nay, máy tính có rất nhiều ngoại vi và số lượng ngoại vi chắc chắn sẽ
ngày càng tăng trong tương lai. Do đó, để giảm tải cho bus, một số ngoại vi tốc độ
thấp đã dần bị loại bỏ khi có các ngoại vi tốc độ cao hơn xuất hiện.
Trong hệ thống máy tính sử dụng CPU Intel, bus tốc độ cao được tích hợp
trong chip cầu bắc và hiện nay đã được tích hợp vào một số bộ xử lý trung tâm thế
hệ mới, bus mở rộng tốc độ thấp được tích hợp trong chip cầu nam.
4.4. Hệ thống cache
4.4.1. Giới thiệu
Từ khi mô hình máy tính Von Neumann ra đời, với chương trình được lưu
trữ trong bộ nhớ, mối tương quan về tốc độ giữa bộ xử lý trung tâm và bộ nhớ luôn
là vấn đề lớn, cần phải giải quyết. CPU luôn có tốc độ cao hơn bộ nhớ, do đó, khi
phát ra một yêu cầu tới bộ nhớ, CPU phải chờ bộ nhớ đáp ứng trong một khoảng
thời gian dài. Chính điều này đã làm hạn chế đáng kể tốc độ của CPU nói riêng và
của cả hệ thống nói chung.
Quá trình thiết kế bộ nhớ chương trình để có thể đáp ứng được yêu cầu về
tốc độ gặp phải sự ràng buộc giữa ba yếu tố sau: tốc độ, dung lượng và giá thành
chế tạo của bộ nhớ. Như đã phân tích ở các phần trên, để tăng tốc độ của hệ thống,
chúng ta luôn mong muốn bộ nhớ phải có dung lượng lớn, tốc độ cao. Tuy nhiên,
trên thực tế nếu bỏ qua yếu tố giá cả, bộ nhớ có dung lượng lớn luôn có tốc độ thấp
hơn bộ nhớ có dung lượng nhỏ hơn.
Qua quá trình phát triển, người ta cũng nhận thấy rằng, việc thực thi một
chương trình của vi xử lý không hoàn toàn ngẫu nhiên. Nếu lệnh đang thực thi ở địa
chỉ A, thì lệnh kế tiếp thường sẽ nằm trong vùng lân cận của A. Hơn nữa hầu hết
việc thực thi chương trình phần lớn đều là các vòng lặp, trong đó một số lệnh trong
một phần chương trình được thực thi nhiều lần. Do đó, ta chỉ cần một bộ nhớ có
dung lượng nhỏ để có thể lưu một phần chương trình hoặc dữ liệu.
Từ các yếu tố trên, ý tưởng về một bộ nhớ dung lượng nhỏ, tốc độ cao có
chức năng chứa một phần chương trình hoặc dữ liệu ra đời, được gọi là bộ nhớ
cache. Ban đầu, cache có dung lượng khoảng vài KB và được gắn ngoài CPU, về
69
sau, với công nghệ tích hợp ngày càng tiên tiến, cache có dung lượng lớn hơn và
được tích hợp vào bên trong CPU như hình 4.13.
Hình 4.13. Vị trí của cache trong hệ thống
4.4.2. Chức năng
Như đã đề cập ở phần trên, cache dùng để chứa một phần chương trình thực
thi hoặc dữ liệu truy xuất (sau đây ta goi hai thành phần này là một tham chiếu) lặp
lại nhiều lần. Các tham chiếu này được chép từ bộ nhớ lớn, tốc độ chậm (bộ nhớ
chính) vào bộ nhớ cache tốc độ cao. Khi các tham chiếu này được sử dụng lặp lại
nhiều lần sẽ làm tăng đáng kể tốc độ thực thi lệnh của vi xử lý từ đó cải thiện tốc độ
hoạt động của cả hệ thống. Chính vì vây, bộ nhớ cache còn được gọi là bộ nhớ truy
cập nhanh.
Để hiểu rõ hơn về chức năng chính của cache, ta giả sử một tham chiếu được
gọi k lần trong một thời gian ngắn, CPU sẽ cần 1 lần truy xuất bộ nhớ chính và (k-1)
lần truy xuất đến cache. Ta cũng giả sử, c là thời gian truy xuất bộ nhớ cache và m
là thời gian truy xuất bộ nhớ chính, do đặc tính của hai bộ nhớ nên c rất nhỏ hơn m
(c<<m). Gọi h là tỉ lệ gọi tham chiếu thành công trong bộ nhớ cache (nghĩa là tham
chiếu có trong bộ nhớ cache), khi đó h = (k-1)/k và tỉ lệ thất bại tương ứng là (1-h)
= 1/k.
Thời gian truy xuất tham chiếu trung bình = c + (1-h)m
Từ đó ta thấy, khi tham chiếu được gọi nhiều lần (k rất lớn) thì h → 1, thời
gian truy xuất trung bình sẽ tiến tới c. Khi tham chiếu chưa có trong cache, h → 0,
thời gian truy xuất trung bình sẽ tiến tới (c+m). Tuy nhiên, trên thực tế, thời gian
này nhỏ hơn (c+m) nhờ vào kỹ thuật thiết kế. Việc tìm kiếm tham chiếu trong bộ
nhớ chính thông thường sẽ được khởi động cùng lúc với việc tìm kiếm trên cache.
70
Khi tham chiếu không được tìm thấy trên cache (cache miss), chu kỳ truy cập trên
bộ nhớ chính đã được khởi động. Phương pháp này cũng đồng thời dừng ngay chu
kỳ truy cập bộ nhớ chính khi tham chiếu được tìm thấy trong cache (cache hit).
4.4.3. Cache nhiều tầng
Khi kỹ thuật sử dụng bộ nhớ cache được giới thiệu, trong hệ thống chỉ có
duy nhất một bộ nhớ cache, kết nối với vi xử lý thông qua bus hệ thống bên ngoài,
gọi là cache ngoài. Khi kỹ thuật chế tạo phát triển, mật độ tích hợp tăng, cache
được tích hợp vào bên trong vi xử lý, còn được gọi là on-chip cache. So với cache
ngoài, thời gian truy cập on-chip cache giảm đáng kể, do đường dữ liệu được rút
ngắn, góp phần cải thiện tốc độ của hệ thống. Trong thời gian truy cập on-chip
cache, bus hệ thống ở trong trạng thái rãnh sẽ được sử dụng cho các mục đích khác.
Đó là hai ưu điểm chính của bộ nhớ on-chip cache. Do giới hạn về diện tích trên
một chip, cache lại được chế tạo từ các cell SRAM chiếm diện tích khá lớn, nên các
bộ nhớ on-chip cache lúc đầu có dung lượng rất nhỏ, như vi xử lý Intel 80486 chỉ
có một bộ nhớ on-chip cache có dung lượng 8KB.
Theo thời gian, chương trình ngày càng dài và phức tạp trong khi dung lượng
bộ nhớ on-chip cache lại quá nhỏ, nhiều tham chiếu không được tìm thấy trong bộ
nhớ cache làm tăng tỷ lệ cache miss. Vi xử lý phải gọi các tham chiếu này từ bộ nhớ
ngoài có tốc độ chậm, thông qua bus hệ thống. Do đó, tỷ lệ cache miss tăng sẽ làm
ảnh hưởng đến tốc độ của hệ thống. Để khắc phục tình trạng này, một bộ nhớ cache
khác được kết nối với vi xử lý thông qua một bus riêng, gọi là back-side bus. Để
phân biệt các bộ nhớ cache, bộ nhớ on-chip cache trước đó được gọi là L1 cache
(cache cấp 1), bộ nhớ cache thêm vào được gọi là L2 cache (cache cấp 2). L2 cache
thường có dung lượng lớn hơn so với L1 cache và cũng có chức năng lưu trữ lệnh
và dữ liệu. Một tham chiếu khi không được tìm thấy ở L1 cache sẽ tiếp tục được tìm
trong L2 cache. Với kỹ thuật thiết kế và chế tạo ngày càng tiên tiến, L2 cache cũng
được tích hợp vào bên trong vi xử lý. Việc bổ sung L2 cache làm tăng tỷ lệ cache
hit, cải thiện đáng kể tốc độ của hệ thống.
Các bộ vi xử lý hiện đại ngày nay còn được tích hợp thêm bộ nhớ cấp 3 (L3
cache) có dung lượng lên đến hàng MB, làm cho tốc độ của toàn hệ thống máy tính
71
ngày càng được nâng cao. Hình 4.14 là mô hình của cache nhiều tầng. Theo cấp
tăng dần, bộ nhớ cache có tốc độ giảm dần nhưng dung lượng tăng dần, nghĩa là L1
cache có tốc độ cao nhất và dung lượng nhỏ nhất, còn L3 cache có tốc độ thấp nhất
và dung lượng cao nhất.
Hình 4.14. Cấu trúc cache 3 tầng
Bảng 4.1 mô tả sự phát triển của bộ nhớ cache theo các dòng vi xử lý của
Intel.
Bảng 4.1. Sự phát triển của bộ nhớ cache theo các dòng vi xử lý của Intel
Vi xử lý Intel Mô tả
386 Bổ sung bộ nhớ cache ngoài
486
Tích hợp bộ nhớ cache vào bên trong vi xử lý
Bổ sung thêm bộ nhớ cache ngoài, gọi là L2 cache
Pentium Tách riêng bộ nhớ cache dùng cho lệnh và dữ liệu
Pentium II Tích hợp bộ nhớ L2 cache vào bên trong vi xử lý
Pentium III Bổ sung thêm bộ nhớ cache ngoài, gọi là L3 cache
Pentium 4 Tích hợp bộ nhớ L3 cache vào bên trong vi xử lý
4.4.4. Phân loại
Bên trong vi xử lý thường có hai loại cache, đó là: cache dùng để lưu trữ
lệnh của vi xử lý và cache dùng để lưu trữ dữ liệu trong lúc hoạt động. Thời điểm
ban đầu khi kỹ thuật sử dụng bộ nhớ cache vừa mới xuất hiện, chỉ có duy nhất một
bộ nhớ cache dùng để lưu trữ cả lệnh và dữ liệu. Về sau, cache L1 được tách thành
hai phần để chứa lệnh và dữ liệu riêng biệt. Kỹ thuật sử dụng chung bộ nhớ cache
cho lệnh và dữ liệu có một số ưu điểm sau:
72
Dung lượng bộ nhớ cache lớn, do đó tỷ lệ truy cập cache thành công sẽ cao
hơn so với kỹ thuật sử dụng cache riêng
Đơn giản hơn so với kỹ thuật sử dụng cache riêng do chỉ cần tổng hợp và
thiết kế một bộ nhớ cache duy nhất
Tuy nhiên, cache chung không còn thích hợp khi kỹ thuật superscalar xuất
hiện. Như đã đề cập ở phần trên, đây là kỹ thuật thực thi nhiều lệnh song song, do
đó, sẽ xảy ra trường hợp tranh chấp bộ nhớ cache để truy cập lệnh và dữ liệu làm
hạn chế tốc độ thực thi của vi xử lý. Giả sử một lệnh truy xuất đang truy xuất dữ
liệu trong cache, khi đó nếu ta sử dụng bộ nhớ cache chung, lệnh sau đó chỉ được
gọi khi lệnh truy xuất dữ liệu này hoàn thành do tại một thời điểm bộ nhớ cache chỉ
có thể đáp ứng việc truy cập cho một lệnh. Xác suất xảy ra các trường hợp này khá
cao, do đó không phát huy hết ưu điểm của kỹ thuật superscalar. Để có thể kết hợp
các ưu điểm của cache chung và riêng, người ta tách bộ nhớ cache L1 thành hai
phần riêng biệt dành để chứa lệnh và dữ liệu, các bộ nhớ cache cấp cao hơn (hiện
nay là các cấp 2 và 3) vẫn là các cache dùng chung.
CÂU HỎI ÔN TẬP CHƢƠNG 4
1. Giải thích nguyên lý hoạt động của cấu trúc pipeline 4 tầng?
2. Trình bày những yếu tố có thể ảnh hưởng đến hoạt động của cấu trúc pipeline và
các giải pháp khắc phục.
3. Kỹ thuật superscalar là gì?
4. Thanh ghi trong vi xử lý là gì? Một vi xử lý thường có mấy loại thanh ghi, trình
bày đặc điểm của từng loại.
5. Tập lệnh của vi xử lý là gì? Mô tả các trường có thể có của một lệnh trong tập
lệnh.
6. Phân biệt các loại bộ nhớ: RAM, ROM, PROM, EPROM, EEPROM.
7. Trình bày chức năng của hệ thống kết nối (bus). Vì sao ta thường phải thiết kế
nhiều bus trong một hệ thống?
8. Trình bày chức năng của bộ nhớ truy cập nhanh cache và đặc điểm của các tầng
cache trong vi xử lý. Tại sao phải phân chia cache L1 thành cache lệnh và dữ liệu?
73
Chƣơng 5. HỆ THỐNG XUẤT NHẬP
Xuất nhập là quá trình chuyển dữ liệu giữa các thành phần của máy tính (bao
gồm các thiết bị ngoại vi và bộ nhớ) dưới sự điều khiển của vi xử lý trung tâm. Các
thiết bị ngoại vi, còn gọi là các I/O (input/output) gồm có ba loại: các thiết bị nhập
dữ liệu (input) (như bàn phím, chuột, micro, ), các thiết bị xuất dữ liệu (output)
(như màn hình, loa, máy in, ) và các thiết bị vừa nhập, vừa xuất (như ổ đĩa cứng,
bộ nhớ USB, màn hình cảm ứng, ). Mỗi thiết bị ngoại vi được điều khiển bằng
một khối điều khiển I/O. Để nội dung được ngắn gọn, ta gọi khối điều khiển I/O là
ngoại vi, phân biệt với các thiết bị ngoại vi là các thiết bị kết nối vào khối điều
khiển I/O. Mỗi ngoại có hai giao diện chính như hình 5.1.
Giao diện giao tiếp bus: dùng để giao tiếp với bộ xử lý trung tâm và bộ nhớ.
Giao diện này bao gồm các nhóm tín hiệu theo tiêu chuẩn chung của bus như: địa
chỉ, dữ liệu, điều khiển, vì vậy thường như nhau cho tất cả các ngoại vi.
Giao diện giao tiếp với các thiết bị ngoại vi: bao gồm các tín hiệu kết nối với
thiết bị ngoại vi, vì vậy giao diện này khác nhau cho các ngoại vi khác nhau.
Hình 5.1. Giao diện chính của các ngoại vi
Có ba phương pháp cơ bản để chuyển dữ liệu giữa các thành phần của máy
tính:
Hỏi vòng: hay còn gọi là xuất nhập dữ liệu được điều khiển bằng chương
trình
Xuất nhập dữ liệu bằng ngắt
Truy cập bộ nhớ trực tiếp (còn gọi là DMA)
74
Trong đó, phương pháp đầu tiên ít được sử dụng do không phát huy hết khả
năng của bộ xử lý trung tâm và đáp ứng chậm. Phần tiếp theo ta sẽ tìm hiểu về 2
phương pháp còn lại: ngắt và truy cập bộ nhớ trực tiếp.
5.1. Hệ thống ngắt
Trước khi tìm hiểu về ngắt, ta cần tìm hiểu về hoạt động cơ bản của phương
pháp xuất nhập dữ liệu hỏi vòng. Đây là phương pháp đơn giản nhất, hoạt động chủ
yếu dựa trên sự điều khiển của chương trình phần mềm. Trong đó, ta sẽ lập trình
cho vi xử lý dò hỏi từng ngoại vi có yêu cầu truyền dữ liệu hay không. Quá trình
này sẽ được lặp đi lặp lại trong suốt thời gian hoạt động của hệ thống. Do đó, công
việc của vi xử lý chỉ là liên tục dò trạng thái các ngoại vi và điều khiển việc truyền
dữ liệu. Ngoài ra, do việc dò hỏi diễn ra tuần tự nên một ngoại vi muốn truyền dữ
liệu phải chờ đến khi được vi xử lý dò hỏi. Việc này tạo ra độ trễ dữ liệu gây ảnh
hưởng đến hoạt động của ngoại vi, đặc biệt là các ngoại vi tốc độ cao. Đây là hai
nhược điểm chủ yếu của phương pháp hỏi vòng đã được đề cập ở phần trên. Phương
pháp ngắt xuất hiện đã khắc phục được hai nhược điểm này.
Nếu như ở phương pháp hỏi vòng, các ngoại vi không thể chủ động truyền
dữ liệu tại thời điểm mong muốn thì với phương pháp ngắt, các ngoại vi sẽ chủ
động gởi yêu cầu truy xuất dữ liệu đến vi xử lý. Các yêu cầu này còn được gọi là
yêu cầu ngắt, thường xuất hiện bất đồng bộ và được truyền đến vi xử lý thông qua
ngõ ra ngắt của các ngoại vi. Bên phía vi xử lý, tương ứng cũng có ngõ vào ngắt để
tiếp nhận yêu cầu từ các ngõ ra ngắt này. Khi nhận được yêu cầu, vi xử lý sẽ lập tức
dừng chương trình chính đang thực thi và chuyển đến thực thi chương trình phục vụ
cho yêu cầu ngắt. Quá trình này được mô tả như trong hình 5.2.
Hình 5.2. Hoạt động ngắt của vi xử lý
75
Tùy thuộc vào thiết kế của từng ngoại vi, các yêu cầu ngắt thường được thể
hiện dưới hai hình thức, đó là: ngắt cạnh và ngắt mức.
Ngắt cạnh: yêu cầu ngắt được thể hiện dưới hình thức là cạnh lên hoặc cạnh
xuống của ngõ ra ngắt.
Ngắt mức: yêu cầu ngắt được thể hiện dưới hình thức là mức cao hoặc mức
thấp của ngõ ra ngắt.
Đối với các thiết bị ngoại vi, một vài thao tác có thể làm cho các ngoại vi gây
ra yêu cầu ngắt như: thao tác nhấn phím, nhấn chuột, chạm vào màn hình cảm ứng,
Khi xuất hiện yêu cầu ngắt từ ngoại vi, hầu hết các phần cứng vi xử lý sẽ
thực hiện lần lượt một số thao tác sau:
Tiếp tục hoàn thành lệnh đang thực thi
Gởi lại một tín hiệu xác nhận để thông báo cho ngoại vi biết đã nhận được tín
hiệu và sẽ đáp ứng cho yêu cầu ngắt, ngoại vi có thể tắt yêu cầu ngắt
Lưu lại một số thông tin quan trọng trước khi chuyển đến chương trình phục
vụ ngắt để có thể tiếp tục thực hiện chương trình chính sau khi hoàn thành chương
trình ngắt. Các thông tin này thường bao gồm: trạng thái vi xử lý, địa chỉ của lệnh
tiếp theo trong chương trình chính tại thời điểm xảy ra ngắt.
Chuyển đến chương trình phục vụ ngắt (còn gọi là chương trình ngắt).
Sau khi hoàn thành chương trình phục vụ ngắt, phần cứng vi xử lý sẽ phục
hồi lại trạng thái của vi xử lý trước khi xảy ra ngắt và rẻ nhánh đến để thực hiện
lệnh tiếp theo trong chương trình chính.
Việc lưu lại trạng thái của vi xử lý là cần thiết vì ngắt là sự kiện bất đồng bộ
đối với chương trình của vi xử lý, có thể xảy ra tại bất kỳ thời điểm nào trong quá
trình hoạt động của hệ thống.
Chương trình phục vụ ngắt được lập trình để thực hiện các thao tác thích hợp
khi có sự kiện ngắt bất đồng bộ xảy ra. Thông thường, các ngoại vi khác nhau sẽ có
các chương trình phục vụ ngắt khác nhau. Việc xác định đúng chương trình ngắt
phục vụ cho ngoại vi đang có yêu cầu ngắt rất quan trọng. Sau đây là một số kỹ
thuật để thực hiện công việc này.
76
Dò chương trình ngắt bằng phần mềm: trong một số thiết kế, vi xử lý sẽ
chuyển đến thực hiện lệnh trong chương trình ở một địa chỉ cố định khi có yêu cầu
ngắt. Sau đó, chương trình phần mềm phải có nhiệm vụ dò xem ngoại vi nào đang
có yêu cầu ngắt bằng cách đọc thanh ghi trạng thái của các ngoại vi. Sau khi xác
định được ngoại vi có yêu cầu ngắt, vi xử lý sẽ chuyển đến thực thi chương trình
ngắt thích hợp cho ngoại vi đó.
Phương pháp dò chương trình ngắt bằng phần mềm có một nhược điểm, đó
là: phải tốn thời gian dò tìm chương trình ngắt, làm chậm quá trình xử lý ngắt. Để
khắc phục nhược điểm này, người ta sử dụng một phương pháp khác, đó là daisy
chain (còn được gọi dò ngắt bằng phần cứng). Khi nhận được yêu cầu ngắt, vi xử lý
sẽ gởi lại một tín hiệu xác nhận ngắt. Tín hiệu này được đưa lần lượt qua từng ngoại
vi cho đến khi gặp ngoại vi đang có yêu cầu ngắt. Sau đó, ngoại vi đưa một word
lên bus dữ liệu. Word này còn được gọi là vector ngắt, chứa nhiều thông tin, trong
đó bao gồm cả địa chỉ của chương trình ngắt. Vi xử lý đọc vector ngắt, và chuyển
đến chương trình ngắt tương ứng bắt đầu từ địa chỉ chứa trong vector ngắt này.
Hệ thống máy tính có rất nhiều ngoại vi, mỗi ngoại vi đều có thể tạo yêu cầu
ngắt để truyền dữ liệu. Trong trường hợp có nhiều yêu cầu ngắt xuất hiện cùng một
lúc, thông thường yêu cầu ngắt nào có tính cấp thiết hơn sẽ được đáp ứng trước.
Việc phân xử để xác định thứ tự đáp ứng ngắt được thực hiện bằng bộ điều khiển
ngắt. Tùy theo đặc điểm của từng hệ thống, mức độ ưu tiên ngắt của các ngoại vi có
thể khác nhau, nhưng nhìn chung các ngoại vi sau thường có ưu tiên ngắt cao hơn
so với các ngoại vi còn lại, đó là: bộ xử lý đồ họa, điều khiển bộ nhớ, điều khiển
PCIe, ethernet. Việc quy định mức độ ưu tiên ngắt của các ngoại vi thường do
người thiết kế hệ thống quyết định. Bộ điều khiển ngắt được lập trình để phân xử
ngắt đúng theo những quy định này.
Lấy ví dụ với vi xử lý 8086 của Intel, ngõ vào yêu cầu ngắt có hai chân là
INTR và NMI. Chân INTR thường được kết nối với ngõ ra INT của bộ điều khiển
ngắt 8259A. Ngoài chức năng phân xử ngắt, 8259A còn được sử dụng để mở rộng
số lượng ngõ vào yêu cầu ngắt, đáp ứng cho các hệ thống có nhiều ngoại vi. Các
yêu cầu ngắt vào chân INTR (thông qua 8259A) là các ngắt có thể che được, nghĩa
77
là có thể được hoặc không được đáp ứng. Các yêu cầu ngắt vào chân NMI là các
yêu cầu không che được, nghĩa là các yêu cầu này luôn được đáp ứng. Do đó, chân
NMI thường được sử dụng cho các yêu cầu ngắt quan trọng liên quan đến lỗi phần
cứng như: lỗi pin, lỗi bộ nhớ,
5.2. Truy cập trực tiếp bộ nhớ
Kỹ thuật truyền dữ liệu sử dụng ngắt có khả năng đáp ứng nhanh nhưng việc
truyền dữ liệu vẫn phải được thực hiện thông qua vi xử lý. Nghĩa là, trong chương
trình ngắt, vi xử lý phải đọc dữ liệu từ ngoại vi muốn truyền dữ liệu (còn gọi là
nguồn) và ghi dữ liệu xuống ngoại vi cần nhận dữ liệu (còn gọi là đích) như hình
5.3. Việc này gần như ít ảnh hưởng đến tốc độ chung của hệ thống nếu dữ liệu cần
truyền có dung lượng nhỏ. Tuy nhiên, khi cần truyền khối dữ liệu có dung lượng
lớn, với nguồn hoặc đích là bộ nhớ hoặc thiết bị lưu trữ, kỹ thuật ngắt không còn
thích hợp do vi xử lý phải truyền và nhận lượng lớn dữ liệu cùng với việc có thể
truy cập đến các bộ nhớ hoặc thiết bị lưu trữ có tốc độ thấp sẽ tiêu tốn rất nhiều thời
gian của vi xử lý, ảnh hưởng đến tốc độ chung của cả hệ thống.
Hình 5.3. Truyền dữ liệu thông qua vi xử lý
Để giải quyết những hạn chế của kỹ thuật ngắt, người ta thiết kế thêm một
phần cứng để hỗ trợ việc truyền dữ liệu không cần thông qua vi xử lý. Kỹ thuật này
được gọi là truy cập trực tiếp bộ nhớ (còn gọi là DMA). Phần cứng được thiết kế
thêm gọi là bộ điều khiển DMA (còn gọi là DMAC). DMAC được kết nối trực tiếp
với bus hệ thống. Chức năng chính của bộ điều khiển DMA là chuyển dữ liệu giữa
các ngoại vi, thiết bị lưu trữ và bộ nhớ trong hệ thống như mô tả trong hình 5.4. Bộ
DMAC thay thế vai trò của vi xử lý trong kỹ thuật sử dụng ngắt. Do đó, DMAC có
quyền chiếm bus khi cần truyền dữ liệu. Vi xử lý buộc phải nhường quyền kiểm
soát bus cho DMAC cho đến khi quá trình truyền dữ liệu hoàn tất.
Bộ điều khiển DMA hoạt động dựa trên một số thông tin cơ bản sau:
Địa chỉ nguồn: địa chỉ bắt đầu của ngoại vi, thiết bị lưu trữ hoặc bộ nhớ chứa
dữ liệu cần phải truyền đi
78
Địa chỉ đích: địa chỉ bắt đầu của ngoại vi, thiết bị lưu trữ hoặc bộ nhớ dùng
để lưu dữ liệu được truyền đến
Cách thức đọc/ghi dữ liệu ở nguồn/đích: dữ liệu được truy xuất theo địa chỉ
tăng dần, giảm dần hoặc không đổi
Số lượng dữ liệu: dung lượng dữ liệu (thường tính theo byte) cần được truyền
đi
Hình 5.4. Truyền dữ liệu thông qua DMAC
Dữ liệu truyền theo kỹ thuật DMA thường là các khối gồm nhiều byte dữ liệu
được lưu trữ trong các địa chỉ kế tiếp nhau hoặc không đổi (đối với bộ nhớ FIFO).
Như hình 5.5, ta có thể xác định các khối dữ liệu gồm (n+1) byte, địa chỉ đầu là a,
địa chỉ tăng dần hoặc giảm dần. Do đó, DMAC cần phải có các thông tin như trên
để truyền đi một khối dữ liệu.
Hình 5.5. Minh họa một cách xác định khối dữ liệu trong kỹ thuật DMA
Các thông tin này được lập trình cho DMAC thông qua vi xử lý. Sau khi có
lệnh DMAC sẽ thực hiện truyền dữ liệu trực tiếp mà không cần phải thông qua vi
xử lý. Trong thời gian truyền dữ liệu qua DMAC, vi xử lý có thể thực hiện các công
việc khác. Khi hoàn thành, bộ điều khiển DMA sẽ gởi một tín hiệu ngắt để thông
báo và trả lại quyền kiểm soát bus hệ thống cho vi xử lý. Như vậy, vi xử lý chỉ có
chức năng kiểm soát lúc bắt đầu và lúc kết thúc việc truyền dữ liệu.
79
Hiện nay, nhu cầu trao đổi dữ liệu trong hệ thống rất lớn, đặc biệt là giữa các
thành phần như: bộ nhớ USB, ổ đĩa cứng, mạng máy tính, Do đó, các ngoại vi
như: điều khiển USB, SATA, Ethernet, cũng được trang bị các bộ điều khiển
DMA riêng.
Sau đây, ta lấy ví dụ bộ điều khiển DMA tương thích với các dòng vi xử lý
Intel họ 8086, có tên là 8237A. Hình 5.6 mô tả sơ đồ kết nối 8237A với vi xử lý.
Giả sử ổ đĩa cứng (disk) muốn nhận dữ liệu từ bộ nhớ (memory) thông qua DMA.
Quá trình đồng bộ (bắt tay) để truyền dữ liệu sẽ được thực hiện như sau:
Ngoại vi (trong trường hợp này là bộ điều khiển ổ đĩa) sẽ gởi một yêu cầu sử
dụng DMA đến 8237A bằng cách đưa tín hiệu DREQ lên mức cao.
Chip 8237A sẽ kéo tín hiệu HRQ (kết nối với chân HOLD của vi xử lý) lên
mức cao, báo hiệu cho vi xử lý biết nó cần sử dụng bus để truyền dữ liệu
Vi xử lý sẽ hoàn thành chu kỳ bus hiện tại và kéo chân HLDA lên mức cao
để báo cho 8237A biết nó đã có thể sử dụng bus để truyền dữ liệu. Trong lúc 8237A
thực hiện việc truyền dữ liệu, chân HOLD phải được giữ ở mức cao.
Chip 8237A sẽ tích cực tín hiệu DACK để báo hiệu cho ngoại vi có thể thực
hiện việc truyền dữ liệu.
Chip 8237A bắt đầu truyền dữ liệu bằng cách đặt địa chỉ của byte đầu tiên
lên bus địa chỉ và tích cực chân MEMR để đọc dữ liệu từ bộ nhớ và đặt lên bus dữ
liệu. Sau đó, 8237A sẽ tích cực chân IOW để ghi dữ liệu từ bus dữ liệu xuống ngoại
vi. Chip 8237A, sau đó, sẽ giảm bộ đếm dữ liệu, tăng (hoặc giảm tùy theo cách lập
trình) con trỏ địa chỉ và lặp lại quá trình như trên cho đến khi bộ đếm dữ liệu về 0,
hoàn thành quá trình truyền dữ liệu.
Chip 8237A đưa chân HRQ xuống mức thấp, thông báo cho vi xử lý lấy lại
quyền điều khiển bus, đồng thời gởi cho vi xử lý một tín hiệu ngắt báo hiệu việc
truyền dữ liệu đã hoàn tất.
80
Hình 5.6. Kết nối 8237A với vi xử lý
Mỗi kỹ thuật truy xuất dữ liệu đều có những ưu điểm riêng tùy thuộc vào
điều kiện hoạt động cụ thể của hệ thống. Do đó, người ta thường sử dụng kết hợp
các kỹ thuật truy xuất dữ liệu này khi lập trình hoạt động cho vi xử lý.
5.3. Thiết bị bên ngoài
Thiết bị bên ngoài là các thành phần giúp máy tính giao tiếp với môi trường
bên ngoài. Như đã đề cập trong phần đầu của chương, các thiết bị này còn được gọi
là các thiết bị ngoại vi, giao tiếp với máy tính thông qua các bộ điều khiển I/O, còn
được gọi là ngoại vi của hệ thống máy tính. Các thiết bị bên ngoài có thể được chia
thành ba nhóm lớn:
Các thiết bị nhập dữ liệu
Các thiết bị xuất dữ liệu
Các thiết bị lưu trữ
Các thiết bị ngoại vi phổ biến và quen thuộc nhất đối với con người có lẽ là:
chuột, bàn phím, màn hình máy tính và ổ đĩa cứng.
Chuột và bàn phím máy tính là các thiết bị nhập dữ liệu, thường kết nối với
máy tính thông qua cổng PS/2. Ngày nay, hầu hết các cổng PS/2 đã được thay thế
bằng cổng USB. Dữ liệu truyền qua bàn phím là các ký tự, thường được mã hóa
dưới dạng chuỗi 7 hoặc 8 bit. Hiện nay, phiên bản 7 bit, tương ứng với 128 ký tự
được sử dụng phổ biến. Các ký tự bao gồm hai loại: ký tự in được và ký tự điều
81
khiển. Ký tự in được là các ký tự chữ, số thông thường và một số ký tự đặc biệt
khác có thể hiển thị trên màn hình hoặc có thể in được trên giấy (thông qua máy in).
Các ký tự điều khiển có chức năng điều khiển việc hiển thị các ký tự trên màn hình.
Ví dụ như ký tự xuống dòng (khi ta nhấn Enter), có chức năng điều khiển con trỏ
chuyển sang dòng mới. Các phím được bố trí theo ma trận, việc xác định chuỗi bit
biểu diễn cho một ký tự khi ta nhấn phím được gọi là quét phím. Quá trình này
được một chip điều khiển quét phím chuyên dụng thực hiện. Chuỗi bit này được
truyền nối tiếp đến máy tính thông qua cổng PS/2. Dữ liệu truyền qua chuột máy
tính thường là các thông tin về tọa độ của chuột theo hai trục X và Y và thông tin về
trạng thái các nút nhấn.
Các thông tin được truyền từ chuột và bàn phím thường được tiếp nhận và
hiển thị trên màn hình. Do đó, màn hình máy tính là thiết bị xuất dữ liệu. Ngày nay,
các màn hình CRT truyền thống gần như đã được thay thế bằng các màn hình LCD
nhỏ gọn hơn rất nhiều.
Ngày nay, cùng với màn hình, máy in cũng là một thiết bị xuất dữ liệu phổ
biến trong hệ thống máy tính. Trên thị trường hiện nay có nhiều loại máy in, nội
dung môn học này chỉ đề cập đến hai loại máy in phổ biến được trang bị trong văn
phòng và các hộ gia đình, đó là máy in phun và máy in laser.
Bộ phận quan trọng nhất của máy in laser là một ống kim loại hình trụ, rỗng,
được phủ một lớp vật liệu đặc biệt, có khả năng thay đổi điện tích khi ánh sáng laser
chiếu vào, gọi là trống (drum). Nguyên lý chung của các máy in laser là sử dụng
một hệ thống quang học lái tia laser khắc các hình ảnh cần in lên mặt trống. Sau đó,
trống được lăn qua giấy để in những hình ảnh này lên giấy. Mực máy in laser có
dạng bột, được sấy nóng chảy để bám vào giấy. Do đó, các máy in laser có thể in
được trên nhiều loại giấy mà vẫn đảm bảo được chất lượng.
Các máy in phun sử dụng một đầu phun dùng để phun mực trực tiếp lên giấy.
Mực máy in phun có dạng lỏng nên có hai khuyết điểm như sau: bản in thường bị
lem và hình ảnh thường phai màu theo thời gian. Do đó, ta phải sử dụng đúng loại
giấy cho máy in phun, các loại giấy này thường có đặc điểm chung là không dễ bị
82
thấm nước. Để khắc phục khuyết điểm thứ hai, người ta thường sử dụng các loại
mực chất lượng cao có pha chế với chất chống bay màu.
Hiện nay, các máy in phun thường được sử dụng để in màu. Chất lượng hình
ảnh màu của các máy in phun thường cao hơn, giá thành của máy in phun cũng rẻ
hơn so với máy in laser, tuy nhiên chi phí để in một trang giấy bằng máy in phun
đắt hơn nhiều lần so với máy in laser. Do đó, tùy vào mục đích sử dụng mà ta nên
trang bị loại máy in cho phù hợp.
Ổ đĩa cứng truyền thống là thiết bị lưu trữ dữ liệu dưới dạng từ tính. Các tín
hiệu từ tính được chuyển đổi thành các bit dữ liệu bằng một bộ chuyển đổi chuyên
dụng trước khi truyền đến máy tính. Chuẩn giao tiếp truyền thống giữa ổ đĩa cứng
và máy tính là IDE, thực hiện việc truyền dữ liệu song song. Tuy nhiên, chuẩn này
bị hạn chế về tốc độ truyền dữ liệu, nên hiện nay, chuẩn SATA truyền dữ liệu nối
tiếp, có tốc độ cao và nhỏ gọn hơn được sử dụng phổ biến hơn.
5.4. Các ngoại vi
Như đã đề cập trong phần đầu của chương, ngoại vi của vi xử lý là các khối
điều khiển I/O. Ngoại vi có một số chức năng chính như sau.
Điều khiển và định thì
Giao tiếp với vi xử lý
Giao tiếp với thiết bị bên ngoài
Đệm dữ liệu
Phát hiện lỗi
Trong quá trình hoạt động, vi xử lý phải giao tiếp với rất nhiều thiết bị bên
ngoài. Các nguồn tài nguyên của hệ thống như bộ nhớ chính hay bus hệ thống được
chia sẻ để có thể hoạt động với nhiều ngoại vi. Vì vậy, các ngoại vi yêu cầu phải có
chức năng điều khiển và định thì để có thể điều khiển các thiết bị bên ngoài hoạt
động đồng bộ hoạt động đồng bộ trong hệ thống.
Từ hình 5.1, ta có thể thấy, các ngoại vi có hai giao diện chính.
Giao tiếp bus: dùng để giao tiếp, trao đổi dữ liệu với vi xử lý và các thành
phần khác trong hệ thống thông qua bus. Các tín hiệu trong giao diện này phải
83
tương thích với bus, do đó, thường giống nhau cho các ngoại vi kết nối đến cùng
một bus.
Giao tiếp với các thiết bị bên ngoài: dùng để kết nối và trao đổi dữ liệu với
các thiết bị bên ngoài. Các tín hiệu trong giao diện này hoàn toàn khác nhau giữa
các ngoại vi do thiết bị bên ngoài có các chuẩn giao tiếp khác nhau.
Tốc độ truy xuất dữ liệu của các ngoại vi và bộ nhớ không giống nhau, do đó
chức năng đệm dữ liệu là cần thiết để đảm bảo việc truyền dữ liệu giữa các thành
phần trong hệ thống diễn ra một cách đồng bộ.
Hầu hết các ngoại vi còn có chức năng phát hiện lỗi trong quá trình truyền dữ
liệu.Khi phát hiện lỗi trong dữ liệu nhận được, ngoại vi thường thông báo lỗi này
cho vi xử lý để có hướng xử lý cho phù hợp. Sử dụng parity bit là một ví dụ đơn
giản về việc dùng thêm một bit để phát hiện lỗi trong các giao thức truyền dữ liệu
nối tiếp.
CÂU HỎI ÔN TẬP CHƢƠNG 5
1. Mô tả hoạt động của vi xử lý khi nhận được yêu cầu ngắt từ ngoại vi. Vì sao phải
lưu lại trạng thái các thanh ghi trước khi thực hiện chương trình ngắt?
2. Kỹ thuật DMA là gì? Trình bày ưu điểm của việc truy xuất dữ liệu bằng kỹ thuật
DMA so với kỹ thuật ngắt.
3. Trình bày quá trình xảy ra trong hệ thống khi có một yêu cầu truy xuất dữ liệu
bằng kỹ thuật DMA.
4. Thiết bị ngoại vi được kết nối với máy tính thông qua thành phần nào trong hệ
thống. Mô tả đặc điểm chính của các thành phần này.
84
TÀI LIỆU THAM KHẢO
[1]. Tống Văn On, Giáo trình Cấu trúc máy tính, Nhà xuất bản Lao động – Xã hội,
2007.
[2]. Paul A.Carter, PC Assembly Language, 2006.
[3]. William Stallings, Computer Organization and Architecture (Ninth Edition),
Prentice Hall, 2012
[4]. Linda Null, Julia Lobur, The Essentials of Computer Organization and
Architecture, Jones and Bartlett Publishers, 2003.
Các file đính kèm theo tài liệu này:
- cau_truc_may_tinh_5031_2042685.pdf