Các thủ tục (procedure ):

Một phần của tài liệu Tìm hiểu ngôn ngữ DHVL.doc (Trang 90 - 93)

- TOP là một generic.

8.1.2Các thủ tục (procedure ):

VÀ QUÁ TRÌNH TRÀN

8.1.2Các thủ tục (procedure ):

Các procedure cho phép phân chia hành vi lớn vào nhiều modul . Khác với function , trong procedure cĩ thể trả về giá trị zero hoặc nhiều hơn 1 giá trị , sử dụng các tham số của mode out và inout . Cú pháp của chương trình con cho thân 1 procedure là :

procedure procedure_name ( parameter_list )

Parameter_list xác định danh sách của các tham số hình thức cho procedure . Các tham số cĩ thể là các constant , 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 của thuật tốn logic : 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 := A*B; when DIV => Z := A/B; when LT => ZCOMP := A<B; when LE => ZCOMP := A<=B; when EQ => ZCOMP := A=B; end case ;

end ARITH_UNIT;

Ta xem 1 ví dụ khác của thân 1 procedure , procedure này xoay quanh việc xác định tín hiệu vector ARRAY_NAME , bắt đầu từ bit START_BIT tới bit STOP_BIT , bằng giá trị ROTATE_BY . Lớp đối tượng cho tham số ARRAY_NAME là xác định 1 cách rõ ràng . Biến FILL_VALUE ban đầu tự động được gán là ‘0’ cho 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; --every time the procedure is called, -- initial value is BIT’LEFT, which is ‘0’. 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; -- keyword procedure after end is -- octional.

Các procedure được yêu cầu bởi procedure gọi . Procedure gọi cĩ thể cĩ mỗi phát biểu tuần tự hoặc đồng thời , điều cơ bản đĩ là phát biểu số thực của procedure gọi là hiện tại. Nếu gọi bên trong phát biểu process hoặc chương trình con khác thì nĩ là phát biểu procedure gọi tuần tự , nếu khơng thì nĩ là phát biểu procedure gọi đồng thời . Cú pháp của phát biểu procedure gọi là :

[ label : ] procedure_name ( list_of_actual );

Các số thực được xác định là biểu thức , các biến , các tín hiệu hoặc các file , các số thực đĩ được đưa vào trong procedure và các tên của các đối tượng đĩ được gởi đến procedure xử lý . các số thực cĩ thể xác định sự liên kết vị trí hoặc liên kết tên . Ví dụ :

ARITH_UNIT (D1,D2,ADD,SUM,COMP ); -- positional association. ARITH_UNIT ( Z => SUM, B=> D2, A=>D1,

OP=>ADD,ZCOMP => COMP); --named association.

Một phát biểu chương trình con gọi tuần tự là thực thi 1 cách tuần tự liên quan đến các phát biểu tuần tự chung quanh nĩ . Một phát biểu chương trình con gọi đồng thời là thực thi bất cứ lúc nào khi cĩ 1 sự kiện xảy ra trên các tham số là tín hiệu mode in hoặc inout . Chương trình con gọi đồng thời tương đương 1 quá trình xử lý với 1 chương trình con gọi tuần tự và 1 phát biểu wait , chờ cho đến khi cĩ 1 sự kiện trên các tham số tín hiệu của mode in hoặc inout .

Sau đây là 1 ví dụ của chương trình con gọi đồng thời và phát biểu process tương đương với nĩ :

archtecture DUMMY_ARCH of DUMMY is --following is a procedure body :

procedure INT_2_VEC ( signal D :out BIT_VECTOR ; START_BIT,STOP_BIT : in NATUAL ; signal VALUE : in INTEGER ) is (adsbygoogle = window.adsbygoogle || []).push({});

begin

procedure behavior here. end INT_2_VEC;

begin

--this is an examble of a concurrent procedure call:

INT_2_VEC (D_ARRAY,START,STOP,SIGNAL_VALUE); end DUMMY_ARCH;

--the equivalent process statement for the concurrent procedure call is: process

begin

INT_2_VEC (D_ARRAY,START,STOP,SIGNAL_VALUE); --this is now a sequential procedure call .

wait on SIGNAL_VALUE;

end process;

Một procedure cĩ thể sử dụng như là 1 phát biểu đồng thời hoặc phát biểu tuần tự . Chương trình con gọi đồng thời thường xuyên dùng các process .

postponend procedure INT_2_VEC ( signal D:out BIT_VECTOR ; START_BIT,STOP_BIT : in NATUAL;

Signal VALUE :in INTEGER) is begin

--procedure behavior here . end INT_2_VEC;

Ngữ nghĩa của 1 chương trình con gọi đồng thời dùng postponed là tương đương với ngữ nghĩa của phát biểu process tương ứng với nĩ , được gọi là 1 portponed process .

Thân 1 process cĩ thể cĩ phát biểu wait , trong khi 1 function thì khơng cĩ . Các function sử dụng việc tính tốn các giá trị 1 cách tức thì . Do đĩ function khơng cần phát biểu wait trong đĩ . Một process gọi 1 procedure với phát biểu phát biểu khơng cĩ danh sách cảm nhận .

Vì procedure cĩ thể cĩ phát biểu wait , cho nên các biến và các hằng được mơ tả trong procedure vẫn giữ giá trị của nĩ qua tho82I gian wait và tồn tại liên tục đến khi procedure kết thúc .

Một phần của tài liệu Tìm hiểu ngôn ngữ DHVL.doc (Trang 90 - 93)