Mảng (Arrays) 2 4-

Một phần của tài liệu Thiết kế mạch bằng VHDL (Trang 25 - 28)

Mảng là một tập hợp cỏc đối tượng cú cựng kiểu. Chỳng cú thể là một chiều (1D), 2 chiều (2D) họăc một chiều của một chiều (1D x 1D) và cũng cú thể cú những kớch thước cao hơn.

Hỡnh 3.1 minh họa việc xõy dựng một mảng dữ liệu. Một giỏ trị đơn ( vụ hướng được chỉ ra ở (a), một vector ( mảng 1D) ở (b) và một mảng cỏc vector ( mảng 1Dx1D) ở (c) và mảng của mảng 2D như trong (d)

Thật vậy, cỏc kiểu dữ liệu VHDL được định nghĩa trước đú (mục 3.1) chỉ bao gồm cỏc đại lượng vụ hướng-scalar ( bit đơn) và vector ( mảng một chiểu cỏc bit). Cỏc kiểu dữ liệu cú thể kết hợp trong mỗi loại này là như dưới đõy:

_ Scalars: BIT, STD_LOGIC, STD_ULOGIC, and BOOLEAN.

_ Vectors: BIT_VECTOR, STD_LOGIC_VECTOR,

STD_ULOGIC_VECTOR,

INTEGER, SIGNED, and UNSIGNED.

Như cú thể thấy, khụng hề cú định nghĩa trước mảng 2D hoặc 1Dx1D, mà khi cần thiết, cần phải được chỉ định bởi người dựng. Để làm như vậy, một kiểu mới (new TYPE) cần phải được định nghĩa đầu tiờn, sau đú là tớn hiệu mới (new SIGNAL), new VARIABLE họăc CONSTANT cú thể được khai bỏo sử dụng kiểu dữ liệu đú. Cỳ phỏp dưới đõy sẽ được dựng:

Để chỉ định một kiểu mảng mới:

TYPE type_name IS ARRAY (specification) OF data_type; Để tạo sử dụng kiểu mảng mới:

SIGNAL signal_name: type_name [:= initial_value];

Trong cỳ phỏp ở trờn, một SIGNAL được khai bỏo. Tuy nhiờn nú cũng cú thể là một CONSTANT hoặc một VARIABLE. Gia trị khởi tạo tựy chọn.

* Vớ dụ mảng 1Dx1D:

Chỳng ta muốn xõy dựng một mảng chứa 4 vector, mỗi vector cú kớch thước là 8 bit, đúlà một mảng 1Dx1D ( hỡnh 3.1). Ta gọi mỗi vector là hàng

(row) và mảng hoàn chỉnh là ma trận (matrix). Hơn nữa, chỳng ta muốn bit bờn trỏi cựng của mỗi vector trở thành MSB ( most significant bit) của nú, và dũng trờn cựng trở thành dũng 0. Khi đú sự thực hiện đầy đủ mảng sẽ là như sau:

TYPE row IS ARRAY (7 DOWNTO 0) OF STD_LOGIC; -- 1D array TYPE matrix IS ARRAY (0 TO 3) OF row; -- 1Dx1D array

SIGNAL x: matrix; -- 1Dx1D signal

* Vớ dụ mảng 1Dx1D khỏc:

Cỏch khỏc để xõy dựng mảng 1Dx1D ở trờn cũn được thực hiện như sau:

TYPE matrix IS ARRAY (0 TO 3) OF STD_LOGIC_VECTOR(7 DOWNTO 0);

* Vớ dụ mảng 2D:

Mảng sau đõy thực sự là hai chiều. Lưu ý rằng việc xõy dựng nú dựa trờn cỏc vector, nhưng khỏ hoàn chỉnh trờn cỏc đại lượng vụ hướng.

TYPE matrix2D IS ARRAY (0 TO 3, 7 DOWNTO 0) OF STD_LOGIC; -- 2D array

* Khởi đầu cho mảng:

Như đó thấy trong cỳ phỏp ở trờn, giỏ trị khởi đầu của một SIGNAL hoặc VARIABLE là tựy chọn. Tuy nhiờn, khi việc khởi đầu giỏ trị được đũi hỏi, nú cú thể được thực hiện như trong vớ dụ phớa dưới đõy:

... :="0001"; -- for 1D array ... :=('0','0','0','1') -- for 1D array

* Vớ dụ: Cỏc phộp gỏn mảng hợp lệ và khụng hợp lệ

Phộp gỏn trong vớ dụ này được dựa trờn định nghĩa kiểu và khai bỏo cỏc tớn hiệu như sau:

TYPE row IS ARRAY (7 DOWNTO 0)OF STD_LOGIC;

-- 1D array TYPE array1 IS ARRAY (0 TO 3) OF row;

-- 1Dx1D array

TYPE array2 IS ARRAY (0 TO 3) OF STD_LOGIC_VECTOR(7 DOWNTO 0);

-- 1Dx1D

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 vụ hướng hợp lệ: ---

-- Cỏc phộp gỏn đại lượng vụ hướng (bit đơn) dưới đõy là hợp lệ,

-- bởi vỡ kiểu ( vụ hướng) cơ bản là STD_LOGIC cho tất cả cỏc tớn hiệu -- (x,y,v,w).

x(0) <= y(1)(2); -- lưu ý 2 cặp dấu ngoặc đơn -- (y is 1Dx1D)

x(1) <= v(2)(3); -- 2 cặp dấu ngoặc đơn (v is 1Dx1D) x(2) <= w(2,1); -- 1 cặp dấu ngoặc đơn (w is 2D) y(1)(1) <= x(6); y(2)(0) <= v(0)(0); y(0)(0) <= w(3,3); w(1,1) <= x(7); w(3,0) <= v(0)(3); --- Gỏn vector: ---

x <= y(0); -- hợp lệ (cựng kiểu: ROW)

x <= v(1); -- khụng hợp lệ (khụng phự hợp kiểu: ROW và

-- STD_LOGIC_VECTOR)

x <= w(2); -- khụng hợp lệ (w phải là 2D)

x <= w(2,2 DOWNTO 0);--khụng hợp lệ (khụng phự hợp kiểu: ROW x -- STD_LOGIC)

v(0)<=w(2,2 DOWNTO 0);--illegal(mismatch: STD_LOGIC_VECTOR

-- x STD_LOGIC)

v(0) <= w(2); -- illegal (w must have 2D index)

y(1) <= v(3); -- illegal (type mismatch: ROW x

-- STD_LOGIC_VECTOR)

y(1)(7 DOWNTO 3) <= x(4 DOWNTO 0); -- legal (same type, -- same size)

v(1)(7 DOWNTO 3) <= v(2)(4 DOWNTO 0); -- legal (same type, -- same size)

Một phần của tài liệu Thiết kế mạch bằng VHDL (Trang 25 - 28)