شما یک مدل پردازش سیگنال را در محیط نرمافزار MATLAB ایجاد میکنید…
سپس آن را شبیهسازی و عملکرد آن را بررسی میکنید…
عملکرد مدل مطابق با انتظار شما بود؟
حالا فقط با فشردن چند دکمه، آن را تبدیل به یک ماجول قابل پیادهسازی در FPGA میکنید!
بدون کدنویسی!
به نظر جالب میآید…
اما این تمام ماجرا نیست…
More...
در این برنامه ویدئویی، به طور کامل در مورد ابزار System Generator و قابلیتهای آن به کمک یک مثال عملی توضیح خواهم داد.
در این برنامه، به شما نشان خواهم داد تا چه حد میتوانید به این ابزار اتکا کنید و زمان مناسب برای استفاده از آن چه موقع است.
موضوعی که در این برنامه مطرح میشود، یکی از مواردی است که در دوره پردازش سیگنال با FPGA آموزش داده میشود.
اما بحث پردازش سیگنال با System Generator چیزی در حدود یک ساعت از ۲۵ ساعت زمان این دوره را به خود اختصاص میدهد! دلیل این موضوع آن است که شما برای پیادهسازی الگوریتمهای پردازش سیگنال روی FPGA نمیتوانید فقط به System Generator اتکا کنید.
شما برای این کار نیاز به یک درک و بینش عمیق در مورد روشها و تکنیکهای پیادهسازی الگوریتمهای پردازش سیگنال با FPGA دارید و این در حقیقت عمده زمان دوره پردازش سیگنال با FPGA را به خود اختصاص میدهد.
ابزار System Generator به شما کمک میکند یک مدل پردازشی را در نرمافزار متلب ایجاد بکنید، آن را شبیهسازی کنید و سپس تبدیل به یک ماجول قابل پیادهسازی در FPGA کنید. این ماجول مشابه یک IP Core قابل استفاده در پروژه شما خواهد بود.
برای آشنایی با نحوه استفاده از IPها در نرمافزار ISE این برنامه ویدئویی را ببینید...
در این برنامه، یک مثال ساده برای پیادهسازی به کمک System Generator مطرح خواهم کرد و بعد از instant کردن ماجول حاصل از مدل System Generator، آن را شبیهسازی میکنم تا نتیجه نهایی پیادهسازی را بررسی و تست کنیم.
برای آشنایی با نحوه شبیهسازی به کمک نرمافزار ISim این برنامه ویدئویی را ببینید…
این یک برنامه آموزشی طولانی و نسبتا کامل است و پیشنهاد میکنم حتما آن را ببینید و در مواقع مناسب از آنچه در این برنامه میآموزید در پروژههای خودتان استفاده کنید.
ویدئو یا متن؟
محتوای این برنامه آموزشی، به دو صورت ویدئو و متن آماده شده است. اگر علاقمند به یادگیری این مطلب به صورت ویدئویی هستید، ویدئوی زیر را ببینید و اگر ترجیح میدهید آن را به صورت متن مطالعه کنید، ادامه این مطلب را بخوانید.
برای دانلود نسخه با کیفیت این ویدئو، روی دکمه زیر کلیک کنید:
برای دانلود فایل های مدل و کدهای VHDL، روی دکمه زیر کلیک کنید:
در این مقاله قصد دارم در مورد نحوهی پیادهسازی الگوریتمهای پردازش سیگنال با ابزار System Generator صحبت کنم.
ابزار System Generator از همکاری دو شرکت XILINX و Mathwork به وجود آمدهاست. شرکت XILINX، تولیدکننده نرمافزار ISE و شرکت Mathwork، تولید کننده نرمافزار متلب است. به کمک این ابزار، شما میتوانید الگوریتمهای پردازش سیگنال را به صورت خودکار در FPGA پیادهسازی کنید.
اما این ابزار چیست؟
چه کارهایی میتواند انجام دهد؟
و تا چه حدی میتوانیم به این ابزار تکیه کنیم؟
اینها پرسشهایی هستند که در ادامهی این مقاله به آنها پاسخ خواهم داد.
همچنین به کمک یک مثال، نحوه استفاده از ابزار System Generator و پیادهسازی یک الگوریتم ساده روی FPGA به این روش را به شما نشان خواهم داد.
System Generator چیست؟
در پاسخ به سوال "System Generator چیست؟" باید گفت که ابزار System Generator یا به طور خلاصه SysGen، ابزاری است که بین دو نرمافزار پیادهسازی ISE و نرمافزار شبیهسازی Simulink (که بخشی از نرمافزار متلب است)، ارتباط برقرار میکند.
شما میتوانید با ایجاد یک مدل در نرمافزار Simulink و به کمک یک مجموعه از بلوکهای خاص که بلوکهای XILINX نامیده میشوند، یک مدل پردازشی، مشابه هر مدل پردازشی دیگر ایجاد کنید. پس از شبیهسازی این مدل و اطمینان از کارکرد درست آن، میتوانید به صورت خودکار، آن را به یک IP تبدیل کرده و در نرمافزار ISE به راحتی از آن IP استفاده کنید.
این فرآیند در ظاهر بسیار جذاب است و به نظر میرسد میتواند کار ما را بسیار ساده کند. اما واقعا ما تا چه حد میتوانیم به ابزار System Generator متکی باشیم؟
تا چه حد میتوانیم بهجای کدنویسی به ابزار System Generator اتکا کنیم؟
واقعیت این است که شما با ابزار SysGen نمیتوانید یک سیستم کامل را پیادهسازی کنید. در واقع هنوز هم کدی که یک پیادهساز حرفهای برای پیادهسازی یک الگوریتم مینویسد، از بلوکی که یک ابزار SystemGenerator درست میکند، بهینهتر است.
البته به این نکته توجه داشته باشید که بلوکهای پایهای که در تولید مدلهای SystemGenerator به کار میروند، در واقع همان IPهایی هستند که شما در نرمافزار ISE استفاده میکنید. بنابراین، شما میتوانید یک یا چند بلوک پایه را برای تولید یک سیستم کوچک به هم متصل کنید و در نرمافزار متلب آن را شبیهسازی کرده و به نرمافزار ISE منتقل کنید.
این کار تقریبا مانند آن است که شما از یک یا چند IP در ISE استفاده کرده باشید که این موضوع به هیچ وجه مشکلی ندارد و اتفاقا توصیه هم میشود. اما توجه داشته باشید که شما نمیتوانید برای تولید یک سیستم بزرگ و کامل به SysGen تکیه کنید. زیرا همانگونه که پیشتر گفته شد، خروجی این ابزار، نمیتواند به اندازه کدی که مستقیما توسط یک پیادهساز حرفهای ایجاد شده است، برای یک سیستم متوسط یا بزرگ بهینه باشد.
بنابراین من توصیه میکنم که در صورت نیاز، فقط برای بخشهای کوچکی از سیستمتان که پیادهسازی آن در ISE برای شما مشکل است از این ابزار استفاده کنید و هیچگاه به دنبال پیادهسازی کل یک الگوریتم یا یک پروژه به کمک System Generator نباشید؛ چرا که معمولا این کار منجر به نتیجه مطلوبی نخواهد شد.
نکتهی مهم دیگر این است که شما به عنوان یک پیادهساز حرفهای الگوریتمهای پردازش سیگنال با FPGA، باید مسایل، مفاهیم، روشها و تکنیکهای مربوط به پیادهسازی الگوریتمهای پردازش سیگنال با FPGA را به طور کامل بدانید و به آنها اشراف داشته باشید. حتی اگر بخواهید با System Generator کار کنید، تنظیمات و نکات بسیار زیادی هست که فقط شخصی که با پیادهسازی الگوریتمهای پردازش سیگنال بر روی FPGA به طور کلی آشنا است، میتواند این تنظیمات را به درستی انجام دهد.
من افراد زیادی را میشناسم که حتی به کدنویسی به زبان VHDL هم تسلط زیادی ندارند و تقریبا تمام کارهای خودشان را با System Generator انجام میدهند. اصولا این افراد در یک محیط حرفهای نمیتوانند به عنوان فردی که تعیینکننده است و میخواهد مدیریت پروژه را برعهده گیرد، شناخته شوند. نهایتا این افراد میتوانند سیستمها و الگوریتمهای کوچکی را به صورت جزئی پیادهسازی کنند و آنها را وارد یک پروژه بزرگتر کنند.
به شما توصیه میکنم که اگر دنبال این هستید که در کار خودتان، یعنی در مهارت پیادهسازی الگوریتمهای پردازش سیگنال به کمک FPGA، به فردی شاخص در حوزه کاری و محیط کاری خودتان تبدیل شوید، حتما و حتما دو مورد را برای یادگیری در نظر داشته باشید:
مورد اول، تسلط کامل بر کدنویسی اصولی به زبان VHDL یا Verilog و نحوه صحیح استفاده از منابع داخلی FPGA است. این مورد به شما کمک میکند که پیادهسازیها را به صورت بهینه انجام دهید و همچنین بتوانید هدایت و مدیریت پیادهسازی یک پروژه را بر عهده بگیرید.
نکته دومی که باید حتما به آن مسلط باشید، روشها و تکنیکهای پیادهسازی الگوریتمهای پردازش سیگنال در FPGA است. تنها با آگاهی و تسلط به این نکات، روشها و تکنیکها است که شما میتوانید در صورت نیاز به استفاده از System Generator، آن را به نحو مناسب و بهینه و با دید باز و بینش کافی استفاده کنید. در غیر اینصورت، شما هیچ وقت نمیتوانید در محیط کار حرفهای خودتان به یک فرد تعیینکننده و شاخص تبدیل شوید.
نحوهی استفاده از System Generator
همانطور که اشاره شد، شما میتوانید به کمک System Generator، بلوکهای کوچکی را به کمک FPGA پیادهسازی کنید تا این بلوکها در یک سیستم بزرگتر استفاده شوند.
اجازه دهید با ذکر یک مثال ساده وارد مبحث نحوه استفاده از System Generator جهت پیادهسازی خودکار الگوریتمهای پردازش سیگنال در FPGA شویم.
اتصال نرمافزار ISE و MATLAB
برای استفاده از ابزار System Generator علاوه بر نرمافزار ISE، به نرمافزار متلب نیز نیاز داریم و میبایست آن را روی کامپیوترتان نصب کنید.
به این نکته هم دقت داشته باشید که ممکن است برخی نسخههای نرمافزار متلب با نرمافزار ISE همخوانی نداشته باشند و نتوانند به هم متصل شوند. من شخصاً از آخرین نسخه نرمافزار ISE و نسخه 2012b نرمافزار متلب استفاده میکنم و برای استفاده از System Generator به مشکلی برنخوردهام.
پس از نصب هر دو نرمافزار ISE و MATLAB، در مرحله اول باید نرمافزار System Generator و نرمافزار ISE را به هم لینک کنید.
برای این کار ابتدا باید طبق شکل زیر وارد منوی Start ویندوز شده، سپس در قسمت پروگرامهای ویندوز، وارد بخش فایلهای نرمافزار XILINX شوید.
همانطور که در شکل زیر میبینید، در زیربخشهای XILINX Design Tools گزینه System Generator Matlab Configuration وجود دارد که روی آن کلیک میکنیم.
همانطور که در شکل زیر میبینید پس از کلیک، پنجرهای ظاهر میشود که در آن، نسخه نرمافزار متلب نصب شده روی کامپیوتر شما را پیدا کرده و نشان میدهد. شما باید آن را Select کرده و دکمه Apply را کلیک کنید تا این دو نرمافزار به یکدیگر لینک شوند. اگر این دو نرمافزار قبلا به هم متصل شده باشند، کلمه Configured در قسمت Status گزارش میشود و دکمه Apply غیرفعال خواهد بود.
ساخت مدل و انجام تنظیمات آن در محیط متلب
حال نرمافزار متلب را اجرا کنید. طبق شکل زیر و از منوی Home، گزینه Simulink Library را انتخاب کنید.
با انتخاب این گزینه، پنجره Simulink Library Browser که شامل Block Setها و Tool Boxهای نرمافزار Simulink است، باز میشود. در این پنجره مشاهده میکنیم که مجموعه بلوک جدیدی در انتهای لیست، به نام Xilinx Block Set ایجاد شده است و شما در آن تعداد زیادی از بلوکهای مختلف را میتوانید ببینید.
اما فرق این بلوکها با بلوکهای معمول نرمافزار Simulink، این است که مدل شامل این بلوکها را میتوان علاوه بر مدلسازی و شبیهسازی در نرمافزار Simulink، تنها با چند کلیک تبدیل به یک IPی قابل پیادهسازی در نرمافزار ISE کرد.
بنابراین پس از تولید IP، میتوانید آن را در پروژهی خودتان اضافه کرده و پیادهسازی کنید. در واقع شما با این کار میتوانید یک عملیات خودکار پیادهسازی از مرحلهی مدلینگ به مرحلهی پیادهسازی در نرمافزار ISE داشته باشید.
همانطور که در شکل مشاهده میکنید، ما در بخش XILINX Block Set مجموعه بلوکهای بسیار متنوعی داریم. مثلا در زیربخش Basic Elements، شما میتوانید بلوکهای Constant ،Counter ،Delay ،LFSR MultiPlexer و بلوکهای مختلف دیگر را ببینید.
در زیربخش DSP نیز مطابق شکل زیر، بلوکهای پردازشی مثل انواع فیلتر، الگوریتم کوردیک و غیره وجود دارند.
همچنین در زیربخش Math، بلوکهای ریاضی مثل قدر مطلق، کوردیک، ضربکننده، شمارنده، تقسیمکننده و انواع بلوکهای مختلف دیگر وجود دارند. (شکل زیر)
اما سوالی که مطرح میشود این است که چطور مراحل مختلف درست کردن یک مدل را انجام دهیم و آن را در FPGA پیادهسازی کنیم. برای این کار، ابتدا باید یک مدل جدید Simulink را در نرمافزار متلب، ایجاد کنید. بنابراین مطابق شکل زیر، از منوی Home، گزینهی New را کلیک کرده و سپس Simulink Model را انتخاب کنید.
پس از باز شدن یک مدل جدید، میتوانید بخش Library را دوباره باز کنید و بلوکهایی که لازم دارید را از بلاکستهای مربوط به XILINX، وارد کرده و شروع به مدلسازی کنید.
فرض کنید ما میخواهیم مثال سادهی شمارنده را پیادهسازی کنیم. بنابراین مطابق شکل زیر، در پنجره Library و از بخش XILINX Block Set به زیربخش Basic Element میرویم و بلوک Counter را انتخاب کرده و به صورت Drag & Drop به مدل خود اضافه میکنیم.
برای تغییر تنظیمات بلوک Counter میتوانید روی آن دبلکلیک کنید تا پنجره تنظیمات ظاهر شود. شما میتوانید مطابق شکل زیر، نوع Counter را به صورت Free Running یا Counter Limited انتخاب کنید.
Free Running یعنی شمارنده از صفر شروع به شمردن میکند و شمارش را تا آخرین عددی که با توجه به تعداد بیتش ممکن است، ادامه میدهد. سپس مقدار شمارنده صفر میشود و دوباره از ابتدا شروع به شمردن میکند و همینطور الی آخر.
Counter Limit یعنی این که شما میتوانید در قسمت Count to value، مقداری را بنویسید تا شمارش تا آن مقدار انجام شود و بعد دوباره به صفر برگردد.
در اینجا ما گزینه Free Running را انتخاب میکنیم و به سراغ بخش بعدی تنظیمات میرویم. در قسمت Count direction شما میتوانید جهت شمارش را مشخص کنید. جهت شمارش میتواند افزایشی، کاهشی یا هردو باشد.
اگر Updown را انتخاب کنید و در پایین پنجره تنظیمات، گزینهی Apply را کلیک کنید، در محیط مدل خود میبینید که یک پورت ورودی به بلوک شمارنده اضافه میشود که صفر یا یک بودنش میتواند جهت شمارش را مشخص کند.
در قسمت Output میتوانید نوع خروجی را از بین دو گزینهی Signed (یعنی علامتدار به صورت two's complement) و Unsigned (یعنی بدون علامت) مشخص کنید که ما معمولا خروجی را به صورت Unsigned برای شمارنده مشخص میکنیم.
در قسمت بعد، میتوان عرض بیت خروجی را مشخص کرد. در اینجا به طور پیشفرض، مقدار هشت نوشته شده است که ما همین مقدار را انتخاب میکنیم. یعنی شمارنده از صفر تا ۲۵۵ میشمارد و بعد دوباره صفر میشود و به شمارش ادامه میدهد. در بخش بعد، اگر لازم باشد، میتوانید نقطه باینری یا نقطه کسری را مشخص کنید که ما در این مثال نیازی به آن نداریم و مقدار پیشفرض صفر را تغییر نمیدهیم.
در پنجرهی تنظیمات، tabها یا زبانههای دیگری نیز وجود دارد. برای مثال در زبانهی Implementation میتوانید انتخاب کنید که شمارندهی شما به کمک Fabric پیادهسازی شود یا برای پیادهسازی آن از بلوک DSP48 استفاده شود؛ پیادهسازی به کمک Fabric یعنی پیادهسازی با استفاده از LUTهایی که در FPGA وجود دارد. اما اگر لازم باشد، میتوانید آن را به کمک بلوک DSP48 که یک بلوک سختافزاری از قبل آماده شده در FPGA است، پیاده سازی کنید.
بعد از این که تنظیمات را انجام دادید، دکمه OK را انتخاب کنید.
در مدلهایی که با بلوکهای XILINX پیادهسازی میشوند و قرار است آنها را در FPGA پیادهسازی کنیم، حتما باید بلوک خاصی به اسم System Generator وجود داشته باشد. آیکن بلوک System Generator، لوگوی شرکت XILINX است.
برای اضافه کردن این بلوک به مدلتان، از منوی Home در نرمافزار متلب، روی گزینه Simulink Library کلیک کنید. سپس در پنجره باز شده روی XILINX Block Set کلیک کنید و سپس با کلیک روی زیربخش Basic Element، میتوانید بلوک System Generator را بینید. این بلوک را به روش Drag & Drop به مدلتان اضافه کنید.
بنابراین، بلوک System Generator حتما باید در هر طرحی که قرار است در FPGA پیادهسازی شود، وجود داشته باشد. وقتی که این بلوک را به مدلتان اضافه کردید، باید تنظیماتی روی آن انجام دهید. با دبل کلیک روی بلوک، پنجره تنظیمات آن مطابق شکل زیر باز میشود.
در قسمت Compilation، از بین گزینههای موجود مانند HDL NetlistNGC Netlist و... میتوانید مشخص کنید که خروجی شما به چه صورت باشد. من گزینهی NGC Netlist (یعنی بعد از مرحله سنتز باشد) را انتخاب میکنم.
در قسمت Part، مطابق شکل زیر، نوع FPGAای که قرار است مدل خود را روی آن پیادهسازی کنید را مشخص میکنید. برای مثال، من میتوانم FPGAای که روی بردهای فراد 1 هست را انتخاب کنم، یعنی SPARTAN-6 LX9 با Speed Grade برابر با ۲- و پکیج TQG144.
در قسمت بعد، باید نام نرمافزار سنتزتان را مشخص کنید. من نرمافزار XST (مخفف XILINX Synthesis Tool) را انتخاب میکنم. برای کدنویسی نیز، زبان توصیف سختافزار VHDL را انتخاب میکنم.
در قسمت Target Directory، مشخص میکنید که حاصل این پیادهسازی در کجا ذخیره شود. شما میتوانید همان فولدر پروژهای را که میخواهید پیادهسازی کنید، انتخاب کنید یا یک پوشهی جداگانه برای آن در نظر بگیرید.
در تنظیمات بخش کلاکینگ، شما باید فرکانس کلاکی که قصد دارید در نهایت و پس از پیادهسازی این کد، به این ماژول اعمال کنید را مشخص کنید. بنابراین میبایست در بخش FPGA Clock Period، پریود کلاک موردنظرتان را وارد کنید. من قصد دارم فرکانس ۱۰۰ مگاهرتز را اعمال کنم؛ بنابراین پریود کلاک را برابر با ۱۰ نانوثانیه وارد میکنم.
در قسمت Clock pin location، شماره پینی از FPGA که کلاک به آن متصل است را مشخص میکنید. در بردهای فراد ۱، کلاک بیرونی، یعنی اسیلاتور، به پین شماره P85 وصل شده است.
در قسمت Simulink System Period نیز باید پریود یا استپهای زمانی شبیهسازی در Simulink را مشخص کنید که من معمولا آن را برابر با همان پریود کلاک قرار میدهم. بنابراین در کادر مربوط به آن، عدد 10e-9 یعنی ۱۰ نانوثانیه را مینویسم.
پس از انجام این تنظیمات، میتوانید دکمهی OK را انتخاب و تنظیمات را نهایی کنید.
فرض کنید که تمام آن چیزی که شما قرار هست در FPGA پیاده کنید، همین Counter است. (در عمل، قاعدتا مدار شما پیچیدهتر است و نیاز است تعداد زیادی بلوک استفاده کنید.) در هر صورت، پس از استفاده از بلوکهای مخصوص XILINX در محیط Simulink، قاعدتا میخواهید ابتدا آنها را در نرمافزار متلب شبیهسازی کنید و پس از آنکه از شبیهسازی مطمئن شدید، پیادهسازی را انجام دهید.
برای شبیهسازی این بلوکها، میتوانید به عنوان ورودی و خروجی از همان بلوکهای عادی نرمافزار متلب استفاده کنید. مثلا برای اعمال ورودی به پورت Up_Down که مشخص کنندهی جهت شمارش کانتر است، میتوانید مطابق شکل زیر، در پنجرهی Libraryها، از زیربخش Simulink، گزینهی Source را انتخاب کنید و از آنجا بلوک Constant را به مدل خود اضافه کنید.
دلیل انتخاب این بلوک این است که تنها ورودی مدار من، ورودی تکبیتی Up_Down است؛ بنابراین من ورودی Constant را انتخاب میکنم که بتوانم مقدار یک یا صفر را به این ورودی اعمال کنم.
برای مشاهده وضعیت قسمت خروجی مدار نیز به یک بلوک دیگر نیاز داریم. برای این کار، یک بلوک Scope را از مسیر نشان داده شده در شکل زیر، به مدل خودمان اضافه میکنیم.
اما نکتهای که وجود دارد این است که شما نمیتوانید بلوکهای مربوط به XILINX را مستقیما به ورودیها، خروجیها و بهطور کلی به بلوکهای مربوط به Simulink متصل کنید. برای این کار باید مرزی بین آنها مشخص کرد. این مرز در واقع همان پورتهای ماژولی است که قرار است پیادهسازی شود.
برای مشخص کردن این مرز یا به عبارت دیگر، پورتهای ماژولتان، مجددا باید به قسمت XILINX Block Set برویم و در قسمت Basic Element، دو بلاک به نامهای Gateway in و Gateway out را وارد مدل کنیم.
از Gateway in به عنوان پورتهای ورودی مدارتان یا به عنوان مرز بین پورتهای ورودی و بلوکهایی که مربوط به نرمافزار Simulink هستند و از Gateway out به عنوان پورتهای خروجی و یا به عنوان مرز بین پورتهای خروجی ماژول و بلوکهایی که مربوط به بلوکهای عادی نرمافزار Simulink هستند استفاده میکنیم.
حالا باید سیمبندیها را انجام دهیم. بنابراین بلوکها را به نحو مشخص شده در شکل زیر، به هم متصل میکنیم.
برای بلوک Gateway in نیز تنظیماتی وجود دارد. اگر روی آن دبل کلیک کنیم، پنجرهی تنظیمات باز میشود. مطابق شکل زیر، میتوانیم نوع خروجی یا Output Type را از میان یکی از گزینههای Boolean ،Fixed Point و یا Floating Point انتخاب کنیم.
با توجه به این که پورت ورودی در این مثال یکبیتی است، من گزینهی Boolean را انتخاب میکنم. اگر پورتمان برداری (یعنی چندبیتی) بود، میتوانستیم گزینهی Fixed Point را انتخاب کنیم.
همچنین میتوانیم یک Sample Period برای Gateway in تعریف کنیم که من Sample Period را برابر با همان مقدار کلاکی که قرار است به مدار اعمال کنم، قرار میدهم و بنابراین در کادر مربوط، مقدار ۱۰ نانوثانیه را وارد میکنم.
پس از انجام تنظیمات، دکمه OK را کلیک کنید.
برای Gateway out تنظیمی وجود ندارد و در حال حاضر مدل ما کامل است.
شبیهسازی در متلب
میتوانیم قبل از این که سراغ پیادهسازی برویم، آن را شبیهسازی کنیم؛ بنابراین دکمه شبیهسازی را انتخاب میکنیم و اندکی صبر میکنیم تا شبیهسازی به اندازه مشخصی از زمان انجام شود.
پس مدتی از شروع شبیهسازی، میتوانیم آن را متوقف کنیم و خروجی را در Scope مشاهده کنیم.
همانطور که در شکل زیر میبینید، شمارش از صفر تا حدود ۸۰ انجام شده است و اگر شبیهسازی را برای مدت زمان بیشتری انجام میدادیم، این شمارش میتوانست تا ۲۵۵ ادامه پیدا کند و دوباره از صفر شروع شود و همینطور ادامه پیدا کند.
البته چون در حال استفاده از بلوکهای XILINX هستیم، شبیهسازی مقداری کند است؛ بنابراین، برای مشاهده نتایج شبیهسازی باید نسبت به مدت زمانی که عملکرد مدار در آن شبیهسازی میشود، زمان بیشتری صبر کنیم.
ساخت IP از مدل متلب
حال که از صحت عملکرد مدار خود مطمئن شدیم، میتوانیم این مدار را به صورت یک IP پیادهسازی کنیم و بعداً از آن در پروژه خود استفاده کنیم.
برای این کار کافی است که شما دوباره روی بلوک System Generator دبلکلیک کرده و روی دکمهی Generate کلیک کنید. بعد از کلیک روی دکمه Generate، این بلوک ساخته و سنتز میشود و به صورت یک IP، آمادهی استفاده خواهد بود. توجه داشته باشد که این مرحله، یک مرحله زمان بر است.
تا اینجای کار، شما یک IP را به کمک ابزار System Generator در نرمافزار متلب آماده کردید. سپس آن را شبیه سازی کردید و از درستی عملکرد آن مطمئن شدید. اکنون کافی است که این IP را مثل هر IPی دیگری به پروژه خود اضافه و از آن استفاده کنید.
استفاده از IPی ساخته شده در نرمافزار ISE
همانطور که میبینید، من کد سادهای را آماده کردهام تا بتوانم از IPای که به کمک System Generator ساختیم، استفاده کنم.
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity Counter_Top is Port ( Clock : in STD_LOGIC; Up_Down : in STD_LOGIC; Counter_Out : out unsigned (7 downto 0) ); end Counter_Top; architecture Behavioral of Counter_Top is signal Counter_Out_Int : std_logic_vector (7 downto 0) := (others=>'0'); begin end Behavioral;
تاپ ماژول من، یک ماژول ساده است که یک ورودی کلاک و یک ورودی Up_down دارد. ورودی Up_Down قرار است به ورودی Up_Down ماژولی که در نرمافزار Simulink ساختهایم متصل شود. همچنین خروجی Counter Out به خروجی شمارندهای که در Simulink ساختهایم متصل خواهد شد.
در اولین مرحله، باید IP خود (یعنی ماژولی را که به کمک System Generator ساختهایم) را به پروژه Add کنیم. برای این کار، مطابق شکل زیر، در منوی سمت چپ و در قسمت Hierarchy کلیک راست میکنیم و گزینهی Add Source را انتخاب میکنیم.
حال به پوشهای از کامپیوتر که در آن، خروجی سنتز شدهی بلوک System Generator را ذخیره کرده بودیم میرویم. اکنون فایل با پسوند sgp. را انتخاب میکنیم و با دبلکلیک روی این فایل، آن را به پروژهمان اضافه میکنیم. از این مرحله به بعد، کارمان کاملا شبیه کار با IPهاست.
اگر فکر میکنید که تسلط کافی برای استفاده از IPها را ندارید، پیشنهاد میکنم برنامهی نحوه استفاده از IPها را از این لینک ببینید.
برای استفاده از این IP، همانند روندی که همیشه در استفاده از IPها داشتیم روی آن کلیک میکنیم و همانطور که در شکل میبینید، روی گزینه View HDL Instantiation Temperate در منوی پایین، دبلکلیک میکنیم.
نرمافزار به طور خودکار، برای ما کدی را آماده میکند که بخشهای Component Declaration و Instant را در خود دارد.
شما باید این دو بخش را همانند آنچه در زیر مشاهده میکنید، در کد تاپ ماژولتان، کپی کنید. سپس در قسمت Instant عمل Port Map را انجام دهید؛ درواقع باید اتصالات بین IP و تاپ ماژول را به نحو درستی ایجاد کنید.
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity Counter_Top is Port ( Clock : in STD_LOGIC; Up_Down : in STD_LOGIC; Counter_Out : out unsigned (7 downto 0) ); end Counter_Top; architecture Behavioral of Counter_Top is COMPONENT counter_sysgen_cw PORT( ce : IN std_logic; clk : IN std_logic; gateway_in : IN std_logic; gateway_out : OUT std_logic_vector(7 downto 0) ); END COMPONENT; signal Counter_Out_Int : std_logic_vector (7 downto 0) := (others=>'0'); begin Counter_Out <= unsigned(Counter_Out_Int); Inst_counter_sysgen_cw: counter_sysgen_cw PORT MAP( ce => '1', clk => Clock, gateway_in => Up_Down, gateway_out => Counter_Out_Int ); end Behavioral;
شبیهسازی IP در نرمافزار ISE
تا اینجای کار، ما یک تاپ ماژول به نام Counter_top ایجاد کردیم و در آن، Counterای که در نرمافزار Simulink به کمک ابزار System Generator ساخته بودیم را به صورت یک IP، Instant کردیم. اکنون میتوانیم از آن استفاده کنیم.
حال برای انجام یک تست نهایی، میتوانیم این IP را شبیهسازی کنیم. برای شبیهسازی، شما باید یک تستبنچ بسازید. اگر فکر میکنید در زمینه شبیهسازی و ساخت تستبنچ هم نیاز به اطلاعات بیشتری دارید، میتوانید برنامه نحوهی شبیهسازی به کمک نرمافزار ISim را در این لینک مشاهده کنید.
پس از ساخت تستبنچ، مانند شکل زیر، گزینه Simulation را انتخاب کنید.
در کد تستبنچ، تاپ ماژول ما Instant شده است و تنها کاری که لازم است انجام دهیم این است که در انتهای کد، ورودیها را جهت شبیهسازی مقداردهی کنیم.
LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.numeric_std.ALL; ENTITY Counter_Top_tb IS END Counter_Top_tb; ARCHITECTURE behavior OF Counter_Top_tb IS -- Component Declaration for the Unit Under Test (UUT) COMPONENT Counter_Top PORT( Clock : IN std_logic; Up_Down : IN std_logic; Counter_Out : OUT unsigned(7 downto 0) ); END COMPONENT; --Inputs signal Clock : std_logic := '0'; signal Up_Down : std_logic := '0'; --Outputs signal Counter_Out : unsigned(7 downto 0); -- Clock period definitions constant Clock_period : time := 10 ns; BEGIN -- Instantiate the Unit Under Test (UUT) uut: Counter_Top PORT MAP ( Clock => Clock, Up_Down => Up_Down, Counter_Out => Counter_Out ); -- Clock process definitions Clock_process :process begin Clock <= '0'; wait for Clock_period/2; Clock <= '1'; wait for Clock_period/2; end process; -- Stimulus process stim_proc: process begin -- hold reset state for 100 ns. wait for 100 ns; wait for Clock_period*10; -- insert stimulus here Up_Down <= '1'; wait; end process; END;
چون فقط یک ورودی به نام Updown داریم، فقط باید مقدار آن را تعیین کنیم که من مقدار آن را برابر با یک قرار دادهام.
البته همان طور که در خط ۵۰ام کد میبینید، مقدار پیشفرض یا مقدار اولیه Up_Down صفر است.
در خط ۸۱ کد نیز به اندازهی ۱۰۰ نانوثانیه تاخیر داریم. همچنین در خط ۸۲ کد، به اندازهی ۱۰ کلاک که برابر است با ۱۰۰ نانوثانیه تاخیر اعمال شده است. مجموع این دو تاخیر ۲۰۰ نانوثانیه میشود؛ بنابراین تا ۲۰۰ نانوثانیهی اول شبیهسازی، Up_Down صفر است و پس از آن، Up_Down یک میشود.
پس ما میتوانیم در شبیه سازی، رفتار شمارنده را هم در حالتی که Up_Down صفر است و هم در حالتی که یک است، ببینیم.
حال که تستبنچ کامل شده است، میتوانیم روی تستبنچ کلیک کنیم و مطابق شکل زیر، از منوی پایین و سمت چپ صفحه، روی گزینه Simulate Behavioral Model دبلکلیک کنیم تا نرمافزار ISim، یعنی نرمافزار شبیهساز مجموعهی ISE، از دل نرمافزار ISE اجرا شود. همانطور که میدانید، این شبیهسازی همیشه به مدت یک میکروثانیه انجام میشود.
برای اینکه بتوانیم عددهای ورودی و خروجی را بهتر ببینیم، مطابق شکل، روی آنها کلیک راست میکنیم و از بخش Radix گزینه Unsigned Decimal را انتخاب میکنیم تا عددها به صورت دسیمال دربیاید.
برای اینکه بتوانیم کل شبیهسازی به مدت یک میکروثانیه را در یک قاب ببینیم، مطابق شکل روی دکمه zoom to full view کلیک میکنیم.
همانطور که در شکل میبینید، ورودی Up_Down تا لحظه ۲۰۰ نانوثانیه، صفر بوده و از آنجا به بعد، یک میشود.
درشکل زیر، قسمت شمارش مشخص شدهاست. برای این که ببینیم در این قسمت دقیقا چه اتفاقی میافتد، به کمک گزینه zoom in، سیگنال خروجی را باز میکنیم. حالا میبینید که در قسمتی که Up_Down برابر با صفر است، شمارش به صورت نزولی و در قسمتی که مقدار Up_Down برابر با یک است، شمارش به صورت صعودی انجام شده است.
به این ترتیب ما توانستیم یک مدار ساده را به کمک ابزار System Generator پیادهسازی و شبیهسازی کنیم. فایلهایی که در این پیادهسازی و شبیهسازی استفاده شده است، در همین صفحه و از طریق گزینهی زیر قابل دانلود هستند.
امیدوارم از خواندن این مقاله هم لذت برده باشید و بتوانید از نکات یاد گرفته شده، در انجام پروژههایتان استفاده کنید.
برای دانلود فایل های مدل و کدهای VHDL، روی دکمه زیر کلیک کنید:
آیا برنامه ویدئویی پیادهسازی الگوریتمهای پردازش سیگنال با System Generator برای شما مفید بود؟
لطفا نظرتان را در مورد این برنامه در پایین همین پست با دیگران به اشتراک بگذارید. همچنین با کلیک روی هر کدام از دکمههای اشتراک گذاری ابتدای این مطلب و به اشتراکگذاری آن در شبکههای اجتماعی میتوانید افراد بیشتری را در یادگیری این مطالب سهیم کنید.
سلام استاد،
اگه امکان داره توضیح بدید که چرا در کد کامپنت شده که به وسیله sysgen تولید میشه یک ورودی کلاک داخل کد برنامه ایجاد میشه. اما اگه قرار باشه دقیقا همون برنامه که در sysgen نوشتیم رو بصورت کد vhdl داخل نرم افزار ISE بنویسیم نیازی به ورودی کلاک نیست؟؟؟
متشکرم
سلام،
اگر همان ماجول را مستقیم به صورت VHDL پیادهسازی میکردید هم نیاز به کلاک بود. در این مثال، یک شمارنده را پیادهسازی کردیم و شمارنده، یک ماجول ترتیبی سنکرون است که نیاز به کلاک دارد.
موفق باشید.
سلام ….من می خواستم یه سوال درباره قابلیت sysgen بپرسم هرچند به این جلسه مربوط نیست…به هر حال من عذر می خوام بابتش.
من مثال خودتون که درباره کانتر بود و در اون پست مربوط به sysgen که گذاشته بودین که در اون باید فایل vhdl و فایل .sgp رو اضافه میکردیم به کار بردم و موقع instantiation temple با مشکل مواجه شدم …در واقع عمل instant رو انجام نمیده و ودر صفحه ادیتور ise کد componentو instant نمیاد …یه پیامی میاد که انگار جلوی اینکار میگیره ..تو پیام نوشته که باید به فایل با پسوند .tfi مراجعه کنید تا instant انجام بشه …در حالی که این پسوند از داخل ise اصلا باز نمیشه ؟
سلام،
ما با این خطا تا به حال برخورد نکردهایم. اگر تمام مراحل را به طور دقیق پیش بروید قاعدتا نباید با این مشکل برخورد کنید. پیشنهاد میکنم مجددا و با دقت این کار را تکرار کنید.
در عین حال میتوانید پیام خطا را اینجا کپی کنید. شاید راهحلی از متن آن مشخص شود.
موفق باشید.
عرض سلام و تشکر خاطر اموزش خوبتون.
یک سوالی ازتون دارم استاد، اینکه با این روش آیا میشه نتیجه خروجی برنامه ise به طور خودکار روی برنامه متلب پیاده بشه؟
در واقع کاری که من میخوام انجام بدم اینه که تصویر از طریق متلب فراخوانی میشه و اطلاعات اون برای پردازش به ise منتقل بشه و بعد نتایج پردازش برای نمایش دوباره به متلب برگرده، حالا میخوام این فرایند بدون اینکه مدام برنامه ها باز بشن انجام بشه. یعنی همینکه برنامه متلب شروع میشه و عکس اولیه نمایش داده شد بعد از مدتی نتیجه کارهم مشخص بشه. با این روش میتونم به این ایده برسم؟
سلام،
این قابلیت در نرمافزار متلب وجود دارد اما تا جایی که به خاطرم دارم با نرمافزار ModelSim و متلب میتوانید این لینک را برقرار کنید. البته شما باید این موضوع را جستجو و بررسی کنید چون من این کار را چندین سال پیش انجام دادم و قطعا تغییرات زیادی تا به امروز اتفاق افتاده است.
موفق باشید.
عرص سلام و وقت بخیر
آیا راهی هست که خروجی نمایش داده شده در scop رو به صورت تصویر مشاهده کنیم؟
چون اطلاعات خروجی من اطلاعات پردازش شده یک عکس هست.
سلام،
در اسکوپ استاندارد چنین قابلیتی وجود ندارد. ممکن است در بخش مربوط به پردازش تصویر چنین امکانی وجود داشته باشد اما من از آن اطلاعی ندارم.
موفق باشید.
سلام، خیلی آموزش عالی بود، ممنون بابتش
ولی چند سوال برام پیش اومد، اگر وقت کردید در مورد حتی یکیش هم توضیح بدید ممنون میشم،
1) من دو پروژه تعریف کردم، در یکی یک فیلتر FIR با استفاده از ip core درون نرم افزار xilinx استفاده کردم و در دیگری همین فیلتر با تنظیمات یکسان رو از طریق sysgen درست کردم و در پروژه دوم آوردم.(علاوه بر تنظیمات داخلی نسخه هردو ip استفاده شده نیز یکسان 6.2 میباشد) ولی بعد از سنتز منابع سخت افزاری استفاده شده در دو پروژه باهم فرق داره!!(در design summary نرم افزار ise 14.7 بررسی کردم) سوالم اینکه در یک پروژه بزرگ این اختلاف ممکنه خیلی زیاد بشه به نحوی که پیاده سازی با یکی بر دیگری ترجیح داده بشه؟!
کلا یکم بیشتر در مورد تفاوت این دو توضیح بدید ممنون میشم
2) در تنظیمات بلوک system generator امکان داره گزینه های مختلف بخش compilation رو یکم توضیح بیشتر بدید؟! این حالتی که شما انتخاب کردید و توضیح دادید بعد از سنتز یعنی چی؟ از این لحاظ که اگر مثلا گزینه قبل رو انتخاب کنیم نمیتونیم در کدمون اون رو instant کنیم؟!
سلام، ممنون از شما.
۱- تا جایی که من میدانم، این دو فیلتر باید یکسان باشند و اگر هم تفاوتهایی در مقدار منابع مصرفی مشاهده میکنید ممکن است به دلیل این باشد که مثلا در روش SysGen بخشهای اضافهای خارج از IP به پروژه اضافه شده است اما قاعدتا بسیار ناچیز است و در یک پروژه بزرگ هم نباید تفاوت محسوسی ایجاد کند.
۲- وقتی یک ماجول را از طریق سیستم جنراتو ایجاد میکنید این امکان را دارید که مشخص کنید این ماجول در سطح کد HDL ایجاد شود یا مثلا یک مرحله بعدتر از آن و در سطح ماجول سنتز شده ایجاد شود. این کاری است که در بخش Compilation انجام میدهید.
موفق باشید.
این مسئله که بلوکی که با sysgen پیاده می شود به اندازه کد vhdl یک شخص حرفه ای بهینه نیست اشتباه هست. شما می توانید برای مقایسه به نتایج implementation رجوع کنید، آنچه که sysgen تولید می کند netlist هست. در این بین تعداد منابع استفاده شده، اعم از LUT ها flip flop ها و ضرب کننده ها باید مقایسه شوند که هیچ تفاوتی وجود ندارد. پیاده سازی بلوک های پردازشی در sysgen بسیار بهینه هست. هر فرد حرفه ای در vhdl نویسی ابتدا بلوک دیاگرام دقیق از سیستم را طراحی و سپس آن بلوک دیاگرام را توصیف می کند. بدون طراحی دقیق بلوک دیاگرام، کد نویسی با vhdl بسیار نا کارامد خواهد بود. بعد از طراحی، توصیف بیشتر یک عملیات ماشینی هست. در ابزاری مثل sysgen، شما بلوک دیاگرام را طراحی و با کامپایل کردن نرم افزار این توصیف را انجام می دهد. نباید برنامه نویسی برای fpga با برنامه نویسی برای dsp ها و cpu ها اشتباه گرفته شود.
اگر این ویدئو را به طور دقیق ملاحظه کنید در آن گفته شده است که بلوکهای پردازشی موجود در System Generator در حقیقت همان IPهای موجود در نرمافزار پیادهسازی است که استفاده از آنها بسیار هم توصیه میشود چون هم فرآیند پیادهسازی را بسیار تسریع میکنند و هم بسیار بهینه هستند. نکتهای در آموزش وجود داشت این است که برای پیادهسازی یک پروژه بزرگ که دارای دهها ماجول مختلف است نمیتوان به طور کامل به این ابزار اتکا کرد و در این حالت پیادهسازی یک فرد حرفهای نتیجه بهتری خواهد داد. در عین حال، در همین حالت هم ممکن است بخشهایی با System Generator پیادهسازی شده باشد.
موفق باشید.
“برای پیادهسازی یک پروژه بزرگ که دارای دهها ماجول مختلف است نمیتوان به طور کامل به این ابزار اتکا کرد و در این حالت پیادهسازی یک فرد حرفهای نتیجه بهتری خواهد داد”
این جمله درست نیست. بعنوان کسی که بیش از 12 سال تجربه پیاده سازی با vhdl و با sysgen برای fpga های کوچک و بزرگ و پروه های باز سبک و بسیار پیچیده انجام داده.
خواهد پند گیرید خواه ملال.
ممنون از اینکه نظرتان را با ما به اشتراک گذاشتید.