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

Một phần của tài liệu luận văn tìm hiểu ngôn ngữ vhdl viết chương trình thiết kê mạch cộng 8 bit song song cho 2 toán hạng (Trang 80 - 82)

- TOP làm ột generic.

Ch ương 8: CÁC CHƯƠNG TRÌNHCON VÀ QUÁ TRÌNH TRÀN

8.1.2 Cá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 toá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ó :

--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

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;

--since SIGNAL_VALUE is an input signal. 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 toá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 luận văn tìm hiểu ngôn ngữ vhdl viết chương trình thiết kê mạch cộng 8 bit song song cho 2 toán hạng (Trang 80 - 82)

Tải bản đầy đủ (PDF)

(103 trang)