You are currently viewing MUSRA#6: VHDL Code cho bộ DMAC với chức năng chuyển vị ma trận
Hình 1. Ví dụ minh họa quá trình chuyển vị một ma trận.

MUSRA#6: VHDL Code cho bộ DMAC với chức năng chuyển vị ma trận

Design and Implementation of DMAC with a built-in Matrix Transposer

DOWNLOAD VHDL CODE HERE

1. Mục tiêu

      Đề xuất thiết kế mức RTL, mô hình hóa bằng VHDL, mô phỏng bằng ModelSIM và thực thi một bộ điều khiển truy xuất bộ nhớ trực tiếp DMAC có khả năng chuyển vị ma trận (Matrix transposer). Đơn vị thực hiện chức năng copy một ma trận có kích thước R×C (R hàng C cột) từ địa chỉ A, thực hiện chuyển vị ma trận và sau đó ghi tới tới địa chỉ B trong không gian bộ nhớ của hệ thống. Các tham số R×C, A, B phải được nạp vào các thanh ghi (RIR, CIR), SAR và DAR của DMAC trước khi quá trình DMA diễn ra.

 Minh họa quá trình chuyển vị một ma trận
Hình 1. Ví dụ minh họa quá trình chuyển vị một ma trận.

2. Yêu cầu

  • 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
Giao diện ghép nối I/O của đơn vị Matrix transposer.
Hình 2. Giao diện ghép nối I/O của đơn vị Matrix transposer.

Bảng 1: Mô tả các tín hiệu vào ra.

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

       Matrix transposer 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 giống như một bộ điều khiển truy xuất trực tiếp bộ nhớ DMAC. MATRIX TRANSPOSER 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 Matrix transposer 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 Matrix transposer và giám sát trạng thái hoạt động của Matrix transposer.
  • Giao diện giao tiếp với bộ nhớ và thiết bị ngoại vi: trong giao diện này Matrix transposer là thiết bị Master. Matrix transposer 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 báo rằng CPU cho phép MATRIX TRANSPOSER đượ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 MATRIX TRANSPOSER, lúc này MATRIX TRANSPOSER 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 đó MATRIX TRANSPOSER 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 MATRIX TRANSPOSER:

  • Các thiết bị ngoại vi hoặc CPU yêu cầu truyền dữ liệu thông qua Matrix transposer bằng cách kéo chân dreq (DMA request) lên mức cao;
  • MATRIX TRANSPOSER sẽ gửi tín hiệu hreq tới 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 MATRIX TRANSPOSER bằng cách đặt tín hiệu hlda lên mức cao để thông báo với MATRIX TRANSPOSER 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 MATRIX TRANSPOSER đang thực hiện nhiệm vụ.
  • MATRIX TRANSPOSER sẽ đặt dack = ‘1’ để báo cho thiết bị ngoại vi biết rằng nó bắt đầu truyền dữ liệu.
  • Khi DMAC 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 để đọc dữ liệu của khối dữ liệu nguồn từ bộ nhớ vào bus dữ liệu. Tiếp theo nó kích hoạt memw_n để ghi dữ liệu vào bộ nhớ ở vị trí khối dữ liệu đích. Sau đó MATRIX TRANSPOSER 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 MATRIX TRANSPOSER 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.

3. Thuật toán chuyển vị một ma trận

Gọi b là chuyển vị của mảng a, ta có: b[j][i] = a[i][j] với i=0:R-1, j=0:C-1

Vì tổ chức vật lý của bộ nhớ là tuần tự và có thể mô hình hóa bằng mảng một chiều M[addr], nên: Nếu mảng a được lưu trong bộ nhớ M bắt đầu tại địa chỉ A thì: a[i][j] = M[A+i*C+j].

Quá trình chuyển vị một ma trận được mô tả bằng thuật toán như trong bảng dưới:

Thuật toán 4:
1

2

3

4

5

6

7

8

9

10

11

12

13

14

–Variable addr_a, addr_b, I, j, T: 16-bit IntegerAddr_a := A;

for i= 0 to R-1 do

{

   Addr_b := B+i;

   for j=0 to C-1 do

{

T := M[Addr_a] ; // đọc mảng a[][] và lưu vào biến T

M[Addr_b] := T; // ghi giá trị của T vào mảng b

Addr_a++; //tăng địa chỉ mảng a[][] lên 1 đơn vị để trỏ tới phần tử cột tiếp theo

Addr_b +=R; // tăng địa chỉ mảng b để chuyển sang hàng tiếp theo

}

Addr_a ++; // tăng địa chỉ mảng a[][] lên 1 đơn vị để chuyển sang hàng tiếp theo

}

4. Thiết kế kiến trúc RTL

