توسط احمد ثقفی 

10 بهمن, 1396

مولد موج سینوسی در FPGA

آیا تا به حال به تولید یک موج سینوسی دیجیتال درون FPGA نیاز داشته‌اید؟

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

برای انجام این کار، روش‌های متنوعی وجود دارد؛ روش‌های غیر اصولی و ناکارآمد و روش‌های بهینه و حرفه‌ای!

در این برنامه ویدئویی، شما را با روش‌های مختلف پیاده‌سازی مولد موج سینوسی در FPGA آشنا می‌کنم و سپس مراحل پیاده‌سازی یکی از این روش‌ها را به طور کامل به شما نشان می‌دهم.

More...

انواع روش‌های پیاده‌سازی مولد موج سینوسی در FPGA

در این برنامه، با سه روش برای پیاده‌سازی توابع خاص در FPGA و از جمله موج سینوسی آشنا می‌شوید.

این روش‌ها، استفاده از بسط تیلور، الگوریتم CORDIC و روش DDS است.

از میان این روش‌ها، من روش DDS را برای پیاده‌سازی مولد موج سینوسی در FPGA انتخاب می‌کنم و پس از بیان مفاهیم مرتبط با آن، به کمک DDS IP Core موجود در نرم‌افزار ISE مراحل پیاده‌سازی آن را به طور کامل به شما نشان می‌دهم.

برای آشنایی با نحوه استفاده از IPها در نرم‌افزار ISE برنامه ویدئویی زیر را ببینید…

روش DDS برای پیاده‌سازی مولد موج سینوسی در FPGA

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

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

اینکه چطور به کمک این روش می‌توان موج‌های سینوسی با فرکانس‌های مختلف درون FPGA تولید کرد، موضوعی است که آن را به طور کامل در این برنامه توضیح می‌دهم.

ویدئو یا متن؟

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

برای دانلود نسخه با کیفیت این ویدئو، روی دکمه زیر کلیک کنید:

در این مقاله، چگونگی پیاده‌سازی مولد موج سینوسی در FPGA را به شما آموزش خواهم داد.

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

در این مقاله، چندین روش برای پیاده‌سازی موج سینوسی در FPGA، به شما معرفی خواهم کرد.

پس از معرفی روش‌ها، یکی از آن‌ها را انتخاب کرده و به شما نشان می‌دهم که چگونه می‌توانید به‌کمک آن یک مولد موج سینوسی درون FPGA پیاده‌سازی کنید.

همان‌طور که می‌دانید ما در زبان‌های توصیف سخت‌افزاری VHDL یا Verilog، عملگری برای پیاده‌سازی توابع خاص مانند سینوس نداریم.

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

اما چه روش‌هایی برای پیاده‌سازی یک شکل موج سینوسی درون FPGA وجود دارد؟

روش‌های پیاده‌سازی موج سینوسی درون FPGA

اکنون سه روش برای پیاده‌سازی موج سینوسی درون FPGA به شما معرفی می‌کنم.

روش بسط تیلور

اولین روش برای پیاده‌سازی یک شکل موج سینوسی در FPGA روش بسط تیلور است.

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

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

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

بنابراین، این روش، قابلیت پیاده‌سازی در FPGA را دارد.

اما مشکل روش تیلور این است که برای معادل کردن یک تابع یا موج سینوسی باید تعداد زیادی جمله را با هم جمع کنیم.

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

بنابراین، پیاده‌سازی تمامی جملات به‌صرفه نیست و ناچاراً باید تعداد محدودی از آن‌ها را پیاده‌سازی کنیم.

پیاده‌سازی تعداد محدودی از جملات باعث کاهش دقت موج سینوسی می‌شود.

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

بنابراین به‌سراغ روش دوم می‌رویم.

روش CORDIC

روش دوم، روش CORDIC است.

احتمالاً با نام این روش یا الگوریتم CORDIC آشنا هستید.

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

حُسن این روش این است که شما به‌کمک روش CORDIC، می‌توانید این توابع خاص و نسبتاً پیچیده را فقط و فقط با عملیات جمع و شیفت پیاده‌سازی کنید.

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

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

اما برای پیاده‌سازی توابعی مانند سینوس، روش سومی نیز وجود دارد که اتفاقاً در این برنامه قصد دارم در مورد این روش به‌طور مفصل توضیح دهم.

روش DDS

روش سوم پیاده‌سازی موج سینوسی در FPGA، روش Direct Digital Sensitizer یا DDS نام دارد.

در روش DDS، شما نمونه‌هایی از موج موردنظرتان را درون یک جدول یا یک حافظه RAM قرار می‌دهید.

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

البته این توضیح، یک توضیح بسیار خلاصه و پایه‌ای از روش DDS است و در ادامه مقاله توضیحات بیشتری را به شما ارائه خواهم داد.

اما اگر بخواهیم روش DDS را پیاده‌سازی کنیم، دو راه پیش رو داریم:

  • روش اول این است که از یک IP Core به همین نام استفاده کنیم.
  • روش دوم، کدنویسی به یکی از زبان‌های VHDL یا Verilog است.

