آیا مدارتان را با موفقیت شبیهسازی کردهاید اما وقتی آن را در FPGA پیادهسازی میکنید مدار کار نمیکند؟
آیا برای انتقال صحیح دادهها بین یک قطعه جانبی مثل ADC یا حافظه و FPGA به مشکل برخوردهاید؟
آیا مدار شما در دمای معمولی درست کار میکند اما در سرما یا گرمای شدید دچار مشکل شده است؟
اگر پاسختان به بعضی از سوالات بالا مثبت است، مدار شما به احتمال زیاد دچار مشکلات زمانبندی یا Timing است.
More...
و آنچه میتواند به شما برای رفع این مشکل کمک کند، استفاده از قیدها یا Constraints در نرمافزار ISE است.
آشنایی با مفهوم قیدها در نرمافزار ISE و نحوه تنظیم آنها از جمله مواردی است که به شما کمک میکند، مداراتی با استانداردهای حرفهای پیادهسازی کنید.
انواع مختلف قید یا Constraints در نرمافزار ISE وجود دارد که مهمترین آنها، قیدهای زمانی و قیدهای پیادهسازی هستند.
برای آشنایی با نرمافزار ISE این برنامه ویدئویی را ببینید…
در این برنامه، شما را با سه قید مهم زمانی که استفاده از آنها در هر پروژهای ضروری است آشنا میکنم. این قیدها که به آنها قیدهای زمانی گلوبال گفته میشود، شامل موارد زیر هستند:
- قید Period
- قید Offset IN
- و قید Offset OUT.
به کمک این قیدها میتوانید زمانبندی یا Timing مسیرهای دیتا را در تمام مداری که با FPGA پیادهسازی میکنید تحت کنترل داشته باشید.
قید Period به شما کمک میکند، مقدار فرکانس کلاکی را که قصد دارید به مدارتان اعمال کنید به نرمافزار پیادهسازی اطلاع دهید. این باعث میشود که پیادهسازی بر مبنای فرکانس کلاک مورد نظر شما انجام شود و همچنین تحلیل کاملی از نتیجه پیادهسازی به شما ارائه خواهد شد.
قیدهای Offset IN و Offset OUT به شما کمک میکنند بتوانید قطعات جانبی مثل ADC، DAC و انواع حافظه را به طور اصولی و بدون مشکل در انتقال دیتا به FPGA متصل کنید.
در این برنامه همچنین در مورد مفهوم Setup Time و Hold Time در پیادهسازی دیجیتال و ارتباط آن با موضوع زمانبندی به طور کامل توضیح میدهم.
ویدئو یا متن؟
محتوای این برنامه آموزشی، به دو صورت ویدئو و متن آماده شده است. اگر علاقمند به یادگیری این مطلب به صورت ویدئویی هستید، ویدئوی زیر را ببینید و اگر ترجیح میدهید آن را به صورت متن مطالعه کنید، ادامه این مطلب را بخوانید.
برای دانلود نسخه با کیفیت این ویدئو، روی دکمه زیر کلیک کنید:
در این مقاله قصد دارم، در مورد روشهای افزایش سرعت مدار، با تنظیم قیود زمانی در نرم افزار ISE، صحبت کنم.
تنظیم قیود زمانی، مسئلهای است که بیشتر طراحان دیجیتال با FPGA، آن را نادیده میگیرند و همین امر، باعث بروز مشکلات زیادی در مراحل مختلف پیادهسازی میشود. اگر میخواهید مداراتی که با FPGA پیادهسازی میکنید، دارای استانداردهای حرفهای باشند، حتما باید با مسئلهی تنظیم قیدها آشنایی داشته باشید و آن را به نحو صحیحی به کار ببرید.
مشکلات ایجاد شده ناشی از عدم استفاده از قیود زمانی
عدم استفاده از قیود زمانی، چه مشکلاتی در مدار ایجاد میکنند؟
ممکن است تا به حال با این مسئله مواجه شده باشید که مداری را پیادهسازی کرده و آن را در نرمافزار، شبیهسازی کرده باشید؛ و تا این مرحله همه چیز درست باشد؛ اما وقتی آن مدار را در FPGA پیادهسازی میکنید، درست کار نمیکند.
یا ممکن است، شما FPGA را با یک قطعهی جانبی مثل A2D یا حافظه، Interface کرده باشید و وقتی دیتایی که از A2D به سمت FPGA میآید را بررسی میکنید، میبینید که این انتقال دیتا با خطا همراه است.
مسئلهی دیگری که برای افرادی که در زمینهی FPGA، حرفهایتر فعالیت کردهاند، ممکن است به وجود آمده باشد، این است که انتقال دیتا بین FPGA و یک قطعهی جانبی در دمای معمولی درست انجام میشود اما در گرما یا سرمای شدید دچار خطا میشود.
علت تمامی این مشکلات، میتواند عدم استفادهی صحیح از قیود زمانی باشد. البته این مشکلات میتوانند دلایل دیگری نیز داشته باشد؛ ولی به احتمال زیاد، اگر در مداری این مسائل رخ دهد، میتوان به کمک استفادهی صحیح از قیود زمانی، این مشکلات را برطرف کرد.
ریشهی مشکلات زمانبندی در FPGA کجاست؟
به طور خلاصه، رعایت نشدن مقدار لازم برای Setup Time وHold Time ، در عناصر سنکرون مدار، باعث بروز مشکلات زمانبندی میشود. ممکن است این جمله، پیچیده به نظر برسد؛ چون در آن، مفاهیم مختلفی وجود دارد که در ادامه، دربارهی آنها صحبت خواهیم کرد.
مسئلهی عناصر سنکرون، مفهوم Setup Time و مفهوم Hold Time، مفاهیم بسیار مهمی هستند.
در یک مدار دیجیتال، عناصر و قطعاتی که تغییر و انتقال دیتا در آنها، همزمان با سیگنال کلاک انجام میشود، عناصر سنکرون نامیده میشوند.
مثلاً، رجیستری که در شکل زیر میبینید، برای رجیستر کردن و ورود دیتای حاضر در پورت ورودیش، نیاز به دریافت لبهی بالا روندهی کلاک دارد؛ در واقع رجیستر شدن یا ورود دیتا به رجیستر، همزمان با لبهی بالاروندهی کلاک است.

