آشنايي با زبان VHDL:


فرمت و قالب دستورات 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 <&gt 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 نيز داشته باشد.

منبع:WWW.DSPCORE.IR

:MEPLA_F@YAHOO.COM انجام پروژه vhdl