اطلاعیه

Collapse
No announcement yet.

ساخت تابع در vhdl

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

    ساخت تابع در vhdl

    سلام
    توی آموزش هائی که توی اینترنت هست خیلی چیز هارو ننوشتند از جمله ساخت تابع
    مثلا من یک قسمتی درست میکنم برای تقسیم فرکانس و درست کردن تاخیر
    حالا میخام هر جا که خاستم از این تابع استفاده کنم ولی بلد نیستم کسی هست که راهنمائی کنه ؟؟؟ oo:

    #2
    پاسخ : ساخت تابع در vhdl

    تعریف و استفاده از توابع داخل VHDL خیلی سادست. تابع مورد نظر رو باید در قسمت Architecture و قبل از begin تعریف کنی. ورودی های تابع فقط باید از نوع Input باشن. خروجی تابع با Return مشخص میشه. برای مثال اینجا یک تابع ساده ی تبدیل Binary به BCD رو قرار میدم:
    function to_bcd ( bin : std_logic_vector(7 downto 0) ) return std_logic_vector is
    variable i : integer:=0;
    variable bcd : std_logic_vector(11 downto 0) := (others => '0'
    variable bint : std_logic_vector(7 downto 0) := bin;

    begin
    for i in 0 to 7 loop -- repeating 8 times.
    bcd(11 downto 1) := bcd(10 downto 0); --shifting the bits.
    bcd(0) := bint(7);
    bint(7 downto 1) := bint(6 downto 0);
    bint(0) :='0';


    if(i < 7 and bcd(3 downto 0) > "0100&quot then --add 3 if BCD digit is greater than 4.
    bcd(3 downto 0) := bcd(3 downto 0) + "0011";
    end if;

    if(i < 7 and bcd(7 downto 4) > "0100&quot then --add 3 if BCD digit is greater than 4.
    bcd(7 downto 4) := bcd(7 downto 4) + "0011";
    end if;

    if(i < 7 and bcd(11 downto 8) > "0100&quot then --add 3 if BCD digit is greater than 4.
    bcd(11 downto 8) := bcd(11 downto 8) + "0011";
    end if;


    end loop;
    return bcd;
    end to_bcd;
    این تابع یک عدد 8 بیتی باینری رو دریافت کرده و در خروجی یک عدد BCD سه رقمی (4 بیت برای هر رقم) معادل با عدد باینری برای نمایش در سون سگمنت میده.
    اسم تابع to_bcd هستش که شما انتخاب می کنید.
    اسم ورودی (یا ورودی ها) bin هستش که شما نام و نوع اون رو انتخاب می کنید ( در اینجا std_logic_vector(7 downto 0))
    بعد از تعریف ورودی (ورودی ها) باید نوع خروجی مشخص بشه: در اینجا std_logic_vector که بعد از return آورده شده. و در آخر خط اول با is به استقبال بقیه قسمت ها میریم.
    متغیرهای مورد نیاز رو قبل از Begin تعریف کنید و پس از Begin عملیات لازم رو انجام بدین.
    در انتها متغیری رو که می خواین به عنوان خروجی تابع برگردانده بشه و نوعشو در ابتدا مشخص کردین با return برگردونید. در اینجا return bcd;
    تابع رو با end name; به پایان برسونید. (نام تابعname=)
    تمام این کد ها باید در قسمت architecture و قبل از begin نوشته بشه.
    حالا در هر قسمت که نیاز به فراخوانی تابع دارین خیلی راحت می تونین مثل زیر تایع رو استفاده کنید:
    فرض کنید 12 پین به عنوان خروجی در ابتدای پروژه تعریف شده و 8 بیت نیز به عنوان ورودی داریم:
    Binary : in std_logic_vector(7 downto 0);
    BCD_Out : out std_logic_vector(11 downto 0);
    حالا می خواهیم ورودی Binary توسط تابع to_bcd به BCD_Out منتقل بشه:
    BCD_Out <= to_bcd(Binary);
    به همین راحتی!
    البته بعضی ها می گن بهتره فراخوانی تابع رو داخل process هم قرار بدی:
    Process(Clock)
    Begin
    If(rising_edge(Clock) ) then
    BCD_Out <= to_bcd(Binary);
    End if;
    End process;
    ----------------------------
    برای تقسیم فرکانس و درست کردن تاخیر یک counter درست کن. استفاده از تابع معقول نیست.
    موفق باشی.

    دیدگاه

    لطفا صبر کنید...
    X