شمایی از یک رجیستر
همچنین، تعیین خروجی Q در این رجیستر، همزمان با لبهی بالاروندهی کلاک است؛ یعنی هرگاه لبهی بالاروندهی کلاک ظاهر شود، خروجی تغییر میکند. بنابراین این عنصر، یک عنصر سنکرون است.
اما نکته ای که در عناصر سنکرون وجود دارد این است که برای انتقال صحیح دیتا به آنها، نیاز است که چند لحظه قبل از لبهی بالاروندهی کلاک، و چند لحظه بعد از آن، دیتا به صورت ثابت و پایدار در ورودی عنصر سنکرون حضور داشته باشد.
نمودار زمانبندی ورود دیتا به عنصر سنکرون
به کمک نمودار زمانی زیر، میتوانید این موضوع را بهتر متوجه شوید. در قسمت پایین نمودار، سیگنال کلاک ورودی به عنصر، مشاهده میشود. در قسمت بالا، زمانبندی دیتای ورودی به رجیستر را مشاهده میکنید.

نمودار زمانبندی ورود دیتا به رجیستر
در لحظاتی که دیتا به صورت دو خط موازی نمایش داده شده، یعنی دیتا به صورت ثابت و پایدار در ورودی رجیستر قرار گرفته است.
در لحظاتی که دیتا در حال تغییر است، به صورت خطوط مورب نشان داده شده است؛ در این لحظات، دیتا پایدار نیست و مقدار معتبری ندارد؛ بنابراین نمیتوان آن را در رجیستر ذخیره کرد.
همانطور که قبلاً توضیح دادم، در عناصر سنکرون، نیاز است که چند لحظه قبل از لبهی بالا روندهی کلاک و چند لحظه بعد از آن، دیتا به صورت ثابت و پایدار در ورودی دیتا قرار داشته باشد.
در شکل بالا میبینید که برای رجیستر کردن دیتای D1، چند لحظه قبل از لبهی بالاروندهی کلاک و چند لحظه بعد از آن، دیتا به صورت ثابت و پایدار در ورودی رجیستر قرار داشته است.
به مدت زمانی که لازم است قبل از لبهی بالاروندهی کلاک، دیتا در ورودی عنصر سنکرون به صورت پایدار و ثابت وجود داشته باشد، Setup Time گفته میشود که در شکل، آن را با TSetup نشان دادهایم.
همچنین، به مدت زمانی که لازم است بعد از لبهی بالاروندهی کلاک، دیتا در ورودی عنصر سنکرون به صورت ثابت و پایدار باقی بماند،Hold Time گفته میشود که در شکل، آن را با THold نشان دادهایم.
خطای Setup Time و Hold Time چگونه رخ میدهد؟
در یک مدار واقعی، ممکن است در مسیر ورودی دیتا به رجیستر، مدارات دیگری -مثلاً مدارات ترکیبی- حضور داشته باشند. برای مثال، در شکل زیر، مدار ترکیبی حاضر در ورودی، باعث ایجاد یک تاخیر میشود؛ یعنی هر مدار ترکیبی، یک Propagation Delay یا تاخیر انتشاری دارد که باعث میشود سیگنالی که در آن مسیر قرار دارد، دچار تاخیر شود.
بنابراین، قرار گرفتن مدار ترکیبی در مسیر ورودی، باعث تاخیر در زمانبندی دیتای ورودی به رجیستر میشود؛ بنابراین زمانبندی به صورت شکل زیر تغییر میکند.

