فرمت و قالب دستورات VHDL

نحوه فراخوانی و بکارگیری یک کتابخانه:

LIBRARY library_name;

 

نحوه فراخوانی و بکارگیری یک  package از داخل کتابخانه اش:

USE library_name.package_name.ALL;

 

فرم کلی Entity:

ENTITY entity_name IS

          GENERIC( parameter_name : string := default_value;

          parameter_name : integer := default_value);

PORT(

input_name , input_name     : IN STD_LOGIC;

input_vector_name               : IN STD_LOGIC_VECTOR( high downto low);

bidir_name , bidir_name       : INOUT STD_LOGIC;

output_name , output_name : OUT STD_LOGIC);

END entity_name;

 

دستور entity به منظور معرفی شکل ظاهری قطعه یا طرح از لحاظ نوع پایه های ورودی و خروجی (نه اتصالات داخلی) استفاده می شود.

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

استفاده از نام entity و یا خود کلمه entity در جلوی آن اختیاری است.

طریقه تخصیص یا انتصاب سیگنال ها بصورت همزمان :

سیگنال در VHDL حکم سیم اتصال یا پایه قطعه را دارد

Signal <= expression;

 

فرم کلی Architecture :

ARCHITECTURE arch_name OF entity_name IS

SIGNAL signal_name : STD_LOGIC;

SIGNAL signal_name : STD_LOGIC;

BEGIN

-- Process Statement

-- Concurrent Procedure Call

-- Concurrent Signal Assignment

-- Conditional Signal Assignment

-- Selected Signal Assignment

-- Component Instantiation Statement

-- Generate Statement

END arch_name;

تمامی عبارات داخل begin و end در صورت وجود بطور همزمان اجرا می شوند (البته در واقعیت با یک تاخیر بسیار کوچک ∂، زیرا گیتهای منطقی نیز در عمل دارای کمی تاخیر (delay) می باشند). نوشتن نام architecture در جلوی  end آن، اختیاری است.

فرم کلی دستور  : case

CASE expression IS

WHEN constant_value =>

statement;

statement;

WHEN constant_value =>

statement;

    .

    .

    .

statement;

WHEN OTHERS =>

statement;

statement;

END CASE;

دستور case چون یک دستور sequential است، تمامی عبارات داخل begin و end مربوط به آن بصورت ترتیبی (خط به خط) اجرا می شوند؛ لذا حتما می بایست داخل بدنه process نوشته شود. اگر when others  نوشته نشود در اینصورت می بایست تمامی حالتهای ممکن عبارت ذکر شود.

تخصیص (انتساب) سسیگنالها بصورت شرطی :

signal <= expression WHEN boolean_expression ELSE

   expression WHEN boolean_expression ELSE

expression;           

 

هرگز این دستور نباید داخل دستور process نوشته شود.

فرم کلی تعریف ومقداردهی اولیه : constant 

CONSTANT constant_name : type_name := constant_value;

فرم کلی تعریف سیگنال داخلی:

SIGNAL signal_name : type_name;

فرم کلی تعریف متغیر : (variable) 

VARIABLE variable_name : type_name;

فرم کلی تعریف  : process 

معمولا باتوجه به ساختار مدار، می توان از یکی از دو نمونه زیر استفاده نمود:

Process با لیست حساسیت : (sensitivity list) 

:process_label

PROCESS ( signal_name , signal_name , signal_name )

VARIABLE variable_name : STD_LOGIC;

VARIABLE variable_name : STD_LOGIC;

BEGIN

-- Signal Assignment Statement

-- Variable Assignment Statement

-- Procedure Call Statement

-- If Statement

-- Case Statement

-- Loop Statement

END PROCESS process_label;

خود دستور process، concurrent است (یعنی داخل بدنه architecture نوشته می شود) اما داخل بدنه اش برعکس بدنهarchitecture، بصورت sequential کار می کند.

Process بدون لیست حساسیت (به کمک عبارات : ( wait, wait until, wait for, wait on 

process_label:

PROCESS

VARIABLE variable_name : STD_LOGIC;

VARIABLE variable_name : STD_LOGIC;

BEGIN

WAIT UNTIL clk_signal = '1';

-- Signal Assignment Statement

-- Variable Assignment Statement

-- Procedure Call Statement

-- If Statement

-- Case Statement

-- Loop Statement

END PROCESS process_label;

فرم کلی  دستور : If… then … else 

IF expression THEN

statement;

statement;

ELSIF expression THEN

statement;

statement;

ELSE

statement;

statement;

END IF;

عبارت If بصورت ترتیبی (خط به خط) اجرا می شود.

فرم کلی انتساب در سیگنالها:

signal_name <= expression;

فرم کلی انتساب در متغیرها:

variable_name := expression ;

فرم کلی دستور : with … select 

label:

WITH expression SELECT

signal <= expression WHEN _ constant_value,

expression _WHEN constant_value,

expression _WHEN constant_value,

expression _WHEN constant_value;

فرم کلی دستور  : for … loop 

عبارات داخل for … loop به صورت خط به خط اجرا می شوند برعکس عبارات for … generate که بصورت همزمان اجرا می­شوند.

loop_label:

FOR index_variable IN discrete_range LOOP

statement;

statement;

END LOOP loop_label;

فرم کلی دستور  : while … loop 

عبارات داخل دستور while … loop بصورت ) sequential خط به خط ) اجرا می شوند.

loop_label:

WHILE boolean_expression LOOP

statement;