در این مقاله، پس از اینکه شما را با مفهوم روش DDS آشنا کردم، IP Core مربوط به DDS را در نرم‌افزار ISE به شما معرفی می‌کنم و تنظیمات مهم این IP را به شما آموزش خواهم داد.

به‌کمک آی‌پی DDS می‌توانید انواع موج‌های سینوسی و کسینوسی با فرکانس‌های مختلف را در مدار درون FPGA پیاده‌سازی کنید.

اما پیاده‌سازی موج سینوسی به روش DDS چیست؟

به‌عبارت دیگر، مفهوم روش DSS چیست؟

مفهوم روش DDS، مفهوم نسبتاً ساده‌ای است؛ برای اینکه یک موج سینوسی را به‌صورت دیجیتالی درون FPGA پیاده‌سازی کنید، روش DDS ایده‌ای به‌صورت زیر ارائه می‌دهد.

ابتدا باید یک دوره تناوب از موج سینوسی را به روشی تولید کنید.

مثلاً می‌توانید این موج را در نرم‌افزار متلب تولید کنید.

سپس، از یک دوره تناوب یا یک پریود این موج سینوسی، تعدادی نمونه را جدا می‌کنید و به یک حافظه منتقل می‌کنید.

همان‌طور که می‌دانید، درون FPGA‌ها، حافظه‌هایی به‌عنوان حافظه‌های رم داخلی وجود دارد.

این حافظه‌ها شامل حافظه BRAM (حافظه بلوکی) و Distributed RAM (حافظه توزیع شده) هستند.

من در این مثال فرض کرده‌ام که می‌خواهیم از یک حافظه بلوکی استفاده کنیم.

همان‌طور که در شکل زیر مشاهده می‌کنید من از یک پریود موج سینوسی، 2N نمونه را برداشته و به یک حافظه BRAM منتقل کرده‌ام:

نمونه‌برداری از یک موج سینوسی و انتقال نمونه‌ها به یک حافظه درون FPGA

نمونه‌برداری از یک موج سینوسی و انتقال نمونه‌ها به یک حافظه درون FPGA

آدرس‌ها در این حافظه BRAM، از خانه صفر شروع شده و تا خانه 2N-1 ادامه دارند.

البته هر خانه حافظه نیز عرض بیتی دارد؛ این عرض بیت در واقع نشان‌دهنده دقت هر کدام از این نمونه‌ها است.

اگر چنین حافظه‌ای در مدارمان، درون FPGA، داشته باشیم، می‌توانیم با خواندن آن، یک موج سینوسی در FPGA بسازیم.

اما این کار را به چه ترتیب انجام دهیم؟

فرض کنید من در مدارم درون FPGA سیگنال کلاکی با فرکانس ۱۰۰ مگاهرتز داشته باشم.

اگر فرکانس سیگنال کلاک من ۱۰۰ مگاهرتز باشد، یعنی پریود این سیگنال ۱۰ نانو‌ثانیه است.

بنابراین، اگر در هر کلاک، یک نمونه از این حافظه را بخوانم، در واقع در حال خواندن نمونه‌های یک پریود از یک موج سینوسی هستم.

اگر این نمونه‌ها را تا انتها بخوانم و دوباره به ابتدای RAM بازگردم، در واقع، من یک موج سینوسی را درون FPGA تولید کرده‌ام.

اکنون سوالی که مطرح می‌شود این است که فرکانس موج سینوسی که به این روش تولید می‌کنیم، چه مقداری دارد.

به نظر شما فرکانس شکل موج سینوسی که به روش DDS و از طریق خواندن مقادیر نمونه‌های یک پریود از یک BRAM درون FPGA تولید می‌شود به چه عواملی بستگی دارد؟

عوامل موثر در فرکانس موج سینوسی تولید شده به روش DDS در FPGA

فرکانس موج سینوسی که ما به روش DDS در FPGA تولید می‌کنیم، در حقیقت به سه عامل بستگی دارد.

اگر به این موضوع فکر کرده باشید، احتمالاً چند عامل به ذهنتان رسیده است.

برای اینکه این موضوع بهتر مشخص شود، در ادامه مقاله،‌ یک مثال عددی مطرح می‌کنم و در خلال این مثال، به عوامل موثر در فرکانس سیگنال سینوسی حاصل پی خواهیم برد.

فرض کنید ما برای پیاده‌سازی یک موج سینوسی به‌روش DDS، یک دوره تناوب از موج سینوسی را مثلاً در نرم‌افزار متلب تولید کرده‌ایم و ۱۰ نمونه از این دوره تناوب را درون یک BRAM از FPGA قرار داده‌ایم.

فرض کنید ما این RAM را با فرکانس کلاک ۱۰۰ مگاهرتز می‌خوانیم.

فرکانس کلاک ۱۰۰ مگاهرتز معادل پریود ۱۰ نانو‌ثانیه است. یعنی خواندن هر نمونه، ۱۰ نانو‌ثانیه طول می‌کشد.

بنابراین، برای خواندن یک سری نمونه از این RAM و تولید یک پریود موج سینوسی، ۱۰۰ نانو‌ثانیه زمان لازم است.

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

