اطلاعیه

Collapse
No announcement yet.

آموزش زبان VHDL

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    آموزش زبان VHDL

    آشنایی با زبان 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
لطفا صبر کنید...
X