آموزش, آموزش FPGA, الکترونیک دیجیتال, توصیه شده, مقاله های سیسوگ

عناصر حافظه در سیستم‌های دیجیتال | آموزش FPGA قسمت دوازدهم

آموزش FPGA و زبان VHDL

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

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

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

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

حافظه‌ها در دیجیتال و منحصرا در مدارات ترتیبی

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

  • لچ
  • فلیپ‌فلاپ

 تفاوت بین لچ و فلیپ‌فلاپ

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

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

پیاده‌سازی با لچ یا فلیپ‌فلاپ؟

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

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

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

پیاده‌سازی مدارات ترتیبی در محیط Sequential

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

وقتی سیگنال کلاک را در لیست حساسیت process نوشتیم، هر تغییری که روی کلاک رخ بدهد process فعال خواهد شد و هر ارجاعی که در این محیط وجود داشته باشد با هر گونه تغییر کلاک انجام می‌شود که این موضوع مطلوب و مدنظر ما نمی‌باشد. برای رفع کردن این مشکل باید بتوانیم لبه‌ی سیگنال کلاک را تشخیص بدهیم تا تغییرات با لبه‌ی کلاک صورت بپذیرند، در اینجا ما قصد داریم که مدار ترتیبی موردنظر با لبه‌ی بالارونده کار کند، پس در ادامه ابتدا با نحوه‌ی تشخیص لبه‌ی بالارونده‌ی کلاک در FPGA آشنا خواهیم شد و سپس فلیپ‌فلاپ حساس به لبه‌ی بالارونده را توصیف خواهیم کرد.

لبه‌ی کلاک

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

تشخیص لبه‌ی کلاک

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

در زبان VHDL قابلیتی به اسم attribute وجود دارد که می‌توانیم با استفاده از این قابلیت لبه‌ی کلاک را تشخیص بدهیم. البته attribute های مختلفی در زبان VHDL وجود دارد که ما با همه‌ی این attribute ها کار نداریم و فقط قصد داریم با استفاده از attribute نوع event لبه‌ی کلاک را تشخیص بدهیم. خروجی attribute نوع event دو مقدار منطقی ‘0’ یا ‘1’ می‌باشد و متناسب با شرایط می‌تواند هر کدام از این دو مقدار منطقی باشد. اگر مقدار سیگنال در process فعلی که فعال شده است، نسبت به آخرین باری که process فعال شده است تغییر کرده باشد، خروجی attribute مقدار ‘1’ منطقی خواهد بود، در غیر این‌صورت خروجی attribute مقدار ‘0’ منطقی خواهد بود.

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

در کد بالا از event استفاده کردیم و عبارت شرط وقتی برقرار است که هم تغییری روی سیگنال کلاک رخ داده باشد و هم سیگنال کلاک در آن لحظه برابر با ‘1’ باشد و این یعنی لبه‌ی بالارونده‌ی کلاک.

برای توصیف لبه‌ی پایین به کد زیر توجه کنید:

در کد بالا عبارت شرط وقتی برقرار است که هم تغییری روی سیگنال کلاک رخ داده باشد و هم سیگنال کلاک در آن لحظه برابر با ‘0’ باشد و این یعنی لبه‌ی پایین‌رونده‌ی کلاک.

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

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

خب حالا که مقدمات کلاک را به خوبی بررسی کردیم و با تمامی زیر و بم آن آشنا شدیم، قصد داریم فلیپ‌فلاپ  را با استفاده از زبان VHDL توصیف کنیم، به کد زیر توجه کنید:

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

انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

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

9 دیدگاه در “عناصر حافظه در سیستم‌های دیجیتال | آموزش FPGA قسمت دوازدهم

  1. Avatar for Ali Nickeghbal Ali Nickeghbal گفت:

    با سلام . امکان این وجود دارد که کدمان هم حساس به لبه بالارونده باشد و هم حساس به لبه پایین رونده ؟ برای مثال در قسمت architecture دو تا پروسس بنویسیم که یکی حساس به لبه پایین رونده و دیگری هم حساس به لبه بالارونده باشد ؟

    1. Avatar for Phoenix Phoenix گفت:

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

      1. Avatar for Ali Nickeghbal Ali Nickeghbal گفت:

        به چه دلیلی اصولی نیست ؟ بخاطر فلیپ فلاپ های درون FPGA ؟

        1. Avatar for Phoenix Phoenix گفت:

          در نظر بگیرید که هم برای لبه‌ی بالا و هم لبه‌ی پایین نیاز به edge detection هست و منابع بیشتری برای این کار نیاز هست و بحث سیم بندی که می‌تواند سرعت را کاهش دهد هم را در نظر بگیرید. از سوی دیگر به یک سری مباحث تئوری در رابطه با تاخیر در ترانزیستورهای سازنده و اینا مربوط میشه که در عمل هم خودشو نشون میده اما چون من خودم به حد کافی اشراف ندارم در این بحث ترجیح می‌دهم راهنمایی اشتباه نکنم.

        2. Avatar for محسن محسن گفت:

          با سلام خدمت شما دوست عزیز
          یک توضیح تکمیلی به توضیحات ققنوس اضافه می‌کنم.
          در FPGA فلیپ فلاپی که با هر دو لبه کلاک کار کنه نداریم . (البته در موارد استثنا در IO ها وجود داره ولی به طور کلی در CLB ها هر فلیپ فلاپ تنها با یک لبه کلاک کار میکنه)

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

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

          1. Avatar for Phoenix Phoenix گفت:

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

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

            خب چون ما توصیف کردیم اون هم با این پیش فرض که ما می‌دونیم داریم چکار می‌کنیم برای ما به وجودش میاره و نهایتا یه سری info تو گزارشات به ما بده. اما این کار غیر اصولی هستش و زمانی که منابع را الکی داریم زیاد می‌کنیم place and route سخت‌تر می‌شه و نه تنها به سرعت بهتری نرسیدیم بلکه کلی از منابع را هم الکی هدر داده‌ایم.

  2. بازتاب: آموزش FPGA قسمت سیزدهم: توصیف عناصر حافظه (بخش دوم) - سیسوگ - Sisoog
  3. Avatar for احمد احمد گفت:

    اگه امکان داره در پیام رسان داخلی هم کانال بزنید

    1. Avatar for Sisoog OS Sisoog OS گفت:

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

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *