از سادهترین تا پیچیدهترین مدارات دیجیتال را میتوان با عباراتی توصیف کرد که متعلق به زبانی به نام VHDL هستند. با این زبان در برنامه ویدئویی آموزش زبان VHDL آشنا میشوید.
زبان VHDL یکی از دو زبان توصیف سختافزاری اصلی در طراحی مدارات دیجیتال به کمک FPGA است که امکان پیادهسازی انواع مدارات دیجیتال را فراهم میکند.
در برنامه آموزش زبان VHDL به مرور با مفاهیمی آشنا میشوید که پایههای یک طراحی حرفهای را تشکیل میدهند.
More...
در این برنامه با ذهنیت مناسب برای "پیادهسازی دیجیتال" آشنا میشوید و میآموزید چگونه دیدگاه "برنامهنویسی" را که بیشتر طراحان دیجیتال به آن خو گرفتهاند کنار بگذارید.
برای آشنایی با نحوه نصب و کرک نرمافزار ISE این برنامه ویدئویی را ببینید…
در این برنامه با ساختار زبان VHDL و بخشهای concurrent و sequential برای طراحی مدارات ترکیبی و ترتیبی آشنا میشوید.
قواعد اصلی بخش concurrent در زبان VHDL در این برنامه به طور مفصل شرح داده میشود تا کم کم آماده طراحی عملی مدارات پیچیدهتر شوید.
منتظر بخشهای بعدی این برنامه آموزشی باشید تا با نحوه پیادهسازی انواع مدارات ترکیبی و ترتیبی آشنا شوید و بتوانید آنها را شبیهسازی کنید.
برای آشنایی بیشتر با زبان VHDL قسمت دوم این آموزش را ببینید…
ویدئو یا متن؟
محتوای این برنامه آموزشی، به دو صورت ویدئو و متن آماده شده است. اگر علاقمند به یادگیری این مطلب به صورت ویدئویی هستید، ویدئوی زیر را ببینید و اگر ترجیح میدهید آن را به صورت متن مطالعه کنید، ادامه این مطلب را بخوانید.
برای دانلود نسخه با کیفیت این ویدئو، روی دکمه زیر کلیک کنید:
در این مقاله، قصد دارم شما را با زبان VHDL آشنا کنم.
در یکی از مقالههای قبلی، اطلاعات اولیهای راجع به زبان VHDL به دست آوردید.
در این مقاله، در مورد زبان VHDL و ساختار و امکاناتی که این زبان در اختیار ما قرار میدهد، بیشتر صحبت میکنم.
زبان توصیف سختافزاری (HDL)
یک زبان توصیف سختافزاری یا HDL، در واقع ابزاری برای توصیف یک مدار دیجیتالی است.
شما میتوانید به کمک یک زبان HDL، یک مدار را به نرمافزار مخصوص پیادهسازی (مثلاً، نرمافزار پیادهسازی شرکت XILINX که ISE نام دارد) معرفی کنید.
به کمک یک زبان HDL مانند VHDL یا Verilog، میتوانید انواع مختلف سختافزارهای دیجیتال را، برای پیادهسازی با FPGA، توصیف کنید.
به این نکته هم توجه داشته باشید که مفاهیم و اصولی که در هر دو زبان VHDL و Verilog به کار میروند یکسانند؛ فقط سینتکسهای این دو زبان متفاوت است.
نکتهی بسیار مهم، این است که قبل از شروع به کدنویسی با یکی از زبانهای HDL (و همچنین در حال کدنویسی)، ذهنیت صحیحی در مورد کاری که در حال انجام آن هستید، داشته باشید.
همانطور که در برنامهی "FPGA چیست؟" توضیح دادم، ماهیت و ساختار FPGA نسبت به پردازندهها کاملاً متفاوت است.
بنابراین، هنگامی که با FPGA کار میکنید و برای آن، کد HDL مینویسید، باید همواره به این تفاوتها توجه داشته باشید.
به این موضوع دقت کنید که وقتی در حال کدنویسی هستید، شما در حال توصیف یک مدار دیجیتال هستید؛ به عبارت دیگر، شما یک برنامهی نرمافزاری نمینویسید.
از طرف دیگر، یک زبان HDL، شامل دستوراتی برای نوشتن یک برنامهی نرمافزاری نیست؛ بلکه دارای ساختارهایی برای توصیف یک سختافزار دیجیتال است.
همانطور که قبلاً هم اشاره کردم، دستورات نوشتن یک برنامهی نرمافزاری، مربوط به CPU هستند؛ اما وقتی شما با FPGA کار میکنید، قبل از پیکرهبندی آن، FPGA، هیچ سختافزار مشخصی را ارائه نمیکند و فقط شامل دریایی از منابع دیجیتالی، مثل LUTها و سیمها است.
پیشنهاد من به شما این است که برای شروع کدنویسی برای FPGA، همواره یک مدار دیجیتال را تصور کنید و برای خط به خط کدی که مینویسید، در ذهنتان تصوّر کنید که این خطوط، چه سختافزار دیجیتالی را توصیف میکند.
به این ترتیب، به مرور زمان، ذهن شما عادت میکند که به راحتی، برای سختافزارهای مختلف،کد مناسب را پیدا کند.
مدارات ترکیبی و مدارات ترتیبی
احتمالاً از درس مدار منطقی به یاد دارید که به طور کلی، مدارات منطقی به دو دسته تقسیم میشوند:
یکی مدارات ترکیبی و دیگری مدارات ترتیبی.
مدارات ترکیبی، مداراتی هستند که خروجی آنها، در هر لحظه از زمان، به ورودی همان لحظه بستگی دارد.
مالتیپلکسرها، دیمالتیپلکسرها، دیکدرها و انکدرها مثالهایی از مدارات ترکیبی هستند.
اما خروجی مدارات ترتیبی (بر خلاف مدارات ترکیبی)، در هر لحظه از زمان، به جز اینکه به ورودیهای همان لحظه بستگی دارد، به ورودیهای لحظات قبل هم بستگی دارد.
همین جا میتوانیم حدس بزنیم که حتماً در مدارات ترتیبی، عنصر حافظه وجود دارد؛ زیرا قرار است خروجیهای هر لحظه را، به کمک ورودیهای همان لحظه و ورودیهای لحظات قبل محاسبه کند.
بنابراین، نیاز دارد که درون خودش حافظه داشته باشد.
شمارندهها و شیفت رجیسترها، مثالهای معروف و سادهای از مدارات ترتیبی هستند.
خود مدارات ترتیبی به دو گروه سنکرون و آسنکرون طبقهبندی میشوند.
مدارات ترتیبی سنکرون، مداراتی هستند که اثر ورودی همزمان با یک سیگنال خارجی به خروجی منتقل میشود که به آن سیگنال خارجی، در اصطلاح کلاک میگوییم.
اما، در مدارات آسنکرون، اثر ورودی، بدون در نظر گرفتن کلاک، به خروجی منتقل میشود.
یک زبان HDL، از جمله VHDL و Verilog، به شما این قابلیت و امکان را میدهد که بتوانید هر کدام از مدارات منطقی را، به راحتی طراحی کنید.
ساختار کلی یک کد VHDL
اکنون، به ساختار کد VHDL و قابلیتهای آن میپردازیم.
همانطور که در یکی ازمقالههای قبلی اشاره کردم، به طور کلی، هر کد VHDL از دو بخش اصلی تشکیل شده است؛ بخش Entity، که در آن پورتهای ورودی و خروجی را تعریف میکنیم و بخش Architecture، که اصل مدار را در آن توصیف میکنیم (شکل زیر).
بخش Entity کد VHDL
تنها وظیفهی ساختار Entity، تعریف پورتهای ورودی و خروجی است.
مطابق آنچه در کد زیر میبینید، این ساختار، با کلمهی کلیدی Entity شروع میشود. پس از آن، نام Entity وجود دارد که من آن را Adder قرار دادهام. سپس، باید کلمات کلیدی is و port نوشته شوند.
همچنین، بین دو پرانتز، پورتهای ورودی و خروجی را مشخص میکنیم.
در نهایت، و بعد از بسته شدن پرانتز، کلمهی کلیدی end و اسم Entity قرار میگیرد.
Entity Adder is Port ( A : in BIT; B : in BIT; Cin : in BIT; Sum : out BIT; Cout : out BIT ); end Adder;
برای تعریف پورتها، باید به ازای هر پورت، سه مورد را مشخص کنیم:
اول، اسم پورتها است که در ستون اول کد بالا مشخص شده است.
پس از قرار دادن یک علامت ":"، شما باید جهت پورت را مشخص کنید؛ در واقع باید مشخص کنید که پورت شما ورودی، خروجی یا دو طرفه (Bidirectional) است.
در اصطلاح زبان VHDL، به این موضوع، مشخص کردن مُد پورت گفته میشود.
پس از مشخص کردن مُد پورت، باید نوع یا تایپ پورت را مشخص کنید؛ من در کد بالا، از تایپ BIT استفاده کردهام.
اگر تایپ پورتی BIT باشد، میتواند دو مقدار صفر یا یک را به خود بگیرد.
دقت کنید که تایپ BIT را صرفاً برای آشنایی شما استفاده کردهام؛ در عمل، از این تایپ استفاده نمیکنیم؛ زیرا تایپ BIT قابل سنتز شدن نیست.
در عمل، برای پورتهای تک بیتی، از تایپ STD_Logic استفاده میکنیم.
ساختار Architecture در کد VHDL
اکنون به سراغ آشنایی با ساختار Architecture میرویم.
ساختار Architecture، با کلمهی کلیدی Architecture شروع میشود.
سپس، نامی که برای Architecture انتخاب کردهایم را مینویسیم که در بالا، آن را behavioral نامگذاری کردهایم.
سپس، کلمهی کلیدی of را مینویسیم. پس از آن، نام Entity (که Adder بود)، و سپس، کلمهی کلیدی is را مینویسیم.
همانند آنچه در شکل بالا میبینید، در ساختار Architecture سه ناحیه وجود دارد:
ناحیهی Declaration، ناحیهای است که در آن سیگنالها و ماژولها را تعریف میکنیم؛ این ناحیه، قبل از کلمهی کلیدی Begin قرار دارد.
ناحیهی Concurrent، ناحیهای برای توصیف مدارات ترکیبی است که بعد از Begin آرکیتکچر و تا انتهای آن (که با کلمات کلیدی End Architecture پایان مییابد)، قرار دارد.
از ناحیهی Sequential، برای تعریف مدارات ترتیبی استفاده میکنیم؛ این ناحیه، در دل ناحیهی Concurrent و درون ساختار Process قرار دارد. خود ساختار Process، دارای کلمهی کلیدی Begin است و از کلمهی کلیدی Begin، تا عبارت کلیدی End Process، ناحیهی Sequential محسوب میشود.
همین جا، این نکته را بدانید که عمدهی مدارات ما، در قسمت Sequential یا ترتیبی تعریف خواهند شد.
در ادامه، دربارهی ناحیهی Concurrent بیشتر صحبت میکنیم.
چند نکته در زبان VHDL
به چند نکته در مورد زبان VHDL توجه کنید:
در این زبان، برای اینکه یک سیگنال، یا ترکیبی از سیگنالها را، به یک سیگنال دیگر ارجاع دهیم، مانند کد زیر، از علامت "کوچکتر مساوی" استفاده میکنیم. اصطلاحاً به این علامت، علامت ارجاع یا Signal Assignment میگوییم.
A <= B and C;
در کد بالا، دو رجیستر B و C، با هم and شده و سپس به رجیستر A ارجاع داده میشوند.
در اصطلاح زبان VHDL، به پورتها و رجیسترهایی که توسط پیادهساز طراحی میشوند، سیگنال گفته میشود.
بنابراین، هنگامی که من کلمهی سیگنال را به کار میبرم، میتواند به معنای یک پورت یا به معنای رجیستری باشد که توسط پیادهساز طراحی شده است.
محیط Concurrent
مهمترین قانون در محیط Concurrent، این است که یک عبارت ارجاع، فقط زمانی ارزیابی یا اعمال میشود که یکی از سیگنالهای سمت راست ارجاع، تغییر کند.
برای مثال، در کد بالا که عبارت B and C، به A ارجاع شده است، این عبارت فقط زمانی ارزیابی و اعمال میشودکه یکی از سیگنالهای B یا C تغییر کند.
مداری را تصور کنید که یک گیت and، با دو ورودی B و C است و این گیت، یک خروجی A دارد.
تنها زمانی A تغییر میکند که B یا C تغییر کند.
از این صحبت، میتوان نتیجه گرفت که در محیط Concurrent، محل قرارگیری خطوط کد، نسبت به یکدیگر اولویتی ندارند.
این موضوع را در ادامه بیشتر توضیح خواهم داد.
اصطلاح دیگری به نام Event، در زبان VHDL وجود دارد.
در زبان VHDL، اصطلاحاً وقتی مقدار یک سیگنال مقدار تغییر کند، میگویند که روی آن سیگنال، Event رخ داده است.
اگر بخواهیم قانون محیط Concurrent را با این اصطلاح زبان VHDL، بیان کنیم، باید بگوییم که یک عبارت Assignment، فقط زمانی ارزیابی یا اعمال میشود که روی یکی از سیگنالهای سمت راست آن، یک Event رخ داده باشد.
اکنون اجازه دهید که محیط Concurrent را در نرمافزار ISE بررسی کنیم.
شکل زیر، کد مثال Adder را که در مقالهی قبلی در مورد آن صحبت کردیم، در محیط نرمافزار ISE میبینید:
در قسمت اول، Entity را تعریف کردهایم؛ در ابتدای مقاله، به بررسی بخشهای مختلف Entity پرداختیم.
پس از بخش Entity، بخش Architecture را میبینیم.
در این بخش، به دو خروجی Sum و Cout مقادیری Assign شده است.
من برای سادگی، دو خط ۱۸ و ۱۹ کد را فعلاً پاک میکنم و دو عبارت دیگر را جایگزین میکنم که آن را در کد زیر مشاهده میکنید:
library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity Example_01_Full_Adder is Port ( A : in STD_LOGIC; B : in STD_LOGIC; Cin : in STD_LOGIC; Sum : out STD_LOGIC; Cout : out STD_LOGIC ); end Example_01_Full_Adder; architecture Behavioral of Example_01_Full_Adder is begin A <= B and C; D <= A; end Behavioral;
در کد بالا، سیگنال B و C را با هم and میکنیم و به A، Assign میکنیم. پس از آن، سیگنال A را به D، Assign میکنیم.
همانطور که گفتم، در محیط Concurrent، هر کدام از خطوط Assignment فقط زمانی ارزیابی و اعمال میشوند که روی یکی از سیگنالهای سمت راستشان یک Event رخ دهد؛ یعنی، اگر B یا C تغییر کند، سطر ۱۸اُم کد اعمال میشود و مقدار A آپدیت میشود.
در خط ۱۹اُم کد نیز، اگر مقدار A تغییر کند، این خط ارزیابی میشود و مقدار D تغییر میکند.
پس در خط ۱۸اُم، اگر مقدار B یا C، به نحوی تغییر کند، مقدار A تغییر خواهد کرد، و بعد از اینکه مقدار A تغییر کند، چون A سمت راست Assignment خط ۱۹اُم است، این Assignment هم ارزیابی میشود و در نتیجه مقدار D نیز تغییر میکند.
حالا فرض کنید من جای دو خط ۱۸ و ۱۹ را عوض کنم؛ به نظر شما آیا تغییری در عملکرد این مدار حاصل میشود؟
همانطور که قبلاً گفتم، در محیط Concurrent، خطوط ارزیابی، اولویتی نسبت به هم ندارند و محل قرار گرفتن آنها، اولویتی برای انجام زودتر یک Assignment ایجاد نمیکند؛ در واقع، اینکه کدامیک از این خطوط را ابتدای کد بنویسیم و کدامیک را آخر کد بنویسیم، هیچ تفاوتی ندارد.
این مسئله، بر خلاف آنچه برای یک زبان برنامهنویسی وجود دارد، است.
بنابراین، در این کد، با جابهجا کردن خطوط ۱۸ و ۱۹، هیچ تغییری در عملکرد این مدار رخ نمیدهد.
تنها عاملی که باعث ارزیابی این سطرها و اعمال مقدار سمت راست به مقدار سمت چپ میشود، رخ دادن یک Event در یکی از سیگنالهای سمت راست است.
فرض کنید جای دو خط ۱۸ و ۱۹ را عوض کنیم:
D <= A; A <= B and C;
در این حالت، در صورتی که روی یکی از سیگنالهای B یا C یک Event رخ دهد، سطر دوم ارزیابی میشود و مقدار A آپدیت میشود. در این صورت، چون مقدار A آپدیت شده و تغییر کرده است، پس در سمت راست Assignment سطر اول نیز، یک Event رخ داده و بنابراین، این سطر هم پس از سطر دوم ارزیابی میشود و مقدار D، آپدیت میشود.
بنابراین، در هر دو حالت، سطر مربوط به Assignment سیگنال A به D، دومین سطری است که ارزیابی میشود و تفاوتی ندارد که من این سطر را به عنوان اولین سطر یا به عنوان دومین سطر کد بنویسم.
اکنون به مثال جمعکننده برگردیم. در این مثال نیز، مطابق با آنچه در کد زیر میبینید، دو سطر Assignment داریم:
library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity Example_01_Full_Adder is Port ( A : in STD_LOGIC; B : in STD_LOGIC; Cin : in STD_LOGIC; Sum : out STD_LOGIC; Cout : out STD_LOGIC ); end Example_01_Full_Adder; architecture Behavioral of Example_01_Full_Adder is begin Cout <= (A and B) or (A and Cin) or (B and Cin); Sum <= A xor B xor Cin; end Behavioral;
در خط ۱۸اُم، مقدار Sum، و در خط ۱۹اُم، مقدار Cout را توصیف کردهایم.
در این کد نیز، دو بخش مربوط به دو Assignment، دو بخش کاملاً مجزا هستند و اینکه کدامیک از این خطها را در ابتدا بنویسیم تغییری در عملکرد مدار ندارد.
تنها دلیلی که باعث میشود یکی از این خطوط ارزیابی شوند و مقدار سمت راست به مقدار سمت چپ اعمال شود، رخ دادن Event روی یکی از سیگنالهای سمت راست است.
امیدوارم از خواندن این مقاله هم لذت برده باشید و بتوانید از نکات یاد گرفته شده، در انجام پروژههایتان استفاده کنید.
آیا برنامه ویدئویی آموزش زبان VHDL برای شما مفید بود؟
لطفا نظرتان را در مورد این برنامه در پایین همین پست با دیگران به اشتراک بگذارید. همچنین با کلیک روی هر کدام از دکمههای اشتراک گذاری ابتدای این مطلب و به اشتراکگذاری آن در شبکههای اجتماعی میتوانید افراد بیشتری را در یادگیری این مطالب سهیم کنید.
با عرض سلام و خسته نباشید
آموزش بسیار جالب و زیبایی بود
ولی به نظر بنده دو پیشنهاد زیر رو هم اعمال کنید خیلی زیبا تر میشود.
۱-شما نحوه نصب نرم افزار رو آموزش رو نگذاشتین
و ای کاش خود نرم افزار رو هم لینک دانلود انرا در پایین همین آموزش می گذاشتین
۲- بعد از آموزش نصب نرم افزار و کرک کامل آن نحوه ایجاد یک پروژه جدید
رو می گفتین و بعد نحوه کد نویسی آن
و هرچه آموزش به زبان خوذمونی تر باشه بهتر است تا کتابی
و ای کاش یه برد هم با این قسمت معرفی می کردید
و نحوه سنتز کردن برنامه و اینکه همزمان بتوان برنامه را کامپایل کرد و نتیجه را دید.
ولی بازم تشکر بابت آموزش های خوبتون
سلام، ممنون از توجه شما به این برنامه و بیان نظراتتون.
مطئنا تمام نظرات شما رو در تولید برنامههای بعدی در نظر خواهم گرفت. اما به دو مساله هم در این ارتباط توجه داشته باشید:
۱- نوع این آموزشها به صورتی است که در هر برنامه بیشتر به یک موضوع تاکید شود و مواردی رو که شما اشاره کردید در برنامههای جداگانهای توضیح داده خواهند شد.
۲- موضوع نرمافزار رو هم در برنامه “آشنایی با نرمافزار ISE” شروع کردم و موارد مربوط به اون رو در ادامه همون برنامه بیان خواهم کرد. این برنامه هم، اولین آموزش در زمینه کدنویسی بود و موارد مرتبط رو در ادامه این برنامه مطرح خواهم کرد.
نتیجه کل صحبتم این هست که تمام مواردی که شما بیان کردید آموزش داده خواهند شد اما هر موضوع در یک ویدئوی جداگانه که در ادامه منتشر خواهد شد.
موفق باشید.
سلام استاد
بسیار مفید بود اموزشتون
خواهشی که از شما دارم این هست که این برنامه ریزیی که کردید را که برای ایمیل هایمان این مطالب مفیدتان را ارسال می کنید همیشکی باشه و طبق یه برنامه ریزی خاص جلو بروید و قطع نشود تا ما هم بتونم برنامه ریزی کنار مطالب مفیدتان داشته باشیم تا بتونیم حداکثر استفاده رو ببریم
سلام، ممنون از شما.
هدف و برنامه من هم همین هست و امیدوارم بتوانم حداقل یک ایمیل در هفته را برای موضوعات آموزشی ارسال کنم.
موفق باشید.
سلام،
برای آشنایی با نحوه نصب و کرک نرمافزار ISE برنامه ویدئویی زیر را ببینید:
نحوه نصب نرمافزار ISE و کرک آن
salam khaste nabashid khili mmnon az amozeshton
با عرض سلام و خسته نباشید
آموزش بسیار جالب و زیبایی بود
h
با سلام
به فایل صوتی گوش کردم. برای من خیلی مفید بود
سپاسگزارم
سلام،
امیدوارم برنامههای ویدئویی بعدی هم برای شما مفید واقع شوند.
موفق باشید.
سلام. فوق العاده بود. خیلی تمیز توضیح داده شد.
کمال عبدی. مونیخ
سلام،
خوشحالم که مورد توجه شما قرار گرفته است.
موفق باشید.
سلام استاد ثقفی
توضیحات بسیار واضح، مفید و قابل فهم هستند، ممنون
سلام،
ممنون از نظر مثبت شما.
موفق باشید.
مفید بود