VII. CÁC KIỂU DỮ LIỆU TRONG VHDL
e. Kiểu dữ liệu mảng ARRAY
Array là tập hợp các đối tượng cùng một kiểu dữ liệu, có thể là mảng 1 chiều (1D), mảng 2 chiều (2D) hoặc mảng 1 chiều × 1 chiều (1D × 1D). Các mảng có thể có nhiều chiều hơn nữa nhưng chúng không được tổng hợp. Hình 2-11 minh hoạ cấu trúc của mảng dữ liệu. Hình (a) là giá trị đơn (scalar), hình (b) là mảng 1 chiều (1D), hình (c) là mảng các vector (1D ×1D) và hình (d) là mảng scalar (2D).
Hình 2-11. Các kiểu mảng dữ liệu.
Các loại dữ liệu có thể tổng hợp đã định nghĩa cho các kiểu mảng ở trên là Dữ liệu Scalar: BIT, STD_LOGIC, STD_ULOGIC và BOOLAEN.
Các Vector: BIT_VECTOR, STD_LOGIC_VECTOR, STD_ULOGIC_VECTOR, INTEGER, SIGNED và UNSIGNED.
Cú pháp chỉ định cho một kiểu dữ liệu mảng mới như sau:
TYPE type_name IS ARRAY (specification) OF data_type; Để sử dụng kiểu dữ liệu mảng mới này thì khai báo tín hiệu như sau:
SIGNAL signal_name: type_name [:=initial_value];
Trong cú pháp ở trên tín hiệu SIGNAL được khai báo. Tuy nhiên cũng có thể là CONSTANT hoặc VARIABLE. Chú ý tuỳ chọn giá trị khởi gán chỉ được dùng cho mô phỏng.
Ví dụ 2-39: về mảng 1D×1D:
Chúng ta muốn xây dựng một mảng chứa 4 vector, mỗi vector chứa 8 bit – đây là mảng 1D×1D. Chúng ta gọi mỗi vector là một hàng và một mảng đầy đủ là một ma trận. Cách khai báo như sau:
TYPE row IS ARRAY (7 DONWTO 0) OF STD_LOGIC; -- 1D array
TYPE matrix IS ARRAY (0 TO 3) OF row; -- 1D×1D array
SIGNAL x: matrix; -- 1D×1D signal
Ví dụ về khai báo mảng kiểu khác:
TYPE matrix IS ARRAY (0 TO 3) OF STD_LOGIC_VECTOR(7 DOWNTO 0); Ví dụ về khởi gán cho mảng:
… := ‚0001‛; -- gán cho mảng 1D
… := ((‘0’, ‘1’, ‘1’, ‘1’), (‘1’, ‘1’, ‘1’, ‘0’)); -- gán cho mảng 1D×1D hoặc 2D
Ví dụ 2-40: về các phép gán hợp lệ và không hợp lệ của mảng: Cho các mảng được khai báo như sau:
TYPE row IS ARRAY (7 DONWTO 0) OF STD_LOGIC; -- 1D array
TYPE array1 IS ARRAY (0 TO 3) OF row; -- 1D×1D array
TYPE array2 IS ARRAY (0 TO 3) OF STD_LOGIC_VECTOR (7 DOWNTO 0); -- 1D×1D array
TYPE array3 IS ARRAY (0 TO 3, 7 DOWNTO 0) OF STD_LOGIC;-- 2D array
SIGNAL x: row;
SIGNAL y: array1;
SIGNAL v: array2;
SIGNAL w: array3;
Các phép gán bit như sau:
x(0) <= y(1) (2); -- gán bit thứ 2 của vector y1 cho x(0). x(1) <= v(2) (1); -- gán bit thứ 1 của vector v2 cho x(1). x(2) <= w(2,1); -- gán bit thứ 1 của vector w2 cho x(2). y(1) (1) <= x(6);
y(2) (0) <= v(0) (0);
Các phép gán vector như sau:
x <= y(0) ; -- hợp lệ vì cùng kiểu dữ liệu row.
x <= v(1) ; -- không hợp lệ vì không tương thích kiểu dữ liệu row× STD_LOGIC_VECTOR.
x <= w(2) ; -- không hợp lệ vì không tương thích kiểu dữ liệu row× STD_LOGIC_VECTOR.
x <= w(2, 2 downto 0); -- không hợp lệ vì không tương thích kiểu dữ liệu. v(0) <= w(2, 2 downto 0); -- không hợp lệ vì không tương thích kiểu dữ liệu. v(0) <= w(2) ; -- không hợp lệ vì không tương thích kiểu dữ liệu. y(1) <= v(3) ; -- không hợp lệ vì không tương thích kiểu dữ liệu.
y(1) (7 downto 3) <= x(4 downto 0); -- hợp lệ vì cùng kiểu và kích thước dữ liệu. v(1) (7 downto 3) <= v(2) ( 4 downto 0); -- hợp lệ vì cùng kiểu và kích thước dữ liệu. w(1, 5 downto 1) <= v(2) ( 4 downto 0); -- không hợp lệ vì không cùng kiểu.