به‌کمک این مثال عددی احتمالاً متوجه شده‌اید که فرکانس شکل موج تولید شده به‌روش DDS به چه عواملی بستگی دارد.

یکی از این عوامل، فرکانس سیگنال کلاکی است که ما به‌کمک آن نمونه‌ها را از حافظه می‌خوانیم.

در مثال ما فرکانس سیگنال کلاک، ۱۰۰ مگاهرتز بود و با محاسباتی که بیان شد به فرکانس ۱۰ مگاهرتز برای موج سینوسی رسیدیم.

اکنون اگر فرکانس نمونه برداری را به ۲۰۰ مگاهرتز افزایش دهیم، فرکانس موج سینوسی حاصل چه مقدار خواهد بود؟

اگر فرکانس نمونه برداری ۲۰۰ مگاهرتز باشد، پریود آن ۵ نانو‌ثانیه خواهد بود.

حال اگر ۵ نانو‌ثانیه را در تعداد نمونه‌ها که برابر با ۱۰ بود ضرب کنیم، حاصل ۵۰ نانو‌ثانیه می‌شود.

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

به این ترتیب، با افزایش فرکانس سیگنال کلاک از ۱۰۰ مگاهرتز به ۲۰۰ مگاهرتز، فرکانس موج سینوسی حاصل دو برابر شد.

پس، یکی از عوامل موثر در فرکانس موج سینوسی که به‌روش DDS تولید می‌شود، فرکانس سیگنال کلاک مدار است.

در واقع، فرکانس سیگنال کلاکی که به‌کمک آن حافظه را می‌خوانیم.

عامل دوم تعیین کننده فرکانس شکل موج سینوسی حاصل، تعداد نمونه‌هایی است که ما از یک پریود موج سینوسی اولیه برداشته‌ایم. در مثالی که مطرح کردم، از یک پریود سینوس، ۱۰ نمونه برداشتیم.

فرض کنید که فرکانس سیگنال کلاکی که به‌کمک آن حافظه را می‌خوانیم همان ۱۰۰ مگاهرتز باشد.

به این ترتیب، با ضرب پریود این سیگنال (۱۰ نانوثانیه) در تعداد نمونه‌ها (۱۰ نمونه) به مقدار ۱۰۰ نانو‌ثانیه می‌رسیم.

پریود ۱۰۰ نانو‌ثانیه معادل فرکانس ۱۰ مگاهرتز است. بنابراین، یک موج سینوسی با فرکانس ۱۰ مگاهرتز در FPGA تولید خواهد شد.

اکنون می‌توانیم بدون تغییر دادن فرکانس خواندن از BRAM، تعداد نمونه‌ها را تغییر دهیم. مثلاً تعداد نمونه‌ها را به‌جای ۱۰ نمونه، ۲۰ نمونه در نظر بگیریم.

بنابراین، یک پریود موج سینوسی از ۲۰ نمونه تشکیل شده است. فرکانس ۱۰۰ مگاهرتز معادل پریود ۱۰ نانوثانیه است.

بنابراین،‌ اگر پریود سیگنال کلاک (۱۰ نانوثانیه) را در تعداد نمونه‌ها (۲۰ نمونه) ضرب کنیم، به مقدار ۲۰۰ نانو‌ثانیه می‌رسیم.

پریود ۲۰۰ نانو‌ثانیه، معادل فرکانس ۵ مگاهرتز است. به این ترتیب، با افزایش تعداد نمونه‌ها، فرکانس موج سینوسی تولید شده در FPGA کاهش پیدا کرد.

بنابراین، عامل دیگری که می‌تواند فرکانس موج سینوسی در روش DDS را تحت تاثیر قرار دهد، تعداد نمونه‌هایی است که برای یک پریود سینوس در نظر می‌گیریم و آن‌ها را به BRAM منتقل می‌کنیم.

اما به‌جز این دو عامل، عامل دیگری نیز می‌تواند فرکانس موج سینوسی را تحت تاثیر قرار دهد.

شاید این عامل را حدس زده باشید.

عامل سوم، گام خواندن نمونه‌ها از خانه‌های حافظه است.

در دو مثالی که فرکانس و تعداد نمونه‌ها را تغییر دادم، مقادیر خانه‌های حافظه را پشت سر هم می‌خواندیم.

یعنی ابتدا خانه صفر، سپس خانه یک، پس از آن خانه دو و به همین‌طور ترتیب تا خانه آخر حافظه را می‌خواندیم.

اما ما می‌توانیم به‌جای این کار، مقادیر را با فاصله‌ها یا گام‌های مشخصی از حافظه بخوانیم. مثلاً می‌توانیم مقادیر را یکی در میان بخوانیم.

اکنون مثال اول را با تغییر در گام خواندن از حافظه مجدداً بررسی می‌کنیم.

در آن مثال، تعداد ۱۰ نمونه از یک پریود سینوس را در حافظه قرار داده بودیم. فرکانس سیگنال کلاک برابر با ۱۰۰ مگاهرتز بود که پریود معادل با آن برابر با ۱۰ نانو‌ثانیه می‌شد.

