Giáo trình: Cấu trúc máy tính và giao diện - Nguyễn Phạm Hoàng Dũng

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.

pdf88 trang | Chia sẻ: thucuc2301 | Lượt xem: 635 | Lượt tải: 1download
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:

  • pdfcau_truc_may_tinh_5031_2042685.pdf
Tài liệu liên quan