پردازش سیگنال با System Generator

پیاده‌سازی الگوریتم‌های پردازش سیگنال با System Generator

شما یک مدل پردازش سیگنال را در محیط نرم‌افزار 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 وجود دارد که روی آن کلیک می‌‌کنیم.

SysGen-MATLAB Configurator

انتخاب نرم‌افزار ارتباط‌دهی ISE و MATLAB

همان‌‌طور که در شکل زیر می‌‌بینید پس از کلیک، پنجره‌‌ای ظاهر می‌‌شود که در آن، نسخه نرم‌‌افزار متلب نصب شده روی کامپیوتر شما را پیدا کرده و نشان می‌‌دهد. شما باید آن را Select کرده و دکمه Apply را کلیک کنید تا این دو نرم‌‌افزار به یکدیگر لینک شوند. اگر این دو نرم‌‌افزار قبلا به هم متصل شده باشند، کلمه Configured در قسمت Status گزارش می‌‌شود و  دکمه Apply غیرفعال خواهد بود​.

نحوه‌ی ​برقراری ارتباط MATLAB و ISE

نحوه‌ی ​برقراری ارتباط MATLAB و ISE

ساخت مدل و انجام تنظیمات آن در محیط متلب

حال نرم‌‌افزار متلب را اجرا کنید. طبق شکل زیر و از منوی Home، گزینه Simulink Library را انتخاب کنید.

باز کردن پنجره‌ی Simulink Block Library

​انتخاب گزینه‌ی Simulink Block Library

با انتخاب این گزینه، پنجره Simulink Library Browser که شامل Block Set‌‌ها و Tool Box‌‌های نرم‌‌افزار Simulink است، باز می‌‌شود. در این پنجره مشاهده می‌‌کنیم که مجموعه بلوک جدیدی در انتهای لیست، به نام X​ilinx Block Set ایجاد شده است و شما در آن تعداد زیادی از بلوک‌‌های مختلف را می‌‌توانید ببینید.

نمایش مجموعه بلوک‌های Xilinx در پنجره‌ی کتابخانه‌های Simulink متلب

​مجموعه بلوک‌های Xilinx در پنجره‌ی کتابخانه‌های Simulink متلب

اما فرق این بلوک‌‌ها با بلوک‌‌های معمول نرم‌‌افزار Simulink، این است که مدل شامل این بلوک‌‌ها را می‌‌توان علاوه بر مدل‌‌سازی و شبیه‌‌سازی در نرم‌‌افزار Simulink، تنها با چند کلیک تبدیل به یک IPی قابل پیاده‌‌سازی در نرم‌‌افزار ISE کرد.

بنابراین پس از تولید IP، می‌‌توانید آن را در پروژه‌‌ی خودتان اضافه کرده و پیاده‌‌سازی کنید. در واقع شما با این کار می‌‌توانید یک عملیات خودکار پیاده‌‌سازی از مرحله‌‌ی مدلینگ به مرحله‌‌ی پیاده‌‌سازی در نرم‌‌افزار ISE داشته باشید.

همان‌‌طور که در شکل مشاهده می‌‌کنید، ما در بخش XILINX Block Set مجموعه بلوک‌‌های بسیار متنوعی داریم. مثلا در زیربخش Basic Elements، شما می‌‌توانید بلوک‌‌های Constant​ ،Counter​ ،Delay​ ،LFSR​ MultiPlexer و بلوک‌‌های مختلف دیگر را ببینید.

نمایش ​بلوک‌های قسمت Basic Elements از مجموعه بلوک‌های Xilinx

​بلوک‌های قسمت Basic Elements از مجموعه بلوک‌های Xilinx

در زیربخش DSP نیز مطابق شکل زیر، بلوک‌‌های پردازشی مثل انواع فیلتر، الگوریتم کوردیک و غیره وجود دارند.

نمایش بلوک‌های بخش DSP از مجموعه بلوک‌های Xilinx

بلوک‌های بخش DSP از مجموعه بلوک‌های Xilinx

