Mục tiêu: Thiết kế RTL, mô hình hóa bằng VHDL, mô phỏng bằng ModelSim và thực thi một đơn vị điều khiển truy xuất trực tiếp bộ nhớ (DMAC: Direct Memory Access Controller). Đơn vị thực hiện chức năng copy một khối dữ liệu a có gồm L phần tử từ địa chỉ A và ghi tới tới địa chỉ B trong không gian bộ nhớ của hệ thống. Các tham số L, A, B phải được nạp vào các thanh ghi điều khiển (RIR, SAR và DAR) của DMAC trước khi quá trình DMA diễn ra.
Giới thiệu về truy xuất bộ nhớ trực tiếp DMA (Direct Memory Access)
DMA controller là một đơn vị chức năng cho phép các thiết bị I/O có thể truy cập vào memory một cách độc lập với CPU. DMAC thường có hai giao diện ghép nối:
- Giao diện ghép nối với CPU: Trong giao diện này CPU đóng vai trò thiết bị Master còn DMA controller là thiết bị Slave. Thông qua giao diện này CPU có thể viết các thông tin điều khiển vào DMA controller và giám sát trạng thái hoạt động của DMA controller.
- Giao diện giao tiếp với bộ nhớ và thiết bị ngoại vi: trong giao diện này DMA controller là thiết bị Master. DMA controller khởi phát việc đọc dữ liệu từ vị trí nguồn và ghi dữ liệu tới vị trí đích.
Để hỗ trợ cho việc trao đổi dữ liệu với thiết bị ngoại vi bằng cách truy cập trực tiếp vào bộ nhớ, CPU thường có một chân lối vào gọi là chân yêu cầu treo CPU (HOLD Request: Hreq) để thiết bị ngoại vi khi có yêu cầu dùng bus cho biệc trao đổi dữ liệu với bộ nhớ thì thông qua chân này mà báo cho CPU biết. Khi CPU nhận được yêu cầu treo thì nó tự tách ra khỏi hệ thống bus bằng cách đưa các chân kết nối của nó với bus vào trạng thái trở kháng cao và đưa xung HDLA ra ngoài để thông vào rằng CPU cho phép DMAC được sử dụng bus đó.
Khi CPU tách ra khỏi hệ thống bằng việc tự treo để trao quyền sử dụng bus cho DMAC, lúc này DMAC chịu trách nhiệm điểu khiển toàn bộ hoạt động trao đổi dữ liệu của hệ thống. Để làm được điều đó DMAC cần có các tín hiệu điều khiển cần thiết giống như các tín hiểu của CPU và nó phải lập trình được.
Quy trình hoạt động của DMAC:
- Các thiết bị ngoại vi hoặc CPU sẽ yêu cầu truyền dữ liệu thông qua DMA bằng cách kéo chân dreq (DMA request) lên mức cao.
- Các DMA sẽ gửi tín hiệu hreq lên trên CPU, báo hiệu cho CPU rằng nó cần sử dụng đường bus dữ liệu và bus địa chỉ của hệ thống.
- CPU sẽ kết thúc chu trình sử dụng bus hiện tại và đáp ứng yêu cầu của DMA bằng cách đặt tín hiệu hlda lên mức cao để thông báo với DMAC rằng nó có thể sử dụng các bus để thực hiện nhiệm vụ của mình. Tín hiệu hlda phải giữ ở mức cao khi DMA đang thực hiện nhiệm vụ.
- DMAC sẽ kích hoạt dack cho thiết bị ngoại vi biết rằng nó bắt đầu truyền dữ liệu.
- Khi DMA bắt đầu truyền dữ liệu từ bộ nhớ sang ngoại vi hoặc từ bộ nhớ tới bộ nhớ bằng cách đặt địa chỉ của byte đầu tiên của khối cần truyền lên bus dữ liệu và kích hoạt memr_n, sau đó đọc byte từ bộ nhớ vào bus dữ liệu. Sau đó nó kích hoạt memw_n để ghi nó vào bộ nhớ, Sau đó thì DMA giảm số từ cần gửi và tăng con trỏ địa chỉ, lặp laị quá trình này cho đến khi số đếm tiến tới 0 và kết thúc nhiệm vụ.
- Sau khi DMA kết thúc công việc nó sẽ hủy kích hoạt hreq, báo hiệu với CPU rằng CPU có thể lấy lại quyền kiểm soát các đường bus.
Yêu cầu đối với thiết kế:
- Hỗ trợ giao thức ghép nối tới CPU theo chuẩn Intel bus interface
- Hỗ trợ giao thức ghép nối với mảng bộ nhớ của MUSRA
- Độ rộng bus dữ liệu được tham số hóa để có thể thay đổi linh hoạt thep tùy từng ứng dụng
- Độ rộng bus địa chỉ được tham số hóa để có thể thay đổi linh hoạt theotùy từng ứng dụng
Miêu tả chức năng của các chân vào/ra của Sorting Unit được mô tả trong Bảng 1.
Bảng 1: Mô tả các tín hiệu vào/ra của DMA Controller
Signals | Direction | Width (bits) | Reset | Description |
Generic | ||||
DATA_WIDTH | 8 | N/A | Data Width | |
ADDR_WIDTH | 8 | N/A | Address Width | |
AIN_WIDTH | 4 | N/A | Ain Width | |
Common Signals | ||||
clk | Input | 1 | N/A | TÍn hiệu xung nhịp Clock |
rst_n | Input | 1 | 0 | Tín hiệu Reset tích cực mức thấp |
Configuration Port | ||||
cs_n | Input | 1 | 1 | Tín hiệu chọn DMAC |
iorin_n | Input | 1 | 1 | Tín hiệu clock cho phép đọc dữ liệu từ thanh ghi. |
iowin_n | Input | 1 | 1 | Tín hiệu clock cho phép ghi dữ liệu từ dbin vào thanh ghi. |
dreq | Input | 1 | 0 | Tín hiệu yêu cầu DMA |
Hreq | Output | 1 | 0 | Tín hiệu yêu cầu CPU nhường quyền làm chủ bú |
hlda | Input | 1 | 0 | Tín hiệu từ CPU xác nhận CPU từ bỏ quyển sử dụng BUS |
dack | Output | 1 | 0 | Tín hiệu thông báo rằng DMA chuẩn bị truyền dữ liệu. |
ain | Input | AIN_WIDTH | N/A | Tín hiệu địa chỉ chọn thanh ghi điều khiển của DMA. |
dbin | Input | DATA_WIDTH | N/A | Dữ liệu cần nạp vào các thanh ghi điều khiển. |
Ports for transferring data | ||||
memr_n | Inout | 1 | 1 | Tín hiệu tích cực mức thấp cho phép đọc dữ liệu từ MEM vào DMAC. |
memw_n | Inout | 1 | 1 | Tín hiệu tích cực mức thấp cho phép viết từ DMAC đến MEM. |
addr_R | Input | ADDR_WIDTH | N/A | Địa chỉ cho đọc dữ liệu vào DMA. |
data_i | Input | DATA_WIDTH | N/A | Cổng nhận dữ liệu vào DMAC |
addr_W | Output | ADDR_WIDTH | N/A | Địa chỉ cho viết dữ liệu tới MEM. |
data_o | Output | DATA_WIDTH | N/A | Cổng xuất dữ liệu ra khỏi DMAC |
Thuật toán dịch chuyển khối dữ liệu của DMAC
Quá trình truy xuất bộ nhớ và di chuyển một khối dữ liệu từ vị trí A tới vị trí B được mô tả bằng thuật toán như trong Bảng 2.
Bảng 2. Mã giả (Pseudo code) mô tả thuật toán.
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
— this algorithm is for DMA process — External Memory: M[1K][8] — Internal BUFFER: BUF[16][8] can operate as a FIFO or RAM block — var addr_a, addr_b: 16 bit — var i, j: 16 bit Beginning: wait for start = ‘1’ Done = ‘0’ Addr_a = A; — starting address of source data block in memory Addr_a = B; — starting address of destination data block in memory for i=0 to L-1 do BUF[] = M[addr_a]; M[addr_b] = BUF[0] Addr_a++; Addr_b++; end for Done = ‘1’ wait for start = ‘0’ go to the beginning End |