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

31 اردیبهشت, 1397

پیاده‌سازی کاملا سنکرون در FPGA

چیزی که در این برنامه ویدئویی خواهید دید، نسبت به آنچه تا به حال در اکثر کتاب‌ها و منابع اینترنتی دیده‌اید کاملا متفاوت است…

پیاده‌سازی کاملا سنکرون!

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

اما پیاده‌سازی کاملا سنکرون یعنی چه؟

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

More...

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

برای آشنایی با زبان VHDL این برنامه ویدئویی را ببینید…

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

فلیپ‌فلاپ‌های موجود در FPGA

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

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

در واقع بهتر است اصلا از سیگنال ریست در مدارتان استفاده نکنید!

اما اگر مجبور به استفاده از آن بودید، راه‌حل چیست؟

در انتهای این برنامه ویدئویی در مورد این موضوع به طور کامل صحبت می‌کنم.

ویدئو یا متن؟

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

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

در این مقاله، قصد دارم به موضوع بسیار مهم پیاده‌سازی کاملاً سنکرون مدار در FPGA بپردازم.

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

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

برای آشنایی با الگوی استاندارد کدنویسی برای FPGA، این برنامه را مشاهده کنید…

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

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

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

منابع سخت‌افزاری درون FPGA

همان‌طور که احتمالاً اطلاع دارید، فراوان‌ترین و مهم‌ترین منبع سخت‌افزاری موجود در FPGA‌ها، مجموعه LookUpTable‌ها (LUT‌ها) و فلیپ‌فلاپ‌ها هستند.

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

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

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

مزایای پیاده‌سازی مدار به‌صورت کاملاً سنکرون

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

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

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

پیاده‌سازی مدار به‌صورت کاملاً سنکرون سه مزیت دارد:

  • استفاده از منابع سخت‌افزاری کمتر
  • افزایش سرعت مدار
  • قابلیت اطمینان بیشتر مدار

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

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

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

و در نهایت، مدار کاملاً سنکرون، دارای قابلیت اطمینان بیشتری در بلند مدت خواهد بود.

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

اما مفهوم پیاده‌سازی کاملاً سنکرون، در زبان VHDL به چه صورت است؟

نحوه کدنویسی برای توصیف یک مدار کاملاً سنکرون

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

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

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

در واقع، در پیاده‌سازی HDL (به‌کمک زبان VHDL یا Verilog)، برای سنکرون کردن کامل مدار، باید تمام مدارتان را درون شرط بالارونده کلاک توصیف کنید.

اکنون به‌کمک یک مثال، ببینیم که منظور از این عبارت چیست؟

کد زیر را در نظر بگیرید:

architecture Behavioral of my_name is
Begin

process(Clock)
Begin

	if rising_edge(Clock) then
		A <= B;
		E <= D;
end if;

end process;
end Behavioral;

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

اما این دو مشخصه چیست؟

مشخصه اول این است که تنها سیگنالی که درون لیست حساسیت پراسس این کد نوشته شده، سیگنال کلاک است.

این موضوع به چه معناست؟

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

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

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

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

مداری که در این کد نمونه توصیف شده است، یک مدار بسیار ساده است که تنها دارای دو ارجاع B به A و D به E است.

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

دو مشخصه‌ای که در ارتباط با این کد توضیح دادم باعث می‌شوند که مدار شما یک مدار کاملاً سنکرون باشد.

اکنون به مبحث سیگنال کنترلی reset در مدارات سنکرون می‌پردازم؛ این مبحث، به فلیپ‌فلاپ‌های درون FPGA مرتبط است که در ادامه مقاله به‌طور مفصل آن‌ها را بررسی می‌کنم.

پیاده‌سازی سیگنال کنترلی Reset

متاسفانه اکثر افرادی که در زمینه پیاده‌سازی با FPGA کار می‌کنند، سیگنال کنترلی reset را به‌طرز صحیحی استفاده نمی‌کنند.

در حالی که این موضوع، بسیار مهم است و اشتباهات بزرگ در زمینه پیاده‌سازی سیگنال reset، باعث می‌شود که مداری که در نهایت پیاده‌سازی می‌شود، یک مدار آسنکرون باشد. بنابراین، در این حالت، نمی‌توان از مزایای مدار سنکرون بهره برد.

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

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

مسئله‌ای که در ارتباط با سیگنال reset در مدارات سنکرون وجود دارد این است که اولاً تا حد امکان، اصلاً از سیگنال reset استفاده نکنید.

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

اما اگر مجبور به استفاده از سیگنال reset هستید، فقط و فقط از سیگنال reset سنکرون استفاده کنید.

اما نحوه پیاده‌سازی یک سیگنال reset سنکرون به چه ترتیب است؟

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

پیاده‌سازی سیگنال reset به‌صورت آسنکرون

به کد زیر دقت کنید:

process(Clock, Reset)
Begin

if Reset = '1' then

	A <= '0';