نمودار زمانبندی ورود دیتا به رجیستر، در حضور مدارات ترکیبی در مسیر ورودی
در این تصویر، زمانبندی دیتا و کلاک ورودی به رجیستر، در حضور یک مدار ترکیبی نشان داده شده است. میبینیم که دیتا نسبت به لبهی بالاروندهی کلاک، شیب پیدا کرده است.
حال ببینیم آیا قواعدی که قبلاً از نظر Setup Time و Hold Time گفته شد، در این زمانبندی رویت میشود یا خیر.
همانطور که در شکل میبینید، در لحظهای که دیتای D1 معتبر بوده، لبهی بالا روندهی کلاک ظاهر شده است و تا اینجا مشکلی وجود ندارد. ما انتظار داریم، قبل از لبهی بالارونده، به اندازهی زمان TSetup، دیتا به صورت ثابت و پایدار، در مقابل ورودی عنصر سنکرون، قرار داشته باشد. ولی در شکل میبینیم که در لحظات Setup Time ، دیتا در حال تغییر است و معتبر نیست؛ بنابراین یک خطای Setup Time رخ داده و دیتایی که وارد رجیستر میشود، مطمئناً دیتای درستی نخواهد بود.
این موضوع، مشکل اصلی در زمینهی Timing است؛ و در صورتی که از قیود زمانبندی در پیادهسازیهایتان در FPGA، به درستی استفاده نکنید، ممکن است رخ دهد.
انواع مسیرهای انتشار درون FPGA
برای اینکه بتوانیم تاخیرهای انتشار مسیرها را به صورت صحیح پیادهسازی کنیم و همچنین اطلاعاتی از این تاخیرها داشته باشیم، نیاز است که به کمک اعمال صحیح قیدها به مسیرهای انتشار مختلف در FPGA، آنها را کنترل کنیم.
به طور کلی، مسیرهای انتشار درون FPGA، مطابق با شکل زیر، به سه نوع تقسیم میشوند:

