1 اسفند, 1400

کنترل کلاک ماجول‌های مدار در FPGA

نقش کلاک در سیستم‌های دیجیتال چیست؟

عملکرد و درستی مدار، تا چه اندازه به کلاک آن مدار وابسته است؟

آیا راه‌‌های اصولی کنترل کلاک ماجول‌های مدار در FPGA، را می‌شناسید؟

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

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

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

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

More...

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

جایگاه بسیار مهم و اساسی کلاک در سیستم‌های دیجیتال

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

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

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

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

کنترل کلاک ماجول‌های مدار در FPGA

چرا می‌خواهیم کلاک ماجول‌های مدار را کنترل کنیم؟

فرض کنید مداری را در FPGA پیاده‌سازی کردیم که از چند ماجول مختلف تشکیل شده است.

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

یک حالت این است که ورودی کلاک هر ماجول را به صورت دائمی به آن اعمال کنیم تا مدار کار کند و به عملکرد خود ادامه دهد.

اما نکته‌ای که حائز اهمیت است، این است که تمامی ماجول‌ها، در تمامی لحظات، مورد نیاز نیستند.

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

در حالت دیگر ما علاقه‌مند هستیم که در لحظاتی که ماجول هیچ کار خاصی انجام نمی‌دهد، کلاک آن را قطع کنیم... اما چرا؟ 

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

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

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

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

اما بیشتر از این به کاربردها و مثال‌ها نمی‌پردازیم و در ادامه می‌خواهیم سراغ روش‌های کنترل کلاک برویم.

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

روش Gated Clock

روش Gated Clock یک روش غیر اصولی است، و متاسفانه اکثر افراد از همین روش غیر اصولی استفاده می‌کنند.

روش Gated Clock، باعث glitch، افزایش تاخیر کلاک و انواع مشکلات زمانی می‌شود.

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

ابتدا به کد زیر توجه کنید:

Gated_Clock <= En and G1 and Clock;
process(Gated_Clock)
begin
	if risinge_edge(Gated_Clock) then
		A <= B;
	end if;
end process;

در کد بالا، هدف از پیاده‌سازی این بوده است که بتوانیم کلاک (Clock) این ماجول خاص از مدار را به کمک سیگنال‌های En و G1 کنترل کنیم.

برای این کار، ابتدا در محیط Concurrent، سیگنال Clock را با سیگنال‌های En و G1 به صورت منطقی AND کرده و به یک سیگنال جدید به اسم Gated Clock ارجاع دادیم.

بنابراین اگر سیگنال‌های En و G1 برابر با '1' باشند، در Gated Clock، سیگنال Clock را خواهیم داشت، در غیراین‌صورت Gated Clock برابر با '0' خواهد بود.

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

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

کنترل کلاک ماجول‌های مدار در FPGA

کنترل کلاک ماجول‌های مدار در FPGA، به روش Gated Clock

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

اما کلاک این فلیپ‌فلاپ، حاصل AND منطقی کلاک اصلی مدار (Clock)، و سیگنال‌های En و G1 است.

در این مدار ما یک طراحی اشتباه و غیراصولی انجام داده‌ایم.

ما در مسیر کلاک فلیپ‌فلاپ، از یک مدار ترکیبی (گیت منطقی AND) استفاده کردیم.

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

از معایب و پیامد‌های بد این عمل، به وجود آمدن پدیده glitch و ایجاد مشکل در محاسبات پیاده‌سازی است و باعث به وجود آمدن یک مدار غیر بهینه، خصوصا از نظر زمانی می‌شود.

بنابراین توصیه می‌شود که به هیچ وجه در مسیر کلاک، هیچ نوع مداری قرار ندهید، و از روش غیر اصولی Gated Clock اصلا استفاده نکنید.

اما راه‌حل چیست؟

روش Clock Enable

روش Clock Enable یک روش اصولی و توصیه‌شده برای کنترل کلاک مدار است.

استفاده از روش Clock Enable باعث کاهش منابع مصرفی و افزایش سرعت مدار می‌شود.

همچنین این روش قابلیت اطمینان مدار را بالا می‌برد و باعث کاهش بسیار شدید مشکلات زمانی در مدار می‌شود.

برای کنترل کلاک به روش Clock Enable، به جای اینکه تغییراتی را بر روی کلاک اعمال کنیم، از قابلیتی که فلیپ‌فلاپ FPGAهای شرکت Xilinx از قبل دارند، به نحو صحیحی استفاده خواهیم کرد.

فلیپ‌فلاپ FPGAهای شرکت Xilinx، یک ورودی کنترلی به اسم CE یا Clock Enable دارند که اگر این ورودی کنترلی را غیرفعال کنیم، دیگر کلاکی به این فلیپ‌فلاپ اعمال نخواهد شد.

برای توضیحات بیشتر در رابطه با این روش، ابتدا به کد زیر توجه کنید:

Enable <= En and G1;
process(Clock)
begin
	if risinge_edge(Clock) then
		if(Enable = '1') then
			A <= B;
		end if;
	end if;
end process;

در کد بالا، سیگنال‌هایی که در کنترل کلاک دخیل هستند، یعنی سیگنال‌های En و G1 را به صورت منطقی AND کرده و به یک سیگنال جدید به اسم Enable ارجاع دادیم.

پس از انجام مراحل بالا، از سیگنال Clock (سیگنالی که هیچ‌گونه دست‌کاری روی آن انجام نشده است) به عنوان کلاک اصلی مدار استفاده کردیم، یعنی سیگنال Clock را در لیست حساسیت process و شرط لبه‌ی بالارونده‌ی کلاک قرار دادیم.

و دقیقا پس از شرط لبه‌ی بالارونده‌ی کلاک، از یک شرط دیگر، به اسم شرط Enable استفاده کردیم. و سیگنال Enable، حاصل AND منطقی سیگنال‌های En و G1 است.

