آموزش FPGA قسمت دوازدهم: توصیف عناصر حافظه (بخش اول)

آموزش FPGA قسمت دوازدهم: توصیف عناصر حافظه (بخش اول)

آموزش FPGA قسمت دوازدهم: توصیف عناصر حافظه (بخش اول)
آموزش FPGA قسمت دوازدهم: توصیف عناصر حافظه (بخش اول)

در قسمت یازدهم از مجموعه آموزشی 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 می‌شود، سیگنال‌ها در محیط ترکیبی و ترتیبی تبدیل به چه چیزی خواهند شد و ربط سیگنال به حافظه چیست و کلی سوال دیگر را در قسمت سیزدهم بررسی خواهیم کرد، پس با ما همراه باشید.

حمایت از سپهر

خوشحال میشیم برای تداوم و کیفیت ما رو حمایت کنید.

0 نفر

پــــســنــدیـده انـد

توجه

دیدگاه ها

9 دیدگاه

  • MORPHO 110
    Ali Nickeghbal
    ۱۹ اسفند ۱۳۹۸

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

    • Phoenix
      ۱۹ اسفند ۱۳۹۸

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

      • MORPHO 110
        Ali Nickeghbal
        ۲۰ اسفند ۱۳۹۸

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

        • Phoenix
          ۲۲ اسفند ۱۳۹۸

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

        • محسن
          ۲ فروردین ۱۳۹۹

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

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

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

          • Phoenix
            ۵ فروردین ۱۳۹۹

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

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

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

            0
  • آموزش FPGA قسمت سیزدهم: توصیف عناصر حافظه (بخش دوم) - سیسوگ - Sisoog
    ۲ شهریور ۱۳۹۸

    […] قسمت دوازدهم از مجموعه آموزشی FPGA مفصلا در رابطه با عناصر حافظه در […]

  • احمد
    ۱۱ مرداد ۱۳۹۸

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

    • Sisoog Os
      Sisoog OS
      ۱۱ مرداد ۱۳۹۸

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

پر بحث ترین ها

مسابقه دوم : چالش برنامه نویسی به زبان C

مسابقه اول سیسوگ (مسابقه اول: درک سخت افزار) انتقادهای زیادی رو در پی داشت تا جایی که حتی خودمم به نتیجه مسابقه...

Zeus ‌ Zeus ‌
  • 2 سال پیش

راه اندازی LCD گرافیکی Nokia 1661 و دانلود کتابخانه آن

LCD گرافیکی یکی از مهم ترین پارامترهای موجود در طراحی انواع مدارات الکترونیکی پیچیده و حتی ساده است ، نمایش وضعیت و...

Zeus ‌ Zeus ‌
  • 4 سال پیش

ریموت کدلرن و چکونگی دکد کردن آن به همراه سورس برنامه

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

Zeus ‌ Zeus ‌
  • 5 سال پیش

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

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

Zeus ‌ Zeus ‌
  • 5 سال پیش

مسابقه سوم: استخراج داده از رشته ها در زبان C

نزدیک به 5 ماه از مسابقه دوم سیسوگ می‌گذره و فکر کردم که بد نیست یک چالش جدید داشته باشیم! البته چالش‌ها...

Zeus ‌ Zeus ‌
  • 2 سال پیش

مسابقه ششم: بزن میکروکنترلر را بسوزون!

بزنم میکروکنترلر را بسوزونم اونم تو  این شرایط!، طراحی مسابقه از اون چیزی که به نظر می‌رسه سخت‌تر است، باید حواست باشه...

Zeus ‌ Zeus ‌
  • 10 ماه پیش

آموزش قدم به قدم راه اندازی +NRF24L01

آموزش قدم به قدم راه اندازی +NRF24L01  با کتابخانه سازگار با انواع میکروکنترلرها و کامپایلرها قبل از اینکه قسمت بشه با ماژول...

رسول خواجوی بجستانی رسول خواجوی بجستانی
  • 3 سال پیش

ساخت ماینر با FPGA و ARM

چند ماهی هست که تب بیت کوین و ارزهای دیجیتال خیلی بالا رفته! چه شد که این پست را نوشتم همانطور که...

Zeus ‌ Zeus ‌
  • 3 سال پیش

کار با ماژول تمام عیار mc60 – قسمت دوم – راه اندازی OpenCPU

در قسمت اول به یکسری اطلاعات کلی ماژول mc60 پرداختیم، با نرم افزار QNavigator کار کردیم و یک هدربرد هم برای کار...

Mahdi.h   Mahdi.h  
  • 3 سال پیش

مسابقه چهارم: کدام حلقه سریع‌تر است؟

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

Zeus ‌ Zeus ‌
  • 1 سال پیش
سیـــســـوگ

مرجع متن باز آموزش الکترونیک