I. Tổng quan kỹ thuật vi xử lý Các phương pháp vào ra
Trong các hệ thống ứng dụng, kỹ thuật vi xử lý đóng vai trò trung tâm điều khiển, đòi hỏi sự trao đổi thông tin liên tục giữa bộ vi xử lý và các thiết bị ngoại vi. Quá trình này, được gọi là quá trình vào/ra (I/O), là nền tảng cho mọi hoạt động của hệ thống, từ việc nhận dữ liệu từ cảm biến đến việc xuất lệnh điều khiển cơ cấu chấp hành. Hiệu quả của hệ thống phụ thuộc rất lớn vào phương pháp điều khiển trao đổi thông tin được lựa chọn. Có ba nhóm phương pháp chính để thực hiện quá trình vào/ra. Nhóm thứ nhất là vào/ra điều khiển bằng chương trình, nơi mọi hoạt động trao đổi số liệu đều do chương trình thực hiện trực tiếp thông qua các lệnh vào/ra. Nhóm thứ hai là vào/ra điều khiển bằng ngắt, một cơ chế hiệu quả hơn, trong đó thiết bị ngoại vi chủ động thông báo cho bộ vi xử lý khi nó sẵn sàng trao đổi dữ liệu. Bộ vi xử lý sẽ tạm dừng công việc hiện tại để thực thi chương trình phục vụ ngắt, sau đó quay lại chương trình chính. Nhóm thứ ba, vào/ra điều khiển bằng phần cứng hay còn gọi là thâm nhập bộ nhớ trực tiếp (DMA - Direct Memory Access), là phương pháp cho phép trao đổi dữ liệu tốc độ cao trực tiếp giữa bộ nhớ và thiết bị ngoại vi mà không cần sự can thiệp của bộ vi xử lý. Mỗi phương pháp có ưu và nhược điểm riêng, phù hợp với các ứng dụng khác nhau, từ các hệ thống đơn giản, chi phí thấp đến các hệ thống yêu cầu hiệu suất và tốc độ xử lý cao. Việc lựa chọn phương pháp tối ưu là một bài toán quan trọng trong thiết kế hệ thống vi xử lý.
1.1. Khái niệm về quá trình trao đổi số liệu trong hệ vi xử lý
Quá trình trao đổi số liệu, hay còn gọi là quá trình vào/ra (I/O), là hoạt động cốt lõi cho phép bộ vi xử lý tương tác với thế giới bên ngoài. Nó bao gồm việc truyền dữ liệu giữa các mạch ngoài với bộ vi xử lý và giữa bộ vi xử lý với bộ nhớ. Các cửa vào và cửa ra thực chất là các thanh ghi ngoài, có chức năng như các điểm trung chuyển dữ liệu. Một số bộ vi xử lý, như 8085A, sử dụng tín hiệu điều khiển IO/M để phân biệt không gian địa chỉ. Khi IO/M = 0, hệ thống truy cập bộ nhớ; khi IO/M = 1, hệ thống truy cập thiết bị vào/ra. Hướng trao đổi dữ liệu được xác định bởi các tín hiệu điều khiển đọc (RD) và ghi (WR).
1.2. Phân loại 3 nhóm điều khiển vào ra chính chương trình ngắt DMA
Có ba phương pháp điều khiển trao đổi thông tin chính. Thứ nhất, vào/ra điều khiển bằng chương trình, trong đó CPU toàn quyền kiểm soát việc trao đổi thông qua các lệnh IN và OUT. Phương pháp này đơn giản nhưng chiếm dụng thời gian của CPU. Thứ hai, vào/ra điều khiển bằng ngắt, nơi thiết bị ngoại vi gửi yêu cầu ngắt đến CPU khi sẵn sàng. CPU sẽ tạm dừng chương trình chính để thực thi một chương trình con phục vụ ngắt, giúp tăng hiệu quả hệ thống. Thứ ba, thâm nhập bộ nhớ trực tiếp (DMA), là phương pháp cao cấp nhất. Phần cứng điều khiển DMA sẽ quản lý việc truyền dữ liệu trực tiếp giữa thiết bị I/O và bộ nhớ mà không cần qua các thanh ghi của CPU, lý tưởng cho các ứng dụng đòi hỏi tốc độ truyền dữ liệu cực cao.
II. Thách thức trong kỹ thuật vi xử lý Giao tiếp I O
Việc thiết kế giao tiếp vào/ra trong kỹ thuật vi xử lý đối mặt với nhiều thách thức, đặc biệt là trong việc quản lý và phân biệt không gian địa chỉ cũng như lựa chọn thiết bị. Một trong những quyết định cơ bản là lựa chọn giữa vào/ra tách biệt (Isolated I/O) và vào/ra theo địa chỉ bộ nhớ (Memory-mapped I/O). Với vào/ra tách biệt, các thiết bị I/O có một không gian địa chỉ riêng, được truy cập bằng các lệnh chuyên dụng như IN và OUT. Phương pháp này giúp tách bạch rõ ràng giữa bộ nhớ và ngoại vi. Ngược lại, vào/ra theo địa chỉ bộ nhớ gán cho các cổng I/O những địa chỉ trong không gian bộ nhớ của hệ thống. Điều này cho phép sử dụng toàn bộ tập lệnh truy cập bộ nhớ (MOV, LDA, STA,...) để thao tác với thiết bị ngoại vi, mang lại sự linh hoạt cao hơn. Tuy nhiên, thách thức lớn nhất nằm ở khâu giải mã địa chỉ. Khi hệ thống có nhiều thiết bị I/O, cần một cơ chế logic để đảm bảo rằng tại một thời điểm, chỉ có một thiết bị duy nhất được chọn để giao tiếp trên bus. Lỗi trong thiết kế giải mã có thể dẫn đến xung đột bus (bus contention), khi hai hay nhiều thiết bị cùng lúc cố gắng đưa dữ liệu lên bus, gây ra chập mạch và làm hỏng phần cứng. Do đó, việc thiết kế mạch giải mã địa chỉ chính xác và hiệu quả là yếu tố sống còn để đảm bảo sự ổn định và tin cậy của toàn bộ hệ thống vi xử lý.
2.1. Phân biệt vào ra tách biệt và vào ra theo địa chỉ bộ nhớ
Vào/ra tách biệt sử dụng các lệnh IN và OUT, đòi hỏi 3 chu kỳ máy để thực hiện. Tín hiệu IO/M của 8085A sẽ ở mức cao (IO/M=1) để chỉ định đây là thao tác với I/O. Phương pháp này có không gian địa chỉ giới hạn (ví dụ 256 cổng vào và 256 cổng ra cho 8085A). Trong khi đó, vào/ra theo địa chỉ bộ nhớ coi các cổng I/O như các ô nhớ. Tín hiệu IO/M sẽ ở mức thấp (IO/M=0). Điều này cho phép dùng các lệnh mạnh mẽ như MOV r, M hay SHLD để trao đổi dữ liệu, mang lại sự linh hoạt trong lập trình nhưng làm giảm không gian địa chỉ dành cho bộ nhớ RAM/ROM thực.
2.2. Các khó khăn trong việc giải mã địa chỉ cho thiết bị ngoại vi
Khi một hệ vi xử lý chỉ có một vài thiết bị I/O, việc giải mã địa chỉ có thể không cần thiết. Tuy nhiên, với số lượng lớn thiết bị, việc giải mã trở nên bắt buộc. Một phương pháp đơn giản là chọn tuyến tính (linear selection), sử dụng trực tiếp các đường địa chỉ để chọn thiết bị. Phương pháp này tiết kiệm mạch logic nhưng tiềm ẩn rủi ro: một lỗi lập trình nhỏ (nhầm địa chỉ cổng) có thể khiến hai cửa vào cùng được chọn, gây xung đột bus và hư hỏng phần cứng. Hơn nữa, phương pháp này giới hạn số lượng thiết bị có thể kết nối. Để khắc phục, các bộ giải mã IC như 74LS138 hay 8205 được sử dụng để tạo ra các tín hiệu chọn thiết bị (chip select) duy nhất cho mỗi cổng, đảm bảo hoạt động an toàn và cho phép mở rộng hệ thống.
III. Hướng dẫn kỹ thuật vi xử lý Vào ra bằng chương trình
Phương pháp vào/ra điều khiển bằng chương trình là nền tảng của kỹ thuật vi xử lý, trong đó mọi hoạt động trao đổi dữ liệu đều được quản lý trực tiếp bởi phần mềm. Để thực hiện phương pháp này, việc thiết kế mạch logic để tạo ra các xung chọn thiết bị là tối quan trọng. Có hai cách tiếp cận chính: chọn tuyến tính và sử dụng bộ giải mã địa chỉ. Phương pháp chọn tuyến tính không yêu cầu mạch logic phức tạp, thường dùng cho các hệ thống nhỏ có dưới 8 cửa vào và 8 cửa ra. Tuy nhiên, nó có nhược điểm lớn là dễ gây xung đột phần cứng nếu chương trình có lỗi địa chỉ. Để an toàn và có khả năng mở rộng, việc sử dụng các bộ giải mã địa chỉ như 74LS139, 74LS138 là giải pháp được ưu tiên. Các IC này nhận đầu vào là các bit địa chỉ và các tín hiệu điều khiển (IO/M, RD, WR) để tạo ra các xung chọn thiết bị duy nhất, loại bỏ nguy cơ xung đột bus. Trong quá trình trao đổi dữ liệu, có hai hình thức: không điều kiện và có điều kiện. Trao đổi không điều kiện diễn ra khi bộ vi xử lý gửi hoặc nhận dữ liệu mà không cần kiểm tra trạng thái của thiết bị ngoại vi. Ngược lại, trao đổi có điều kiện đòi hỏi bộ vi xử lý phải kiểm tra một cờ trạng thái (status flag) để xác định xem thiết bị đã sẵn sàng hay chưa. Kỹ thuật này, gọi là handshaking, đảm bảo tính toàn vẹn dữ liệu. Khi có nhiều thiết bị, bộ vi xử lý có thể sử dụng phương pháp hỏi vòng (polling) để tuần tự kiểm tra cờ trạng thái của từng thiết bị.
3.1. Phương pháp chọn tuyến tính và các bất lợi cần lưu ý
Phương pháp chọn tuyến tính sử dụng mỗi bit địa chỉ để điều khiển một cửa vào/ra. Ví dụ, bit A4 có thể được dùng để chọn cửa 16. Mạch logic sẽ tổ hợp tín hiệu này với IO/M và RD (cho lệnh đọc) hoặc WR (cho lệnh ghi) để tạo xung chọn. Bất lợi chính là lỗi chương trình có thể gây nguy hại phần cứng. Giả sử dây địa chỉ A2 và A3 dùng cho cửa 4 và 8. Nếu một lệnh IN 12 (địa chỉ 12 = 8+4) bị thực thi do lỗi, cả hai cửa 4 và 8 sẽ cùng được chọn, dẫn đến chập mạch trên bus dữ liệu. Do đó, khi áp dụng phương pháp này, lập trình viên phải đảm bảo không bao giờ chọn hai cửa đồng thời.
3.2. Sử dụng bộ giải mã địa chỉ IC để quản lý nhiều thiết bị I O
Để quản lý nhiều thiết bị vào/ra một cách an toàn, các bộ giải mã địa chỉ như 74LS138 (giải mã 3 sang 8) hoặc 74LS154 (giải mã 4 sang 16) được sử dụng. Các bit địa chỉ thấp (ví dụ A0-A2) được nối vào đầu vào của bộ giải mã. Các tín hiệu điều khiển như RD, WR, IO/M được nối vào các chân cho phép (enable) của IC. Nhờ vậy, bộ giải mã chỉ hoạt động khi có một lệnh I/O hợp lệ, và nó sẽ tạo ra một xung chọn duy nhất ở một trong các đầu ra, kích hoạt đúng thiết bị ngoại vi được chỉ định. Việc sử dụng các bộ giải mã này giúp hệ thống trở nên module hóa, dễ mở rộng và an toàn hơn.
3.3. Điều khiển trao đổi dữ liệu có điều kiện Handshaking Polling
Trao đổi dữ liệu có điều kiện, hay handshaking, là một phương pháp đồng bộ hóa giữa bộ vi xử lý và thiết bị ngoại vi. Thiết bị sẽ thiết lập một cờ (flag) để báo hiệu rằng nó đã sẵn sàng (ví dụ, có dữ liệu mới để đọc, hoặc bộ đệm đã trống để ghi). Bộ vi xử lý sẽ liên tục kiểm tra cờ này. Khi có nhiều thiết bị, chương trình sẽ thực hiện hỏi vòng (polling): tuần tự đọc byte trạng thái của từng thiết bị để xem thiết bị nào cần phục vụ. Phương pháp này làm tăng thời gian chờ (I/O overhead) nhưng đảm bảo dữ liệu không bị mất hoặc ghi đè.
IV. Giải pháp kỹ thuật vi xử lý Sử dụng IC giao tiếp LSI
Để tối ưu hóa thiết kế và giảm số lượng linh kiện trong các hệ thống vi xử lý, các vi mạch tích hợp cỡ lớn (LSI) có khả năng lập trình được sử dụng rộng rãi. Các IC này tích hợp nhiều chức năng như cổng vào/ra, bộ đệm, chốt, và logic điều khiển vào cùng một chip, cho phép cấu hình linh hoạt bằng phần mềm. Hai vi mạch tiêu biểu trong họ vi xử lý 8085A là Intel 8155 và 8255A. Vi mạch 8155 là một thiết bị đa năng, bao gồm 256 byte RAM tĩnh, ba cổng I/O (hai cổng 8 bit và một cổng 6 bit) và một bộ định thời 14 bit. Các cổng I/O của 8155 có thể được cấu hình là đầu vào hoặc đầu ra thông qua việc ghi vào thanh ghi lệnh/trạng thái (C/S). Hơn nữa, cổng C có thể hoạt động như các đường tín hiệu handshaking cho cổng A và B, hỗ trợ trao đổi dữ liệu có điều kiện một cách hiệu quả. Trong khi đó, 8255A (Programmable Peripheral Interface - PPI) là một vi mạch chuyên dụng cho giao tiếp ngoại vi, cung cấp ba cổng I/O 8 bit (A, B, C). Điểm mạnh của 8255A là khả năng hoạt động ở nhiều chế độ khác nhau. Chế độ 0 (vào/ra cơ bản) cho phép cấu hình mỗi cổng là vào hoặc ra. Chế độ 1 (vào/ra chốt) hỗ trợ giao tiếp handshaking. Chế độ 2 cung cấp một bus hai chiều 8 bit, rất hữu ích cho các ứng dụng phức tạp. Việc sử dụng các IC LSI này giúp đơn giản hóa phần cứng, tăng tính linh hoạt và giảm chi phí cho hệ thống vi xử lý.
4.1. Chức năng và cách cấu hình vi mạch đa năng Intel 8155
Intel 8155 là một vi mạch hỗ trợ mạnh mẽ cho 8085A. Nó tích hợp sẵn một bộ chốt địa chỉ để tách kênh bus địa chỉ/dữ liệu. Để cấu hình 8155, chương trình cần ghi một byte lệnh vào thanh ghi C/S (Command/Status). Các bit trong byte lệnh này sẽ định nghĩa hướng của cổng A và B (vào/ra), chế độ hoạt động của cổng C (vào, ra, hoặc tín hiệu điều khiển handshaking), và điều khiển bộ định thời. Ví dụ, để cấu hình cổng A là vào, cổng B là ra và sử dụng chế độ handshaking ALT4, chương trình sẽ gửi giá trị 0AH đến địa chỉ thanh ghi C/S. Sau khi cấu hình, các lệnh IN và OUT được dùng để đọc/ghi dữ liệu qua các cổng tương ứng.
4.2. Lập trình mạch nối ghép ngoại vi PPI 8255A với các chế độ
Vi mạch 8255A được điều khiển thông qua một từ điều khiển (control word) ghi vào thanh ghi điều khiển. Từ điều khiển này xác định chế độ hoạt động cho các cổng. Chế độ 0 là chế độ I/O cơ bản, phù hợp cho các giao tiếp đơn giản. Chế độ 1 (Strobed I/O) sử dụng các chân của cổng C làm tín hiệu điều khiển (STB, IBF, OBF, ACK) để thực hiện giao tiếp handshaking với thiết bị ngoại vi. Chế độ 2 (Bidirectional Bus) biến cổng A thành một bus dữ liệu hai chiều, được điều khiển bởi 5 bit của cổng C. 8255A còn có một tính năng mạnh mẽ là khả năng lập/xóa từng bit của cổng C (Bit Set/Reset), rất tiện lợi cho các ứng dụng điều khiển riêng lẻ.
V. Kỹ thuật vi xử lý nâng cao Điều khiển bằng ngắt DMA
Để khắc phục hạn chế về hiệu suất của phương pháp hỏi vòng (polling), kỹ thuật vi xử lý hiện đại ứng dụng cơ chế ngắt (interrupt). Thay vì để bộ vi xử lý liên tục kiểm tra trạng thái thiết bị, cơ chế ngắt cho phép thiết bị ngoại vi chủ động gửi một tín hiệu yêu cầu phục vụ đến bộ vi xử lý khi nó cần trao đổi dữ liệu. Khi nhận được yêu cầu ngắt, bộ vi xử lý sẽ hoàn thành lệnh đang thực thi, lưu lại trạng thái hiện tại (chủ yếu là địa chỉ của lệnh kế tiếp trong thanh ghi PC) vào ngăn xếp, sau đó nhảy đến một chương trình con đặc biệt gọi là chương trình phục vụ ngắt (ISR). Sau khi thực thi xong ISR, nó sẽ khôi phục lại trạng thái và tiếp tục chương trình chính. Bộ vi xử lý 8085A có một cấu trúc ngắt ưu tiên với 5 đầu vào: TRAP, RST7.5, RST6.5, RST5.5 và INTR, trong đó TRAP có ưu tiên cao nhất và không thể bị che. Một kỹ thuật khác để tối đa hóa tốc độ truyền dữ liệu là Thâm nhập bộ nhớ trực tiếp (DMA). Trong chế độ DMA, một bộ điều khiển DMA chuyên dụng sẽ giành quyền điều khiển bus hệ thống từ bộ vi xử lý và thực hiện việc truyền dữ liệu trực tiếp giữa bộ nhớ và thiết bị I/O. Bộ vi xử lý chỉ cần khởi tạo bộ điều khiển DMA với thông tin về địa chỉ nguồn, địa chỉ đích và số byte cần truyền, sau đó có thể thực hiện các công việc khác. DMA là giải pháp không thể thiếu trong các ứng dụng đòi hỏi thông lượng dữ liệu lớn như đồ họa, mạng, hay lưu trữ đĩa.
5.1. Cấu trúc ngắt ưu tiên của bộ vi xử lý 8085A và ứng dụng
8085A có 5 đầu vào ngắt: TRAP, RST7.5, RST6.5, RST5.5, và INTR. TRAP là ngắt không che được (NMI), thường dùng cho các sự kiện khẩn cấp như mất nguồn. Các ngắt còn lại là ngắt che được, có thể được cho phép hoặc vô hiệu hóa bằng lệnh EI (Enable Interrupt) và DI (Disable Interrupt). Mỗi ngắt (trừ INTR) được liên kết với một địa chỉ vector cụ thể trong bộ nhớ, nơi chương trình phục vụ ngắt bắt đầu. 8085A có cơ chế ưu tiên cứng: TRAP > RST7.5 > RST6.5 > RST5.5 > INTR. Điều này đảm bảo rằng khi nhiều yêu cầu ngắt xảy ra đồng thời, yêu cầu có mức ưu tiên cao hơn sẽ được phục vụ trước.
5.2. Nguyên lý hoạt động của thâm nhập bộ nhớ trực tiếp DMA
Thâm nhập bộ nhớ trực tiếp (DMA) là kỹ thuật truyền dữ liệu tốc độ cao. Quá trình hoạt động gồm các bước: 1. Bộ vi xử lý lập trình cho bộ điều khiển DMA (DMAC) với địa chỉ bắt đầu của bộ nhớ, tổng số từ cần truyền và hướng truyền. 2. Thiết bị I/O gửi yêu cầu truyền dữ liệu đến DMAC. 3. DMAC gửi yêu cầu giữ bus (HOLD) đến bộ vi xử lý. 4. Bộ vi xử lý hoàn thành chu kỳ máy hiện tại, thả nổi các bus và gửi tín hiệu chấp nhận (HLDA) cho DMAC. 5. DMAC giành quyền điều khiển bus, thực hiện truyền dữ liệu trực tiếp giữa I/O và bộ nhớ. 6. Sau khi hoàn tất, DMAC trả lại quyền điều khiển bus cho bộ vi xử lý. Quá trình này loại bỏ vai trò trung gian của CPU, giải phóng tài nguyên và tăng tốc độ truyền dữ liệu lên đáng kể.
VI. Tương lai kỹ thuật vi xử lý và các phương thức giao tiếp
Tổng kết lại, kỹ thuật vi xử lý cung cấp một loạt các phương pháp giao tiếp vào/ra, mỗi phương pháp có những đặc điểm riêng biệt phù hợp với các yêu cầu ứng dụng khác nhau. Vào/ra điều khiển bằng chương trình, bao gồm cả kỹ thuật hỏi vòng, là phương pháp đơn giản nhất, dễ triển khai nhưng lại làm lãng phí thời gian xử lý của CPU. Nó phù hợp với các hệ thống đơn giản, không yêu cầu đáp ứng thời gian thực nghiêm ngặt. Vào/ra điều khiển bằng ngắt là một bước tiến vượt bậc, giải phóng CPU khỏi việc phải chờ đợi thiết bị ngoại vi, giúp hệ thống hoạt động hiệu quả và đáp ứng tốt hơn với các sự kiện không đồng bộ. Đây là phương pháp phổ biến nhất trong hầu hết các ứng dụng nhúng. Cuối cùng, Thâm nhập bộ nhớ trực tiếp (DMA) là giải pháp đỉnh cao cho các tác vụ truyền dữ liệu khối lượng lớn với tốc độ cao, giảm thiểu sự can thiệp của CPU đến mức tối đa. Nhìn về tương lai, xu hướng trong kỹ thuật vi xử lý là tích hợp ngày càng nhiều bộ điều khiển ngoại vi phức tạp ngay trên cùng một vi mạch (SoC - System on a Chip). Các vi điều khiển hiện đại không chỉ có các cổng I/O cơ bản mà còn tích hợp sẵn các bộ điều khiển ngắt tiên tiến, nhiều kênh DMA, cùng với các giao diện truyền thông chuẩn như UART, SPI, I2C. Điều này giúp đơn giản hóa việc thiết kế phần cứng, giảm kích thước và chi phí sản phẩm, đồng thời tăng cường hiệu suất và độ tin cậy của hệ thống.
6.1. Tóm tắt ưu nhược điểm của các phương pháp vào ra
- Điều khiển bằng chương trình (Polling): Ưu điểm là cấu trúc phần mềm và phần cứng đơn giản. Nhược điểm là lãng phí tài nguyên CPU, thời gian đáp ứng chậm và không thể đoán trước, phụ thuộc vào vị trí của thiết bị trong vòng lặp hỏi vòng.
- Điều khiển bằng ngắt: Ưu điểm là đáp ứng nhanh với các sự kiện, hiệu quả sử dụng CPU cao. Nhược điểm là phần cứng và phần mềm phức tạp hơn, cần quản lý ngăn xếp và bối cảnh (context switching).
- Điều khiển bằng DMA: Ưu điểm là tốc độ truyền dữ liệu rất cao, CPU được giải phóng hoàn toàn trong quá trình truyền. Nhược điểm là yêu cầu phần cứng phức tạp nhất (bộ điều khiển DMA) và chi phí cao hơn.
6.2. Xu hướng tích hợp bộ điều khiển I O trong vi điều khiển
Các vi điều khiển hiện đại (MCU) và hệ thống trên chip (SoC) đang đi theo xu hướng tích hợp sâu. Thay vì sử dụng các IC giao tiếp ngoại vi rời rạc như 8155 hay 8255A, các MCU ngày nay tích hợp sẵn các bộ điều khiển ngoại vi có thể lập trình (peripherals). Một MCU có thể có hàng chục kênh DMA, một bộ điều khiển ngắt vector lồng nhau (Nested Vectored Interrupt Controller - NVIC), và các bộ điều khiển cho nhiều chuẩn giao tiếp. Sự tích hợp này không chỉ giúp giảm diện tích bo mạch và chi phí mà còn tối ưu hóa hiệu suất vì các thành phần giao tiếp với nhau trên cùng một đế silicon với tốc độ rất cao, mở ra khả năng cho các ứng dụng vi xử lý ngày càng phức tạp và mạnh mẽ hơn.