ایدهای که در ذهن طراح دیجیتال است باید به نحوی استاندارد بیان شود تا سپس توسط ابزار طراحی نرمافزاری موجود، تبدیل به دادههایی شود که برای FPGA قابل فهم باشد. همانطور که قبلاً نیز اشاره شد، در FPGA یک پردازنده آماده وجود ندارد و در نتیجه دستورات برنامهنویسی نیز که به کمک آن بتوان یک روتین نرمافزاری ایجاد کرد وجود ندارد. بنابراین چگونه میتوان یک طرح دیجیتال را برای FPGA توصیف کرد؟ به عبارت دیگر، مراحل پیادهسازی با FPGA کدامند؟
More...
زبانهای توصیف سختافزاری
برای توصیف یک طرح دیجیتال سختافزاری، زبانهای مخصوصی طراحی شدهاند که به کمک آنها میتوان توابع و عملکردهای مختلف منطقی و دیجیتالی را توصیف کرد. این زبانها را زبانهای توصیف سختافزاری (HDL: Hardware Description Language) مینامند. انواع مختلفی از زبانهای HDL وجود دارد. اما دو زبان که از همه پرکاربردترند و در دنیا به طور گسترده مورد استفاده قرار میگیرند، VHDL و Verilog هستند.
هر دو زبان علیرغم تفاوت در کلمات کلیدی و ساختارها، قابلیت توصیف هر مدار دیجیتال را دارا هستند. در این بخش، برای اینکه آشنایی کلی با ماهیت این زبانها حاصل شود، زبان توصیف سختافزاری VHDL را انتخاب کردهایم.
VHDL مخفف عبارت Very high speed integrated circuits Hardware Description Language است. این زبان در ابتدا توسط وزارت دفاع آمریکا به منظور توصیف و مستندسازی طرحهای الکترونیکی آن زمان طراحی شد. سپس در سال ۱۹۸۷ توسط گروه استانداردسازی IEEE به صورت استاندارد درآمد و در قالب استاندارد IEEE 1076 ارائه شد.
برای آشنایی با زبان VHDL این برنامه ویدئویی را ببینید…
زبان VHDL از چه بخش هایی تشکیل شده است؟
هر کد VHDL برای اینکه یک ماجول دیجیتال را توصیف کند، از دو بخش تشکیل شده است؛ Entity و Architecture. شکل زیر یک تراشه دیجیتال را نشان میدهد. دو بخش در این تراشه متمایز شده است:
- پورتهای ورودی/خروجی
- مدار دیجیتال داخلی
بخش Entity در هر کد VHDL توصیفکننده پورتهای ورودی/خروجی ماجول دیجیتال هستند. بخش Architecture نیز توصیفکننده مدار دیجیتال داخلی است. پورتهای ماجول مورد نظر ممکن است به صورت ورودی یا خروجی و تکبیتی یا چندبیتی تعریف شوند. مدار داخلی معمولاً از پورتهای ورودی، مقادیر دیجیتال را دریافت کرده و پس از انجام عملیات منطقی، حاصل را به پورتهای خروجی ارسال میکند.
پیاده سازی تمام جمعکننده با VHDL
برای آشنایی بیشتر با نحوه توصیف یک ماجول دیجیتال به کمک زبان VHDL بهتر است یک مثال ساده را بررسی کنیم. فرض کنید میخواهیم یک مدار تمام جمعکننده (Full Adder) را با FPGA پیادهسازی کنیم.
شکل زیر مدار دیجیتال یک تمام جمع کننده و پورتهای آن را نشان میدهد. همانطور که در شکل دیده میشود، پورتهای a و b به عنوان دو بیت ورودی که باهم جمع میشوند و Cin به عنوان بیت نقلی ورودی (معمولاً از طبقه قبل) به عنوان ورودیهای این ماجول هستند. پورتهای خروجی ماجول Sum و بیت نقلی خروجی Cout است.
اولین مرحله در توصیف یک طرح دیجیتال به کمک VHDL توصیف پورتهای آن در بخش Entity است. برای توصیف پورتهای تمام جمع کننده، بخش Entity به صورت شکل زیر خواهد بود. در این بخش از کلمات کلیدی ENTITY و PORT برای مشخص کردن پورتها استفاده شده است. ورودی یا خروجی بودن پورت با کلمه کلیدی IN یا OUT مشخص شده است.
entity Full_Adder is Port ( A, B, Cin : in STD_LOGIC; Sum, Cout : out STD_LOGIC ); end Full_Adder;
عبارت STD_LOGIC که نوع پورت را مشخص میکند، به مقادیر استانداردی که پورت میتواند داشته باشد اشاره میکند. بعضی از این مقادیر عبارتند از: ۰، ۱، Z یا high-Z و U یا Uninitialized و X یا Don’t care.
مرحله بعد در توصیف طرح، مشخص کردن مدار دیجیتال داخلی است. این کار در بخش Architecture از کد VHDL انجام میشود. شکل زیر، توصیف مدار داخلی تمام جمعکننده را نشان میدهد.
برای هر Architecture نیز مثل Entity باید اسمی انتخاب شود. سپس باید Architecture را به یک Entity نسبت داد. بعد از کلمه کلیدی Begin میتوان مدار دیجیتال را توصیف نمود. این کار در کد شکل زیر به کمک کلمات کلیدی XOR و AND انجام شده است.
برای نسبت دادن حاصل یک عملیات منطقی به خروجی از عبارت => استفاده شده است. در نهایت با قرار دادن بخشهای Entity و Architecture در یک فایل با پسوند vhd میتوان یک ماجول کامل تمام جمع کننده را برای استفاده در مراحل بعدی طراحی ایجاد کرد.
architecture Behavioral of Full_Adder is begin Sum <= A xor B xor Cin; Cout <= (A and B) or (A and Cin) or (B and Cin); end Behavioral;
مراحل پیادهسازی با FPGA
برای پیادهسازی یک طرح دیجیتال به کمک FPGA مراحل مختلفی وجود دارد که باید به دقت از طرف طراح انجام شوند. البته بخش عمدهای از این مراحل به کمک نرمافزارهای مخصوصی که برای این کار طراحی شدهاند انجام میشوند. این نرمافزارها در بخشهای بعدی این مقاله معرفی خواهند شد. شکل زیر مراحل طراحی با FPGA را در قالب یک فلوچارت نشان میدهد.
ورود طرح و کامپایل
اولین مرحله طراحی، ورود طرح به ابزار نرمافزاری طراحی است. به عبارت دیگر، باید به نحوی طرح را برای نرمافزاری که به کمک آن قصد انجام مراحل پیادهسازی را داریم توصیف کرد. برای توصیف طرح، همانطور که در بخش قبل گفته شد میتوان از زبانهای توصیف سختافزاری مثل VHDL یا Verilog استفاده کرد. البته معمولاً نرمافزارهای ورود طرح، قابلیت توصیف طرح به صورت شماتیکی را نیز دارند که برای توصیف طرحهای متوسط و بزرگ امکان به کار گیری آنها وجود ندارد.
پس از وارد کردن طرح و بررسی خطاهای احتمالی در نوشتن آن (syntax error)، باید آن را کامپایل کرد. کامپایل یک توصیف سختافزاری از طرح در این جا به معنی تبدیل توصیف HDL به مجموعهای از معادلات منطقی است.
شبیهسازی منطقی
برای ارزیابی صحت طرح، معمولاً در این مرحله آن را شبیهسازی میکنند. شبیهسازی در این مرحله را شبیهسازی منطقی (Functional Simulation) مینامند؛ زیرا آنچه را در این مرحله میتوان شبیهسازی کرد فقط منطق طرح است و مواردی مثل تأخیر گیتها و مسیرها هنوز برای ابزار طراحی شناخته شده نیست.
برای آشنایی با نحوه شبیهسازی به کمک نرمافزار ISim این برنامه ویدئویی را ببینید…
سنتز طرح و شبیهسازی زمانی
بعد از اینکه به کمک شبیهسازی منطقی از صحت عملکرد طرح اطمینان حاصل شد، باید آن را سنتز نمود. سنتز به طور کلی یعنی تبدیل یک توصیف سطح بالا به توصیف سطح پایینتر. این مفهوم با یک مثال در شکل زیر نشان داده شده است. همانطور که در شکل دیده میشود، یک تمام جمعکننده تکبیتی را میتوان به کمک عبارت سطح بالای a + b + Cin = Sum توصیف کرد.
یک توصیف سطح پایینتر از جمعکننده، توسط گیتهای منطقی قابل بیان است. از آنجا که هرکدام از این گیتهای منطقی، خود به کمک مدارات ترانزیستوری پیادهسازی میشوند، یک توصیف سطح پایینتر از تمام جمعکننده، یک مدار ترانزیستوری است که در شکل نشان داده شده است.
بنابراین در این شکل، یک توصیف سطح بالا از مفهوم تمام جمعکننده در دو مرحله به توصیفهای سطح پایینتر سنتز شده است. اما سنتز در یک FPGA، یعنی پیادهسازی معادلات و روابط منطقی حاصل از مرحله کامپایل به کمک “منابع موجود” در آن FPGA. به عبارت دیگر، ابزار طراحی باید بتواند به کمک منابعی منطقی که در یک FPGA خاص وجود دارند مثل LUTها، مالتی پلکسرها، ضرب کنندهها و غیره، توصیف سختافزاری مورد نظر را پیادهسازی کند.
برای این منظور، ابزار طراحی باید نسبت به منابع سختافزاری موجود در FPGA مورد نظر آگاهی کامل داشته باشد. بنابراین باتوجه به اینکه چه نوع FPGAای توسط طراح انتخاب میشود، نتیجه حاصل از مرحله سنتز میتواند متفاوت باشد.
در مرحله سنتز، تأخیر گیتها و منابع سختافزاری دیگر که در طراحی بکار میروند محاسبه و در نظر گرفته میشود. بنابراین، بعد از مرحله سنتز میتوان مجدداً طرح را شبیهسازی نمود. تفاوت این شبیهسازی که به آن شبیهسازی زمانی (Timing Simulation) گفته میشود، با شبیهسازی منطقی در این است که تأخیرهای انتشار (Propagation Delays) منابع بکار گرفته شده در طرح نیز در شبیهسازی دخیل میشوند و درنتیجه، شبیهسازی به آنچه در عمل رخ میدهد نزدیکتر است.
جانمایی طرح
مرحله مهم بعدی در طراحی دیجیتال به کمک FPGA، جانمایی (Place) است. با توجه به اینکه منابع سختافزاری موجود در هر FPGA در مکانهای مشخص و ثابتی درون FPGA قرار دارند، باید مشخص شود که منابع بکار گرفته شده در مرحله سنتز، دقیقاً در چه مکانهایی درون FPGA قرار دارند. نرمافزار طراحی این کار را با توجه به معیارهای مختلفی انجام میدهد. یکی از مهمترین این معیارها این است که منابع را در نقاطی از FPGA قرار دهد که بتواند با مسیرهای کوتاهتری آنها را به هم متصل کند.
مسیریابی و شبیهسازی زمانی
بنابراین مرحله بسیار مهم دیگر در پیادهسازی طرح، مسیریابی (Routing) است. در این مرحله، ابزار طراحی به کمک الگوریتمهای پیچیدهای سعی در یافتن بهترین مسیرها برای اتصال منابع بکار گرفته شده در طرح مورد نظر میکند.
با توجه به اینکه خود مسیرها (سیمها) دارای تأخیر هستند، میتوان در این مرحله نیز مجدداً طرح را شبیهسازی زمانی کرد. در این شبیهسازی که به آن شبیهسازی بعد از جانمایی و مسیریابی (Post-Place & Rout Simulation) میگویند، نه تنها تأخیر گیتها و منابع دیجیتالی دیگر، بلکه تأخیر مربوط به سیمهای متصل کننده منابع دیجیتالی به یکدیگر نیز در شبیهسازی در نظر گرفته میشود.
ساخت فایل پیکرهبندی و پیکرهبندی FPGA
مرحله بعدی طراحی، ساخت فایل پیکرهبندی (Configuration File) است. این فایل که یک فایل باینری است، حاصل تمام مراحل طراحی را به کمک مجموعهای از صفرها و یکها برای ارسال به FPGA در خود دارد. اینکه کدام یک از منابع سختافزاری در FPGA استفاده میشود، داخل LUTها چگونه پر میشوند و مسیرها چگونه به یکدیگر متصل میشوند، همگی درون این فایل باینری قرار دارند.
برای آشنایی با نحوه ساخت فایل پیکرهبندی و پروگرام کردن FPGA این برنامه ویدئویی را ببینید…
آخرین مرحله از طراحی، پیکرهبندی FPGA است. در این مرحله، به کمک یک پروگرامر و رابط Jtag موجود در FPGA، فایل باینری پیکره بندی به داخل FPGA بارگزاری میشود. بعد از بارگزاری این فایل، FPGA تبدیل به سختافزاری که به کمک زبان HDL توصیف شده بود میشود.
آیا مقاله آشنایی با FPGA – مراحل پیادهسازی با FPGA برای شما مفید بود؟
لطفا نظرتان را در مورد این برنامه در پایین همین پست با دیگران به اشتراک بگذارید. همچنین با کلیک روی هر کدام از دکمههای اشتراک گذاری ابتدای این مطلب و به اشتراکگذاری آن در شبکههای اجتماعی میتوانید افراد بیشتری را در یادگیری این مطالب سهیم کنید.
درود
خیلی دنبال همچین مطلبی بودم. واقعا مفید بود و بسیار قابل فهم و ساده توضیح داده بودین.
سپاس
سلام،
خوشحالم که برای شما مفید بوده.
موفق باشید.
بسیار خلاصه و مفید بود به طوری که یه دید کلی درباره نحوه و مراحل پیاده سازی در FPGA در اختیارم گذاشت. بسیار سپاسگذارم.
خوشحالم که از این مطلب لذت بردید.
موفق باشید.
بسیار عالیه اگر میشود لطف کنید در مورد برنامه نویسی های ساده آموزش دهید
به نظر بنده یکی از لذت بخش ترین مراحل آموزش FPGA می باشد .
سلام استاد ثقفی
واقعا متشکرم از مطالب ارزنده و مفید که ارایه کردید.
سلام وقت بخیر
میخواستم بدونم
در fpga مدت زمانی که صرف محاسبه جمع دو عدد می شود چقدر است و ایا تفاوتی با ضرب دو عدد دارد
و سوال دیگه اینکه زمان محاسبه عملگرهای منطقی نظیر بزرگ تر بودن و … چقدر است
سلام،
پاسخ شما در هر FPGA میتواند متفاوت باشد و عدد ثابتی برای آن وجود ندارد. روش صحیح رسیدن به این پاسخ این است که مدار یا عملگر مورد نظرتان را در نرمافزار پیادهسازی کنید و سپس مراحل پیادهسازی را در نرمافزار انجام دهید. در یکی از گزارشهایی که نرمافزار به شما میدهد، پاسخ سوال شما برای FPGAای که در نرمافزار انتخاب کردهاید وجود دارد.
موفق باشید.
سلام وقتتون بخیر
آموزش زبان وریلاگ رو هم دارید
سلام،
آموزشهای سایت ما بر مبنای زبان VHDL است اما مفاهیمی که آموزش داده میشوند عینا در زبان Verilog هم قابل استفاده هستند.
موفق باشید.
سلام. میخواستم بدونم چرا از زبان وریلاگ استفاده نمیکنید؟
و آموزشهایتان بر مبنای VHDL است.
آیا وریلاگ در انجام برخی پروژه ها با مشکل مواجه میشود و یا اینکه بطور کلی VHDL نسبت به وریلاگ برتری هایی دارد؟
ممنون.