اکنون فرض کنید به‌جای خواندن کل این ۱۰ نمونه، برای تشکیل یک پریود، نمونه‌ها را یکی در میان بخوانیم. در واقع، در این حالت، برای تشکیل یک پریود، پنج نمونه را می‌خوانیم.

اگر پریود سیگنال کلاک (۱۰ نانوثانیه) را در تعداد نمونه‌ها (۵ نمونه) ضرب کنیم، به مقدار ۵۰ نانو‌ثانیه می‌رسیم.

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

به این ترتیب، فرکانس موج سینوسی که به روش DDS در FPGA تولید می‌شود به سه عامل بستگی دارد:

  • تعداد نمونه‌هایی که از یک پریود سینوس در نظر می‌گیرید و درون حافظه قرار می‌دهید.
  • فرکانس سیگنال کلاکی که به‌کمک آن حافظه را می‌خوانید.
  • فاصله‌ها یا گام‌هایی که از حافظه می‌خوانید.

اگر بخواهیم ارتباط این پارامترها را به‌صورت یک رابطه ریاضی بنویسیم، این رابطه به‌صورت زیر خواهد بود:

فرمول فرکانس موج سینوسی که به روش DDS در FPGA تولید می‌شود

در این رابطه، با توجه به نوع تنظیماتی که در ادامه مقاله برای آی‌پی DDS خواهید دید، step یا گام را بر حسب پارامترهای دیگر نوشته‌ایم.

پارامتر Fout، فرکانس سیگنال تولید شده در FPGA است. در واقع، ما می‌خواهیم در FPGA یک شکل موج سینوسی با فرکانس Fout تولید کنیم.

پارامتر Fclk نیز فرکانس سیگنال کلاکی است که به‌کمک آن مقادیر را از حافظه می‌خوانیم.

همچنین، 2N تعداد خانه‌های حافظه است.

گام یا step نیز فاصله خواندن نمونه‌ها از حافظه است. مثلاً اگر step برابر با دو باشد، یعنی شما خانه‌های حافظه را یکی در میان می‌خوانید.

اما چرا فرمول را به این صورت نوشتیم؟

چون ما در آی‌پی مربوط به DDS، ابتدا مقدار فرکانس سیگنال کلاک سیستم را مشخص می‌کنیم.

سپس، مشخص می‌کنیم که N چقدر باشد؛ در واقع، 2N تعداد خانه‌های حافظه موردنظر ما خواهد بود.

همچنین، به‌دنبال فرکانس خاصی برای سیگنال سینوسی تولید شده در FPGA، یعنی پارامتر Fout هستیم.

مثلاً، فرض کنید که قصد داریم یک شکل موج سینوسی با فرکانس ۱۰ مگاهرتز درون FPGA تولید کنیم.

اگر پارامترهای درون رابطه بالا را مشخص کنیم، می‌توانیم مقدار step یا گام را برای تولید این فرکانس به‌دست آوریم.

در تنظیمات آی‌پی DDS، بخشی وجود دارد که می‌توانید step به‌دست آمده از رابطه بالا را در آن وارد کنید.

وقتی مقدار step را در تنظیمات آی‌پی وارد کنید، می‌توانید ماژولی را درون FPGA داشته باشید که یک شکل موج سینوسی دیجیتالی با فرکانس موردنظر شما بسازد.

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

فرض کنید فرکانس کلاک مدار شما که به‌کمک آن نمونه‎‌های سینوس را از BRAM می‌خوانید برابر با ۱۰۰ مگاهرتز باشد.

فرض کنید ما به‌دنبال ساخت یک موج سینوسی با فرکانس ۱۰ مگاهرتز درون FPGA هستیم. من برای محاسبه step دو حالت را فرض می‌کنم.

ابتدا فرض کنید که N برابر با ۸ باشد، یعنی تعداد نمونه‌های یک پریود از موج سینوسی که درون BRAM ذخیره کرده‌ایم ۲۸ باشد.

اگر مقادیر گفته شده را در رابطه step قرار دهید، مقدار step برابر با ۲۶ می‌شود.

یعنی، ما باید حافظه را با فاصله ۲۶ خانه، ۲۶ خانه بخوانیم؛ در این صورت می‌توانیم یک موج سینوسی با فرکانس ۱۰ مگاهرتز تولید کنیم.

اما اگر N را برابر با ۱۶ در نظر بگیریم، تعداد خانه‌های حافظه برابر با ۲۱۶ خواهد بود.

اگر مقدار جدید N را در فرمول step جاگذاری کنیم، step برابر با ۶۵۵۴ می‌شود.

یعنی، وقتی که N برابر با ۱۶ است شما باید ابتدا خانه اول حافظه را بخوانید و سپس به‌سراغ خانه ۶۵۵۴ بروید.

پس از آن، باید دوباره یک گام به‌طول ۶۵۵۴ بردارید و خانه‌ای از حافظه که به آن رسیده‌اید را بخوانید.

به همین ترتیب، با گام‌هایی به‌طول ۶۵۵۴ خانه‌های BRAM را می‌خوانید تا شکل موجی سینوسی که تولید می‌کنید فرکانسی برابر با ۱۰ مگاهرتز داشته باشد.