هم‌‌چنین در زیربخش Math، بلوک‌‌های ریاضی مثل قدر مطلق، کوردیک، ضرب‌‌کننده، شمارنده، تقسیم‌‌کننده و انواع بلوک‌‌های مختلف دیگر وجود دارند. (شکل زیر)

نمایش بلوک‌های بخش Math از مجموعه بلوک‌های Xilinx

بلوک‌های بخش Math از مجموعه بلوک‌های Xilinx

اما سوالی که مطرح می‌‌شود این است که چطور مراحل مختلف درست کردن یک مدل را انجام دهیم و آن را در FPGA پیاده‌‌سازی کنیم. برای این کار، ابتدا باید یک مدل جدید Simulink را در نرم‌‌افزار متلب، ایجاد کنید. بنابراین مطابق شکل زیر، از منوی Home، گزینه‌‌ی New را کلیک کرده و سپس Simulink Model را انتخاب کنید.

نمایش نحوه‌ی ساخت یک مدل جدید در Simulink متلب

ساخت یک مدل جدید در Simulink متلب

پس از باز شدن یک مدل جدید، می‌‌توانید بخش Library را دوباره باز کنید و بلوک‌‌هایی که لازم دارید را  از بلاک‌‌ست‌‌های مربوط به XILINX، وارد کرده و شروع به مدل‌‌سازی کنید.

فرض کنید ما می‌‌خواهیم مثال ساده‌‌ی شمارنده را پیاده‌‌سازی کنیم. بنابراین مطابق شکل زیر، در پنجره Library و از بخش XILINX Block Set به زیربخش Basic Element می‌‌رویم و بلوک Counter را انتخاب کرده و به صورت Drag & Drop به مدل خود اضافه می‌‌کنیم.

نمایش نحوه‌ی اضافه کردن بلوک Counter به مدل Simulink

نحوه‌ی اضافه کردن بلوک Counter به مدل Simulink

برای تغییر تنظیمات بلوک Counter می‌‌توانید روی آن دبل‌کلیک کنید تا پنجره تنظیمات ظاهر شود. شما می‌‌توانید مطابق شکل زیر، نوع Counter را به صورت Free Running یا Counter Limited انتخاب کنید.

نمایش پنجره‌ی تنظیمات بلوک Counter؛ بخش Counter type

تنظیمات بلوک Counter؛ بخش Counter type

Free Running یعنی شمارنده از صفر شروع به شمردن می‌‌کند و شمارش را تا آخرین عددی که با توجه به تعداد بیتش ممکن است، ادامه می‌دهد. سپس مقدار شمارنده صفر می‌‌شود و دوباره از ابتدا شروع به شمردن می‌‌کند و همین‌‌طور الی آخر.

Counter Limit یعنی این که شما می‌‌توانید در قسمت Count to value، مقداری را بنویسید تا شمارش تا آن مقدار انجام شود و بعد دوباره به صفر برگردد.

در اینجا ما گزینه Free Running را انتخاب می‌‌کنیم و به سراغ بخش بعدی تنظیمات می‌‌رویم. در قسمت Count direction شما می‌‌توانید جهت شمارش را مشخص کنید. جهت شمارش می‌تواند افزایشی، کاهشی یا هردو باشد.

اگر Updown را انتخاب کنید و در پایین پنجره تنظیمات، گزینه‌‌ی Apply را کلیک کنید، در محیط مدل خود می‌‌بینید که یک پورت ورودی به بلوک شمارنده اضافه می‌‌شود که صفر یا یک بودنش می‌‌تواند جهت شمارش را مشخص کند.

klhda بلوک Counter با ورودی Up

بلوک Counter با ورودی Up