شمایی از مسیرهای انتشار درون FPGA
مسیر اول، مسیر بین پینهای ورودی FPGA تا عناصر سنکرون است.
مسیر دوم، مسیر بین عناصر سنکرون است؛ مثلاً از یک رجیستر تا یک رجیستر دیگر.
و مسیر نوع سوم، مسیر بین یک عنصر سنکرون تا پایه های خروجی FPGA است.
انواع قیدهای زمانی
برای هر کدوم از این سه نوع مسیر، سه قید زمانی متفاوت وجود دارد؛ که باید از آنها به نحو صحیحی در پروژههایتان استفاده کنید.
به قیدهای زمانی که از آنها برای کنترل و زمانبندی این سه نوع مسیر استفاده میکنیم، اصطلاحاً قیدهای زمانی Global گفته میشود.
قبل از پرداختن به این قیدها، اجازه دهید دربارهی این موضوع صحبت کنیم که در پیادهسازی دیجیتال، قید چه مفهومی دارد.
در نرمافزار ISE، استفاده از قیود، روشی است که شما به کمک آن، هدفتان از پیادهسازی را به نرمافزار پیادهساز، اعلام میکنید؛
مثلاً به نرمافزار پیادهساز میگویید که هدف من از پیادهسازی این است که تا حد ممکن، سرعت کلاک بیشتری به دست آورم.
یا ممکن است به نرمافزار اعلام کنید که هدف من از پیادهسازی این است که فضای کمتری در FPGA اشغال شود، یا منابع دیجیتالی کمتری از FPGA مصرف شود.
شما میتوانید به کمک قیدها، این موارد را به نرمافزاری که کد شما را پیادهسازی میکند، اعلام کنید.
انواع مختلف قیدها در نرمافزار ISE وجود دارد؛ ما در این مقاله، مشخصاً در مورد قیدهای زمانی و قیدهای زمانی Global، صحبت خواهیم کرد.
سه قید زمانی Global متفاوت، برای جلوگیری از مشکلات زمانبندی در نرمافزار ISE وجود دارد.
قید اول، قید Period است که برای پوشش مسیرهای انتشار بین عناصر سنکرون استفاده میشود.
قید دوم، قید Offset In است که برای پوشش مسیرهای انتشار بین پایههای ورودی FPGA تا عناصر سنکرون استفاده میشود.
و در نهایت، قید آخر، قید Offset Out است که برای پوشش مسیرهای بین عناصر سنکرون و پایههای خروجی استفاده میشود.
اکنون اجازه دهید دربارهی مسیرهای انتشار بین عناصر سنکرون بیشتر صحبت کنیم؛
مطمئناً، اکثر مدار شما، شامل مسیرهای بین عناصر سنکرون خواهد بود؛ چون تعداد پایههای ورودی و خروجی مدار شما محدود هستند؛ بنابراین مسیرهای انتشار مربوط به آنها نیز محدود میشود.
اما بقیهی کد شما، شامل عناصر سنکرون میشود که بین آنها، مسیرهای انتشاری وجود دارد و باید برای این مسیرها، از قید Period استفاده کنید.
مشکلاتی که در صورت عدم استفاده از قیدهای زمانی ممکن است رخ دهد
در صورت عدم استفاده از قیدهای زمانی، چه مشکلاتی در مدار ایجاد میشود؟
به شکل زیر توجه کنید؛ در این شکل، دو عنصر سنکرون میبینید که مسیر انتشاری بین آنها وجود دارد. یک مدار ترکیبی نیز، بین این مسیر وجود دارد. کلاک سیستم به هر دو عنصر سنکرون به صورت همزمان اعمال میشود.

