آموزش FPGA قسمت هفدهم: توصیف حافظه‌های چند بیتی (رجیستر یا ثبات)

آموزش FPGA قسمت هفدهم: توصیف حافظه‌های چند بیتی (رجیستر یا ثبات)

آموزش FPGA قسمت هفدهم: توصیف حافظه‌های چند بیتی (رجیستر یا ثبات)
آموزش FPGA قسمت هفدهم: توصیف حافظه‌های چند بیتی (رجیستر یا ثبات)

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

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

Register (ثبات)

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

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

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

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

Register

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

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

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

بهتر است برای درک هرچه بهتر موضوع شماتیک مدار پیاده‌سازی شده در FPGA را نیز مشاهده کنیم.

Register

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

Register

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

شما تنها با تغییر دادن عرض بیت D و Q می‌توانید تعداد بیت‌های رجیستر پیاده‌سازی خود را تغییر دهید، اما راهی بهتر برای این کار وجود دارد که ما از این به بعد همیشه از این تکنیک استفاده می‌کنیم. در ادامه با این روش آشنا خواهیم شد.

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

در ادامه می‌خواهیم یک رجیستر 32 بیتی را با استفاده از خاصیت Generic توصیف کنیم برای این منظور باید تکه کد زیر را به کد قبلی اضافه کنیم و عرض بیت ورودی و خروجی را با استفاده از این پارامتر تعریف کنیم.

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

نکته‌ی دیگر اینکه چون ریست در انتهای کد نوشته شده است اولویت با آن است و اگر شرط آن برقرار باشد مقدار رجیستر 0 منطقی خواهد شد.

امیدوارم که به خوبی این موضوع ساده را فرا گرفته باشید. در قسمت هجدهم به توصیف شیفت رجیستر خواهیم پرداخت.

حمایت از سپهر

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

0 نفر

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

توجه

دیدگاه ها

9 دیدگاه

  • sara
    ۲۷ مهر ۱۳۹۸

    سلام وقت بخیر…ببخشید شما عکسی از معماری داخلی spartan6 یا یه مورد دیگه از خانواده FPGA شرکتxilinx دارین؟
    اگه دارین لطفا عکسشو برام بفرستین

    • Phoenix
      ۲۸ مهر ۱۳۹۸

      سلام دوست عزیز. آن چیزی که شما می‌خواهید احتمالا در یک عکس وجود ندارد مگر یک شماتیک کلی از امکانات. برای اینکه هر بخش را به طور دقیق بررسی کنید فایل‌هایی تحت عنوان ugxxx به معنای User Guide را در xilinx سرچ کنید. در این فایل ها عکس‌ها و شماتیک‌‌هایی زیادی از منابع داخلی، مانند حافظه‌ها، ضرب‌کننده‌ها، منابع کلاک و … وجود دارد. همچنین زمانی که داریدیک ip را اضافه می‌کنید که نهایتا یکی از منابع درونی fpga است می‌توانید در پایین سمت چپ، دیتاشیت آن را مشاهده کنید.

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

      در تأیید پاسخ دوست عزیزم باید بگم که FPGA ها مجموعه از عناصر اختصاصی هستند که هر کدام برای خودشان یک شماتیک خاص دارند. این عناصر به صورت سطری یا سطونی در کنار هم قرار می‌گیرند و در نهایت یک FPGA شکل داده میشه.
      برای دسترسی به مستندات کامل تراشه های spartan 6 می تونید از لینک زیر استفاده کنید.
      https://www.xilinx.com/products/silicon-devices/fpga/spartan-6.html#documentation
      و در بخش دانلود مستندات مربوط به عناصر مختلف از قبیل CLB و CLK و DSP و Memory رو دانلود و مطالعه کنید.

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

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

  • آموزش FPGA قسمت هجدهم: شیفت رجیستر (بخش اول) - سیسوگ - Sisoog
    ۹ مهر ۱۳۹۸

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

  • َAmir
    ۱ مهر ۱۳۹۸

    سلام
    خسته نباشید
    ممنون از آموزش های خوبتون .
    کد رجیستر 32 بیتی که با generic نوشته شده … اسم Entity که قرار دادین Register_32bit هست اما خط 19 و 21 نوشتین Register_8bit که ارور میده و سنتز نمیشه … باید 8 به 32 اصلاح بشه.

    منتظر سری بعدی آموزش های خوبتون هستیم …

    • Phoenix
      ۲ مهر ۱۳۹۸

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

      • َAmir
        ۷ مهر ۱۳۹۸

        بعد شما تمام رجیسترهایی که طراحی کردین ورودی موازی/خروجی موازی (PIPO) هست دیگه ؟
        یعنی فقط با یک کلاک 32 بیت ورودی ذخیره میشه . درسته ؟

        • Phoenix
          ۸ مهر ۱۳۹۸

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

پر بحث ترین ها

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

درآمد زایی به سبک پینوکیو

ما مهندسین, بخصوص مهندسین برق و الکترونیک … علاقه خاصی به طراحی و ساختن داریم علاقه زیادی به تکنولوژی , بخصوص از...

Sisoog Os Sisoog Os
  • 3 سال پیش
سیـــســـوگ

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