Tài liệu Các phương pháp điều khiển vào ra dữ liệu
Bạn đang xem 20 trang mẫu của tài liệu "Tài liệu Các phương pháp điều khiển vào ra dữ liệu", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
tai_lieu_cac_phuong_phap_dieu_khien_vao_ra_du_lieu.doc
Nội dung text: Tài liệu Các phương pháp điều khiển vào ra dữ liệu
- CÁC PHƯƠNG PHÁP ĐIỀU KHIỂN VÀO RA DỮ LIỆU
- Mục lục 1. GIỚI THIỆU CÁC PHƯƠNG PHÁP ĐIỀU KHIỂN VÀO/RA DỮ LIỆU. 2. VÀO RA DỮ LIỆU BẰNG PHƯƠNG PHÁP QUÉT VÒNG. 3. VÀO RA DỮ LIỆU BẰNG PHƯƠNG PHÁP NGẮT. Nội dung CÁC PHƯƠNG PHÁP ĐIỀU KHIỂN VÀO RA DỮ LIỆU 1. GIỚI THIỆU CÁC PHƯƠNG PHÁP ĐIỀU KHIỂN VÀO/RA DỮ LIỆU. Như đã biết hệ thống CPU bao gồm 3 phần chính : CPU, bộ nhớ và vào ra. Trong đó CPU đóng vai trò là nơi chỉ đạo tất cả các hoạt động của các nơi còn lại. Đối với bộ nhớ chúng có tốc độ hoạt động khá nhanh, có thể đáp ứng gần như tức thời khi CPU truy cập, mặt khác bộ nhớ sử dụng lưu trữ các hằng và biến nên khi cần chúng sẽ được truy xuất bằng một lệnh truyền dữ liệu, khi đó dữ liệu đã có sẵn trong bộ nhớ mà không phải chờ đáp ứng từ bên ngoài. Còn đối với vào ra thông thường có tốc độ đáp ứng chậm, mặt khác đôi khi chúng còn phải chờ tác động từ bên ngoài (ví dụ như khi đọc bàn phím CPU phải chờ cho người sử dụng nhấn phím ). Khi hệ thống CPU có nhiều thiết bị vào ra có thể thực hiện ba giải pháp quản lý thiết bị bao gồm: - Vào ra dữ liệu bằng phương pháp quét vòng (polling). - Vào ra dữ liệu bằng ngắt (interrupt). - Vào ra dữ liệu bằng phương pháp thâm nhập trực tiếp bộ nhớ ( DMA -Direct Memory Access). Với phương pháp quét vòng CPU sẽ hoạt động theo chế độ phân chia thời gian, nó sẽ kiểm tra lần lượt từng thiết bị và thực hiện chương trình phục vụ khi có thiết bị hoạt động. Với phương pháp ngắt thiết bị hoạt động sẽ thông báo để CPU biết phục vụ nó. Còn với phương pháp vào ra bằng DMA, CPU sẽ được yêu cầu ngưng hoạt động để thiết bị vào ra (thường là ổ đĩa) truyền dữ liệu theo từng khối với bộ nhớ. Mỗi phương pháp điều khiển vào ra dữ liệu nêu trên có các đặc điểm khác nhau và sẽ được ứng dụng trong các trường hợp khác nhau, chúng sẽ được mô tả cụ thể trong các mục kế tiếp của chương. 2. VÀO RA DỮ LIỆU BẰNG PHƯƠNG PHÁP QUÉT VÒNG. Như đã nói trong phương pháp quét vòng CPU sẽ kiểm tra lần lượt từng thiết bị có trong hệ thống của nó. Đối với các thiết bị luôn sẵn sàng hoạt động thiết bị có thể truyền dữ liệu một cách hoàn toàn thụ động tới vào ra, CPU sẽ mở cửa vào ra để đọc dữ liệu hoặc ghi dữ liệu tới thiết bị khi chúng tới vòng phục vụ. Lúc này các bộ vào ra chỉ đóng vai trò là các cổng ngăn cách giữa Bus hệ thống và thiết bị, để các hoạt động của thiết bị không ảnh hưởng tới hệ thống trong khi CPU phục vụ các thiết bị khác. Ví dụ như trong hệ thống đo nhiệt độ và hiển thị lên LED 7 đoạn: cứ tới vòng phục vụ CPU sẽ đọc được giá trị số tương ứng với nhiệt độ đầu dò luôn sẵn sàng tại ngõ ra bộ biến đổi A/D, và sau đó sẽ cung cấp ra LED 7 đoạn để hiển thị. Và nếu vòng phục vụ đủ ngắn, có thể luôn thấy nhiệt độ cần đo hiển thị trên LED trong khi các thiết bị khác của hệ thống vẫn được phục vụ. Tuy nhiên trong thực tế không phải tất cả các thiết bị làm việc với CPU đều luôn ở trạng thái sẵn sàng như trên. Nên rất dễ xảy ra khả năng tới vòng phục vụ mà thiết bị chưa sẵn sàng truyền dữ liệu với CPU. Để chắc chắn
- truyền được dữ liệu với thiết bị trong phương pháp thăm dò khi tới vòng phục vụ, trước khi thực hiện việc truyền dữ liệu CPU sẽ kiểm tra trạng thái của thiết bị bằng cách đọc vào các tín hiệu bắt tay (Handshake Signal). Ví dụ trên hình 6.1 trình bày mạch giao tiếp vào (Input) có bắt tay giữa một thiết bị và CPU. Mạch Mạch cài Thiết bị Data Bus đệm vào D0 –D7 G Trên hình 6.1 khi thiết bị OCvào có dữ liệu truyền cho CPU, nó cung STBcấp tín hiệu STB để cài dữ liệu vào bộ cài đồng thời kích cho mạch lật tạo tín hiệu sẵn sàng làm việc mức 1. Khi tới vòng phục vụ của thiết bị này, trước hết CPU đọc cổng 0 (CS0 = 0) nếu được dữ liệu với bit D0 = 1 thì nó hiểu rằng thiết bị này đã sẵn sàng làm việc. Khi CPU đọc cổng 1 (CS1 = 0) để CS1lấy dữ liệu nó sẽ xoá luôn tín hiệu+5V sẵn sàng để chuẩn bị cho lần truyền dữ liệu tiếp theo. pr Data Bus Q D D CPU0 8255 clk PC4 clr STB Thiết bị vào CS0 PC5 ACK D0-D7 PA0-PA7 D0 –D7 CS1 Hình 6.1: Mạch giao tiếp vào có bắt tay. PC1 STB Thiết bị ra PC2 ACK D0 –D7 PB0-PB7 Hình 6.2: Vào ra có bắt tay sử dụng 8255 Trong các hệ thống vi xử lý các mạch vào ra có bắt tay thông thường được thực hiện bằng các bộ vào ra có lập trình, việc thiết kế mạch sẽ đơn giản hơn rất nhiều vì các mạch tạo tín hiệu bắt tay được tích hợp ngay trong chip vào ra này. Hình 6.2 trình bày sơ đồ vào ra có bắt tay sử dụng 8255. Trên sơ đồ, 8255 đóng vai trò giao tiếp với một thiết bị vào và một thiết bị ra. Cổng A của 8255 dành cho việc truyền dữ liệu vào, PC4, PC5 sử dụng làm các thiết bị bắt tay vào. Khi thiết bị vào có dữ liệu truyền, trước hết nó kiểm tra tín hiệu ACK, nếu tín hiệu này tích cực thì dữ liệu truyền trước đó chưa được CPU đọc vào, nếu ACK không tích cực thiết bị sẽ cung cấp tín hiệu STB để cài dữ liệu vào PA của 8255, 8255 sẽ nhận dữ liệu và tác động ACK. Tín hiệu STB sẽ được giữ nguyên cho đến khi ACK hết tích cực, do đó CPU có thể kiểm tra tín hiệu này để xác định đã có dữ liệu sẵn sàng chưa. Khi CPU đọc dữ liệu từ cổng A, STB và ACK sẽ được xoá. Một giao tiếp gần tương tự sẽ sử dụng cho thiết bị ra. 3. VÀO RA DỮ LIỆU BẰNG PHƯƠNG PHÁP NGẮT. i. Khái quát. Với phương pháp quét vòng dù chỉ kết nối thụ động theo dữ liệu hay có bắt tay, CPU đều đóng vai trò chủ động nó đi quét thường xuyên các thiết bị xem có cần phục vụ
- hay không. Giải pháp này sẽ làm lẵng phí thời gian của CPU khi các thiết bị không có nhu cầu phục vụ thường xuyên, mà CPU vẫn phải thực hiện chương trình kiểm tra. Có một giải pháp vào ra khác tránh được nhược điểm trên, đó là cơ chế ngắt. Trong giải pháp này các thiết bị có yêu cầu phục vụ sẽ nhắc chừng CPU bằng cách cung cấp tín hiệu từ ngoài, lúc này CPU sẽ tạm ngưng công việc nó đang thực hiện để phục vụ thiết bị, khi thiết bị được phục vụ xong CPU sẽ quay về với công việc mà nó đang thực hiện dở. Hầu hết các họ vi xử lý đều cho phép ngưng chương trình bình thường đang thực hiện để chuyển qua một chương trình tại vị trí đặc biệt, bằng một số tín hiệu cung cấp từ bên ngoài hoặc một số lệnh đặc biệt trong chương trình. Việc chuyển điều khiển này giống như cơ chế gọi chương trình con, hoạt động được chuyển từ chương trình chính qua chương trình con phục vụ cho ngắt. INTR CPU INTA Bộ điều khiển ngắt Các yêu cầu ngắt Hình 6.3: Cung cấp các yêu cầu ngắt cho CPU thông qua bộ điều khiển ngắt. Thông thường các CPU có hai tín hiệu để nhận các tín hiệu yêu cầu ngắt là: ngắt không che (NMI - Non Mask able Interrupt), và ngắt có thể che được bằng phần mềm (INT - Interrupt). Tín hiệu yêu cầu ngắt NMI có độ ưu tiên cao hơn INT, và khi nhận được tín hiệu NMI thì CPU bắt buộc phải chuyển điều khiển qua chương trình ngắt. Còn khi nhận được tín hiệu INT thì CPU còn đi xét cờ ngắt, nếu cờ ngắt đã được lập nó sẽ chuyển điều khiển qua chương trình ngắt, còn nếu cờ ngắt chưa được lập thì yêu cầu ngắt sẽ không được phục vụ. Cờ ngắt có thể được lập hay xóa bằng lệnh hợp ngữ trong chương trình, với các công việc quan trọng không cho phép tạm ngưng chúng ta có thể cấm ngắt bằng lệnh xoá cờ ngắt ở đầu chương trình. Để phục vụ ngắt được nhiều thiết bị, trong các hệ thống vi xử lý thường sử dụng bộ điều khiển ngắt. Các tín hiệu yêu cầu sẽ được đưa tới bộ điều khiển ngắt và tùy theo thứ tự ưu tiên sẽ gửi tới CPU như hình 6.3. Nếu chỉ có một yêu cầu ngắt nó sẽ được chuyển ngay tới CPU, nếu có nhiều yêu cầu ngắt xảy ra đồng thời thì yêu cầu nào có độ ưu tiên cao hơn sẽ được bộ điều khiển ngắt gửi tới CPU phục vụ trước. Độ ưu tiên sẽ được lập trình khi khởi động bộ điều khiển ngắt. ii. Ví dụ về cơ chế ngắt của CPU 8086/8088 và Z80. Cơ chế ngắt của CPU 8086/8088. Khái quát: Một yêu cầu ngắt trong hệ thống 8086/8088 có thể cung cấp từ một trong 3 nguồn sau:
- - Nguồn thứ nhất cung cấp từ bên ngoài qua các ngõ vào INTR (Interrupt Request), hoặc NMI, chúng được gọi là các ngắt cứng. - Nguồn thứ 2 thực hiện bằng một lệnh ngắt trong chương trình (INT), trường hợp này được gọi là ngắt mềm. - Nguồn thứ ba xuất phát từ một số điều kiện lỗi trong một số lệnh mà chương trình thực hiện. Ví dụ như khi thực hiện lệnh chia cho 0, 8086/8088 sẽ tự động ngắt chương trình đang thực hiện. Trường hợp này được gọi là ngắt ngoại lệ (exception). Tại cuối mỗi chu kỳ thực hiện lệnh 8086/8088 sẽ kiểm tra các yêu cầu ngắt. Khi có yêu cầu 8086 sẽ đáp ứng bằng các bước sau: - Nạp thanh ghi cờ vào đỉnh ngăn xếp và giảm thanh ghi con trỏ ngăn xếp đi 2. - Không cho phép ngắt INT bằng cách xóa cờ ngắt IF trong thanh ghi cờ. - Xóa cờ bẫy TF trong thanh ghi cờ. - Nạp thanh ghi đoạn lệnh CS vào đỉnh ngăn xếp và giảm con trỏ ngăn xếp đi 2. - Nạp thanh ghi con trỏ lệnh IP vào đỉnh ngăn xếp và giảm con trỏ ngăn xếp đi 2. - Nhảy xa tới chương trình con phục vụ ngắt tương ứng theo yêu cầu. Chương trình chính PUSH FLAGS Chương trình phục vụ ngắt CLEAR IF CLEAR TF PUSH các thanh ghi PUSH CS PUSH IP Nhảy tới chương trình ngắt POP IP POP CS POP FLAGS POP các thanh ghi IRET Hình 6.4: Qui trình phục vụ ngắt của 8086/8088. Quá trình trên được tổng kết trong hình 6.4. Như trên hình vẽ, 8086 cất thanh ghi cờ vào đỉnh ngăn xếp, không cho phép ngõ vào yêu cầu ngắt INTR và chức năng chạy từng bước, rồi thực hiện lệnh gọi xa tới chương trình phục vụ ngắt. Lệnh IRET tại cuối chương trình phục vụ ngắt sẽ chuyển điều khiển quay về chương trình chính. Như đã biết khi thực hiện lệnh gọi xa 8086/8088 sẽ lập giá trị mới cho thanh ghi đoạn CS và thanh ghi con trỏ lệnh IP. Để thực hiện việc gọi xa gián tiếp, 8086 lấy giá trị mới cho CS và IP từ 4 ô nhớ. Tương tự như vậy khi đáp ứng ngắt 8086/8088 cũng lấy địa chỉ chương trình ngắt từ 4 ô nhớ liên tiếp. Trong hệ thống 8086/8088, 1KB bộ nhớ từ địa chỉ 00000H tới địa chỉ 003FFH được dành riêng để chứa các địa chỉ của các chương trình ngắt được gọi là bảng vector ngắt, hay bảng con trỏ ngắt. Mỗi địa chỉ sẽ
- chứa trong 4 ô nhớ, nên bảng này sẽ chứa được địa chỉ của 256 chương trình ngắt. Hình 6.5 trình bày bảng vector ngắt. Chú ý là giá trị nạp cho thanh ghi con trỏ lệnh (IP) luôn đặt tại địa chỉ thấp, còn cho thanh ghi đoạn lệnh (CS) nằm ở địa chỉ cao. Mỗi từ kép cho một vector ngắt được nhận dạng bằng một số trong khoảng từ 0 tới 255. Nó được gọi là số hiệu ngắt hay số kiểu ngắt. Trong bảng 5 vector ngắt đầu tiên dành cho các ngắt đặc biệt, các vector từ 5 tới 31 dự phòng cho các thế hệ vi xử lý sau của Intel, các vector từ 32 tới 255 đã được sử dụng cho các ngắt cứng và các ngắt mềm. Do mỗi vector ngắt gồm 4 byte, vì thế 8086/8088 sẽ xác định địa chỉ của các vector ngắt trong bảng bằng cách nhân số hiệu ngắt với 4. Người sử dụng cũng có thể thay thế địa chỉ chương trình của mình vào bảng vector ngắt, lúc này mỗi lần xảy ra ngắt điều khiển sẽ được chuyển tới chương trình của người sử dụng thay vì chuyển tới chương trình phục vụ ngắt cũ. 03FFH Con trỏ ngắt kiểu 255 244 vector 03FCH ngắt đã sử dụng Con trỏ ngắt kiểu 33 084H Con trỏ ngắt kiểu 32 27 vector 080H ngắt dự Con trỏ ngắt kiểu 31 (dự trữ) phòng Con trỏ ngắt kiểu 5 (dự trữ) 014H Con trỏ ngắt kiểu 4 (tràn) 010H 5 vector Con trỏ ngắt kiểu 3 (1byte lệnh INT) ngắt dành 00CH Con trỏ ngắt kiểu 2 (ngắt không che) riêng 008H Con trỏ ngắt kiểu 1 (chạy từng bước) 004H 000H Con trỏ ngắt kiểu 0 (lỗi chia) Hình 6.5: Bảng vector ngắt trong hệ thống 8086/8088. Các kiểu ngắt của 8086/8088. - Ngắt kiểu 0 : chia cho 0. 8086/8088 sẽ tự động thực hiện ngắt kiểu 0 khi kết quả các phép chia vượt quá khả năng chứa trong thanh ghi đích. Khi đó các cờ, CS, IP sẽ được nạp vào đỉnh ngăn xếp, IF và TF sẽ bị xóa. Sau đó CS và IP sẽ được nạp giá trị mới từ các địa chỉ 00002Hvà 00000H trong bảng vector ngắt. Vì ngắt 0 xảy ra một cách tự động không thể cấm được, do đó để tránh ngắt này trong chương trình phải kiểm tra để chắc rằng số chia khác 0. Hoặc viết một chương trình phục vụ ngắt mới, sau đó đổi vector ngắt hiện có trong bảng, nhưng khi đó chương trình sẽ khá phức tạp. - Ngắt kiểu 1: Chạy từng bước.
- Ngắt này sẽ thực hiện chương trình theo từng lệnh, khi này có thể xem nội dung của các ô nhớ và các thanh ghi để kiểm tra kết quả của lệnh. Khi lệnh đã thực hiện đúng có thể cho phép CPU thực hiện lệnh tiếp theo. Nói cách khác trong chế độ chạy từng bước 8086 ngưng lại sau khi chạy xong mỗi lệnh, và chờ quyết định tiếp theo từ người sử dụng. Nhờ việc lập xóa thanh ghi cờ nên thủ tục chạy từng bước thực hiện khá dễ dàng trong hệ thống 8086. Khi cờ bẫy được lập, 8086 sẽ tự động thực hiện ngắt 1 sau khi thực hiện xong một lệnh, với vector ngắt được lấy trong bảng vector ngắt tại các địa chỉ từ 00004H tới 00008H. Khi đó cờ bẫy sẽ được lập các thanh ghi được lưu vào đỉnh ngăn xếp, chương trình con phục vụ cho ngắt 1 sẽ tùy thuộc theo hệ thống. Chú ý là không có lệnh thiết lập hay xóa cờ bẫy, muốn thực hiện công việc trên cần nạp thanh ghi cờ vào đỉnh ngăn xếp sau đó sử dụng một lệnh xử lý dữ liệu để lập bit, và cuối cùng phục hồi lại thanh ghi cờ từ đỉnh ngăn xếp. Trong quá trình thực hiện chương trình phục vụ ngắt cờ bẫy sẽ được xóa. - Ngắt kiểu 2: Phục vụ ngắt không che. 8086/8088 sẽ tự động thực hiện ngắt 2 khi nhận được một cạnh lên tại ngõ vào NMI. Ngắt này luôn được thực hiện mà không bị che bởi phần mềm, vì thế ngắt này thường được sử dụng cho các công việc quan trọng. Ví dụ có thể sử dụng ngắt 2 để backup chương trình khi mất nguồn. - Ngắt kiểu 3 : Thiết lập điểm dừng trong chương trình. Ngắt này được sử dụng cho việc gỡ rối một chương trình. Khi chèn vào chương trình một điểm dừng hệ thống sẽ thực hiện các lệnh của chương trình cho tới điểm dừng rồi chuyển điều khiển qua thủ tục ngắt 3. Tùy theo từng hệ thống, thủ tục ngắt 3 có thể gửi nội dung các thanh ghi, hoặc các ô nhớ lên màn hình rồi chờ cho tới khi nhận được lệnh kế tiếp từ người sử dụng. - Ngắt kiểu 4 : Ngắt tràn. Cờ tràn OF của 8086 sẽ tự động được thiết lập sau khi thực hiện các phép tính số học mà kết quả có sự tràn bit 1 qua bit có trọng số lớn nhất. Ví dụ khi cộng 01101100 (108 thập phân) với 01010001 (81 thập phân) kết quả sẽ là 10111101 (189 thập phân). Kết quả này chỉ đúng đối với phép cộng số nhị phân không dấu, mà không đúng đối với số nhị phân có dấu. Đối với số nhị phân có dấu, bit cao nhất bằng 1 sẽ chỉ thị số âm và giá trị sẽ là bù 2, như vậy kết quả ở trên sẽ là -67 thập phân. Có hai cách để phát hiện và đáp ứng một lỗi tràn. Cách thứ nhất có thể sử dụng lệnh JO (nhảy khi cờ tràn = 1) ngay sau các lệnh số học, nếu cờ tràn được thiết lập sau lệnh số học điều khiển chương trình sẽ được chuyển tới địa chỉ thị trong lệnh JO để có thể xử lý lỗi tràn. Cách thứ hai là việc phát hiện và đáp ứng một lỗi tràn được đặt vào một ngắt. Trong chương trình sau các lệnh số học sẽ đặt lệnh INT 0 để chuyển tới chương trình ngắt khi cờ ngắt được lập. - Các ngắt mềm từ 0 tới 255. Lệnh INT của 8086/8088 có thể sử dụng để gọi các ngắt mềm từ 0 tới 255. Ngắt được gọi sẽ chỉ thị bằng số hiệu của nó trong lệnh INT, ví dụ INT 32H sẽ gọi chương trình ngắt 32H. Địa chỉ chương trình ngắt trong bảng vector ngắt sẽ nằm tại địa chỉ bằng số hiệu ngắt nhân 4. Lệnh INT có nhiều cách sử dụng, có thể dùng INT 0 để chạy thử chương trình phục vụ ngắt chia cho 0, mà không cần phải thực hiện lệnh chia cho 0 thực sự, hoặc cũng có thể thử chương trình ngắt NMI bằng lệnh INT 2 mà không cần có tín hiệu yêu cầu ngắt đưa vào chân NMI.
- - Các yêu cầu ngắt kiểu 0 tới 255. Ngõ vào INTR của 8086 cho phép nhận các tín hiệu yêu cầu ngắt từ bên ngoài để thực hiện các chương trình ngắt tương ứng với chúng. Khác với ngõ vào NMI, INTR có thể che được bằng phần mềm. Nếu cờ ngắt IF bị xóa thì các yêu cầu đưa tới INTR sẽ không được đáp ứng. Cờ ngắt IF có thể thiết lập bằng lệnh STI, và xóa bằng lệnh CLI. Khi reset cờ ngắt IF sẽ tự động được xóa, như vậy trước khi muốn 8086 đáp ứng ngắt cần phải lập IF. Khi chuyển điều khiển qua chương trình ngắt, cờ ngắt cũng tự động được xóa. Điều này được thực hiện do 2 nguyên nhân sau: nguyên nhân thứ nhất là do nếu không xóa cờ ngắt thì khi chương trình phục vụ một ngắt này đang thực hiện có thể sẽ có một yêu cầu ngắt mới, làm điều khiển chương trình sẽ chuyển tiếp tới một chương trình ngắt mới nữa. Nếu muốn điều đó xảy ra thì chỉ việc thực hiện lệnh lập IF tại đầu chương trình ngắt. Nguyên nhân thứ hai là nếu không xóa IF thì khi trạng thái mức cao tại ngõ vào INTR còn được giữ chương trình ngắt sẽ bị gọi lại trong chính nó nhiều lần. Lệnh IRET tại cuối chương trình ngắt sẽ phục hồi thanh ghi cờ, điều này làm cho cờ ngắt trở về mức 1 tiếp tục cho phép 8086/8088 đáp ứng ngắt. Để nhận được nhiều yêu cầu ngắt hệ thống 8086/8088 sử bộ điều khiển ngắt 8259. 8086/8088 sẽ nhận một trong các đường yêu cầu ngắt IR để gửi tới chân yêu cầu ngắt INTR của 8086. Nếu cờ IF được lập 8086 sẽ trả lời yêu cầu ngắt bằng tín hiệu INTA (Interrupt Acknowledge), sau đó nó sẽ đọc vào vector ngắt cung cấp từ 8259 qua các đường dữ liệu thấp D0 tới D7. Vector ngắt chính là số hiệu ngắt được lập trình trước trong 8259 nó sẽ được nhân với 4 để xác định vị trí chứa địa chỉ chương trình phục vụ ngắt trong bảng vector ngắt. Khi có đồng thời 2 hoặc nhiều nguồn yêu cầu ngắt, 8086 sẽ đáp ứng cho ngắt có độ ưu tiên cao nhất, sau đó sẽ tới các ngắt có độ ưu tiên tiếp theo. Độ ưu tiên của các ngắt cũng được lập trình trước trong 8259. iii. Cơ chế ngắt của Z80. - Ngắt có thể che: Trong hệ thống Z80 ngắt INT sẽ tác động ở cạnh xuống của tín hiệu đưa tới ngõ vào INT, và cờ ngắt IFF đã được thiết lập bằng lệnh EI. Cờ ngắt cũng bị xóa khi chương trình ngắt được thực hiện, khi reset, hoặc khi thực hiện lệnh DI. Khi đáp ứng ngắt INT CPU Z80 có thể hoạt động ở một trong 3 chế độ: Mode 0, Mode 2 và Mode 3 tùy thuộc vào lệnh khởi tạo chế độ ngắt thực hiện trước khi có tín hiệu yêu cầu ngắt là IM0, IM1 hay IM2. Mode 0: khi đáp ứng ngắt mode 0 CPU Z80 sẽ yêu cầu thiết bị cung cấp một lệnh vào BUS dữ liệu, thường là lệnh RST (vì khi này cơ chế cung cấp lệnh sẽ đơn giản do chỉ có một byte), nhưng cũng có thể là một lệnh gọi chương trình con hoặc một lệnh bất kỳ nào đó. Mode 1: khi đáp ứng trong mode này Z80 sẽ nhảy tới địa chỉ 0038H, tại địa chỉ này có thể là chương trình phục vụ ngắt, cũng có thể chỉ là một lệnh nhảy tới chương trình ngắt. Cũng có thể sử dụng một lệnh nhảy gián tiếp (ví dụ JP (HL)) để có thể quyết định địa chỉ chương trình ngắt trước khi có tín hiệu yêu cầu ngắt. Mode 2 : Mode này là khả năng đáp ứng ngắt mạnh nhất của CPU Z80. Khi khởi động mode này, CPU sẽ thực hiện chương trình phục vụ ngắt tại địa chỉ chứa trong các ô nhớ có địa chỉ cung cấp bởi thanh ghi địa chỉ trang ngắt I và thiết bị yêu cầu ngắt. Thanh ghi I cung cấp 8 bit cao, còn thiết bị yêu cầu ngắt sẽ cung cấp 8 bit thấp của ô nhớ đó. Thực ra thiết bị chỉ cần cung cấp 7 bit cao, còn bit có trọng số nhỏ nhất (D0)
- luôn có giá trị là 0, vì giá trị mới trong thanh ghi PC phải được giữ trong hai ô nhớ liên tiếp. Dựa theo nguyên tắc hoạt động trên, người sử dụng có thể lập một loạt địa chỉ của các chương trình phục vụ ngắt cho các thiết bị khác nhau tại một vùng nhớ nào đó gọi là bảng vector ngắt. Khi hệ thống bắt đầu hoạt động có thể nạp địa chỉ trang ngắt bằng lệnh LD I,A. Mỗi thiết bị sẽ yêu cầu chương trình phục vụ ngắt của mình bằng cách cung cấp 7 bit địa chỉ còn lại. Có thể biểu diễn hoạt động của ngắt mode 2 của Z80 trên hình 6.6 : 000H . . nnmmH . Byte thấp của địa chỉ chương trình phục vụ ngắt UV (UVh) Byte cao của địa chỉ chương trình phục vụ ngắt nn mm (XYh) Thanh ghi I 7 bit do thiết bị cung cấp 0 XYUVH Chương trình phục vụ ngắt - Ngắt không che: NMI Ngắt không che Hìnhcủa Z80 6.6: sẽ Hoạt được động thực của hiện ngắt bất INT chấp mode giá 2 trị của của Z80. cờ ngắt IFF, khi đáp ứng ngắt này cờ ngắt IFF sẽ bị xóa, thanh ghi PC được nạp vào đỉnh ngăn xếp và điều khiển chương trình sau đó sẽ chuyển qua địa chỉ 0066H. Tương tự như ngắt INT mode 1, tại địa chỉ này có thể là chương trình phục vụ ngắt cũng có thể chỉ là một lệnh nhảy tới chương trình phục vụ ngắt. iv.BỘ ĐIỀU KHIỂN NGẮT 8259. Khái quát và nối ghép với hệ thống. 8259 được gọi là bộ điều khiển ngắt ưu tiên, nó nhận các tín hiệu yêu cầu ngắt từ thiết bị để cung cấp tới CPU theo trình tự ưu tiên. Sơ đồ khối của 8259 được thực hiện như hình 6.7: INTA INT DATA BUS BUFFER CONTROL LOGIC D0 - D7 RD READ/WRITE WR LOGIC IN IR0 INTERRUPT SERVICE PRIORITY A0 REQUEST REG RESOLVER (ISR) REG (IRR) CS IR7 CAS0 CASCADE BUFFER / CAS1 COMPARATOR INTERRUPT MASK REG (IMR) CAS2 CP/EN Hình 6.7: Sơ đồ khối bộ điều khiển ngắt 8259.
- Trước hết xem xét chức năng của các tín hiệu. Các tín hiệu của 8259 được chia thành 3 nhóm chính: - Bus dữ liệu D0 - D7 sử dụng để CPU lập trình 8259 hoạt động theo các chế độ khác nhau, và theo chiều ngược lại sử dụng để 8259 cung cấp vector ngắt tới CPU. - Các tín hiệu yêu cầu ngắt IR0 - IR7 nhận tín hiệu yêu cầu ngắt từ các thiết bị. - Các tín hiệu điều khiển bao gồm : + RD, WR nhận điều khiển từ CPU để xác định chiều truyền dữ liệu giữa CPU và 8259. + A0 xác định các vị trí khác nhau trong 8259 truyền nhận dữ liệu với CPU. CS chọn mạch: nhận tín hiệu từ giải mã địa chỉ chọn mạch cho phép 8259 được phép hoạt động. + CAS0 - CAS3 (Cascade): tín hiệu sử dụng cho việc ghép tầng 8259. + SP/EN: khi 8259 làm việc ở chế độ không có đệm trên bus dữ liệu thì tín hiệu này sử dụng để chọn 8259 là mạch chủ hay mạch tớ. Còn khi 8259 có đệm thì tín hiệu này đóng vai trò là tín hiệu cho phép EN để mở cổng đệm dữ liệu tại thời điểm thích hợp. + INT sử dụng cung cấp yêu cầu ngắt tới CPU, INTA nhận tín hiệu chấp nhận tín hiệu yêu cầu ngắt từ CPU. Chức năng các thanh ghi bên trong 8259 bao gồm: - Thanh ghi mặt nạ ngắt (IMR) sử dụng để cho phép (unmask) hoặc không cho phép (mask) phục vụ các ngõ vào yêu cầu ngắt. Mỗi bit trong thanh ghi này sẽ tương ứng với một ngõ vào yêu cầu ngắt. Có thể không cho phép một ngõ vào đó bằng cách ghi 0 tới bit tương ứng của nó trong IMR. - Thanh ghi yêu cầu ngắt (IRR) sẽ giữ lại các yêu cầu ngắt của các ngõ vào. Khi có tín hiệu yêu cầu ngắt đưa tới ngõ vào nào thì bit tương ứng của nó trong thanh ghi này sẽ được lập lên 1.
- - Thanh ghi phục vụ ngắt (ISR) sẽ lưu trạng thái các ngõ vào yêu cầu ngắt đang được phục vụ. Bit tương ứng trong thanh ghi sẽ được lập tương ứng với ngõ vào đang được phục vụ. - Khối xử lý ưu tiên (Priority resolver) sẽ đóng vai trò quyết định yêu cầu tại ngõ vào nào được phục vụ, bằng cách xem xét các bit trong các thanh ghi IMR, ISR và IRR. Ví dụ: giả sử IR2 và IR4 không bị che và có một tín hiệu yêu cầu ngắt đưa tới ngõ vào IR4. Yêu cầu trên IR4 sẽ lập bit thứ 4 trong thanh ghi IRR lên 1. Trước tiên bộ xử lý ưu tiên xem bit tương ứng với nó trong thanh ghi IMR, nếu bit này bằng 1 yêu cầu ngắt bị che và sẽ không được phục vụ. Nếu bằng 0 bộ xử lý ưu tiên sẽ kiểm tra các bit trong thanh ghi ISR để xem có ngõ vào nào có mức ưu tiên cao hơn đang được phục vụ hay không. Nếu có một ngõ vào có mức ưu tiên cao hơn đang được phục vụ thì bộ xử lý ưu tiên sẽ không tạo ra tác động nào cả. Ngược lại nếu không có yêu cầu ngắt ưu tiên cao hơn đang được phục vụ thì bộ xử lý ưu tiên sẽ chuyển mạch cho tín hiệu yêu cầu ngắt gửi tới CPU. Khi CPU đáp ứng bằng tín hiệu trả lời INTA, 8259 sẽ gửi số hiệu ngắt đã được lập trình từ trước tới CPU theo Bus dữ liệu. Lập trình cho 8259. Để 8259 có thể hoạt động được, thì sau khi cấp nguồn nó phải được lập trình từ 2 tới 4 từ điều khiển ICW (Input Control Word), và sau đó là các từ điều khiển OCW (Output Control Word). Các từ điều khiển sẽ định nghĩa các chế độ hoạt động cụ thể cho 8259, chúng được định nghĩa như sau: Các từ điều khiển ICW: ICW1 Bit D0 (IC4) xác định 8259 được nối với họ vi xử lý nào. Khi nối với hệ thống 16/32 bit 8086/8088 thì nhất thiết phải cần ICW4 (IC4=1), còn đối với hệ thống 8 bit 8080/8085 thì IC4=0 và như vậy các bit của ICW4 sẽ bị xóa về 0. Bit D1 (SNGL) định nghĩa 8259 hoạt động trong chế độ chỉ có 1 mạch chủ hay có thêm các mạch tớ. D2 (ADI) định nghĩa khoảng cách địa chỉ của bảng vector ngắt. D3 (LITM) định nghĩa ngõ vào yêu cầu ngắt tác động mức hay cạnh. Các bit còn lại là các bit địa chỉ A7A6A5 trong hệ thống 8080/85, đối với các hệ thống 16/32 bit chúng không xác định. ICW1: A0=0 A7 A6 A5 1 LTIM ADI SNG IC4 L 1: Cần ICW4 Là địa chỉ vector đối với 8080/85 0: bỏ ICW4 Không xác định với hệ 16/32 bit Single: 1: chỉ có 1 mạch 8259 Level Trigger Mode: Chế độ của xung yêu cầu 0: nhiều mạch 8259 ngắt Address Interval: 1: theo mức dương K/c giữa các vector ngắt 0: theo cạnh lên 1: 4 byte (80x86/88) 0: 8 byte (8080/85) ICW2: A0=1 T7 T6 T5 T4 T3 T2 T1 T0
- ICW2 là 8 bit địa chỉ cao của vector ngắt (AD15 - AD8) trong hệ thống 8080/85, là vector ngắt (T7- T3)trong hệ thống 8086/88. ICW3 mạch chủ: A0=1 S7 S6 S5 S4 S3 S2 S1 S0 1: ngõ vào tương ứng có 1 mạch tớ 0: không có mạch tớ ở ngõ vào ICW3 cho mạch tớ: A0=1 0 0 0 0 0 ID2 ID1 ID0 000 cho mạch tớ tại ngõ vào IR0 111 cho mạch tớ tại ngõ vào IR7. ICW2 Từ điều khiển này cho phép chọn kiểu ngắt (số hiệu ngắt) ứng với các bit T7-T3 trong hệ thống 8086/88, khi đó các bit còn lại luôn được gán giá trị 0 ứng với ngõ vào IR0. Các vector ngắt của các ngõ vào tiếp theo sẽ lần lượt tăng lên 1. Ví dụ nếu ICW2 = 40H thì các vector ngắt sẽ lần lượt mang số hiệu từ 40H tới 47H. Trong các hệ thống 8080/85 thì ICW2 sẽ cung cấp các bit địa chỉ cao của địa chỉ vector ngắt. ICW3 Từ điều khiển này chỉ dùng tới khi bit SNGL trong ICW1 = 0 tức là trong hệ thống có nhiều 8259 nối tầng với nhau. Như vậy sẽ tồn tại hai loại ICW3: một cho mạch chủ (master) và 1 cho mạch tớ (slave). Các bit ICW3 của 8259 chủ sử dụng để chỉ định ngõ vào nào có ghép tầng (cascade). Trong 8259 tớ chỉ sử dụng 3 bit thấp để xác định nó được nối tới ngõ vào nào của 8259 chủ. ICW4 A0=1 0 0 0 SFNM BUF M/S AEOI PM N Special Fully Nested Mode P mode Chế độ lồng hoàn toàn. 1: 8086/88 1: SFNM 0: 8080/8085 0x: Chế độ không đệm Auto End Of Interrupt: 10: Chế đệm mạch tớ 1: EOI tự động 11: Chế độ đệm mạch chủ 0: EOI thông thường ICW4 Từ điều khiển này chỉ dùng đến khi trong từ điều khiển ICW1 có bit D0 =1. Bit PM cung cấp khả năng chọn vi xử lý làm việc với 8259.
- Bit SFNM = 1 cho phép chọn chế độ ưu tiên cố định đặc biệt. Trong chế độ này các yêu cầu ngắt với mức ưu tiên cao nhất hiện thời từ một mạch tớ làm việc theo kiểu nối tầng sẽ được mạch chủ nhận biết ngay cả khi mạch chủ còn đang phục vụ một yêu cầu ngắt ở mạch tớ khác nhưng với mức ưu tiên thấp hơn. Sau khi các yêu cầu ngắt được phục vụ xong thì chương trình phục vụ ngắt phải có lệnh kết thúc yêu cầu ngắt EOI đặt trước lệnh IRET đưa đến cho mạch 8259 chủ. Khi SFNM = 0 thì chọn chế độ ưu tiên cố định ( mức ưu tiên giảm từ IR0 tới IR7). Nếu 8259 không dùng tới ICW4 thì chế độ này cũng được coi như mặc định. Trong chế độ này nếu chỉ có một yêu cầu ngắt đang được phục vụ thì các yêu cầu có mức ưu tiên thấp hơn sẽ bị cấm, và các yêu cầu có mức ưu tiên cao hơn sẽ ngắt các yêu cầu có mức ưu tiên thấp hơn. Bit BUF cho phép chọn chế độ làm việc giữa 8259 và CPU là có đệm hay không có đệm. Khi BUF =1 M/S = 0/1 sẽ chọn đệm ở mạch chủ hoặc mạch tớ. Bit AEOI = 1 cho phép kết thúc yêu cầu ngắt tự động. Lúc này 8259 sẽ tự động xóa ISRi = 0 khi xung INTA chuyển lên mức cao mà không làm thay đổi thứ tự ưu tiên. Ngược lại khi AEOI = 0 chương trình phục vụ ngắt phải có thêm lệnh EOI trước IRET đưa tới cho 8259. Các từ điều khiển ICW được lập trình cho 8259 theo giải thuật hình 6.8: ICW1 ICW2 D1 (ICW1) = 1 ? ICW3 D1 (ICW1) = 1 ? ICW4 Sẵn sàng nhận yêu cầu ngắt Các từ điều Hìnhkhiển 6.8: hoạt Giải động thuật OCW: lập trình các từ điều khiển ICW cho 8259. OCW1 A0=1 M7 M6 M5 M4 M3 M2 M1 M0 Mặt nạ các ngắt tại các ngõ vào yêu cầu: 1: có mặt nạ 0: không có mặt nạ
- OCW2 A0=0 R SL EOI 0 0 L2 L1 L0 Mã hóa chế độ kết thúc Mã hóa mức ưu tiên ngắt bị tác động ngắt 000: mức 0; ; 111: mức 7 OCW3 A0=0 0 ESM SMM 0 1 P ERIS RIS 10: đọc IRR ở lần sau 11: đọc ISR ở lần sau Special Mask Mode 10:xóa chế độ mặt nạ đặc biệt Thăm dò trạng thái hiện tại của yêu cầu ngắt.1: 11:lập chế độ mặt nạ đặc biệt đọc mã ưu tiên cao nhất ở lần đọc sau Các từ điều khiển OCW sẽ quyết định 8259 hoạt động như thế nào khi nó đã được khởi động bằng các từ đều khiển ICW. OCW1: OCW1 dùng để ghi giá trị của các bit mặt nạ vào thanh ghi mặt nạ IMR. Khi một bit mặt nạ nào đó của IMR được lập thì yêu cầu tương ứng với ngõ vào đó sẽ không được phục vụ. Từ điều khiển này phải được ghi tới 8259 ngay sau các từ ICW. Cũng có thể đọc lại IMR để xem tại thời điểm hiện tại ngõ vào nào có yêu cầu bị che. OCW2: Các bit R, SL, EOI cho phép chúng ta chọn cách thức kết thúc ngắt khác nhau. Một vài cách kết thúc ngắt còn tác động tới các yêu cầu ngắt được chỉ định với mức ưu tiên được mã hóa bởi 3 bit L3L2L1. Các chế độ kết thúc ngắt bao gồm: - Chế độ ưu tiên cố định: Đây là chế độ làm việc mặc định của 8259 sau khi đã được nạp các từ làm việc khởi đầu. Trong chế độ này có mức ưu tiên tại các ngõ vào mặc định giảm dần từ IR0 tới IR7. Các ngõ vào có mức ưu tiên thấp hơn sẽ bị cấm, và các yêu cầu có mức ưu tiên cao hơn sẽ ngắt các yêu cầu có mức ưu tiên thấp hơn. - Chế độ quay mức ưu tiên. Ở chế độ này khi một yêu cầu ngắt được phục vụ xong nó sẽ được gán mức ưu tiên thấp nhất để tạo điều kiện cho các yêu cầu ngắt khác có cơ hội được phục vụ. - Chế độ quay mức ưu tiên chỉ định. Trong chế độ này cần phải chỉ rõ ngõ vào nào được gán mức ưu tiên thấp nhất bằng các bit L2L1L0. Ngõ vào có chỉ số kế tiếp nó sẽ được gán mức ưu tiên cao nhất. Với các chế độ ưu tiên trên các bit R, SL,EOI trong OCW2 được mã hóa để chỉ thị các chế độ kết thúc ngắt khác nhau như sau:
- 1. Kết thúc ngắt thông thường: Chương trình con phục vụ ngắt phải có lệnh EOI đặt trước lệnh trở về IRET cho 8259. Mạch 8259 sẽ xác định yêu cầu ngắt vừa được phục vụ và xóa bit tương ứng với nó trong thanh ghi ISR, tạo điều kiện cho yêu cầu ngắt ở chính ngõ vào này hoặc các ngắt có yêu cầu thấp hơn được phục vụ. 2. Kết thúc yêu cầu ngắt chỉ định: chương trình con phục vụ ngắt cũng phải có lệnh EOI đặt trước lệnh IRET. Mạch 8259 sẽ xóa đích danh bit ISR được chỉ định bởi các bit L2L1L0 để tạo điều kiện cho yêu cầu ngắt ở chính ngõ vào này hoặc các ngõ vào có yêu cầu thấp hơn được phục vụ. 3. Quay đổi mức ưu tiên khi kết thúc ngắt thông thường: chương trình con phục vụ ngắt cũng cần lệnh EOI. Mạch 8259 sẽ xác định ngõ vào vừa được phục vụ, xóa bit tương ứng trong ISR và gán cho ngõ vào này mức ưu tiên thấp nhất, còn đầu vào có chỉ số kế tiếp (i+1) sẽ được gán mức ưu tiên cao nhất. 4. Quay đổi mức ưu tiên trong chế độ kết thúc ngắt tự động: chỉ cần cung cấp lệnh chọn chế độ này một lần bằng cách chọn chế độ quay khi EOI tự động. Từ đó trở đi 8259 sẽ đổi mức ưu tiên mỗi khi kết thúc ngắt như mô tả trong phần 3. Muốn xóa bỏ chế độ này chỉ việc lập trình lại chế độ khác cho 8259. 5. Quay đổi mức ưu tiên khi kết thúc yêu cầu ngắt chỉ định: chương trình phục vụ ngắt phải có lệnh EOI chỉ đích danh trước lệnh IRET. Mạch 8259 sẽ xóa bit tương ứng trong thanh ghi ISR và gán mức ưu tiên thấp nhất cho ngõ vào có chỉ số chỉ định bởi L2L1L0. 6. Lập mức ưu tiên: chế độ này cho phép thay đổi mức ưu tiên cố định hoặc mức ưu tiên gán trước bằng cách gán mức ưu tiên thấp nhất cho ngõ vào chỉ định bởi L2L1L0, yêu cầu ngắt có chỉ số kế tiếp (i+1) sẽ có mức ưu tiên cao nhất. Các bit R,SL và EOI được mã hóa cho các chế độ như mô tả trong bảng sau: 001 Lệnh EOI thông thường Kết thúc ngắt EOI 011 Lệnh EOI chỉ định 101 Đổi mức ưu tiên khi có EOI thường Đổi mức ưu tiên tự động 100 Lập chế độ quay khi có EOI tự động 000 Xóa chế độ quay khi có EOI tự động 111 Đổi mức ưu tiên khi có EOI chỉ định Đổi mức ưu tiên chỉ định 110 Lập mức ưu tiên 010 Không làm gì cả Từ điều khiển hoạt động OCW3 sau khi ghi vào 8259 cho phép thực hiện các công việc sau: + Chọn ra các thanh ghi để đọc. + Thăm dò trạng thái yêu cầu ngắt bằng cách đọc trạng thái của ngõ vào có mức ưu tiên cao nhất cũng với mã đầu vào của nó. + Thao tác với mặt nạ đặc biệt. Khi đọc các thanh ghi IRR và ISR có thể biết được các ngõ vào nào đang có yêu cầu phục vụ, và ngõ vào nào đang được phục vụ.
- Bằng việc cho bit P của OCW3 = 1 có thể đọc được trên bus dữ liệu ở lần đọc ngay sau đó từ thăm dò, trong từ thăm dò này sẽ có các thông tin về yêu cầu ngắt có mức ưu tiên cao nhất như hình sau: I x x x x W2 W1 W0 1: Đang có yêu cầu ngắt Mã hóa số hiệu ngõ vào có 0: không có yêu cầu ngắt mức ưu tiên cao nhất Chú ý trước khi đọc từ thăm dò cần phải cấm các yêu cầu ngắt bằng lệnh CLI. Bit ESM = 1 cho phép thao tác với chế độ mặt nạ đặc biệt. Chế độ mặt nạ đặc biệt được dùng để thay đổi chế độ ưu tiên ngay bên trong chương trình con phục vụ ngắt. Ví dụ trong trường hợp có một yêu cầu ngắt bị cấm (bị che bởi chương trình phục vụ ngắt với từ lệnh OCW1) mà ta lại muốn cho phép các yêu cầu ngắt với mức ưu tiên thấp hơn so với yêu cấu ngắt bị cấm đó được tác động, khi đó cần phải sử dụng chế độ mặt nạ đặc biệt. Khi đã được thiết lập thì chế độ mặt nạ đặc biệt sẽ tồn tại cho đến khi xóa bằng cách ghi vào 8259 một từ OCW3 khác có bit SMM = 0. Mặt nạ đặc biệt không ảnh hưởng tới các yêu cấu ngắt với mức ưu tiên cao hơn. Hình 6.9 biểu diễn việc kết nối 8259 chủ với CPU 8088 ở chế độ MIN. 8259 D0-D7 D0-D7 RD RD WR WR A0 A0 INTR INT INTA INTA A -A 1 7 CS IO/M Hình 6.9: Kết nối một 8259 với CPU 8088 ở chế độ MIN. b. VÀO RA DỮ LIỆU BẰNG DMA. (Direct Memory Access ). i. Nguyên tắc chung. Trong các nguyên tắc vào ra quét vòng và ngắt đã biết, dữ liệu được truyền trực tiếp giữa CPU và các cổng vào ra, tốc độ truyền dữ liệu sẽ tùy thuộc vào các lệnh của CPU, vì thế sẽ không thể thực hiện việc truyền dữ liệu một cách nhanh chóng. Để truyền dữ liệu với tốc độ nhanh hơn người ta sử dụng phương pháp vào ra bằng cơ chế thâm nhập trực tiếp bộ nhớ (DMA - Direct Memory Access). Trong cơ chế này thiết bị ngoại vi sẽ truyền dữ liệu theo khối với bộ nhớ mà không thông qua sự điều khiển của CPU, bộ điều khiển DMA tạo ra các địa chỉ một cách tuần tự để truyền trực tiếp dữ liệu giữa bộ nhớ và vào ra, mà không phải thực hiện các chu kỳ đọc ghi như CPU, do đó tốc độ truyền sẽ rất nhanh. Sơ đồ khối của hệ thống vào ra dữ liệu theo nguyên tắc DMA có thể mô tả như hình 6.10: ADDRESS LATCHES ALE AD0-AD15 CPU MEMORY DATA BUS DATA BUS CONTROL BUS CONTROL BUS (IOR, IOW, MEMR,MEMW) DATA BUS HOLD HRQ DMA CONTROL BUS CONTROLLER HLDA HLDA DREQ PERIPHERAL DACK DEVICE Hình 6.10: Nguyên tắc vào ra bằng DMA trong hệ thống vi xử lý.
- Trong sơ đồ này CPU và DMAC sẽ luôn phiên sử dụng các BUS địa chỉ, dữ liệu, và điều khiển thông qua việc điều khiển chuyển mạch ba công tắc lên phía trên hoặc xuống phía dưới. Khi hệ thống bắt đầu hoạt động các công tắc nằm ở phía trên, vì thế các Bus sẽ nối ghép giữa CPU với bộ nhớ và các thiết bị ngoại vi. Hệ thống sẽ hoạt động bình thường cho đến khi cần thực hiện một chu kỳ truy cập DMA (ví dụ đọc 1 file từ đĩa từ trong hệ thống máy vi tính PC). Để đọc một khối dữ liệu từ thiết bị, cần phải gửi một chuỗi lệnh tới thiết bị để xác định vị trí của khối dữ liệu. Khi thiết bị đã có dữ liệu sẵn sàng để truyền nó sẽ gửi tín hiệu yêu cầu DMA bằng tín hiệu DREQ tới bộ điều khiển DMA (DMAC). Nếu DMAC được lập trình không che (cho phép hoạt động khi có yêu cầu ), nó sẽ gửi tín hiệu yêu cầu treo bus HRQ tới ngõ vào HOLD của CPU. Lúc này CPU sẽ treo các bus của nó lên trạng thái trở kháng cao (tương đương với việc chuyển mạch các công tắc xuống phía dưới, ngắt CPU ra khỏi các Bus), và trả lời chấp nhận yêu cầu treo bus bằng tín hiệu HLDA cho bộ điều khiển DMA. Khi nhận được tín hiệu chấp nhận HLDA từ CPU, bộ điều khiển DMA sẽ bắt đầu thực hiện việc điều khiển các Bus. Nó sẽ gửi địa chỉ tới bộ nhớ để xác định vị trí mà byte đầu tiên sẽ được ghi vào. Tiếp theo DMAC sẽ gửi tín hiệu chấp nhận DMA bằng tín hiệu DACK tới cho thiết bị, tín hiệu này sẽ thông báo cho thiết bị trạng thái sẵn sàng cho thiết bị gửi ra một byte dữ liệu. Cuối cùng DMAC sẽ tạo ra cả hai tín hiệu ghi bộ nhớ (MEMW) và đọc vào ra (IOR) một cách đồng thời, IOR sẽ cho phép thiết bị cung cấp dữ liệu ra data Bus, MEMW cho phép bộ nhớ nhận dữ liệu từ data Bus. Như vậy DMA đã điều khiển việc ghi trực tiếp dữ liệu từ thiết bị tới bộ nhớ mà không thông qua CPU. Khi đã hoàn thành việc truyền dữ liệu, DMAC sẽ giải phóng Bus và dừng tác động tín hiệu HOLD. CPU sẽ quay về điều khiển BUS trở lại cho đến khi có một yêu cầu DMA mới. CPU sẽ tiếp tục thực hiện tiếp chương trình tại nơi mà nó đã dừng lại để thực hiện yêu cầu DMA.
- Quá trình ghi trực tiếp dữ liệu từ bộ nhớ tới thiết bị sẽ được thực hiện hoàn toàn tương tự. Khi đó DMAC sẽ tạo ra các tín hiệu điều khiển đọc bộ nhớ (MEMR) và ghi vào ra (IOWC) một cách đồng thời. Trong thực tế có 3 chế độ trao đổi dữ liệu theo nguyên tắc DMA: - Treo CPU một khoảng thời gian để trao đổi cả mảng dữ liệu. - Treo CPU một số chu kỳ máy để trao đổi từng byte - Tận dụng thời gian CPU không sử dụng Bus để truyền dữ liệu. Để hiểu rõ các nguyên tắc này chúng ta có thể xem xét bộ điều khiển DMA 8237 của hãng Intel. ii. Vi mạch DMAC 8237 - A. 1. Các đặc tính cơ bản. Điều khiển cho phép hoặc không cho phép các kênh DMA một cách riêng biệt. Có 4 kênh DMA độc lập nhau. Có khả năng truyền dữ liệu từ bộ nhớ tới bộ nhớ. Có thể truyền theo chiều tăng hoặc giảm địa chỉ. Hiệu suất truyền dữ liệu rất cao: với xung nhịp 5Mhz có thể truyền 1.6MB/1 giây. Có khả năng ghép tầng (cascade) để tăng số kênh DMA. Có tín hiệu ngõ vào kết thúc việc truyền dữ liệu. Có khả năng nhận yêu cầu DMA bằng phần mềm. 2. Sơ đồ khối và chức năng các khối. Như hình 6.11, sơ đồ khối của 8237 bao gồm nhiều khối logic và các thanh ghi. Bus nội nối các thanh ghi cho phép thay đổi các tín hiệu điều khiển giữa các khối. 8237 có tất cả 324 bit nhớ bên trong tạo thành các thanh ghi bao gồm: - 4 thanh ghi địa chỉ cơ sở 16 bit. - 4 thanh ghi đếm số từ cơ sở 16 bit. - 4 thanh ghi địa chỉ hiện hành 16 bit. - 4 thanh ghi đếm số từ hiện hành 16 bit. - 1 thanh ghi địa chỉ tạm thời 16 bit. - 1 thanh ghi đếm số từ tạm thời 16 bit. - 1 thanh ghi trạng thái 8 bit. - 1 thanh ghi lệnh 8 bit. - 1 thanh ghi tạm thời 8 bit. - 4 thanh ghi chế độ 6 bit. - 1 thanh ghi mặt nạ 4 bit. - 1 thanh ghi yêu cầu 4 bit. A0-A3 Bộ giảm Bộ tăng Đệm I/O EOP Thanh ghi đếm Thanh ghi địa RESET Khối CS số từ tạm thời chỉ tạm thời A4-A7 tạo Đệm ra READY nhịp CLK và AEN điều Bộ đệm đọc Bộ đệm đọc/ghi ADSTB khiển A0-A15 MEMW Thanh ghi đếm Thanh ghi đếm số MEMR số từ cơ sở / địa từ hiện tại / địa chỉ hiện tại IOR chỉ cơ sở IOW Đệm ghi Đệm đọc HLDA Bộ mã hóa mức ưu DB0-DB7 HRQ tiên và T.ghi lệnh Đệm I/O DRQ0 - logic tạo DRQ3 ưu tiên luân phiên T.ghi mặt nạ DACK0 - T.ghi T.ghi T.ghi DACK3 C/độ T/thái tạm T.ghi yêu cầu Hình 6.11: Sơ đồ khối bộ điều khiển DMA 8037,
- 8237 có 3 khối điều khiển logic bao gồm: - Khối điều khiển định thời có chức năng tạo các tín hiệu định thời bên trong và bên ngoài cho 8237. - Khối điều khiển lệnh chương trình có chức năng mã hóa các lệnh gửi tới từ CPU để phục vụ một chu kỳ DMA. Nó cũng giải mã từ chế độ để chọn kiểu DMA trong suốt chu kỳ phục vụ. - Khối mã hóa ưu tiên sẽ giải quyết các tranh chấp ưu tiên giữa các kênh DMA có ưu cầu phục vụ tại cùng một thời điểm. 3. Các tín hiệu của 8237. + Vcc, Vss: cấp nguồn +5 Vdc + CLK (Clock): Ngõ vào cung cấp xung nhịp cho 8237 để điều khiển định thời toàn bộ hoạt động bên trong của 8237, và nó sẽ quyết định tốc độ truyền dữ liệu của 8237. Có thể cấp Clock 3 MHz với 8237A, và 5 MHz với 8237 -5. + CS (Chip Select): tín hiệu chọn mạch, sử dụng để CPU chọn 8237 như một địa chỉ vào ra trong suốt chu kỳ nó làm việc, cho phép CPU truyền dữ liệu với 8237. + RESET: Ngõ vào tác động mức cao xóa toàn bộ các thanh ghi lệnh, thanh ghi trạng thái, thanh ghi yêu cầu và thanh ghi tạm thời, nó cũng xóa toàn bộ các bit che phục vụ. Thiết lập lại toàn bộ trạng thái ban đầu của 8237. + READY: Ngõ vào cung cấp từ bộ nhớ tới 8237 trong các chu kỳ đọc ghi, tín hiệu này sử dụng để bộ nhớ thông báo trạng thái sẵn sàng của nó tới 8237 cho phép 8237 giao tiếp được với các bộ nhớ chậm. + HLDA (Hold Acknowledge): Ngõ vào tác động mức cao nhận tín hiệu chấp yêu cầu treo bus gửi tới từ CPU. Khi nhận được tín hiệu này 8237 sẽ bắt đầu chiếm bus của CPU để thực hiện chu kỳ DMA. + DREQ0 - DREQ3: (DMA REQUEST) là các ngõ vào nhận các yêu cầu DMA từ thiết bị. Trong chế độ ưu tiên cố định (fixed) DREQ0 sẽ có mức ưu tiên cao nhất, cho tới DREQ3 có mức ưu tiên thấp nhất. Yêu cầu gửi tới kênh nào thì sẽ được trả lời trên đường DACK tương ứng. Cực tính yêu cầu ở các ngõ vào này có thể lập trình được, khi RESET nó sẽ tác động mức cao. Tín hiệu yêu cầu cần được duy trì cho tới khi DACK tác động. + DB0 - DB7 (Data Bus): là bus dữ liệu hai chiều 3 trạng thái, nối tới bus hệ thống. Bus này có thể sử dụng ghi các từ điều khiển lập trình các thanh ghi của 8237, và đọc trạng thái hiện hành của các thanh ghi trạng thái, tạm thời, và thanh ghi đếm số từ. Trong các chu kỳ DMA 8 bit địa chỉ cao sẽ được cung cấp ra các ngõ ra này, chứa vào bộ cài bên ngoài bằng tín hiệu ADSTB. Trong chu kỳ truyền dữ liệu giữa các ô
- nhớ (Memory - Memory), dữ liệu sẽ được đọc vào 8237 thông qua data bus trong chu kỳ đọc, rồi chuyển ra data bus để chứa vào vị trí mới trong chu kỳ ghi. + IOR (Input / Output Read): là đường tín hiệu hai chiều 3 trạng thái. Trong chu kỳ rỗi (Idle) nó được cung cấp tới từ CPU để đọc giá trị các thanh ghi điều khiển. Trong chu kỳ hoạt động DMA, tín hiệu này là ngõ ra sử dụng để 8237 đọc dữ liệu từ thiết bị ngoại vi trong chu kỳ DMA ghi. + IOW(Input / Output Write) là đường tín hiệu hai chiều 3 trạng thái. Trong chu kỳ rỗi (Idle) nó được cung cấp tới từ CPU, để CPU có thể ghi các thông tin cần thiết tới 8237. Trong chu kỳ hoạt động DMA, tín hiệu này là ngõ ra sử dụng để 8237 ghi dữ liệu tới thiết bị ngoại vi, trong chu kỳ DMA đọc. + EOP (End Of Process) : Là tín hiệu hai chiều tác động mức thấp, cho phép kết thúc phục vụ DMA hiện hành. Khi thiết bị bên ngoài muốn kết thúc phục vụ DMA hiện hành nó cung cấp tới ngõ vào này một xung mức thấp. Khi 8237 thực hiện xong một chu kỳ DMA nó sẽ cung cấp tín hiệu thông báo tới ngõ ra này. Tóm lại khi có mức thấp tại ngõ này quá trình phục vụ DMA sẽ kết thúc, trạng thái của 8237 cần được tạo lập lại. Nếu 8237 được lập trình cho phép tự động khởi động (auto initialize), thì thanh ghi cơ sở sẽ được ghi tới thanh ghi hiện hành của kênh đó. Bit che (mask) và bit TC (Terminal Count) của kênh hiện hành trong thanh ghi trạng thái sẽ được lập, trừ khi kênh đó đã được lập trình tự động khởi động. + A0 - A3 (Address): là các tín hiệu hai chiều 3 trạng thái, trong chu kỳ rỗi (không phục vụ DMA) các tín hiệu này là các ngõ vào sử dụng để CPU định vị các thanh ghi điều khiển bên trong 8237. Trong trạng thái phục vụ DMA chúng là các ngõ ra cung cấp các bit địa chỉ thấp ra bus địa chỉ, sử dụng cho các bộ nhớ và thiết bị ngoại vi. + A4 - A7 (Address) : là các ngõ ra 3 trạng thái cung cấp 4 bit địa chỉ trong các chu kỳ phục vụ DMA. + HRQ (Hold Request) : là ngõ ra gửi yêu cầu treo bus tới CPU, nó được tác động khi có yêu cầu trên một kênh vào DREQ không che. Ngõ vào HLDA cần phải tác động sau HRQ ít nhất sau 1 chu kỳ xung nhịp. + DACK0 - DACK3 (DMA Acknowledge): là các ngõ ra thông báo cho thiết bị ngoại vi biết yêu cầu DMA của nó được chấp nhận. Mức tác động của các ngõ này có thể lập trình được, khi khởi động lại nó sẽ tác động mức thấp. + AEN (Address Enable) : là ngõ ra tác động mức cao cài 8 bit địa chỉ cao lên bus hệ thống, tín hiệu này có thể sử dụng để cấm các thiết bị khác truy cập bus trong khi đang phục vụ DMA. + ADSTB (Address Strobe): là ngõ ra tác động mức cao cài các đường địa chỉ cao ra bộ cài bên ngoài. + MEMR (Memory Read) : là ngõ ra 3 trạng thái tác động mức thấp sử dụng cho phép 8237 đọc bộ nhớ trong chu kỳ DMA đọc, hoặc trong chu kỳ truyền dữ liệu giữa bộ nhớ và bộ nhớ. + MEMW (Memory Write) : là ngõ ra 3 trạng thái tác động mức thấp sử dụng cho phép 8237 ghi bộ nhớ trong chu kỳ DMA ghi, hoặc trong chu kỳ truyền dữ liệu giữa bộ nhớ và bộ nhớ. 3. Nối ghép 8237 với hệ thống CPU. Khi phục vụ một yêu cầu DMA ở 1 trong các ngõ vào DREQ, 8237 sẽ gửi yêu cầu treo bus tới CPU bằng cách cung cấp mức cao tới ngõ ra HRQ, CPU nhận tín hiệu này tại ngõ vào HOLD, lúc này nó thực hiện hết chu kỳ lệnh hiện hành rồi
- treo các bus lên trạng thái trở kháng cao và trả lời cho 8237 bằng tín hiệu HLDA. Khi nhận được tín hiệu trả lời của CPU, 8237 bắt đầu quá trình chiếm bus để thực hiện chu kỳ phục vụ DMA. Địa chỉ mà 8237 tạo ra bao gồm 2 byte, 8 bit cao cung cấp tới các ngõ ra A0-A7, 8 bit thấp sẽ cung cấp ra data bus DB0-DB7 và được xung ADSTB cài vào bộ cài 8 bit cung cấp tới bộ nhớ. Address Bus A0 -A15 AEN OE A8-A15 STB AEN A0-A3 A4-A7 ADSTB DB0- HLDA HLDA DB7 HOLD HRQ DREQ 0-3 CLK RESET MEMR MEMW IOR IOW DACK 0-3 CLOCK RESET MEMR MEMW IOR IOW Data Bus D0 -D7 4. Hoạt động DMA. 8237 được thiếtHình kế 6.12: hoạt Sơ động đồ khối ở hai kết chu nối kỳgiữa chính 8237 vàlà: Bus chu hệ kỳ thống. rỗi (Idle cycle) và chu kỳ tích cực (active cycle). Trong mỗi chu kỳ này có thể chia thành nhiều trạng thái khác nhau . 8237 phân biệt 7 trạng thái hoạt động riêng biệt bao gồm: Trạng thái không tích cực IS (Inactive State): Trạng thái này không có yêu cầu DMA hợp lệ, các ngõ vào yêu cầu ở trạng thái treo. IS được tính cả thời điểm 8237 trong trạng thái đang lập trình. S0 là trạng thái đầu tiên của chu kỳ phục vụ DMA, lúc này 8237 đang gửi yêu cầu treo Bus nhưng CPU chưa gửi trả tín hiệu xác nhận HLDA. 8237 sẽ ở trạng thái này cho đến khi CPU cung cấp tín hiệu chấp nhận yêu cầu treo BUS HLDA, tín hiệu này của CPU sẽ cho phép 8237 bắt đầu chu kỳ truyền dữ liệu của nó. S1, S2, S3 và S4 là các chu kỳ làm việc trong chu kỳ phục vụ DMA. Khi giao tiếp với các bộ nhớ có tốc độ đáp ứng chậm một trạng thái chờ có thể thêm vào giữa S2 và S3 cho đến khi tín hiệu ngõ vào READY của 8237 hết tích cực. Chú ý là dữ liệu được truyền trực tiếp giữa bộ nhớ và vào/ra với, các tín hiệu MEMR và IOW hoặc MEMW và IOR tác động một cách đồng thời tại một thời điểm. Dữ liệu sẽ không đọc vào hoặc ghi ra 8237 trong các chu kỳ truyền dữ liệu giữa vào ra và bộ nhớ. Việc truyền dữ liệu giữa các ô nhớ một chu kỳ đọc từ ô nhớ truyền và 1 chu kỳ ghi vào ô nhớ nhận cho mỗi byte. Như vậy trong chu kỳ này sẽ yêu cầu 8 trạng thái
- cho việc truyền một byte. Các trạng thái S11, S12, S13, S14 cho việc đọc dữ liệu từ bộ nhớ, và các trạng thái S21, S22, S23, S24 cho việc ghi dữ liệu vào bộ nhớ. Chu kỳ rỗi. Khi không có kênh DMA nào yêu cầu được phục vụ, 8237 sẽ chuyển qua chu kỳ rỗi và thực hiện trạng thái SI. Trong chu kỳ này 8237 sẽ kiểm tra các ngõ vào DREQ tại mỗi chu kỳ xung CLK xem có yêu cầu DMA nào cần phục vụ hay không. Trong chu kỳ này 8237 cũng kiểm tra ngõ vào CS xem CPU có thực hiện các chu kỳ đọc ghi các thanh ghi của nó hay không. Khi CS và HLDA đều ở mức thấp 8237 sẽ ở trạng thái lập trình các điều kiện hoạt động. CPU lúc này có thể thực hiện các công việc như tạo lập, thay đổi kiểm tra các tình trạng hiện thời của 8237 bằng cách đọc ghi các thanh ghi bên trong 8237. Các đường địa chỉ vào A0 - A3 sử dụng để CPU xác định tới các thanh ghi mà nó muốn đọc hoặc ghi. Các tín hiệu IOR và IOW lúc này sẽ là các ngõ vào cung cấp từ CPU để định nghĩa chu kỳ là đọc hay ghi. Khi đó đối với các thanh ghi đếm địa chỉ, hoặc các thanh ghi đếm số từ 6 bit sẽ có thêm 1 bit để xác định phần cao hay phần thấp của chúng được phép truyền dữ liệu với CPU. Các bit này có thể lập trình trước bằng phần mềm, và sẽ xóa khi có tín hiệu RESET. Đặc biệt trong chế độ này CPU có thể lập trình các chế độ hoạt động cho 8237 với sự tác động CS, IOW và các bit địa chỉ tương ứng. Các lệnh sẽ bao gồm cả việc lập xóa các Flip/Flop chọn phần cao hay thấp của các thanh ghi, và lệnh RESET toàn bộ các thanh ghi của 8237. Chu kỳ tích cực. Khi đang trong chu kỳ rỗi, nếu có tín hiệu yêu cầu cung cấp tới ngõ vào DREQ không bị lập trình che của 8237, nó sẽ gửi tín hiệu HRQ tới vi xử lý và chuyển qua chu kỳ tích cực. Trong chu kỳ này 8237 sẽ làm việc ở 1 trong 4 chế độ. Chế độ truyền byte. Trong chế độ này 8237 được lập trình chỉ thực hiện 1 chu kỳ truyền, các bộ đếm số từ và địa chỉ sẽ được tăng hoặc giảm sau mỗi lần truyền. Khi bộ đếm số từ quay lại từ 0 tới FFFFH thì kết thúc đếm TC (Terminal Count) sẽ được tự động thiết lập nếu kênh đã được lập trình TC. DREQ phải giữ nguyên mức tích cực cho đến khi DACK tích cực. Khi DREQ không còn giữ mức tích cực, HRQ sẽ hết tác động giải phóng bus hệ thống. Nếu nó tác động trở lại và nhận được tín hiệu HLDA, một chu kỳ truyền byte khác sẽ được thực hiện. Điều này cho phép việc truyền dữ liệu xem vào các chu kỳ hoạt động của CPU. Việc định thời hoạt động của 8237 sẽ tùy thuộc vào đặc tính của vi xử lý. Chế độ truyền khối. Trong chế độ truyền khối 8237 sẽ thực hiện việc truyền dữ liệu cho đến khi bộ đếm số từ chuyển từ 0000H tới FFFFH, hoặc khi ngõ vào EOP tác động mức 0. DREQ chỉ cần giữ mức tác động cho đến khi DACK tác động. Nếu được lập trình thì quá trình tự động khởi động sẽ thực hiện khi kết thúc phục vụ DMA. Chế độ truyền theo yêu cầu. Trong chế độ này 8237 sẽ truyền dữ liệu liên tục cho tới khi kết thúc đếm TC (bộ đếm từ chuyển từ 0000H tới FFFFH), hoặc khi gặp tín hiệu EOP, hoặc khi DREQ hết tích cực. Như vậy thiết bị có thể duy trì việc truyền dữ liệu cho đến khi hết dung
- lượng của nó. Khi dữ liệu chưa truyền hết mà gặp TC, hoặc có tín hiệu EOP thì phục vụ DMA sẽ được thiết lập lại vì DREQ vẫn còn tích cực Chế độ xếp tầng.(Cascade Mode). Trong chế độ này có thể xếp tầng nhiều bộ điều khiển DMA để tăng số yêu cầu ngõ vào. Các tín hiệu HRQ và HLDA của 8237 thêm sẽ được nối vào DREQ và DACK của 8237 trước nó. Điều này cho phép 8237 phía sau truyền yêu cầu qua 8237 trước nó, trình tự ưu tiên vẫn được duy trì, và ngõ vào mới yêu cầu sẽ phải chờ cho đến khi có tín hiệu chấp nhận yêu cầu DACK. Vì thế kênh xếp tầng của 8237 chủ chỉ sử dụng cho 8237 cộng thêm, và nó sẽ quyết định mức ưu tiên cho các kênh cộng thêm đó. Nó không được đưa ra địa chỉ của mình vì như vậy sẽ gây ra xung đột với các kênh cộng thêm của nó. 8237 sẽ đáp ứng các tín hiệu DREQ và DACK còn tất cả các tín hiệu khác ngoại trừ HRQ đều không được phép tác động. Hình 6.13̃ mô tả việc xếp tầng thêm hai 8237 tớ vào hai kênh của 8237 chủ, tạo thành hệ thống DMA hai mức. Có thể tăng thêm nhiều 8237 vào các kênh khác của 8237 tầng thứ nhất. Cũng có thể tăng thêm số kênh yêu cầu bằng cách, xếp tầng vào các kênh của các 8237 tầng thứ hai tạo thành hệ thống 3 tầng. 8237 tầng thứ hai 8237 tầng thứ nhất CPU DREQ HRQ DACK HLDA HOLD HRQ HLDA HLDA DREQ HRQ DACK HLDA Các kiểu truyền dữ liệu.Hình 6.13: Hệ thống xếp tầng 8237. Trong mỗi chế độ truyền nêu trên 8237 có thể ở một trong 3 kiểu truyền là: đọc ghi và kiểm tra. Trong kiểu ghi dữ liệu sẽ được chuyển từ thiết bị vào ra tới bộ nhớ bằng cách tác động đồng thời các tín hiệu IOR và MEMW. Trong kiểu đọc dữ liệu sẽ được chuyển từ bộ nhớ tới thiết bị vào ra bằng cách tác động đồng thời các tín hiệu MEMR và IOW. Kiểu kiểm tra sẽ thực hiện các việc truyền giả. Trong kiểu này 8237 tạo ra địa chỉ và đáp ứng EOP giống như trong kiểu đọc và ghi, nhưng các tín hiệu điều khiển bộ nhớ và vào ra sẽ không được tác động. Chế độ kiểm tra không được cho phép hoạt động trong chu kỳ truyền dữ liệu giữa bộ nhớ và bộ nhớ. Truyền dữ liệu giữa bộ nhớ - bộ nhớ. Chu kỳ này cho phép việc truyền một khối dữ liệu từ vùng nhớ này qua vùng nhớ khác với thời gian ngắn nhất. Một bit trong thanh ghi lệnh có thể lập trình cho các kênh 0 và 1 có thể hoạt động ở chế độ truyền giữa bộ nhớ và bộ nhớ. Quá trình sẽ được bắt đầu bằng cách thiết lập yêu cầu DMA bằng phần mềm (không phải bằng tín hiệu đưa tới ngõ vào DREQ). Khi đó 8237 sẽ thực hiện việc yêu cầu DMA như bình thường. Sau khi nhận được tín hiệu trả lời HLDA từ CPU, 8237 sẽ thực hiện
- 8 trạng thái truyền trong chế độ truyền khối. Đầu tiên nó sẽ đọc dữ liệu từ bộ nhớ, thanh ghi địa chỉ hiện hành của kênh 0 được sử dụng giữ địa chỉ nguồn dữ liệu có thể tăng hoặc giảm như thông thường. Dữ liệu đọc được từ bộ nhớ sẽ được chứa vào thanh ghi tạm thời bên trong 8237. Kênh 1 sẽ ghi dữ liệu trong thanh ghi tạm thời tới địa chỉ chứa trong thanh ghi địa chỉ hiện hành của nó, thanh ghi này cũng có thể tăng hoặc giảm như thông thường. Bộ đếm số từ của kênh 1 sẽ được giảm, và khi nó chuyển từ 0000H sang FFFFH thì TC sẽ xảy ra, TC và ngõ ra EOP sẽ tác động chỉ thị kết thúc phục vụ DMA. Kênh 0 có thể lập trình để duy trì 1 địa chỉ cho tất cả các lần truyền, điều này cho phép lấp đầy 1 vùng nhớ chỉ bằng một từ duy nhất (chỉ thay đổi địa chỉ đích, không thay đổi địa chỉ nguồn). 8037 sẽ đáp ứng tín hiệu EOP trong suốt quá trình truyền dữ liệu giữa bộ nhớ và bộ nhớ. Điều này cho phép thực hiện việc so sánh tìm kiếm trong một chuỗi dữ liệu có sắp xếp, bằng cách cung cấp tín hiệu tới ngõ vào EOP khi tìm được dữ liệu mong muốn. Tự động khởi động. Bằng cách lập một bit trong thanh ghi chế độ , có thể lập trình cho một kênh tự động khởi động. Trong chế độ này giá trị của các thanh ghi địa chỉ hiện hành, và thanh ghi đếm số từ hiện hành sẽ được phục hồi lại bằng giá trị của các thanh ghi cơ sở tương ứng khi EOP. Giá trị của các thanh ghi cơ sở được CPU nạp đồng thời với các thanh ghi hiện hành, nhưng chúng không bị thay đổi trong suốt quá trình phục vụ DMA. Bit che (mask) sẽ không được xoá trong chế độ tự động khởi động. Ngay sau quá trình khởi động lại kênh sẽ sẵn sàng thực hiện một yêu cầu DMA khác mà không cần sự can thiệp nào thêm từ CPU. Nếu không lập trình chế độ khởi động lại, các thông số của kênh phải được CPU lập trình lại sau khi EOP, mới có thể sẵn sàng cho một phục vụ DMA mới. Trình tự ưu tiên. 8237 có hai kiểu mã hóa ưu tiên có thể chọn bằng phần mềm đó là chế độ ưu tiên cố định và chế độ ưu tiên quay vòng. Trong chế độ ưu tiên cố định, ưu tiên sẽ giảm dần theo số thứ tự của các kênh, kênh 0 có độ ưu tiên cao nhất cho tới kênh 3 sẽ có độ ưu tiên thấp nhất. Khi một kênh được phục vụ, yêu cầu của các kênh khác sẽ bị ngăn chặn cho đến khi phục vụ được thực hiện xong. Ưu tiên cao nhất 0 2 Phục vụ 3 Phục vụ 1 Phục vụ 3 Yêu cầu 0 2 0 1 Ưu tiên thấp nhất 3 1 2 Hình 6.14: Chế độ ưu tiên phục vụ DMA quay vòng Trong chế độ ưu tiên quay vòng, kênh vừa được phục vụ xong sẽ có mức ưu tiên thấp nhất, kênh kế tiếp của nó sẽ có mức ưu tiên cao nhất, các kênh còn lại sẽ có độ ưu tiên theo vòng. Một chu trình ví dụ có thể biểu diễn như hình 6.14. Định thời rút gọn.
- 8237 có thể thực hiện chu kỳ truyền dữ liệu với chu kỳ rút gọn chỉ với 2 chu kỳ clock. Chu kỳ S1 sử dụng cho việc tạo địa chỉ, việc đọc ghi dữ liệu sẽ được thực hiện trong S2. Tạo địa chỉ. Để giảm bớt số chân, 8237 kết hợp 8 bit địa chỉ cao vào bus dữ liệu tạo thành bus đa hợp DB0 -DB7. Trong S1 các bit địa chỉ cao sẽ cung cấp ra các ngõ này cùng với tín hiệu cài địa chỉ ADSTB. Cạnh lên của ADSTB sẽ cài các bit địa chỉ này ra bộ cài địa chỉ bên ngoài. Tín hiệu cho phép địa chỉ AEN sẽ cho phép đặt các đường địa chỉ này lên bus hệ thống trong các trạng thái còn lại. Byte địa chỉ thấp sẽ được cung cấp trực tiếp ra các đường A0-A7, đưa lên bus địa chỉ hệ thống. Khi phục vụ trong chế độ truyền khối và truyền theo yêu cầu bao gồm nhiều chu kỳ truyền, các địa chỉ sẽ được tạo ra một cách tuần tự. Với các chu kỳ truyền bằng các địa chỉ kế tiếp nhau, các bit địa chỉ cao chỉ phải thay đổi một lần trong 256 lần truyền. Do đó các đường địa chỉ cao và tín hiệu ADSTB chỉ tác động 1 lần sau 256 lần truyền, 255 lần truyền còn lại các đường này chỉ dành cho dữ liệu. 5. Mô tả các thanh ghi. Thanh ghi địa chỉ hiện hành. Mỗi kênh DMA có 1 thanh ghi địa chỉ hiện hành 16 bit. Thanh ghi này sẽ giữ địa chỉ trong suốt quá trình phục vụ DMA. Giá trị địa chỉ sẽ tự động tăng hoặc giảm sau mỗi lần truyền. Giá trị của thanh ghi này có thể CPU đọc được mỗi lần 8 bit, và nó có thể phục hồi lại giá trị ban đầu từ thanh ghi cơ sở nếu kênh được lập trình tự động khởi động lại. Quá trình tự động khởi động lại chỉ xảy ra sau khi EOP. Thanh ghi đếm số từ hiện hành. Mỗi kênh DMA có 1 thanh ghi đếm số từ hiện hành 16 bit. Giá trị của thanh ghi này sẽ xác định số chu kỳ truyền cần phải thực hiện, số chu kỳ truyền thực sự sẽ nhiều hơn giá trị lập trình trong thanh ghi đếm số từ hiện hành 1 (nghĩa là nếu lập trình thanh ghi hiện hành là 100, thì số chu kỳ truyền sẽ là 101). Thanh ghi này sẽ tự động giảm sau mỗi chu kỳ truyền, khi giá trị của nó chuyển từ 0000H sang FFFFH thì TC sẽ được tạo ra. Giá trị của thanh ghi này có thể đọc hoặc ghi mỗi lần 8 bit trong khi lập trình cho 8237. Việc tự động khởi động sẽ phục hồi lại giá trị của thanh ghi đếm số từ hiện hành bằng giá trị của thanh ghi đếm số từ cơ sở sau khi EOP, nếu kênh được lập trình tự động khởi động. Nếu không được lập trình tự động khởi động lại, thì giá trị của thanh ghi bộ đếm số từ hiện hành sẽ là FFFFH sau khi TC. 7 6 5 4 3 2 1 0 0: Không cho phép truyền bộ nhớ - bộ nhớ 1: Cho phép truyền bộ nhớ - bộ nhớ 0: Không cho phép kênh 0 giữ nguyên địa chỉ 1: Cho phép kênh 0 giữ nguyên địa chỉ x: khi bit D 0 = 0 0: DMAC bị cấm hoạt động 1: DMAC được phép hoạt động 0: Chê độ định thời bình thường 1: Chế độ định thời rút gọn (chỉ truyền 2 CLK) x: khi bit D0 = 0 0: Chế độ ưu tiên cố định 1: Chế độ ưu tiên quay vòng 0: Ghi kéo dài (cho bộ nhớ chậm) 1: Ghi thông thường x: Khi bit D3 = 0 0: DREQ tác động mức cao 1: DREQ tác động mức thấp 0: DACK tác động mức thấp 1: DREQ tác động mức cao Hình 6.15: Thanh ghi lệnh của 8237.
- Các thanh ghi địa chỉ và đếm số từ cơ sở. Mỗi kênh có 1 thanh ghi có một cặp thanh ghi địa chỉ và đếm số từ cơ sở. Mỗi thanh ghi có độ dài 16 bit, chúng giữ giá trị thiết lập ban đầu của các thanh ghi địa chỉ và đếm số từ hiện hành tương ứng với chúng. Trong chế độ tự động khởi động giá trị của các thanh ghi này sẽ ghi trở lại cho các thanh ghi hiện hành. Giá trị của các thanh ghi này được ghi đồng thời với các thanh ghi hiện hành của chúng khi lập trình. Giá trị của các thanh ghi này sẽ không thể đọc được. Thanh ghi lệnh. 8 bit lập trình bởi CPU trong thanh ghi lệnh sẽ điều khiển hoạt động của 8237, giá trị của thanh ghi này sẽ bị xóa khi RESET cứng hoặc mềm. Các bit của thanh ghi điều khiển có các chức năng được định nghĩa trong hình 6.15. 7 6 5 4 3 2 1 0 00: chọn lập trình thanh ghi chế độ kênh 0 01: chọn lập trình thanh ghi chế độ kênh 1 10: chọn lập trình thanh ghi chế độ kênh2 11: chọn lập trình thanh ghi chế độ kênh 3 00: Truyền kiểm tra 01: Truyền ghi 10: Truyền đọc 11: chọn lập trình thanh ghi chế độ kênh 3 xx: khi bit 6 và 7 = 11 0: không khởi động tự động 1: khởi động tự động 0: Địa chỉ hiện hành tăng sau mỗi lần truyền 1: Địa chỉ hiện hành giảm sau mỗi lần truyền 00: Truyền theo yêu cầu 01: Truyền từng byte 10: Truyền khối 11: Chế độ xếp tầng.
- Hình 6.16: Thanh ghi chế độ của 8237. Thanh ghi chế độ. Mỗi kênh có một thanh ghi chế độ 6 bit, khi lập trình bit 0 và 1 trong byte ghi tới địa chỉ của thanh ghi chế độ sẽ xác định thanh ghi chế độ của kênh nào được ghi. Các bit của thanh ghi chế độ được lập trình như hình 6.16. Thanh ghi yêu cầu. 8237 có thể đáp ứng các yêu cầu phục vụ DMA được tác động bằng phần mềm cũng như bằng yêu cầu ở ngõ vào DREQ. Mỗi kênh có 1 bit yêu cầu trong 1 thanh ghi yêu cầu 4 bit. Yêu cầu lập trình tại đây sẽ không bị che hoặc xem xét theo trình tự ưu tiên của mảng mã hóa ưu tiên. Mỗi bit này có thể lập hoặc xóa từ CPU, nó sẽ xóa khi TC hoặc khi có tín hiệu EOP cung cấp từ bên ngoài. Tất nhiên nó sẽ bị xóa khi RESET. Khi yêu cầu cung cấp từ đây thì kênh luôn hoạt động trong chế độ truyền khối. Thanh ghi yêu cầu 7 6 5 4 3 2 1 0 00: chọn lập trình bit y/cầu kênh 0 01: chọn lập trình bit y/cầu kênh 1 Các bit tùy định 10: chọn lập trình bit y/cầu kênh2 11: chọn lập trình bit y/cầu kênh 3 0: Xóa bit yêu câu 1: Lập bit yêu cầu Thanh ghi mặt nạ. (cheHình phục 6.17: vụ DMA)Thanh ghi yêu cầu của 8237. Mỗi kênh có một bit mặt nạ khi được thiết lập nó sẽ không cho phép yêu cầu cung cấp từ ngõ vào DREQ của kênh đó. Các bit này sẽ được thiết lập khi kênh tương ứng với nó có EOP, nếu không lập trình chế độ khởi động tự động. Mỗi bit này cũng có thể lập hoặc xóa bằng phần mềm, toàn bộ thanh ghi sẽ bị xóa khi RESET. Tất cả 4 bit của thanh ghi mặt nạ cũng có thể ghi đồng thời bằng một lệnh. Thanh ghi mặt nạ 7 6 5 4 3 2 1 0 00: chọn lập trình bit mặt nạ kênh 0 01: chọn lập trình bit mặt nạ kênh 1 Các bit tùy định 10: chọn lập trình bit mặt nạ kênh2 11: chọn lập trình bit mặt nạ kênh 3 0: Xóa bit mặt nạ 1: Lập bit mặt nạ
- Thanh ghi mặt nạ lập trình 4 bit 7 6 5 4 3 2 1 0 0: Xóa bit mặt nạ kênh 0 1: Lập bit mặt nạ kênh 0 0: Xóa bit mặt nạ kênh 1 Các bit tùy định 1: Lập bit mặt nạ kênh 1 0: Xóa bit mặt nạ kênh 2 1: Lập bit mặt nạ kênh 2 0: Xóa bit mặt nạ kênh 3 Thanh ghi trạng thái. 1: Lập bit mặt nạ kênh 3 Thanh ghi trạng thái của 8237 có thể được CPU đọc vào để biết được trạng thái hiện tại của 8237. Các bit của thanh ghi này sẽ cho CPU biết trạng thái ngưng phục vụ của các kênh, và các yêu cầu chưa được phục vụ của các kênh. Các bit 0 - 3 sẽ được thiết lập khi kênh tương ứng với nó có tín hiệu EOP cung cấp từ bên ngoài. Các bit 4 - 7 sẽ được lập khi kênh tương ứng với nó có yêu cầu phục vụ. Các bit sẽ bị xóa khi RESET. Thanh ghi trạng thái 7 6 5 4 3 2 1 0 1: Kết thúc đếm kênh 0 1: Kết thúc đếm kênh 1 1: Kết thúc đếm kênh 2 1: Kết thúc đếm kênh 3 1: Có yêu cầu tại kênh 0 1: Có yêu cầu tại kênh 1 1: Có yêu cầu tại kênh 2 Thanh ghi tạm thời. 1: Có yêu cầu tại kênh 3 Thanh ghi tạm thời sử dụng cho việc chứa tạm dữ liệu trong chu kỳ truyền dữ liệu giữa bộ nhớ với bộ nhớ. Khi kết thúc truyền từ cuối cùng có thể đọc được, thanh ghi tạm thời luôn chứa từ cuối cùng của chu kỳ truyền bộ nhớ - bộ nhớ trước trừ khi bị xóa bởi RESET cứng hoặc mềm. Các lệnh lập trình bằng phần mềm. Xóa/lập flip flop cao thấp: Flip flop cao thấp sử dụng cho việc truy cập byte cao hoặc byte thấp của các thanh ghi địa chỉ và đếm số từ hiện hành. Reset mềm: Lệnh này sẽ có tác dụng tương đương với việc cung cấp tín hiệu reset cứng tới ngõ vào RESET của 8237. Nó sẽ xóa toàn bộ các thanh ghi bên trong của 8237, và làm 8237 chuyển về chu kỳ rỗi. Xóa thanh ghi mặt nạ: lệnh này sẽ xóa đồng thời cả 4 bit của thanh ghi mặt nạ, cho phép các kênh của 8237 nhận các yêu cầu DMA.
- Bảng sau sẽ trình bày các tín hiệu cần tác động tương ứng với các lệnh phần mềm: A3 A2 A1 A0 IOR IOW Hoạt động 1 0 0 0 0 1 Đọc thanh ghi trạng thái 1 0 0 0 1 0 ghi thanh ghi lệnh 1 0 0 1 0 1 cấm 1 0 0 1 1 0 ghi thanh ghi yêu cầu 1 0 1 0 0 1 cấm 1 0 1 0 1 0 ghi từng bit thanh ghi mặt nạ 1 0 1 1 0 1 cấm 1 0 1 1 1 0 ghi thanh ghi chế độ 1 1 0 0 0 1 cấm 1 1 0 0 1 0 xóa byte con trỏ Flip fop 1 1 0 1 0 1 đọc thanh ghi tạm thời 1 1 0 1 1 0 Reset mềm 1 1 1 0 0 1 Cấm 1 1 1 0 1 0 xóa thanh ghi mặt nạ 1 1 1 1 0 1 cấm 1 1 1 1 1 0 ghi tất cả các bit thanh ghi mặt nạ Lập trình cho 8237. 8237 có thể lập trình từ vi xử lý tại bất kỳ thời điểm nào khi tín hiệu HLDA không tác động, ngay cả khi tín hiệu HRQ tác động. Điều này có thể gây ra tình trạng hoạt động sai nếu có một yêu cầu DMA xảy ra trong khi CPU đang lập trình cho 8237. Ví dụ khi CPU đang lập trình lại thanh ghi địa chỉ của kênh 1, trong khi kênh 1 nhận được một yêu cầu DMA. Nếu 8237 cho phép phục vụ (bit 2 của thanh ghi lệnh = 0), và nếu kênh 1 không bị lập trình che (bit 1 của thanh ghi mặt nạ = 0), khi đó chu kỳ phục vụ DMA sẽ xảy ra ngay sau khi 1 byte của thanh ghi địa chỉ được lập trình lại. Điều này có thể tránh được bằng cách không cho phép 8237 hoạt động (lập bit 2 của thanh ghi lệnh), hoặc che kênh khi lập trình lại các thanh ghi của nó. Sau khi lập trình cần phải cho phép trở lại. Khi bắt đầu hoạt động chú ý phải thiết lập thanh ghi lệnh các bit với các dữ kiện hợp lệ, ngay cả khi kênh không sử dụng. Kênh thanh ghi c/kỳ Flip DB0-DB7 flop 0 Đ/c cơ bản và Ghi 0 1 0 0 0 0 0 0 A0-A7 hiện hành 0 1 0 0 0 0 0 1 A8-A15 Đ/c hiện hành Đọc 0 0 1 0 0 0 0 0 A0-A7 0 0 1 0 0 0 0 1 A8-A15 Đếm từ cơ bản Ghi 0 1 0 0 0 0 1 0 W0-W7 và hiện hành 0 1 0 0 0 0 1 1 W8-W15 Đếm từ hiện Đọc 0 0 1 0 0 0 1 0 W0-W7 hành 0 0 1 0 0 0 1 1 W8-W15
- 1 Đ/c cơ bản và Ghi 0 1 0 0 0 1 0 0 A0-A7 hiện hành 0 1 0 0 0 1 0 1 A8-A15 Đ/c hiện hành Đọc 0 0 1 0 0 1 0 0 A0-A7 0 0 1 0 0 1 0 1 A8-A15 Đếm từ cơ bản Ghi 0 1 0 0 0 1 1 0 W0-W7 và hiện hành 0 1 0 0 0 1 1 1 W8-W15 Đếm từ hiện Đọc 0 0 1 0 0 1 1 0 W0-W7 hành 0 0 1 0 0 1 1 1 W8-W15 2 Đ/c cơ bản và Ghi 0 1 0 0 1 0 0 0 A0-A7 hiện hành 0 1 0 0 1 0 0 1 A8-A15 Đ/c hiện hành Đọc 0 0 1 0 1 0 0 0 A0-A7 0 0 1 0 1 0 0 1 A8-A15 Đếm từ cơ bản Ghi 0 1 0 0 1 0 1 0 W0-W7 và hiện hành 0 1 0 0 1 0 1 1 W8-W15 Đếm từ hiện Đọc 0 0 1 0 1 0 1 0 W0-W7 hành 0 0 1 0 1 0 1 1 W8-W15 3 Đ/c cơ bản và Ghi 0 1 0 0 1 1 0 0 A0-A7 hiện hành 0 1 0 0 1 1 0 1 A8-A15 Đ/c hiện hành Đọc 0 0 1 0 1 1 0 0 A0-A7 0 0 1 0 1 1 0 1 A8-A15 Đếm từ cơ bản Ghi 0 1 0 0 1 1 1 0 W0-W7 và hiện hành 0 1 0 0 1 1 1 1 W8-W15 Đếm từ hiện Đọc 0 0 1 0 1 1 1 0 W0-W7 hành 0 0 1 0 1 1 1 1 W8-W15