در قسمت Output می‌‌توانید نوع خروجی را از بین دو گزینه‌‌ی Signed (یعنی علامت‌‌دار به صورت two's complement) و Unsigned (یعنی بدون علامت) مشخص کنید که ما معمولا خروجی را به صورت Unsigned برای شمارنده مشخص می‌‌کنیم.

در قسمت بعد، می‌‌توان عرض بیت خروجی را مشخص کرد. در اینجا به طور پیش‌‌فرض، مقدار هشت نوشته شده است که ما همین مقدار را انتخاب می‌‌کنیم. یعنی شمارنده از صفر تا ۲۵۵ می‌‌شمارد و بعد دوباره صفر می‌‌شود و به شمارش ادامه می‌‌دهد. در بخش بعد، اگر لازم باشد، می‌‌توانید نقطه باینری یا نقطه کسری را مشخص کنید که ما در این مثال نیازی به آن نداریم و مقدار پیش‌‌فرض صفر را تغییر نمی‌‌دهیم.

در پنجره‌‌ی تنظیمات، tabها یا زبانه‌‌های دیگری نیز وجود دارد. برای مثال در زبانه‌‌ی Implementation می‌‌توانید انتخاب کنید که شمارنده‌‌ی شما به کمک Fabric پیاده‌‌سازی شود یا برای پیاده‌‌سازی آن از بلوک DSP48 استفاده شود؛ پیاده‌‌سازی به کمک Fabric یعنی پیاده‌‌سازی با استفاده از LUTهایی که در FPGA وجود دارد. اما اگر لازم باشد، می‌‌توانید آن را به کمک بلوک DSP48 که یک بلوک سخت‌‌افزاری از قبل آماده شده در FPGA است، پیاده سازی کنید.

تنظیمات بلوک Counter؛ بخش Implement using

بعد از این که تنظیمات را انجام دادید، دکمه OK را انتخاب کنید.

در مدل‌‌هایی که با بلوک‌‌های XILINX پیاده‌‌سازی می‌‌شوند و قرار است آن‌‌ها را در FPGA پیاده‌‌سازی کنیم، حتما باید بلوک خاصی به اسم System Generator وجود داشته باشد. آیکن بلوک System Generator، لوگوی شرکت XILINX است.

برای اضافه کردن این بلوک به مدل‌تان، از منوی Home در نرم‌‌افزار متلب، روی گزینه Simulink Library کلیک کنید. سپس در پنجره باز شده روی XILINX Block Set کلیک کنید و سپس با کلیک روی زیربخش Basic Element، می‌‌توانید بلوک System Generator را بینید. این بلوک را به روش Drag & Drop به مدل‌تان اضافه کنید.

انتخاب بلوک System Generator از بخش Basic Elements

انتخاب بلوک System Generator از بخش Basic Elements

بنابراین، بلوک System Generator حتما باید در هر طرحی که قرار است در FPGA پیاده‌‌سازی شود، وجود داشته باشد. وقتی که این بلوک را به مدل‌تان اضافه کردید، باید تنظیماتی روی آن انجام دهید. با دبل کلیک روی بلوک، پنجره تنظیمات آن مطابق شکل زیر باز می‌‌شود.

تنظیمات بلوک System Generator؛ بخش Compilation

تنظیمات بلوک System Generator؛ بخش Compilation

در قسمت Compilation، از بین گزینه‌‌های موجود مانند HDL Netlist​NGC Netlist و... می‌‌توانید مشخص کنید که خروجی شما به چه صورت باشد. من گزینه‌‌ی NGC Netlist (یعنی بعد از مرحله سنتز باشد) را انتخاب می‌‌کنم.

در قسمت Part، مطابق شکل زیر، نوع FPGAای که قرار است مدل خود را روی آن پیاده‌‌سازی کنید را مشخص می‌‌کنید. برای مثال، من می‌‌توانم FPGAای که روی بردهای فراد 1 هست را انتخاب کنم، یعنی SPARTAN-6 LX9 با Speed Grade​ برابر با ۲- و پکیج TQG144.

نحوه‌ی انتخاب تراشه در تنظیمات بلوک System Generator

تنظیمات بلوک System Generator؛ انتخاب نوع تراشه 

در قسمت بعد، باید نام نرم‌‌افزار سنتزتان را مشخص کنید. من نرم‌‌افزار XST (مخفف XILINX Synthesis Tool) را انتخاب می‌‌کنم. برای کدنویسی نیز، زبان توصیف سخت‌‌افزار VHDL را انتخاب می‌‌کنم.

نمایش نحوه‌ی انتخاب نرم‌افزار سنتز و زبان توصیف سخت‌‌افزار در تنظیمات بلوک System Generator

تنظیمات بلوک System Generator؛ انتخاب نرم‌افزار سنتز و زبان توصیف سخت‌‌افزار 

در قسمت Target Directory، مشخص می‌‌کنید که حاصل این پیاده‌‌سازی در کجا ذخیره شود. شما می‌‌توانید همان فولدر پروژه‌‌ای را که می‌‌خواهید پیاده‌‌سازی کنید، انتخاب کنید یا یک پوشه‌‌ی جداگانه برای آن در نظر بگیرید.

در تنظیمات بخش کلاکینگ، شما باید فرکانس کلاکی که قصد دارید در نهایت و پس از پیاده‌‌سازی این کد، به این ماژول اعمال کنید را مشخص کنید. بنابراین می‌‌بایست در بخش FPGA Clock Period، پریود کلاک موردنظرتان را وارد کنید. من قصد دارم فرکانس ۱۰۰ مگاهرتز را اعمال کنم؛ بنابراین پریود کلاک را برابر با ۱۰ نانوثانیه وارد می‌‌کنم.

نمایش پنجره‌ی تنظیمات بلوک System Generator؛ بخش Clocking

تنظیمات بلوک System Generator؛ بخش Clocking

در قسمت 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 را انتخاب می‌‌کنم که بتوانم مقدار یک یا صفر را به این ورودی اعمال کنم.

انتخاب بلوک Constant از بخش Sources

انتخاب بلوک Constant از بخش Sources

برای مشاهده وضعیت قسمت خروجی مدار نیز به یک بلوک دیگر نیاز داریم. برای این کار، یک بلوک Scope را از مسیر نشان داده شده در شکل زیر، به مدل خودمان اضافه می‌‌کنیم.

انتخاب بلوک Scope از بخش Sinks

انتخاب بلوک Scope از بخش Sinks

اما نکته‌‌ای که وجود دارد این است که شما نمی‌‌توانید بلوک‌‌های مربوط به XILINX را مستقیما به ورودی‌‌ها، خروجی‌‌ها و به‌‌طور کلی به بلوک‌‌های مربوط به Simulink متصل کنید. برای این کار باید مرزی بین آن‌‌ها مشخص کرد. این مرز در واقع همان پورت‌‌های ماژولی است که قرار است پیاده‌‌سازی شود.

برای مشخص کردن این مرز یا به عبارت دیگر، پورت‌‌های ماژولتان، مجددا باید به قسمت XILINX Block Set برویم و در قسمت Basic Element، دو بلاک به نام‌‌های Gateway in و Gateway out را وارد مدل کنیم.

از Gateway in به عنوان پورت‌‌های ورودی مدارتان یا به عنوان مرز بین پورت‌‌های ورودی و بلوک‌‌هایی که مربوط به نرم‌‌افزار Simulink هستند و از Gateway out به عنوان پورت‌‌های خروجی و یا به عنوان مرز بین پورت‌‌های خروجی ماژول و بلوک‌‌هایی که مربوط به بلوک‌‌های عادی نرم‌‌افزار Simulink هستند استفاده می‌‌کنیم.

انتخاب بلوک های Gateway In و Gateway Out از قسمت Xilinx Blockset

انتخاب بلوک های Gateway In و Gateway Out از قسمت Xilinx Blockset

حالا باید سیم‌‌بندی‌‌ها را انجام دهیم. بنابراین بلوک‌‌ها را به نحو مشخص شده در شکل زیر، به هم متصل می‌‌کنیم.

نمایش نمونه‌ای از یک مدل ساده‌ی Counter در سیمولینک متلب

نمونه‌ای از یک مدل ساده‌ی Counter در سیمولینک متلب

برای بلوک Gateway in نیز تنظیماتی وجود دارد. اگر روی آن دبل کلیک کنیم، پنجره‌ی تنظیمات باز می‌‌شود. مطابق شکل زیر، می‌‌توانیم نوع خروجی یا Output Type را از میان یکی از گزینه‌‌های Boolean ،Fixed Point و یا Floating Point انتخاب کنیم.

نمایش  پنجره‌ی تنظیمات بلوک Gateway in؛ بخش Output Type

 پنجره‌ی تنظیمات بلوک Gateway in؛ بخش Output Type

با توجه به این که پورت ورودی در این مثال یک‌بیتی است، من گزینه‌‌ی 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 به پروژه

اضافه کردن ماژول ساخته شده توسط System Generator به پروژه

حال به پوشه‌‌ای از کامپیوتر که در آن، خروجی سنتز شده‌‌ی بلوک System Generator را ذخیره کرده بودیم می‌‌رویم. اکنون فایل با پسوند sgp. را انتخاب می‌‌کنیم و با دبل‎‌کلیک روی این فایل، آن را به پروژه‌مان اضافه می‌‌کنیم. از این مرحله به بعد، کارمان کاملا شبیه کار با IPهاست.

نمایش نحوه‌ی انتخاب ​خروجی سنتز شده‌‌ی بلوک System Generator با پسوند sgp.

انتخاب ​خروجی سنتز شده‌‌ی بلوک System Generator با پسوند sgp.

اگر فکر می‌‌کنید که تسلط کافی برای استفاده از IPها را ندارید، پیشنهاد می‌‌کنم برنامه‌‌ی نحوه استفاده از IPها را از این لینک ببینید.

برای استفاده از این IP، همانند روندی که همیشه در استفاده از IPها داشتیم روی آن کلیک می‌‌کنیم و همان‌‌طور که در شکل می‌‌بینید، روی گزینه View HDL Instantiation Temperate در منوی پایین، دبل‌کلیک می‌‌کنیم.

نمایش ​نحوه‌ی دسترسی به فایل نمونه‌ی Instant کردن IP

​نحوه‌ی دسترسی به فایل نمونه‌ی Instant کردن IP

نرم‌‌افزار به طور خودکار، برای ما کدی را آماده می‌‌کند که بخش‌‌های Component Declaration و Instant را در خود دارد.

نمایش ​دو بخش اصلی فایل نمونه‌ی Instant کردن IP

​دو بخش اصلی فایل نمونه‌ی Instant کردن IP

شما باید این دو بخش را همانند ​آنچه در زیر مشاهده می‌کنید، در کد تاپ ماژول‌تان، کپی کنید. سپس در قسمت Instant عمل Port Map را انجام دهید؛ درواقع باید اتصالات بین IP و تاپ ماژول را به نحو درستی ایجاد کنید.

​برای ​مشاهده کد کلیک کنید...

شبیه‌‌سازی IP در نرم‌‌افزار ISE

تا اینجای کار، ما یک تاپ ماژول به نام Counter_top ایجاد کردیم و در آن، Counterای که در نرم‌‌افزار Simulink به کمک ابزار System Generator ساخته بودیم را به صورت یک IP، Instant کردیم. اکنون می‌‌توانیم از آن استفاده کنیم.

حال برای انجام یک تست نهایی، می‌‌توانیم این IP را شبیه‌‌سازی کنیم. برای شبیه‌‌سازی، شما باید یک تست‌‌بنچ بسازید. اگر فکر می‌کنید در زمینه شبیه‌‌سازی و ساخت تست‌‌بنچ هم نیاز به اطلاعات بیشتری دارید، می‌‌توانید برنامه نحوه‌‌ی شبیه‌‌سازی به کمک نرم‌‌افزار ISim را در این لینک مشاهده کنید.

پس از ساخت تست‌‌بنچ، مانند شکل زیر، گزینه Simulation را انتخاب کنید.

نمایش ​نحوه‌ی دسترسی به تست‌‌بنچ از طریق تب Simulation

​نحوه‌ی دسترسی به تست‌‌بنچ از طریق تب Simulation

در کد تست‌‌بنچ، تاپ ماژول ما Instant شده است و تنها کاری که لازم است انجام دهیم این است که در انتهای کد، ورودی‌‌ها را جهت شبیه‌‌سازی مقداردهی کنیم.

​برای ​مشاهده کد تست‌بنچ کلیک کنید...

​چون فقط یک ورودی به نام Updown داریم، فقط باید مقدار آن را تعیین کنیم که من مقدار آن را برابر با یک قرار داده‌‌ام.

نمایش مقدار‌دهی ورودی UP_Down

​مقدار‌دهی ورودی UP_Down

البته همان طور که در خط ۵۰ام کد می‌‌بینید، مقدار پیش‌‌فرض یا مقدار اولیه Up_Down صفر است.

نمایش ​مقدار پیش‌‌فرض یا مقدار اولیه ورودی Up_Down در تست‌بنچ

​مقدار پیش‌‌فرض یا مقدار اولیه ورودی Up_Down در تست‌بنچ

در خط ۸۱ کد نیز به اندازه‌‌ی ۱۰۰ نانوثانیه تاخیر داریم. هم‌‌چنین در خط ۸۲ کد، به اندازه‌‌ی ۱۰ کلاک که برابر است با ۱۰۰ نانوثانیه تاخیر اعمال شده است. مجموع این دو تاخیر ۲۰۰ نانوثانیه می‌‌شود؛ بنابراین تا ۲۰۰ نانوثانیه‌‌ی اول شبیه‌‌سازی، Up_Down صفر است و پس از آن، Up_Down یک می‌‌شود.

کد ایجاد تاخیر در شبیه‌سازی

پس ما می‌‌توانیم در شبیه سازی، رفتار شمارنده را هم در حالتی که Up_Down صفر است و هم در حالتی که یک است، ببینیم.

حال که تست‌‌بنچ کامل شده است، می‌‌توانیم روی تست‌‌بنچ کلیک کنیم و مطابق شکل زیر، از منوی پایین و سمت چپ صفحه، روی گزینه Simulate Behavioral Model دبل‌کلیک کنیم تا نرم‌‌افزار ISim، یعنی نرم‌‌افزار شبیه‌‌ساز مجموعه‌‌ی ISE، از دل نرم‌‌افزار ISE اجرا شود. همان‌‌طور که می‌‌دانید، این شبیه‌‌سازی همیشه به مدت یک میکروثانیه انجام می‌‌شود.

نمایش نحوه‌ی اجرای نرم‌افزار ISim برای شبیه‌سازی، از دل نرم‌افزار ISE

نحوه‌ی اجرای نرم‌افزار ISim برای شبیه‌سازی، از دل نرم‌افزار ISE

برای اینکه بتوانیم عددهای ورودی و خروجی را بهتر ببینیم، مطابق شکل، روی آن‌‌ها کلیک راست می‌‌کنیم و از بخش Radix گزینه Unsigned Decimal را انتخاب می‌‌کنیم تا عددها به صورت دسیمال دربیاید.

​نحوه‌ی تغییر مبنای نمایش اعداد در نرم‌افزار ISim

​نحوه‌ی تغییر مبنای نمایش اعداد در نرم‌افزار ISim

برای اینکه بتوانیم کل شبیه‌‌سازی به مدت یک میکروثانیه را در یک قاب ببینیم، مطابق شکل روی دکمه zoom to full view کلیک می‌‌کنیم.

گزینه‌ی Zoom to Full View در نرم‌افزار ISim، برای نمایش کل شبیه‌‌سازی در یک قاب

گزینه‌ی Zoom to Full View در نرم‌افزار ISim، برای نمایش کل شبیه‌‌سازی در یک قاب

همان‌‌طور که در شکل می‌‌بینید، ورودی Up_Down تا لحظه ۲۰۰ نانوثانیه، صفر بوده و از آن‌‌جا به بعد، یک می‌‌شود.

درشکل زیر، قسمت شمارش مشخص شده‌‌است. برای این که ببینیم در این قسمت دقیقا چه اتفاقی می‌‌افتد، به کمک گزینه zoom in، سیگنال خروجی را باز می‌‌کنیم. حالا می‌‌بینید که در قسمتی که Up_Down برابر با صفر است، شمارش به صورت نزولی و در قسمتی که مقدار Up_Down برابر با یک است، شمارش به صورت صعودی انجام شده است.

​نمایش نتیجه‌ی شبیه‌سازی کد پیاده‌ساز Counter

​نمایش نتیجه‌ی شبیه‌سازی کد پیاده‌ساز Counter

به این ترتیب ما توانستیم یک مدار ساده را به کمک ابزار System Generator پیاده‌سازی و شبیه‌‌سازی کنیم. فایل‌‌هایی که در این پیاده‌‌سازی و شبیه‌‌سازی استفاده شده است، در همین صفحه ​و از طریق گزینه‌‌ی زیر قابل دانلود هستند.

امیدوارم​ از خواندن این مقاله هم لذت برده باشید و بتوانید از نکات یاد گرفته شده، در انجام پروژه‌‌هایتان استفاده کنید.

برای دانلود فایل های مدل و کدهای VHDL، روی دکمه زیر کلیک کنید:

آیا برنامه ویدئویی پیاده‌سازی الگوریتم‌های پردازش سیگنال با System Generator برای شما مفید بود؟

لطفا نظرتان را در مورد این برنامه در پایین همین پست با دیگران به اشتراک بگذارید. همچنین با کلیک روی هر کدام از دکمه‌های اشتراک گذاری در ستون سمت چپ این صفحه و اشتراک‌گذاری این مطلب در شبکه‌های اجتماعی می‌توانید افراد بیشتری را در یادگیری این مطالب سهیم کنید.

کانال تلگرام آموزش FPGA از صفر

برای عضویت در کانال تلگرام و دسترسی به آموزش‌های بیشتر و اطلاع سریع از زمان انتشار آموزش‌ها و تخفیف‌های ویژه، روی دکمه زیر کلیک کنید:

  • حسین گفت:

    سلام استاد،
    اگه امکان داره توضیح بدید که چرا در کد کامپنت شده که به وسیله sysgen تولید میشه یک ورودی کلاک داخل کد برنامه ایجاد میشه. اما اگه قرار باشه دقیقا همون برنامه که در sysgen نوشتیم رو بصورت کد vhdl داخل نرم افزار ISE بنویسیم نیازی به ورودی کلاک نیست؟؟؟
    متشکرم

    • سلام،

      اگر همان ماجول را مستقیم به صورت VHDL پیاده‌سازی می‌کردید هم نیاز به کلاک بود. در این مثال، یک شمارنده را پیاده‌سازی کردیم و شمارنده، یک ماجول ترتیبی سنکرون است که نیاز به کلاک دارد.

      موفق باشید.

  • سلام ….من می خواستم یه سوال درباره قابلیت sysgen بپرسم هرچند به این جلسه مربوط نیست…به هر حال من عذر می خوام بابتش.
    من مثال خودتون که درباره کانتر بود و در اون پست مربوط به sysgen که گذاشته بودین که در اون باید فایل vhdl و فایل .sgp رو اضافه میکردیم به کار بردم و موقع instantiation temple با مشکل مواجه شدم …در واقع عمل instant رو انجام نمیده و ودر صفحه ادیتور ise کد componentو instant نمیاد …یه پیامی میاد که انگار جلوی اینکار میگیره ..تو پیام نوشته که باید به فایل با پسوند .tfi مراجعه کنید تا instant انجام بشه …در حالی که این پسوند از داخل ise اصلا باز نمیشه ؟

    • سلام،

      ما با این خطا تا به حال برخورد نکرده‌ایم. اگر تمام مراحل را به طور دقیق پیش بروید قاعدتا نباید با این مشکل برخورد کنید. پیشنهاد می‌کنم مجددا و با دقت این کار را تکرار کنید.

      در عین حال می‌توانید پیام خطا را اینجا کپی کنید. شاید راه‌حلی از متن آن مشخص شود.

      موفق باشید.

  • […] در نرم‌افزار متلب، قابلیت‌‌ها‌‌ی ویژه‌ای برای تبدیل خودکار یک مدل سیمولینک به ماجول قابل پیاده‌سازی … وجود دارد. این قابلیت، به کمک ابزاری به نام System Generator در […]