elsif rising_edge(Clock) then

	A <= B;

end if;

end process;

کد بالا، یک مدار ترتیبی است که درون پراسس تعریف شده است.

این مدار دارای یک سیگنال reset است؛ اما این سیگنال، درون لیست حساسیت پراسس قرار گرفته است.

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

اما چرا سیگنال reset موجود در این کد به‌صورت آسنکرون پیاده‌سازی خواهد شد؟

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

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

بنابراین، در این مدار، سیگنال reset نسبت به سیگنال کلاک، آسنکرون است.

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

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

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

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

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

اما نحوه پیاده‌سازی سیگنال reset به‌صورت سنکرون به چه ترتیب است؟

پیاده‌سازی سیگنال reset به‌صورت سنکرون

نوع اصولی پیاده‌سازی سیگنال reset که توصیه مستقیم شرکت Xilinx است، به‌صورت کد زیر است:

process(Clock)
Begin

if rising_edge(Clock) then

	A	<= B;

	if Reset = '1' then

		A	<= '0';

	end if;

	end if;

end process;

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

منطبق با ویژگی‌هایی که برای مدار کاملاً سنکرون برشمردم، تنها سیگنال موجود در لیست حساسیت پراسس این کد، سیگنال کلاک است.

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

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

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

در اولین سطر پس از شرط لبه بالارونده کلاک، سیگنال B به سیگنال A ارجاع داده شده است.

در سطر دوم، شرطی قرار داده‌ایم که اگر سیگنال reset برابر با یک بود، سیگنال  Aبرابر با صفر شود.

برای سیگنال reset دو حالت وجود دارد؛ یا این سیگنال برابر با یک است، یا برابر با صفر است.

اگر سیگنال reset برابر با یک نباشد، آخرین ارجاع به سیگنال A، همان ارجاع B به A است.

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

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

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

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

ساختار فلیپ‌فلاپ‌های موجود در FPGA‌های شرکت Xilinx

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

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

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

همان‌طور که در شکل زیر مشاهده می‌کنید، فلیپ‌فلاپ‌های موجود در FPGA‌های شرکت Xilinx، دارای تعدادی پایه کنترلی و دیتا هستند:

شمایی از فلیپ‌فلاپ‌های موجود در FPGA‌های شرکت Xilinx

پایه‌های اصلی این فلیپ‌فلاپ‌ها، پایه دیتای ورودی (D) و پایه دیتای خروجی (Q) است.

یک پایه کلاک نیز به‌طور طبیعی در این فلیپ‌فلاپ‌ها وجود دارد.

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

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

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

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

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

اما نکته ظریفی که ارتباط با پایه‌های کنترلی set، reset و CE وجود دارد این است که این پایه‌ها می‌توانند به‌صورت سنکرون یا آسنکرون به‌کار روند.

در واقع، در پیاده‌سازی مدارات دیجیتال به‌کمک این فلیپ‌فلاپ‌ها، می‌توانید سیگنال‌های set و reset را به‌صورت سنکرون یا آسنکرون پیاده‌سازی کنید.

اما نکته مهم‌تر این است که نحوه پیاده‌سازی set و reset باید یکسان باشد؛ یعنی، باید هر دو سیگنال را یا به‌صورت سنکرون یا به‌صورت آسنکرون پیاده‌سازی کنید.

اما اثر این موضوع در پیاده‌سازی به چه صورت خواهد بود؟

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

برای درک تاثیر موضوعی که در ارتباط با نحوه پیاده‌سازی سیگنال‌های set و reset در فلیپ‌فلاپ‌های شرکت Xilinx گفته شد، باید نحوه پیاده‌سازی reset سنکرون و reset آسنکرون درون FPGA را باهم مقایسه کنیم.

فرض کنید قصد داریم عبارت منطقی زیر را پیاده‌سازی کنیم:


Q <= A or (B and C and D and E);

در واقع، سیگنال‌های C ،B و D باید با یکدیگر and شوند و حاصل آن‌ها با سیگنال or ،A شود؛ سپس، نتیجه این محاسبات منطقی، به سیگنال Q منتقل شود.

برای پیاده‌سازی این عبارت منطقی، می‌توانیم کدی به‌صورت زیر بنویسیم:

process(Clock, Reset)
Begin

if Reset = '1' then

	Q <= '0';

elsif rising_edge(Clock) then

	Q <= A or (B and C and D and E);

end if;

end process;

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

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

شمایی از پیاده‌سازی مدار توصیف شده توسط کد آسنکرون، در FPGA

همان‌طور که مشاهده می‌کنید، برای پیاده‌سازی این مدار از دو LUT و یک فلیپ‌فلاپ استفاده شده است؛ من فرض کرده‌ام هر کدام از این LUT‌ها دارای چهار ورودی هستند.

در LUT‌ها، مقادیری قرار داده شده است که تابع and را پیاده‌سازی کنند؛ بنابراین، خروجی LUT اول حاصل عملیات and دو سیگنال D و E است.