4.1 Giao diện ghép nối với CPU (Interface Ctrl)
Giản đồ thời gian các tín hiệu thực hiện giao thức bắt tay giữa DMAC và CPU.
Hình 4: Giản đồ thời gian các tín hiệu thực hiện giao thức bắt tay giữa DMAC và CPU.
Lưu đồ máy trạng thái thực hiện giao thức bắt tay.
Hình 5: Lưu đồ máy trạng thái thực hiện giao thức bắt tay.
4.2 Các thanh ghi điều khiển
Kiến trúc RTL của khối các thanh ghi điều khiển
Hình 3: Kiến trúc RTL của khối các thanh ghi điều khiển.

Tệp các thanh ghi điều khiển bao gồm 6 thanh ghi 8-bit lưu trữ các giá trị thiết lập chế độ làm việc của DMAC. Các thanh ghi trong tệp thanh ghi có thể được truy xuất đọc/viết từ bên ngoài (chẳng hạn CPU) thông quan giao diện ghép nối được chỉ ra bên cạnh trái của sơ đồ trong Hình 3. Trong khi đó các tín hiệu bên lề phải là giao diện ghép nối với đơn vị CCG của DMAC.

Bộ giải mã địa chỉ ADDR_DECODE trong tệp thanh ghi điều khiển nhận dữ liệu đầu vào từ bus Ain và lựa chọn một thanh ghi để viết dữ liệu như thể hiện trong Bảng 3.

Bảng 3: Các thanh ghi được lựa chọn theo giá trị của bus Ain.

AIN Thanh ghi được lựa chọn
“0000” Thanh ghi MDR
“0001” Thanh ghi SAR0
“0010” Thanh ghi SRA1
“0011” Thanh ghi DAR
“0100” Thanh ghi RIR
“0101” Thanh ghi CIR
“0110”

Trong đó các thanh ghi được định nghĩa như sau:

  • Thanh ghi chọn chế độ làm việc 8-bit MDR (MoDe Register). Thanh ghi này lựa chọn chế độ hoạt động của bộ điều khiển bộ nhớ. Bộ điều khiển đọc dữ liệu từ thanh ghi MDR và lựa chọn chế độ hoạt động thích hợp như chỉ ra trong Bảng 4.

Bảng 4: Chức năng hoạt động của bộ điều khiển bộ nhớ theo thanh ghi MDR[3:0].

MDR[3:0] Chức năng hoạt động
“0001” Truy cập bộ nhớ trực tiếp
“0010” Chuyển vị ma trận
“0100” Sắp xếp mảng dữ liệu
“1000” Ghép hai ma trận

Bảng 5: Chức năng hoạt động của bộ điều khiển bộ nhớ theo thanh ghi MDR[4].

MDR[4] Chức năng hoạt động
‘0’ Single transfer mode: đọc/viết từng từ dữ liệu
‘1’ Burst transfer mode: đọc/viết theo loạt

Bảng 6: Chức năng hoạt động của bộ điều khiển bộ nhớ theo thanh ghi MDR[5].

MDR[5] Chức năng hoạt động
‘0’ Data Width = 8
‘1’ Data Width = 16
  • Thanh ghi địa chỉ khối dữ liệu nguồn: SAR0 và SAR1 16-bit (Source Address Register). Các thanh ghi này lưu giá trị địa chỉ bắt đầu của các khối dữ liệu trong bộ nhớ mà DMAC cần phải truy xuất tới. Thông tin từ các thanh ghi SAR0 SAR1 được sử dụng để tính toán địa chỉ cho việc đọc dữ liệu từ bộ nhớ.
  • Thanh ghi địa chỉ đích: DAR 16-bit (Destination Address Register). Các thanh ghi này lưu giá trị địa chỉ bắt đầu của các khối dữ liệu trong bộ nhớ mà DMAC cần phải truy xuất tới. Thông tin từ thanh ghi DAR sử dụng để để tính toán địa chỉ cho việc ghi dữ liệu vào bộ nhớ.
  • Thanh ghi độ dài khối dữ liệu: BLR 16-bit (Block Length Register). Thanh ghi BLR chứa thông tin về số lượng đơn vị dữ liệu cần xử lý. Thanh ghi này được tách thành 2 thanh ghi 8-bit có thể định địa chỉ một cách tách biệt: thanh ghi RIR (Row Index Register) chỉ số hàng của khối dữ liệu; thanh ghi CIR (Column Index Register) lưu số cột của khối dữ liệu. RIR tương ứng với 8-bit cao của BLR, CIR tương ứng với 8-bit thấp của BLR. Nói cách khác BLR = {RIR:CIR}.
    • Nếu RIR !=0 thì RIR chỉ số hàng của khối dữ liệu cần copy
    • Nếu RIR = 0 thì số hàng của khối dữ liệu cần copy là không xác định, tương ứng với vòng lặp vô hạn