مسیر بین دو عنصر سنکرون
فرض کنید، کلاک سیستم 100 مگاهرتز است؛ بنابراین دورهی تناوب آن، ۱۰ نانوثانیه میشود.
و فرض کنید، تاخیر انتشار مدار ترکیبی حاضر در مسیر بین دو عنصر سنکرون، پنج نانوثانیه است.
اکنون، اگر یک لبهی بالاروندهی کلاک به این عناصر سنکرون اعمال شود، خروجی رجیستر اول تغییر میکند؛ آنگاه، به دلیلPropagation Delay یا تاخیر انتشار مدار ترکیبی، این تغییر، بعد از پنج نانوثانیه به ورودی دیتای رجیستر دوم میرسد و پایدار میشود. پس از پنج نانوثانیهی دیگر(جمعاً ۱۰ نانوثانیه میشود که برابر دورهی تناوب کلاک است.)، لبهی بالارونده کلاک ظاهر میشود و دیتای پایدار شده، بدون مشکل، در رجیستر دوم خوانده میشود.
اما حالتی را فرض کنید که تاخیر انتشار مدار ترکیبی، از پریود کلاک بیشتر باشد؛ مثلاً فرض کنید، تاخیر انتشار مدار ترکیبی، ۱۵ نانوثانیه است. وقتی لبهی بالا روندهی کلاک ظاهر میشود، خروجی رجیستر اول تغییر میکند، بعد از ۱۰ نانوثانیه، این خروجی هنوز در بین راه رسیدن به رجیستر دوم است، که لبهی بالاروندهی بعدی کلاک ظاهر میشود. بنابراین، مطمئناً رجیستر دوم، نمیتواند دیتای صحیحی را ذخیره کند.
این مشکل، در صورت عدم زمانبندی صحیح بین مسیرهای عناصر سنکرون رخ میدهد.
استفاده از قید Period، میتواند در رفع این مشکل به ما کمک کند.
نرمافزار پیادهساز، از فرکانس کلاکی که قصد دارید به مدار اعمال کنید، با خبر نیست؛
مسئلهای که وجود دارد این است که نرمافزار پیادهساز، از فرکانس کلاکی که قصد دارید بعد از پیادهسازی به مدار اعمال کنید، با خبر نیست؛ به همین دلیل، بر مبنای تنظیمات پیشفرض قیود دیگر، و تنظیماتی که در کل نرم افزار ISE وجود دارد، تلاش میکند تا حدودی، تاخیر بین این عناصر سنکرون را کاهش دهد؛ اما این مسئله که میزان کاهش تاخیر، مطابق با نیاز شما است یا خیر، قابل تشخیص نیست.
بنابراین، ما به کمک قید Period، به نرمافزار پیادهساز اطلاع میدهیم که قرار است چه فرکانس کلاکی به مدار اعمال کنیم.
مثلاً فرض کنید به نرمافزار اعلام کنیم که قرار است، مدار را با فرکانس کلاک ۱۰۰ مگاهرتز پیادهسازی کنیم. نرمافزار، برمبنای این اطلاعات، تلاش میکند تا تاخیر انتشار بین عناصر سنکرون را به گونهای کاهش دهد که اعمال فرکانس ۱۰۰ مگاهرتز باعث بروز خطاهای زمانی Hold و Setup نشود؛ تا دیتا، به صورت صحیح بین عناصر سنکرون منتقل شود.
در انتهای فرایند پیادهسازی، نرمافزار پیادهساز، نتیجهی اعمال قید Period را در گزارشی به شما اعلام میکند. در این گزارش، چند مورد را به شما اعلام میکند؛
اول آنکه، آیا قید Period، با موفقیت اعمال شده است یا خیر.
و دوم، اگر نرمافزار موفق به اعمال این قید نشده است، در چه نقاطی از مدار، این اتفاق رخ داده است؛ به این ترتیب، این گزارش به شما کمک میکند که آن نقاط را بررسی کرده و مشکل را برطرف کنید.
نحوهی اعمال قید Period به مدار
به صورت کلی، شما به دو روش میتوانید قید Period را به مدار اعمال کنید؛
روش اول این است که قید Period را مستقیماً در فایل UCF وارد کنید.
فایل UCF یا User Constraints File (یعنی فایل قیود کاربر)، فایلی است که شما میتوانید انواع قیود را در آن وارد کنید.
احتمالاً تا این لحظه، تنها قیدی که در فایل UCF وارد کردهاید، قید Location است که برای Pin Assignment به کار میرود. قید Location، قیدی است که به کمک آن، پورتهای مدار را به پینهای FPGA متصل میکنید.
اکنون میخواهیم از قید Period استفاده کنیم. در زیر، Syntax استفاده از این قید را میبینید؛ باید عبارات زیر را در فایل UCF تایپ کنید.
NET "Clock" LOC = P85; NET "Clock" TNM_NET = Clock; TIMESPEC TS_Clock = PERIOD "Clock" 50 MHz HIGH 50% INPUT_JITTER 200 ps;
فرض کنید نام پورت کلاک در کد ما، Clock باشد؛ در خط اول میبینید که این پورت را به پین شمارهی 85 FPGA متصل کردهام.
در خط سوم، ۵۰ مگاهرتز را برای فرکانس این قید مشخص کردهام.
البته نکات دیگری را نیز میتوانید در قید Period تنظیم کنید؛ مثلاً، میتوانید Duty Cycle کلاک ورودی را مشخص کنید که من آن را ۵۰% قرار دادهام.
و یا برای Jitter کلاک ورودی، عدد ۲۰۰ پیکوثانیه را در نظر گرفتهام.
روش دوم، استفاده از نرمافزار Constraints Editor، از مجموعهی نرمافزار ISE است.
این روش، از روش قبلی راحتتر است. میتوانید به کمک پنجرههای تنظیماتی که در آن وجود دارد، قید Period و سایر قیدهای زمانی را اعمال کنید.
افزایش سرعت کلاک با تنظیم قیود پیادهسازی
آخرین موضوع این مقاله، افزایش سرعت کلاک با تنظیم قیود پیادهسازی است. همانطور که قبلاً اشاره شد، میتوانیم به کمک قیدهای زمانی، بحث زمانبندی یا Timing پیادهسازی را، کنترل کنیم و تا حد ممکن سعی کنیم که پیادهسازی بر مبنای خواستهی ما انجام شود.
در واقع، ما به کمک قیدهای زمانی Global، به نرمافزار اطلاع میدهیم که دنبال چه سرعت کلاکی هستیم. اما ممکن است نرمافزار نتواند در پیادهسازی به کلاک مورد نظر ما دست یابد. در این صورت باید چه کاری انجام دهیم؟
اولین کاری که ممکن است انجام دهید، ایجاد تغییراتی در معماری مدار است. مثلاً از روش پایپلاین استفاده کنید تا سرعت مدار را افزایش دهید. در نتیجه، میتوانید کلاکی با سرعت بیشتر به مدار اعمال کنید.
اما اگر روش پایپ لاین برای شما کارساز نبود، روش دوم این است که در نرمافزار پیادهساز، از قیود پیادهسازی استفاده کنید.
قیود پیادهسازی در نرمافزار، شامل قیدهای بسیار متنوعی میشوند که صحبت در مورد آنها زمانی زیادی میطلبد. تنظیم این قیود به تجربهای طولانی نیاز دارد. اما در نرمافزار ISE، روشهایی وجود دارد که میتوانید به کمک آنها، این قیدها را به صورت هوشمندانه تنظیم کنید. در واقع، به کمک پیشنهاداتی که خود نرمافزار به شما ارائه میکند، به احتمال زیاد، میتوانید به فرکانس کلاک مد نظرتان برسید.
اعمال قیدهای زمانی به پروژههایی که با FPGA پیادهسازی میکنید، مسئلهی بسیار مفصلی است که برای توضیح جزئیات آن، به زمان بسیار بیشتری نیاز است؛ به همین دلیل، من برنامهی ویژهای برای آموزش روش اعمال قیدهای زمانی برای افزایش سرعت مدار در پروژههایی که با FPGA پیادهسازی میشوند آماده کردهام.
در آن برنامه، به صورت کامل، انواع قیود زمانی و نحوهی اعمال آنها به مداراتی که با FPGA پیادهسازی میکنید را توضیح دادهام. همچنین، به صورت عملی و به کمک مثالهای متنوع، نحوهی استخراج مقادیر قیدها، از طریق مطالعهی دیتاشیت قطعاتی که به FPGA متصل کردهاید را، نشان دادهام.
اگر تمایل دارید در زمینهی اعمال قیدهای زمانی و افزایش سرعت مدارات دیجیتال به کمک انواع قیدها، اطلاعات بیشتری به دست آورید، پیشنهاد میکنم که آن برنامه را تهیه کنید و از آموزشهای آن استفاده کنید.
در حال حاضر، دورهی "رازهای افزایش سرعت مدار در ISE" فقط به عنوان هدیهی دورههای "طراحی دیجیتال با FPGA" و "پردازش سیگنال با FPGA" ارائه می شود و به صورت مستقل قابل تهیه نیست.
امیدوارم از خواندن این مقاله هم لذت برده باشید و بتوانید از نکات یاد گرفته شده، در انجام پروژههایتان استفاده کنید.
آیا برنامه ویدئویی افزایش سرعت مدار با تنظیم قیدها در ISE برای شما مفید بود؟
لطفا نظرتان را در مورد این برنامه در پایین همین پست با دیگران به اشتراک بگذارید. همچنین با کلیک روی هر کدام از دکمههای اشتراک گذاری ابتدای این مطلب و به اشتراکگذاری آن در شبکههای اجتماعی میتوانید افراد بیشتری را در یادگیری این مطالب سهیم کنید.