اکنون با این توضیحات و بررسی مفهومی الگوریتم DDS، نرم‌افزار ISE را باز می‌کنیم تا ببینیم آی‌پی DDS را چگونه باید تنظیم کنیم تا موج سینوسی موردنظرمان را تولید کند.

تنظیمات آی‌پی DDS را مطابق با مثال آخر انجام خواهیم داد.

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

همچنین،‌ فرض می‌کنیم از یک پریود موج سینوسی، ۲۱۶ نمونه را جدا کرده و درون حافظه رم قرار داده‌ایم؛ بنابراین، N را برابر با ۱۶ در نظر گرفته‌ایم.

طبق رابطه‌ای که داشتیم، step برابر با ۶۵۵۴ می‌شود.

اکنون وارد نرم‌افزار ISE می‌شویم و تنظیمات آی‌پی DDS را انجام می‌دهیم.

تنظیمات آی‌پی DDS در نرم‌افزار ISE

همان‌طور که در شکل زیر مشاهده می‌کنید، برای انتخاب آی‌پی DDS، باید یک source جدید بسازیم؛ بنابراین، مثل همیشه در قسمت Hierarchy کلیک‌راست می‌کنیم و گزینه New Source ر انتخاب می‌کنیم:

ساخت یک source جدید در نرم‌افزار ISE

ساخت یک source جدید در نرم‌افزار ISE

مطابق شکل زیر، از بین source‌هایی که وجود دارد، IP را انتخاب می‌کنیم. سپس، نامی برای آن انتخاب می‌کنیم.

پس از آن، روی گزینه Next کلیک می‌کنیم:

انتخاب source آی‌پی و انتخاب نامی برای آن

انتخاب source آی‌پی و انتخاب نامی برای آن

از میان IP‌هایی که ظاهر می‌شود باید آی‌پی DDS را انتخاب کنیم.

آی‌پی DDS در چندین بخش از لیست IP‌ها ظاهر می‌شود؛ زیرا این لیست بر اساس کاربرد IP‌ها است و آی‌پی DDS در کاربردهای مختلفی استفاده می‌شود.

من این آی‌پی را از بخش Digital Signal Processing و زیر‌بخش توابع مثلثاتی انتخاب می‌کنم (شکل زیر):

انتخاب آی‌پی DDS از لیست آی‌پی‌ها

انتخاب آی‌پی DDS از لیست آی‌پی‌ها

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

اکنون مطابق شکل زیر، گزینه Next را انتخاب می‌کنم و پس از آن در پنجره Summary روی گزینه Finish کلیک می‌کنم:

مراحل ساخت آی‌پی DDS

مراحل ساخت آی‌پی DDS

سپس، چند لحظه صبر می‌کنیم تا wizard مربوط به تنظیمات آی‌پی DDS در نرم‌افزار ISE مطابق شکل زیر ظاهر شود:

تنظیمات آی‌پی DDS

تنظیمات آی‌پی DDS

اکنون تنظیمات مهم این IP را بررسی می‌کنم.

قصد دارم مثال آخری که به آن اشاره کردم را به‌کمک آی‌پی DDS پیاده‌سازی کنم.

در قسمت اول، بخش Configuration Options می‌توانید مشخص کنید که خروجی‌های این DDS چه باشند.

به‌صورت پیش‌فرض گزینه‌های موج سینوسی، موج کسینوسی و فاز سازنده این موج را می‌توانید داشته باشید.

همان‌طور که می‌دانید این موج‌های سینوسی و کسینوسی که تولید می‌شود قاعدتاً یک فاز معادلی دارند.

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

در قسمت بعد، شما باید فرکانس کلاکی که به DDS متصل می‌کنید را مشخص کنید.

در واقع، این همان فرکانسی است که به‌کمک آن مقادیر را از حافظه داخلی DDS قرائت می‌کنیم.

من فرکانس را مطابق شکل زیر برابر با ۱۰۰ مگاهرتز تعیین کرده‌ام:

تنظیمات آی‌پی DDS

تنظیمات آی‌پی DDS

آی‌پی DDS می‌تواند تا ۱۶ کانال داشته باشد؛ یعنی، می‌تواند همزمان ۱۶ موج سینوسی و کسینوسی با فرکانس‌های مختلف تولید کند که در صورت نیاز می‌توانید آن را از قسمت Number of Channels در شکل بالا تنظیم کنید.

من فعلاً آن را برابر با یک قرار می‌دهم.

در قسمت Parameter Selection، شما می‌توانید تنظیمات مربوط به دقت شکل موج سینوسی را مشخص کنید.

برای این کار، مطابق شکل زیر دو انتخاب دارید:

  • System Parameters
  • Hardware Parameters
تنظیمات آی‌پی DDS

تنظیمات آی‌پی DDS

گزینه System Parameters را هنگامی انتخاب می‌کنیم که بخواهیم پارامترهای سیستمی را وارد کنیم.

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

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

اما عمدتاً ما به‌عنوان پیاده‌سازان دیجیتال گزینه دوم (Hardware Parameters) را انتخاب می‌کنیم.

پس از انتخاب این گزینه،‌ مطابق شکل زیر دو پارامتر ظاهر می‌شود:

تنظیمات آی‌پی DDS