درون شرط هم گفتیم اگر سیگنال Enable، برابر با '1' شد، آنگاه عمل ارجاع انجام شود.

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

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

کنترل کلاک ماجول‌های مدار در FPGA

کنترل کلاک ماجول‌های مدار در FPGA، به روش Clock Enable

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

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

در نهایت هر وقت به ورودی کنترلی CE، مقدار '1' اعمال شود، کلاکِ فلیپ‌فلاپ فعال، و اگر '0' اعمال شود، کلاکِ فلیپ‌فلاپ غیرفعال خواهد شد.

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

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

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

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

  • سلام
    مطلب جالبی بود
    لطفا مرجع این مطلب را معرفی فرمایید
    اگر مطلب تالیفی است، ممکن است از جایی اقتباس شده یا مطلب مفید مشابهی در جایی بوده باشد، لطفا آنرا معرفی فرمایید
    قطعا مطالب مهم دیگری نیز پیرامون کلاک وجود دارد و قصد من آشنایی با آن مفاهیم است

    مرسی

    • سلام خدمت شما
      با توجه با اینکه کلاک یک سیگنال بسیار مهم در FPGA است یک سری تمهیدات خاصی در داخل FPGA برای اون در نظر گرفته شده. مثلا یک سری بافرهای خاصی به اسم BUFG وجود دارند که قابلیت جریان‌دهی بالایی دارند و با توجه با اینکه کلاک به بخش‌های زیادی از مدار وصله و جریان زیادی ازش کشیده میشه، لازمه که در سر راه کلاک این بافر قرار داده بشه. البته سینتسایزر سیگنال کلاک رو خودش تشخیص میده و به صورت خودکار سر راه کلاک،‌ این بافر رو قرار میده و نیازی نیست به صورت دستی انجام داد. البته اگه شما توی ISE برید و Shematic technology رو ران کنید می‌بیند که سر راه تمام سیگنال‌های ورودی و خروجی یدونه بافر گذاشته، اما سر راه کلاک نوع بافرش با بقیه فرق داره که همون BUFG هست. باید اینو هم بگم اگه شما کلاک رو به DCM بدین احتمالا در ورودی کلاک (ینی قبل از DCM) از همون بافرهای معمولی قرار داده میشه اما بعد از DCM که قراره کلاک در مدار توزیع بشه از بافر مخصوص کلاک یعنی BUFG عبور داده میشه.
      علاوه بر این مسیرهایی که توی FPGA برای سیگنال‌ها وجود دارند ممکنه بسیار پرپیچ و خم باشه و سیگنال‌ها از چندین سوئیچ بگذرند ( توی FPGA برای route کردن اگه اسمشو اشتباه نگم از Switch matrix استفاده شده) که باعث تاخیر انتشار سیگنال میشه.
      اما اگه از همین مسیرهای معمولی برای کلاک هم استفاده بشه ، کلاک با تاخیرات متفاوت و در نتیجه در زمان‌های متفاوتی به فلیپ فلاپ ها اعمال میشه و به نوعی میشه گفت مدار از حالت سنکرون بودن خارج میشه . چون ما انتظار داریم کلاک همه فلیپ فلاپ‌ها همزمان بخوره اما به خاطر تاخیر‌های متفاوت کلاک در بخش‌های مختلف ، این همزمان بودن به هم میخوره. بنابراین در FPGA یک سری مسیرهای ویژه‌ای برای انتقال و توزیع کلاک در نظر گرفته شده که این تاخیرها رو به حداقل برسونه.
      حالا اگه ما بیام از GATED CLOCK استفاده کنیم، کلاک به چشم یک سیگنال عادی دیده میشه و از بافرها و مسیرهای ویژه کلاک استفاده نمیشه که در نتیجه جریان کلاک محدود به جریان خروجی گیت میشه و نمیتونه مدار ما رو تریگر کنه . از طرفی هم تاخیرها متفاوت میشن و مدار از سنکرون بودن خارج میشه

  • در عمل هیچ تفاوتی ندارد چون سیگنال CLOCK از طریق یک گیت منطقی AND که در داخل خود فلیپ فلاپ تعبیه شده است کنترل می شود و در اینجا تنها تفاوت فقط استفاده از امکانات نرم افزاری همان FPGAی نمونه است، یعنی شرکت Xilinx همین گیتی را که به نظر شما طراحی غیراصولی می آمد را به عنوان امکانات در داخل خود فلیپ فلاپ ارائه داده است، اگر مداری طرح کردید که گلیچ داشت به دنبال ایراد در جای دیگری از طرح خود باشید. چون هر دو نمومه ارائه شده از نظر سخت افزاری کاملا مشابه هستند

  • در راستای پیام شخصی به نام دینامیت باید عرض کنم کاملا نظرشون صحیح. چون شما فرض کنید خارج از یک کد VHDL قصد دارید مداری دیجیتال برای این کار طراحی کنید. مدار این شکل چطور خواهد شد؟ غیر از گیت اند چطور کنترل کرده؟ با مالتی پلکسر؟ اون که بدتر میشه؟ فقط اینکه زایلینکس گفته مبنای درستی نیست واقعا باید در مسائل علمی منطقی برخورد کنیم

    • روی صحبت من اصلا این نیست که اهمیت کلاک نادیده گرفته بشه. اون جای خود دارد. در رابطه با این مطلب عرض کردم که فرقی در هر حالت نیست و نباید هر طراحی رو‌ چون جایی به شکل دیگری گفته غیر اصولی دانست. در مطالب علمی به شدت جای بحث هست تا بهترین حالات بدست بیاد نه مقداری علم بقیه حالا زیر سوال برده بشه

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

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

    >