عکس پیش‌فرض نوشته

دستورات ترتیبی در دستورات پروسس و زیر برنامه ها وجود دارند. که ما در این مطلب به دستور ترتیبی LOOP در دستورات پروسس می پردازیم.

Learning VHDL

 

دستور LOOP در جایی استفاده می شود که به تکرار یک عملیات نیاز باشد. دستورات LOOP وقتی استفاده می شوند که قابلیت تکرار قدرتمندی برای پیاده سازی یک مدل نیاز باشد. در زیر BNF دستور LOOP نوشته شده است:

 

Loop_statement ::=
        [LOOP_label : ] [iteration_scheme] LOOP
    Sequence_of_statements
END LOOP[LOOP_label];

Iteration_scheme ::=
WHILE condition | FOR LOOP_parameter_specification

LOOP_parameter_specification ::=
    Identifier IN discrete_range

 

دستور LOOP یک برچسب اختیاری (LOOP_label) برای مشخص کردن حلقه، و یک طرح تکرار (iteration_scheme) اختیاری داردکه نوع دستور حلقه مورد استفاده را تعیین می کند. Iteration_scheme یک دستور حلقه شرطی WHILE و یک دستور FOR دارد. حلقه FOR به تعداد دفعاتی که با discrete مشخص می شود حلقه را تکرار می کند، مگر اینکه از حلقه خارج شود. دستور حلقه شرطی WHILE تا زمانی که عبارت شرط درست است حلقه می زند.

برای مشاهده نحوه کار این دستورات دو مثال را بررسی می کنیم:

 

WHILE (day = weekday) LOOP
    Day := get_next_day(day);
END LOOP;

 

این مثال از حلقه شرطی WHILE دستور LOOP استفاده می کند. هر بار قبل از اجرای حلقه شرط بررسی می شود.اگر شرط درست باشد دستورات LOOP اجرا می شوند. سپس کنترل به ابتدای حلقه برمی گردد. دوباره شرط بررسی شده و در صورت دست بودن، حلقه مجددا اجرا می شود، اگر درست نباشد، اجرا با دستور بعد از بخش END LOOP ادامه می یابد.

حلقه FOR نوع دیگری از دستور LOOP است:

 

FOR I IN 1 to 10 LOOP
    i_squared(i) := i * i;
END LOOP;

 

این حلقه با شروع اجرای حلقه 10 بار اجرا می شود. کار آن محاسبه مربعات اعداد 1 تا 10 و درج آنها در آرایه سیگنال i_squared است. متغییر شاخص i با مقدار سمت چپ بازه شروع شده و تا مقدار سمت راست بازه اضافه می شود.

در برخی از زبان ها می توان در بدنه حلقه به شاخص حلقه (در این مثال، i) مقداری تخصیص داد. در VHDL تخصیص به شاخص حلقه مجاز نیست. این محدودیت مانع از آن می شود که شاخص حلقه مقدار برگشتی یک تابع یا پارامتر خروجی یا ورودی/خروجی یک رول باشد.

نکته قابل توجه دیگر در مورد دستورات FOR LOOP این است که مقدار شاخص i به طور محلی توسط دستور FOR اعلان می شود. نیازی نیست متغیر i در پروسس، تابع، یا رول وجود داشته باشد این دو متغیر جدا تلقی شده و بر اساس موضوع دستیابی می شوند. برای نشان دادن این نکته مثال زیر را بررسی می کنیم:

 

PROCESS(i)
BEGIN

x <= i + 1;

FOR i IN 1 to a/2 LOOP
    q(i) := a;
END LOOP;

END PROCESS;

 

با تغییر مقدار سیگنال i در لیست حساسیت، پروسس فراخوانی می شود. دستور نخست، مقدار i+1 را روی سیگنال x زمانبندی می کند. سپس، حلقه FOR اجرا می شود. مقدار شاخص i همان شیء سیگنال i مورد استفاده برای محاسبه مقدار جدید سیگنال x نیست. اینها اشیاء جداگانه ای می باشند که بر اساس موضوع دستیابی می شوند. هنگامی که درون حلقه FOR به i مراجعه می شود، شاخص محلی بازیابی می شود. اما، هنگام مراجعه به i در خارج از حلقه، مقدار سیگنال i لیست حساسیت پروسس بازیابی می شود.

همان طور که در مثال ها نشان داده شده، نیازی نیست مقادیر بازه حلقه FOR عدد صحیح باشند. بازه می تواند هر بازه ی گسسته ای باشد. بازه با مشخص کردن نوع یا یک دستور بازه بیان می شود.

این آموزش بیش از ۳ سال قبل ارسال شده و اکنون در لیست به‌روزرسانی‌های سایت قرار دارد. اگر پیشنهاد یا انتقادی برای بهبود آموزش دارید، خوشحال می‌شیم به ما اطلاع بدهید.