4.3 Kiến trúc lõi DMAC
Kiến trúc lõi DMAC với chức năng chuyển vị ma trận
Hình 4. Kiến trúc lõi DMAC
4.3.1 Datapath
Thiết kế Datapath của DMAC chuyển vị ma trận
Hình 5: Thiết kế Datapath.
4.3.2 Controller
FSM của đơn vị điều khiển trong lõi DMAC chuyển vị ma trận
Hình 6: FSM of controller.

5. Mã VHDL mô hình hóa thiết kế

DOWNLOAD MÃ NGUỒN VHDL Ở ĐÂY.

Mã nguồn VHDL mô tả thiết kế của DMAC được lưu trong thư mục RTL. Tổ chức top-down của các tệp mã nguồn được mô tả trong Hình 7.

Tổ chức dạng cây của các file mã nguồn VHDL mô tả DMAC chuyển vị ma trận
Hình 7: Tổ chức dạng cây của các file mã nguồn.

6. Mô phỏng bằng ModelSIM

Mô hình hệ thống để mô phỏng kiểm chứng bộ DMAC chuyển vị ma trận được mô tả trong Hình 8. Bên cạnh bản mô tả mức RTL của DMAC, mô hình mô phỏng còn đưa vào 2 mô hình mức behavior của CPU và bộ nhớ, để tạo nên một hệ vi xử lý hoàn chỉnh.

Cấu trúc hệ thống Testbench cho mô phỏng kiểm chứng DMAC chuyển vị ma trận
Hình 8: Cấu trúc hệ thống Testbench cho mô phỏng kiểm chứng DMAC chuyển vị ma trận.

Các hình bên dưới chỉ ra kết quả mô phỏng thiết kế Matrix transposer thực hiện việc copy ma trận A được lưu ở địa chỉ 0, sau đó chuyển vị và lưu thành ma trận B ở vị trí địa chỉ 32:

  • Input: A = {0, 1, 2; 3, 4, 5; 6, 7, 8}.
  • Output: B = {0, 3, 6; 1, 4, 7; 2, 5, 8}
 Kết quả mô phỏng bộ DMAC chuyển vị ma trận trên ModelSIM.
Hình 9. Kết quả mô phỏng bộ DMAC chuyển vị ma trận trên ModelSIM.
Nội dung của bộ nhớ được lấy mẫu tại thời điểm 2010 ns, trước khi quá trình chuyển vị ma trận lần thứ nhất diễn ra.
Hình 13: Nội dung của bộ nhớ được lấy mẫu tại thời điểm 2010 ns, trước khi quá trình chuyển vị ma trận lần thứ nhất diễn ra.
Nội dung của bộ nhớ được lấy mẫu tại thời điểm 3291ns, khi quá trình chuyển vị ma trận diễn ra.
Hình 14: Nội dung của bộ nhớ được lấy mẫu tại thời điểm 3291ns, khi quá trình chuyển vị ma trận diễn ra.

Phân tích kết quả mô phỏng: 

    Kết quả mô phỏng cho thấy, thời gian để thực hiện chuyển vị một ma trận kích thước R×C tính từ thời điểm tín hiệu Dack chuyển tiếp lên 1 (báo hiệu bắt đầu quá trình chuyển vị ma trận) đến khi Dack chuyển tiếp về 0 (báo hiệu kết thúc quá trình chuyển vị ma trận) được tính bằng công thức:

T = (5C + 5)*R + 3.

(Nếu thêm 2 chu kì kiểm tra trạng thái sẵn sàng của bộ nhớ thì T = (7C + 5)*R + 3.

Xem video quá trình mô phỏng ở đây.

7. Kết quả tổng hợp phần cứng bằng Synopsys DC

Mô hình RTL của Matrix transposer đã được tổng hợp thành phần cứng bằng công cụ Synopsys Design compiler với thư viện công nghệ NANGATE 45nm open cell library. Kích thước thực thi của matrix transposer là khoảng 1.070,92µm2. Tần số hoạt động tối đa của mạch là khoảng 675MHz.

Nguyễn Kiêm Hùng

Hung K. Nguyen studied “Electronic Engineering” in both his bachelor’s and master’s degrees at the Vietnam National University, Hanoi, Vietnam. He received the bachelor’s degree in 2003. After receiving his bachelor’s degree, He worked as an internship in the Research Center of Electronics and Telecommunications. In 2006, He received the master’s degree in electronic engineering from VNU University of Engineering and Technology (VNU-UET). Before pursuing his Ph.D’s degree, He worked as a researcher at the Laboratory for Smart Integrated Systems in VNU University of Engineering and Technology for two years. In 2008, He went to Southeast University, Nanjing, China to get his Ph.D degree. He received the Ph.D. degree in Microelectronics and Solid State Electronics from Southeast University in 2013. After got his Ph.D’s degree, He returned to VNU University of Engineering and Technology to continue his research in VLSI design. He works currently as an assistant professor and senior researcher at VNU Key Laboratory for Smart Integrated Systems. His research interests mainly include multimedia processing, reconfigurable computing, and SoC designs.

Trả lời