2.2. Ngôn ngữ mô tả phần cứng VHDL
2.2.4. Gán tín hiệu và gán biến
Phát biểu đầu tiên bên trong phát biểu tiến trình là một phép gán biến, phát biểu này gán một giá trị cho biến temp. Trong mục trước ta đã đề cập đến cách thức các tín hiệu nhận các giá trị được định thời sau một khoảng thời gian hoặc sau một trì hoãn delta. Phép gán biến xảy ra tức thời khi phát biểu được thực thi. Ví dụ trong mô hình này, phát biểu đầu tiên phải gán một giá trị cho biến temp để phát biểu thứ hai sử dụng nó. Phép gán biến không có trì hoãn mà xảy ra tức thời.
Ta hãy khảo sát hai thí dụ để minh hoạ điểm này rõ ràng hơn. cả hai thí dụ là các mô hình của linh kiện MUX 4 -> 1. Một trong 4 tín hiệu ngõ vào được truyền đến ngõ ra phụ thuộc vào các giá trị của hai ngõ vào A và B. Mô hình thứ nhất của MUX này là mô hình không đúng, còn mô hình thứ hai là phiên bản đúng.
Ví dụ sai về mô tả một bộ ghép kênh LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
ENTITY mux IS
PORT (i0, i1, i2, i3, a, b : IN std_logic;
q : OUT std_logic);
END mux;
ARCHITECTURE wrong of mux IS SIGNAL muxval : INTEGER;
BEGIN
PROCESS ( i0, i1, i2, i3, a, b ) BEGIN
muxval <= 0;
IF (a = ‘1’) THEN muxval <= muxval + 1;
END IF;
IF (b = ‘1’) THEN muxval <= muxval + 2;
END IF;
CASE muxval IS WHEN 0 =>
q <= I0 AFTER 10 ns;
WHEN 1 =>
q <= I1 AFTER 10 ns;
WHEN 2 =>
q <= I2 AFTER 10 ns;
WHEN 3 =>
q <= I3 AFTER 10 ns;
WHEN OTHERS =>
NULL;
END CASE;
END PROCESS;
END wrong;
Mỗi khi một trong các tín hiệu ngõ vào trong danh sách tín hiệu tác động của tiến trình thay đổi giá trị, các phát biểu tuần tự trong tiến trình được thực thi. Phát biểu tiến trình trong thí dụ thứ nhất này chứa 4 phát biểu tuần tự. Phát biểu thứ nhất khởi động tín hiệu cục bộ muxval đến giá trị được biết (0). Các phát biểu kế tiếp cộng các giá trị cho biến cục bộ phụ thuộc vào giá trị của các tín hiệu ngõ vào a và b. Sau cùng phát biểu CASE chọn một tín hiệu ngõ vào để truyền đến ngõ ra dựa trên giá trị của tín hiệu muxval. Tuy nhiên mô hình này có một thiếu sót quan trọng.
Phát biểu đầu tiên:
Muxval <= 0;
làm cho giá trị 0 được định thời như là một sự kiện đối với tín hiệu muxval. Trên thực tế, giá trị 0 được định thời trong một sự kiện ở delta mô phỏng kế do bởi không có trì hoãn nào được chỉ ra. Khi phát biểu thứ hai:
IF (a=’i’) THEN
Muxval<= muxval + 1;
END IF
được thực thi, giá trị của tín hiệu muxval là bất cứ gì được truyền đến sau cùng. Giá trị mới được định thời từ phát biểu đầu tiên đã chưa truyền. Thật ra khi nhiều phép gán một tín hiệu xảy ra bên trong cùng một phát biểu tiến trình, giá trị được gán sau cùng sẽ là gia trị được truyền.
Tín hiệu muxval có một giá trị không thích hợp khi đưa vào tiến trình. Giá trị của muxval không được thay đổi cho đến khi tiến trình đã hoàn tất việc thực thi tất cả các phát biểu tuần tự chứa trong tiến trình. Thật ra néu tín hiệu b có giá trị ‘1’ thì bất kỳ giá trị không thích hợp nào mà tín hiệu có, khi đưa vào tiến trình sẽ có 2 giá trị được cộng thêm vào.
Phương pháp tốt hơn để thực hiện thí dụ này được trình bày trong thí dụ kế tiếp. Khác nhau duy nhất giữa hai mô hình, mô hình kế và mô hình trước, là khai báo muxval và các phép gán cho muxval. Trong mô hình trước, muxval là một tín hiệu và các phát biểu gán tín hiệu được sử dụng để gán các giá trị cho muxval.
Trong thí dụ kế tiếp, muxval là một biến và các phép gán biến được sử dụng để gán cho muxval.
Ví dụ đúng về mô tả một bộ ghép kênh LIBRARY IEEE;
USE IEEE.std_logic_1164ALL;
ENTITY mux IS
PORT (i0, i1, i2, i3, a, b : IN std_logic;
PORT (q : OUT std_logic);
END mux;
ARCHITECTURE better OF mux IS BEGIN
PROCESS ( i0, i1, i2, i3, a, b ) VARIABLE muxval : INTEGER;
BEGIN muxval := 0;
IF (a = ‘1’) THEN muxval := muxval + 1;
END IF;
IF (b = ‘1’) THEN muxval := muxval + 2;
END IF;
CASE muxval IS WHEN 0 =>
q <= I0 AFTER 10 ns;
WHEN 1 =>
q <= I1 AFTER 10 ns;
WHEN 2 =>
q <= I2 AFTER 10 ns;
WHEN 3 =>
q <= I3 AFTER 10 ns;
WHEN OTHERS =>
NULL;
END CASE;
END PROCESS;
END better;
Khác biệt đơn giản của đoạn mã này đã tạo ra khác biệt hoàn toàn về mặt hoạt động. Khi phát biểu đầu tiên:
Muxval := 0;
được thực thi, giá trị 0 được đặt vào biến muxval tức khắc. Giá trị này không được định thời do bởi muxval trong thí dụ này là một biến, không phải là một tín hiệu. Các biến biểu diễn việc lưu cục bộ khác với các tín hiệu biểu diễn liên kết nối mạch. Lưu cục bộ được cập nhật ngay tức thời và giá trị mới có thể được sử dụng sau đó trong mô hình cho các tính toán khác nữa.
Do muxval được khởi động bằng 0 ngay tức thời, hai phát biểu kế tiếp trong tiến trình sử dụng 0 làm giá trị ban đầu và cộng thêm các số thích hợp, phụ thuộc vào các giá trị của các tín hiệu a và b. Các phát biểu này cũng tức thời và do đó khi phát biểu CASE thực thi, biến muxval chứa giá trị đúng. Từ giá trị này tín hiệu ngõ vào đúng được truyền đến ngõ ra.