statement;

END LOOP loop_label;

فرم کلی دستور  : for … generate 

generate_label:

FOR index_variable IN discrete_range GENERATE

statement;

statement;

END GENERATE;

فرم کلی دستور  : if … generate 

عبارات داخل این دستور بصورت همزمان (concurrent) اجرا می شوند.

generate_label:

IF expression GENERATE

statement;

statement;

END GENERATE;

فرم کلی تعریف آرایه یک بعدی یا چند بعدی :

انواع آرایه های یک بعدی که می توان سیگنال ها و متغیرها وحتی ثابتها را از این نوع انتخاب نمود :

TYPE type_name IS ARRAY <index_value> OF element_type;

STD_LOGIC_VECTOR( high DOWNTO low );

BIT_VECTOR( high DOWNTO low ) ;

INTEGER RANGE low TO high ;

تعریف آرایه دو بعدی :

اگر بخواهیم ابعاد آرایه را مشخص نکنیم، برای اینکار از الگوی دوم استفاده می کنیم.

TYPE array_type_name IS ARRAY (high DOWNTO low) OF type_name;

TYPE array_type_name IS ARRAY ( integer RANGE <>) OF type_name;

فرم کلی نوع شمارشی : enumerated 

TYPE enumerated_type_name IS ( name , name , name );

نوع شمارشی شامل لیستی از نامها و کاراکترها است که با آن می توان مدارهای دیجیتال را متناسب با عملیاتی که انجام می دهند و یا انواع مقادیر خروجی که تمایل داریم بگیرند، با توجه به نیاز برنامه نویس، مدلسازی نمود. این نوع بیشتر در طراحی ماشین حالت (state machine) استفاده می شود.

فرم کلی تعریف : subtype 

SUBTYPE subtype_name IS type_name RANGE low_value TO high_value;

SUBTYPE array_subtype_name IS array_type_name( high_index DOWNTO low_index );

زیر نوع در واقع زیر مجموعه ای از نوع ها است، یعنی نوع محدود شده و دارای تعداد عناصر کمتری از نوع می باشد. نوع و زیر نوع در قسمت اعلانات architecture یعنی قبل از begin تعریف می شوند.

فرم کلی تعریف و بکارگیری : component 

قسمت generic بستگی به انتخاب برنامه نویس دارد و اختیاری است. نامهای ورودی و خروجی کامپوننت باید مشابه نامهای ورودی و خروجی انتیتی قطعه مورد نظر باشد. در ضمن تعریف قطعه یا همان کامپوننت باید در قسمت اعلاناتarchitecture صورت بگیرد.

COMPONENT component_name

GENERIC( parameter_name : string := default_value;

        parameter_name : integer := default_value );

PORT(

input_name , input_name      : IN                          STD_LOGIC;

bidir_name , bidir_name        : INOUT STD_LOGIC;

output_name , output_name : OUT      STD_LOGIC);

END COMPONENT;

فرم کلی نمونه گیری از یک قطعه : (component instance) 

نوع 1:

instance_name: component_name

PORT MAP ( component_port => connect_port ,

component_port => connect_port );

نوع 2:

instance_name: component_name

PORT MAP ( connect_port , connect_port );       

گاهی مواقع لازم است از یک قطعه یا چندین قطعه متفاوت دیگر در طرح خود استفاده کنیم لذا در این مواقع دستورcomponent به کمک ما خواهد آمد تا بتوانیم این قطعات را به مدار اصلی خود معرفی کنیم و در نهایت به کمک دستور component instance از این قطعات استفاده کنیم.

نوع 1 تعریف کامل تری است زیرا به کمک آن می توانیم از برخی پایه های قطعه نمونه گرفته شده استفاده نکنیم در حالیکه در نوع 2 با وجود اینکه روش اتصال سیمها (سیگنالها) به پایه های قطعه نمونه گرفته شده آسانتر است اما در این روش باید از همه پایه ها استفاده شود همچنین امکان جابجا نوشتن پایه ها از لحاظ ترتیب تعریف آنها وجود ندارد. در ضمن component instance در بدنه architecture نوشته می شود.

فرم کلی تعریف و بکارگیری : package 

 Pack_declarations می تواند شامل تعریف نوعها، زیر نوعها، کامپوننت ها،سیگنال ها و ثابت ها باشد.

PACKAGE pack_name IS

Pack_declarations

END pack_name ;

PACKAGE BODY pack_name IS

Pack_declarations

END PACKAGE BODY pack_name ;

اگر در پکیج فقط نوع و ثابت داشتیم دیگر نیازی به نوشتن package body نیست.

فرم کلی تعریف و فراخوانی تابع : (Function) 

تابع در architecture و یا package اعلان می شود. هر تابع برعکس procedure، فقط و فقط یک خروجی دارد.

FUNCTION func_name ( func_inputs : in inputs_type ) RETURN output_var_type IS

VARIABLE var_name : var_type ;

.

.

   BEGIN

   .

   .

   .

   Output_var := statement ;

   RETURN output ;

END func_name ;

فرق رویه با تابع در این است که رویه می تواند هر تعداد خروجی که بخواهیم داشته باشد در حالیکه تابع فقط مجاز به برگرداندن یک خروجی می باشد، رویه می تواند داده هایی از نوع inout نیز داشته باشد.


 

دیدگاه جدیدی بگذارید

CAPTCHA
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.
2 + 2 =
Solve this simple math problem and enter the result. E.g. for 1+3, enter 4.