خروجی LUT اول، به‌عنوان ورودی، به LUT دوم اعمال می‌شود.

در LUT دوم، حاصل عملیات and دو سیگنال D و E، با سیگنال‌های C و and ،B می‌شود.

سپس، حاصل and چهار سیگنال B تا D، با سیگنال or ،A می‌شود و نهایتاً این مقدار، در خروجی LUT دوم قرار می‌گیرد.

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

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

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

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

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

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

process(Clock)
Begin

	if rising_edge(Clock) then

		if Reset = '1' then
			Q <= '0';
		else
			Q <= A or (B and C and D and E);
		end if;

	end if;

end process;

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

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

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

اما سنکرون بودن سیگنال reset، در پیاده‌سازی نهایی در FPGA چه اثری خواهد داشت؟

شکل زیر، مدار پیاده‌سازی شده در FPGA را نشان می‌دهد:

شمایی از پیاده‌سازی مدار توصیف شده توسط کد سنکرون، در FPGA

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

در مدار قبلی، دو عدد LUT استفاده شده بود؛ اما در این مدار از یک LUT استفاده شده است.

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

همان‌طور که مشاهده می‌کنید، LUT موجود در این مدار دارای چهار ورودی است که سیگنال‌های D ،C ،B و E به آن‌ها اعمال شده است.

درون این LUT، محتوایی قرار گرفته است که عملیات and این چهار سیگنال را پیاده‌سازی می‌کند.

بنابراین، خروجی LUT، حاصل and چهار سیگنال D ،C ،B و E خواهد بود.

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

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

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

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

البته، ما از سیگنال set در مدارمان استفاده نکرده‌ایم.

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

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

ما در کدمان از سیگنال set استفاده نکرده‌ایم؛ اما نرم‌افزار پیاده‌ساز، حین سنتز کد، به‌جای استفاده از یک LUT دیگر برای پیاده‌سازی عملیات or، سیگنال A را به ورودی set فلیپ‌فلاپ اعمال کرده است.

در این صورت چه اتفاقی می‌افتد؟

اگر سیگنال A برابر با صفر باشد، به این معنی است که set فعال نیست و فلیپ‌فلاپ عملکرد عادی دارد.

اما اگر سیگنال A برابر یا یک باشد، فارغ از اینکه حاصل and چهار سیگنال موجود در پرانتز (خروجی LUT) چه باشد، خروجی فلیپ‌فلاپ برابر با یک خواهد شد.

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

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

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

توجه کنید که در مدار اول، سیگنال reset به‌صورت آسنکرون پیاده‌سازی شده بود؛ بنابراین، سیگنال set نیز آسنکرون خواهد بود.

از طرفی، ورودی‌های A تا E، به‌صورت سنکرون به مدار متصل شده بودند.

بنابراین، نرم‌افزار پیاده‌ساز نمی‌توانست سیگنال سنکرون A را به ورودی set فلیپ‌فلاپ متصل کند.

پس، تکنیک اتصال سیگنال A به ورودی set، فقط در مدار دوم که ورودی set سنکرون بود، قابل پیاده‌سازی است.

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

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

در حالی که در مدار دوم، تنها یک LUT به‌کار رفته است؛ بنابراین، تاخیر انتشار مدار دوم، کمتر است و در نتیجه، سرعت آن بیشتر خواهد بود.

حال در نظر بگیرید که در عمل، در مداری که در FPGA پیاده‌سازی می‌کنید، صدها و هزاران LUT وجود دارد.

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

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

اما منظور از این جمله چیست؟

مقداردهی اولیه به‌جای استفاده از سیگنال Reset

اگر بخواهید در یک مدار از سیگنال reset استفاده کنید، دو حالت وجود دارد:

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

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

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

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

همان‌طور که می‌دانید، می‌توانید در هنگام تعریف سیگنال‌ها و رجیسترها (در بخش معرفی که قبل از begin مربوط به بخش atchitecture قرار دارد)، یک مقدار اولیه برای آن‌ها درنظر بگیرید.

مثلاً، اگر بخواهید یک سیگنال تک‌بیتی به‌نام A با مقدار اولیه یک تعریف کنید، باید قبل از begin مربوط به بخش architecture، عبارت زیر را بنویسید:


Signal    A   :   std_logic    := '1' ;

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

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

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

بنابراین، شما می‌توانید در هنگام تعریف سیگنال‌ها، برای آن‌ها مقدار اولیه تعیین کنید و مطمئن باشید که این مقادیر اولیه، عملاً سنتز می‌شوند و در FPGA به سیگنال‌های شما اعمال می‌شوند.

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

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

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

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

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

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

احمد ثقفی

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

  • سلام استاد
    در شمایی از پیاده‌سازی مدار توصیف شده توسط کد سنکرون، سیگنال A دیده نشده است که با حاصل and چهار سیگنال B, C, D و E ، اور or شده باشد.

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

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

    >