تنظیمات آی‌پی DDS

پارامتر اول، قسمت Phase Width است که به‌صورت پیش‌فرض برابر با ۱۶ است.

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

اگر طبق مثال آخرمان، بخواهیم تعداد ۲۱۶  نمونه از یک پریود سینوس انتخاب کنیم، باید مقدار ۱۶ را برای پارامتر Phase Width وارد کنیم.

بنابراین، مقدار این پارامتر همان مقدار N در فرمول step است.

اما پارامتر Output Width، عرض بیت هر نمونه از موج سینوسی ما را مشخص می‌کند.

واضح است که هر چه عرض بیت نمونه‌های ما بیشتر باشد، دقت آن‌ها نیز بیشتر است.

اگر روی دکمه Next کلیک کنیم، صفحه دوم تنظیمات مطابق شکل زیر ظاهر می‌شود:

تنظیمات آی‌پی DDS

تنظیمات آی‌پی DDS

در این صفحه و در قسمت Output Selection می‌توانید مشخص کنید که در خروجی چه شکل موجی داشته باشید.

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

اگر گزینه Next را انتخاب کنید، مطابق شکل زیر، تنظیمات دیگری که در صفحه سوم قرار دارند را مشاهده خواهید کرد:

تنظیمات آی‌پی DDS

تنظیمات آی‌پی DDS

مثلاً، گزینه Memory Type، به‌صورت پیش‌فرض روی Auto تنظیم شده است؛ اما شما می‌توانید گزینه Distributed ROM یا Block ROM را نیز انتخاب کنید.

اگر هر کدام از این گزینه‌ها را انتخاب کنید، پیاده‌سازی حافظه داخلی DDS به‌کمک این نوع از حافظه‌های داخلی FPGA انجام می‌شود.

همان‌طور که احتمالاً می‌دانید، در FPGA‌های شرکت Xilinx ما دو نوع حافظه رم داخلی داریم:

  • حافظه توزیع شده یا Distributed ROM
  • حافظه بلوکی Block ROM

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

همچنین، می‌توانیم گزینه Auto را انتخاب کنیم و این کار را به نرم‌افزار بسپاریم.

من گزینه Auto را انتخاب می‌کنم.

در قسمت Optional Pins نیز می‌توانید پورت‌های کنترلی و بعضی از پورت‌های دیگر را برای این IP حذف یا اضافه کنید.

مثلاً، اگر مطابق شکل زیر، گزینه Clock Enable را انتخاب کنید، ورودی کنترلی Clock Enable در شماتیک سمت چپ صفحه ظاهر می‌شود:

تنظیمات آی‌پی DDS

تنظیمات آی‌پی DDS

یا گزینه Has Phase Out، مشخص می‌کند که آیا شما در خروجی آی‌پی نیازی به فاز لحظه‌ای موج سینوسی دارید یا خیر.

اگر به این مورد نیاز نداشته باشید می‌توانید تیک قسمت Has Phase Out را بردارید؛ به این ترتیب، فقط دامنه موج سینوسی را در خروجی خواهید داشت.

من مطابق شکل زیر، تیک همه گزینه‌های قسمت Optional Pins را برمی‌دارم و سپس، گزینه Next را انتخاب می‌کنم:

تنظیمات آی‌پی DDS

تنظیمات آی‌پی DDS

در صفحه چهارم تنظیمات، بخش بسیار مهمی را خواهیم داشت.

این بخش حتماً باید به‌صورت دقیق تنظیم شود.

همان‌طور که در شکل زیر مشاهده می‌کنید، نام تنظیمات این صفحه، Phase Angle Increment Values است:

تنظیمات آی‌پی DDS

تنظیمات آی‌پی DDS؛ بخش Phase Angle Increment Value

مقدار Phase Angle Increment Value همان مقدار step است که پیش از این توضیح دادم.

ما در صفحات قبلی تنظیمات آی‌پی، مقادیر را طبق آخرین مثال تعیین کردیم. در واقع، ما قصد داشتیم یک موج سینوسی با فرکانس ۱۰ مگاهرتز داشته باشیم.

مقدار فرکانس سیگنال کلاک مدار را برابر با ۱۰۰ مگاهرتز قرار دادیم.

تعداد خانه‌هایی که در حافظه رم داریم و نمونه‌های یک پریود از شکل موج سینوسی را در آن ذخیره می‌کنیم را نیز برابر با ۲۱۶ مشخص کردیم.

اگر این مقادیر را در فرمول step قرار دهیم، مقدار step، برابر با ۶۵۵۴ می‌شود.

اکنون باید این مقدار به‌دست آمده برای step را در قسمت Phase Angle Increment Value وارد کنیم.

اما باید آن را به‌صورت باینری در تنظیمات آی‌پی وارد کنیم. پس می‌توانیم مطابق شکل زیر، به‌کمک ماشین حساب آن را تبدیل به یک مقدار باینری کنیم:

محاسبه معادل باینری گام به‌کمک ماشین حساب

محاسبه معادل باینری گام به‌کمک ماشین حساب

اکنون این مقدار باینری را مطابق شکل زیر در قسمت Phase and Increment Value وارد می‌کنیم:

تنظیمات آی‌پی DDS؛ بخش Phase Angle Increment Value

تنظیمات آی‌پی DDS؛ بخش Phase Angle Increment Value

همان‌طور که گفتم، این IP می‌تواند تا ۱۶ کانال داشته باشد که ما فقط از کانال اول آن استفاده کرده‌ایم.

اگر قصد تولید چند موج سینوسی را به‌کمک این آی‌پی داشتید، می‌توانید در ردیف‌هایی که در شکل بالا مشاهده می‌کنید، برای هر شکل موج، مقدار گام یا step را مشخص کنید.

اکنون در صفحه چهارم تنظیمات گزینه Next را انتخاب می‌کنیم. سپس، صفحه زیر ظاهر می‌شود که در آن نیز گزینه Next را انتخاب می‌کنیم:

تنظیمات آی‌پی DDS

در آخرین صفحه مربوط به تنظیمات این IP، می‌توانید فرکانس سیگنال نهایی که حاصل تنظیماتمان است را ببینیم:

فرکانس موج سینوسی که به‌کمک آی‌پی DDS در FPGA تولید می‌شود.

فرکانس موج سینوسی که به‌کمک آی‌پی DDS در FPGA تولید می‌شود.

همان‌طور که در قسمت Actual MHz مشاهده می‌کنید، فرکانس شکل موج سینوسی حاصل برابر با ۱۰ مگاهرتز است.

البته توجه داشته باشید که این فرکانس دقیقاً برابر با ۱۰ مگاهرتز نیست؛ با توجه به گام‌های خواندن از حافظه رم و عرض بیتی که برای فاز انتخاب کردیم (پارامتر Phase Width در صفحه اول تنظیمات آی‌پی)، این فرکانس حاصل شده است.

البته فرکانس حاصل، دقت خوبی دارد و تا سه رقم اعشار مقدار صفر دیده می‌شود؛‌ بنابراین، مقدار خطا قابل قبول است.

تنظیمات مربوط به این IP به پایان رسید و مثل همیشه می‌توانید دکمه Generate را انتخاب کنید تا این IP، به‌صورت یک ماژول به پروژه شما اضافه شود.

پس از آن می‌توانید این ماژول را در مدار یا در تاپ‌ماجولتان instant کنید و از آن استفاده کنید.

برای instant کردن و port map کردن این ماژول می‌توانید به برنامه ویدئویی که در همین زمینه قبلاً در سایت منتشر کرده‌ام مراجعه کنید.

برای آشنایی با نحوه استفاده از IPها در نرم‌افزار ISE برنامه ویدئویی زیر را ببینید…

در این ویدئو، روش استفاده از IP‌ها و instant کردن و port map کردن آن‌ها در تاپ‌ماجول را به‌طور مفصل شرح داده‌ام.

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

آیا برنامه ویدئویی چطور یک مولد موج سینوسی در FPGA پیاده‌سازی کنیم برای شما مفید بود؟

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

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

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

درباره نویسنده:

احمد ثقفی

