171
VÝ dô 1:
architecture .................
begin
procedure_any a,b ;
end ..........;
VÝ dô 2:
architecture ................
Begin process
begin
procedure_ any a,b;
wait on a,b;
end process ;
end .............;
3.7.6. Các chơng trình con .
Các chơng trình con bao gồm các thủ tục và các hàm mà nó có thể đợc gọi để thực hiện công việc nào đó lặp lại từ các vị trí gọi
khác nhau trong VHDL. Trong VHDL cung cấp hai kiểu chơng trình con khác nhau là:
- Các thủ tục Procedure. - Các hàm Function .
a. Hàm và các đặc trng của hàm.
- Chúng đợc gọi và thực hiện nh một biểu thức. - Luôn trả về một đối số.
172
- Tất cả các tham số của hàm đều phải là chế độ mode IN. - Tất cả các tham số của hàm phải thuộc lớp các tín hiệu hoặc
các hằng. - Bắt buộc phải khai báo kiểu của gía trị trả về .
- Không đợc chứa các phát biểu Wait. Cú pháp của hàm đợc khai báo nh sau:
function identifier interface_list return type_mark is
{subprogram_declarative_item}
Begin
{sequential_statement}
end [identifier];
Các định danh identifier chỉ ra tên của một hàm, còn interface_list chỉ ra định dạng tham số của một hàm. Mỗi một tham
số đợc định nghiã theo cú pháp sau: [class] name_list [mode] type_name [:=expression];
ở đây class của tham số đối tợng phải đợc chỉ ra là tín hiệu
hoặc hằng, còn mode của đối tợng cần phải là mode in. Nếu không
có tham số mode đợc chỉ ra thì đợc hiểu nh là mode IN, còn nếu không có tham số class đợc chỉ ra thì tham số đợc hiểu nh lµ mét
h»ng. Xem vÝ dơ sau:
process function
c_to_f c : real return real is variable
f : real;
begin
f := c9.05.0 + 32.0;
return f;
173
end c_to_f;
variable
temp : real;
begin
temp : = c_to_f 5.0 + 20.0; -- temp = 61
end process
; Tham số chuyển vào hàm đợc hiểu mặc định là một hằng số, vì
không có khai báo của class.
b. Thủ tục và các đặc trng của chúng.
- Chúng đợc gọi nh một lời phát biểu. - Có thể trả về không hoặc một hoặc nhiều đối số.
- Các tham sè chun giao cho thđ tơc cã thĨ lµ mode in, out, và inout.
- Các tham số chuyển giao cho thđ tơc cã thĨ lµ tÝn hiƯu, h»ng, biÕn.
- Cã thĨ cã chøa ph¸t biĨu Wait. Có ph¸p khai b¸o thđ tơc nh− sau:
procedure identifier interface_list is
{subprogram_declarative_item}
begin
{sequential_statement}
end [identifier];
Identifier đợc sử dụng để chỉ ra tên của procedure và interface_list chỉ ra các tham số hình thức của procedure. Mỗi tham
số đợc sử dụng theo định nghĩa sau:
174
[class] name_list [mode] type_name [:=expression];
Class của đối tợng đợc xem nh hằng, biến , hoặc là tín hiệu và mode của đối tợng có thể là in, out , inout. Nếu không có mode
đợc chỉ ra thì tham số đợc hiểu nh mode in, nếu không có class đợc chỉ ra thì các tham số mode in đợc hiểu nh là các hằng, còn
tham số mode out và inout đợc hiểu nh là các biến. Các tham số có thể là các hằng, các biến, hoặc các tín hiệu và
mode của chúng có thể là in, out, hoặc inout. Nếu lớp của các tham số không xác định rõ ràng thì mặc nhiên nó là constant, nếu nó là
mode in, còn nó là biến nếu mode của tham số đó là out hoặc inout. Một ví dụ thân procedure mô tả hành vi hoạt động của các đơn
vị logic sè häc nh− sau :
type OP_CODE is ADD, SUB, MUL, DIV, LT, LE, EQ;
… procedure
ARITH_UNIT A, B : in INTEGER ; OP : in OP_CODE ;
Z : out INTEGER;
ZCOMP : out BOOLEAN is begin
case OP is when ADD = Z := A+B;
when SUB = Z := A-B; when MUL = Z := AB;
when DIV = Z := AB; when LT = ZCOMP := AB;
when LE = ZCOMP := A=B; when EQ = ZCOMP := A=B;
end case ; end ARITH_UNIT;
Ta xem mét vÝ dô khác của thân một procedure, procedure này
175
quay véc tơ đã đợc xác định với tên là ARRAY_NAME, bắt đầu từ bit START_BIT tới bit STOP_BIT, bởi một giá trị ROTATE_BY.
Lớp đối tợng của tham số ARRAY_NAME đợc xác định một cách tờng minh. Biến FILL_VALUE tự động đợc khởi tạo về 0
mỗi khi procedure đợc gọi.
Procedure
ROTATE_LEFT signal ARRAY_NAME : inout Bit_vector ;
START_BIT, STOP_BIT : in NATUAL;
ROTATE_BY : in POSITIVE is Variable
FILL_VALUE : BIT;
begin assert STOP_BIT START_BIT
report “STOP_BIT is not greater than START_BIT” severity NOTE;
for MACVAR3 in 1 to ROTATE_BY loop
FILL_VALUE := ARRAY_NAME STOP_BIT;
for MACVAR1 in STOP_BIT downto START_BIT + 1 loop
ARRAY_NAME MACVAR1
= ARRAY_NAME
MACVAR1 –1;
end loop;
ARRAY_NAME START_BIT
= FILL_VALUE ;
end loop; end procedure
ROTATE_LEFT;
176
C¸c procedure ®−ỵc gäi bëi lêi gäi procedure. Mét lêi gäi Procedure có thể là một phát biểu tuần tự hoặc một phát biểu đồng
thời, phát biểu này phụ thuộc vào nơi xt hiƯn lêi gäi thđ tơc hiƯn t¹i. NÕu lêi gọi này nằm bên trong một phát biểu process hoặc một
chơng trình con khác thì nó đợc gọi là phát biểu gọi procedure tuần tự, ngợc lại nó đợc gọi là phát biểu gọi procedure gọi đồng
thời. Cú pháp của ph¸t biĨu gäi procedure nh− sau :
[ label : ] procedure_name list_of_actual ;
Thùc tÕ c¸c biĨu thøc, c¸c biÕn, các tín hiệu hoặc các file, đợc chuyển vào trong thủ tục và các tên cuả đối tợng và các tên này sẽ
đợc dùng để lấy các giá trị tính toán từ trong thủ tục. Chúng đợc chỉ ra một cách rõ ràng bởi việc sử dụng sự kết hợp theo tên và kết
hợp theo vị trí . Ví dụ:
ARITH_UNIT D1, D2, ADD, SUM, COMP ; -- Sù kÕt hỵp theo vÞ trÝ.
ARITH_UNIT Z = SUM, B= D2, A=D1, OP=ADD, ZCOMP = COMP; -- Sự kết hợp
theo tên. Một phát biểu gọi thủ tục tuần tự đợc thực thi tuần tự cùng với
các phát biểu tuần tự chung quanh nó. Một phát biểu gọi thủ tục đồng thời đợc thực thi bÊt cø lóc nµo khi cã mét sù kiƯn xảy ra trên
một trong các tham số, mà các tham số này là một tín hiệu ở chế độ in hoặc inout. Một lời gọi thủ tục đồng thời có nghĩa tơng đơng
177
với một process có chứa một lời gọi thủ tục tuần tự và một phát biểu wait. Phát biểu wait này sẽ làm cho quá trình chờ cho đến khi có
một sự kiện xuất hiện trên các tham số tín hiệu của mode in hoặc inout.
Sau đây là mét vÝ dơ cđa lêi gäi thđ tơc ®ång thêi và phát biểu process tơng đơng với nó:
architecture DUMMY_ARCH of DUMMY is
-- Tiếp đến là thân của thủ tục
procedure INT_2_VEC signal D : out BIT_VECTOR ;
START_BIT, STOP_BIT : in NATUAL ;
signal VALUE : in INTEGER is
begin
-- Mô tả hoạt động hành vi của thủ tục
end INT_2_VEC;
begin
-- Đây là vÝ dơ cđa mét lêi gäi thđ tơc ®ång thêi. INT_2_VEC D_ARRAY, START, STOP,
SIGNAL_VALUE;
end DUMMY_ARCH;
Phát biểu process tơng đơng với lêi gäi mét thđ tơc ®ång thêi nh− sau:
process begin
178
INT_2_VEC D_ARRAY,START,STOP,SIGNAL_VALUE;
-- Phần thể hiện của các lời gọi thủ tục tuần tự
wait on SIGNAL_VALUE;
-- Chờ sự kiện trên SIGNAL_VALUE và xem chóng nh− mét tÝn hiƯu vµo.
end process ;
Mét procedure có thể sử dụng hoặc là một phát biểu đồng thời hoặc là phát biểu tuần tự. Các lời gọi đồng thời thờng xuyên đợc
dùng để mô tả chính là c¸c process. VÝ dơ cđa thđ tơc dïng cã khai báo postpone Trì hoãn .
postponend procedure INT_2_VEC signal D:out
BIT_VECTOR ; START_BIT,STOP_BIT : in
NATUAL; signal VALUE :in INTEGER
is
begin
-- Phần khai báo hoạt động cđa thđ tơc
end INT_2_VEC;
Ng÷ nghÜa cđa mét lêi gäi thđ tục đồng thời dùng postponed là
tơng đơng với nhữ nghĩa của phát biểu process tơng ứng với nó và đợc gọi là phát biểu process bị trì hoãn.
Một thân process có thể có phát biểu wait, trong khi một
179
function thì không đợc phép có. Các function đợc sử dụng để tính toán các giá trị một cách tức thì. Vì vậy một function không cần có
phát biểu wait trong đó. Một function không thể gọi một procedure có phát biểu wait trong thủ tục đó. Một process mà có chứa lêi gäi
mét thđ tơc mµ trong thđ tơc nµy cã chứa phát biểu wait, thì process này không đợc khai báo sensitivity list. Hơn nữa từ thực tế chúng ta
thấy một process không thể nhận biết các tín hiệu thuộc sensitivity list vì nếu có process này sẽ rơi vào trang th¸i chê ngay lËp tøc. Víi
mét thđ tơc cã chứa phát biểu wait thì bất cứ biến hay hằng nào đợc khai báo trong thủ tục đó sẽ giữ nguyên giá trị của chúng trong
suốt thời gian thực hiện phát biểu wait và tồn tại chỉ khi thủ tục đợc kết thúc.
3.8. Các đóng gói Packages .