شاید به این موضوعات نیز علاقه داشته باشید:

  • سلام، اگه بخوایم ((sin(2*pi*f*t+(pi/4 رو ایجاد کنیم با DDS برای ایجاد اون pi/4 باید چه کار کنیم؟ آیا می توان در داخل خوده آیپی این را اعمال کرد؟؟ با تشکر

  • برای تغییر یا منترل سرعت موج سینوسی ه تولید شده، گفتین که مثلا اگر ما ۱۰ نمونه گرفتیم و در بلاک رم ذخیره کردیم، برای خواندن از بلاک رم، به جای اینکه یکی یکی بخونیم، مثلا یکی در میون میخونیم که میشه ۵ نمونه و سرعت میشه ۲۰ مگ. خب هرچقدر تعداد نمونه ها بیشتر باشه، موج دقیق تری خواهیم داشت. خب چه کاری ه که اول ۱۰ نمونه برداریم و بعد از بلاک رم ۵ تاش رو بخونیم. از همون اول ۵ تا نمونه میگیریم.
    آیا اگر این کار رو بکنیم تفاوتی داره ؟
    یا اینکه من درست متوجه نشده ام!

    • در مثال ۱۰ نمونه، این موضوع قابل لمس نیست. اما مساله به طور کلی به این صورت است:

      دقت زمانی و در نتیجه دامنه‌ای سیگنال سینوسی با ۵ نمونه بسیار کمتر از سیگنال سینوسی مثلا با ۱۰۰ نمونه است که ۵ نمونه از آن را جدا کردیم.

      • سلام جناب ثقفی.

        بسیار ممنون از آموزش های روان، ساده و پر محتوایی که ارایه میدید.
        خب خواندن چند در میان نمونه ها از LUT ، باعث خارج شدن از حالت سیگنال تن میشه( هارمونیک دار میشه).
        در DDS IP که اشاره کردید نمونه ها در بازه ی یک دوره تناوب یا ۲*pi ذخیره شدند. به عبارت دیگه مثلا اگر تعداد نمونه ها ۲۵۶ باشه، دقت هر استپ ۳۶۰/۲۵۶=۱٫۴ درجه میشه.
        از طرفی میدونیم قدر مطلق اندازه در بازه ۰ تا pi/2 در بازه pi/2 تا ۲*pi تکرار میشه. برای یک زاویه دلخواه، فقط کافیه مقدار متناطر در بازه ۰ تا pi/2 خونده بشه و علامت منفی یا مثبت، با توجه به فاز، درش ضرب بشه.
        بر همین اساس، اگر این ۲۵۶ نمونه رو به ۰ تا pi/2 اختصاص بدیم دقت میشه ۹۰/۲۵۶=۰٫۳۵۱ درجه.
        انگار که یک LUT با ۱۰۲۴ داریم. ولی فقط با اشغال ۲۵۶ خانه.
        البته برای این پیدا کردن نمونه در بازه ۰ تا ۹۰ درجه، کلاک اضافه مصرف میشه. در عوض با مصرف حافظه کمتر، و سیگنال با فرکانس اولین هارمونیک چهار برابر بزرگتر و البته دامنه هارمونیک کوچکتر خواهیم داشت و این میتونه در جایی که سیگنال صاف تری نیاز هست، کاربرد خودش رو داشته باشه.

        و باز هم ممنون از وقتی که برای تهیه این آموزش ها اختصاص میدید.

        • سلام،

          خوشحالم که این آموزش مورد توجه شما قرار گرفته است.

          خود IP هم به موضوعی که اشاره کردید توجه دارد و همه نمونه‌ها ذخیره نمی‌کند.

          موفق باشید.

  • این آموزش واقعا به من کمک کرد.
    خیلی مفید بود با وجود اینکه نمیخواستم از DDS IP استفاده کنم ولی اون ۳ روش تنظیم فرکانس خیلی آموزنده بود و کمک کننده.

  • سلام بر شما استاد محترم
    ممنون از آموزشهاتون
    یک سوال برای من ایجاد شده برای ایجاد یک سینوسی مقدار نمونه های آن با چه پارامتری رابطه دارند؟
    به بیان دیگر اگر ما ۱۶=N باشد با اینکه ۳۲=N باشد چه تفاوتی دارد؟
    به طور کلی چه پارامتری مشخص کننده این پارامتر است؟

    • سلام،

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

      موفق باشید

  • ضمن عرض سلام و وقت بخیر
    من زمانی که IP رو Generate میکنم Generate نمیشه و با خطای زیر مواجه میشم میشه راهنماییم کنید ممنونم.
    ERROR:sim – “._cg_dbgDDS_IP.prj” line 39: Source file
    ./xbip_dsp48_addsub_v2_0/xbip_dsp48_addsub_v2_0_xst_comp.vhd does not exist
    ERROR:sim – Failed executing Tcl generator.
    ERROR:sim – Failed to generate ‘DDS_IP’. Failed executing Tcl generator.

  • سلام مهندس من ی مطلب رو متوجه نشدم . یعنی در پین های خروجی FPGA سیگنال سینوسی خواهم داشت . یه چیز آنالوگ؟؟

    • سلام،

      اولا سیگنال سینوسی که تولید می‌کنیم لزوما به بیرون FPGA ارسال نمی‌شود و ممکن است درون FPGA استفاده شود. دوما، ما به کمک این روش، نمونه‌های دیجیتالی از سیگنال سینوس را تولید می‌کنیم و سیگنال آنالوگی وجود ندارد.

      موفق باشید.

  • سلام آقای ثقفی. ممنون از آموزش خوبتون.
    ببخشید اگر بخوایم این سیگنال سینوسی را در یک ماژول تست به صورت آنالوگ ببینیم باید چکار کنیم؟

    • سلام،

      برای تست، شما می‌توانید از ابزار چیپ‌اسکوپ استفاده کنید. در صورت تمایل به تبدیل این سیگنال به یک سیگنال آنالوگ، می‌توانید از مبدل دیجیتال به آنالوگ در کنار FPGA استفاده کنید.

      موفق باشید.

  • سلام
    توضیحات بسیار عالی بود، عالی عالی خیلی ممنونم
    یک سوال دارم
    وقتی ورودی سینوسی را با استفاده از روش DDS به سیستم طراحی شده می دهیم و خروجی را می گیریم، چجوری میشه خروجی را به صورت سینوسی دید؟ یعنی خروجی هر نمونه را کنار هم بزاریم و به صورت انالوگ نمایش بدیم؟

    • سلام، خوشحالم که این آموزش برای شما مفید بوده است.

      شما می‌توانید از ابزار چیپ‌اسکوپ استفاده کنید و یا یک مبدل دیجیتال به آنالوگ روی بردتان استفاده کنید.

      موفق باشید.

    • سلام،

      در تئوری، اگر فرض کنیم سیگنال سینوسی شما از چهار نقطه به ترتیب با مقادیر دامنه صفر، یک، صفر و منفی یک تشکیل شده است، تا فرکانسی برابر با یک‌چهارم Fclk می‌تواند ایجاد کرد.

      موفق باشید.

  • {"email":"Email address invalid","url":"Website address invalid","required":"Required field missing"}

    ۷ تکنیک پیشرفته کدنویسی برای FPGA

    >