بخش سوم آموزش FPGA : معرفی و معماری ساخت انواع PLD ها

بازگشت به آموزشگاه

مقدمه

در بخش های قبلی گفتیم که FPGA ها جزو دسته دستگاه های قابل برنامه ریزی یا PLD ( مخفف Programmable Logic Device ) می باشند. اما قبل از بوجود آمدن FPGA ها انواع مختلفی از PLD ها نظیر SPLD ( مخفف Simple PLD ) و CPLD ( مخفف Complex PLD ) عرضه و روانه بازار شده بودند که هر یک فناوری های خاص خود را داشتند. هر چند که امروزه استفاده از SPLD ها منسوخ شده است اما هنوز هم از هر دوی FPGA ها و CPLD ها به علت مزایای هریک، در ساخت سیستم های دیجیتال استفاده می شود. بسته به روش ساخت FPGA برخی از آنها فقط یکبار ( One-Time Programmable یا OTP ) و برخی دیگر چندین بار قابل برنامه ریزی مجدد هستند. اگر بتوان قطعه را در حین استقرار درون سیستم طراحی شده برنامه ریزی کرد به آن ISP یا in System Programming گویند. شکل زیر دسته بندی انواع PLD ها را نشان می دهد. برای اینکه دلایل بوجود آمدن FPGA ها برای اولین بار را به خوبی درک کنیم، بهتر است آن ها را با دیگر فناوری های مربوط مقایسه نماییم. در این بخش به تاریخچه بوجود آمدن FPGA ، شباهت ها و تفاوت های معماری ساخت فناوری FPGA با دیگر فناوری ها خواهیم پرداخت.

 


پیاده سازی توابع برنامه پذیر توسط PLA

در سال 1970 آرایه های منطقی برنامه پذیر PLA ( مخفف Programmable Logic Array ) اولین دسته از مدارهای منطقی قابل برنامه ریزی بودند که توسط شرکت Philips معرفی شدند و می توانستند مدارهای منطقی ترکیبی ساده را پیاده سازی کنند. در واقع PLA ها مجموعه ای از گیت های AND متصل به گیت های OR به صورت ماتریسی بودند که با استفاده از سوئیچ های ماتریسی موجود میتوانستند یک تابع برنامه پذیر ساده را پیاده سازی نمایند. شکل زیر ساختار درونی یک PLA نمونه را نشان می دهد.

یک تابع برنامه پذیر از تعدادی ورودی و خروجی تشکیل شده است که رابطه بین ورودی ها و خروجی ها توسط جدول درستی ارائه می گردد. با استفاده از جبر بولی ( Boolean Algebra ) میتوان فرمول ریاضی مربوط به جدول درستی تابع را بدست آورد. برای مثال شکل زیر را در نظر بگیرید که جدول درستی یک تابع برنامه پذیر و نحوه بدست آوردن فرمول آن را نشان می دهد.

همانطور که مشاهده می کنید ، جدول درستی دارای سه ورودی و دو خروجی می باشد. روشی که برای تعیین رابطه بین ورودی ها و خروجی ها مورد استفاده قرار می گیرد به روش Sum Of Product معروف است یعنی ابتدا ورودی ها ضرب می شوند و سپس عبارت های تشکیل شده با هم جمع می شود. در این روش ، در گام اول جدول را برای هر خروجی مجددا تکرار می کنیم. در گام دوم باید همیشه سعی کنیم تعداد جمع ها کمترین حالت ممکن شود لذا دو حالت وجود دارد اگر تعداد 0 ها در خروجی کمتر باشد، بر اساس 0 ها ضرب ورودی ها را انجام می دهیم و اگر تعداد 1 ها در خروجی کمتر باشد، بر اساس 1 ها ضرب ورودی ها را انجام می دهیم. در گام سوم هم کافیست تمامی عبارت ها را با هم جمع کنیم و اینگونه تابع خروجی مورد نظر تشکیل می گردد.

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

همانطور که مشاهده می کنید تمامی گیت ها آماده می باشند و فقط سوئیچ های ماتریسی برای پیاده سازی تابع مورد نظر قطع یا وصل می باشد. این سوئیچ های ماتریسی دارای فناوری پیوندهای فیوزی ( Fuse ) می باشند. در این فناوری ها از فیوز های معمولی جهت اتصال یا عدم اتصال استفاده می شود. اساس کار فیوزها مشابه فیوزهای محافظت از مدار است که در ابتدا اتصال کوتاه هستند و در صورت گذشت جریان بالا می سوزند و مدارباز می شوند.

بعد ها توسط شرکت Actel نوع دیگری از سوئیچ های قابل برنامه ریزی به نام آنتی فیوز ( Anty Fuse ) ساخته شد و در FPGA ها نیز از آن ها استفاده شد. اساس کار آنتی فیوز ها دقیقا برعکس فیوزها می باشند یعنی در ابتدا مدار باز هستند و در صورت گذشت جریان بالا از آن ها می سوزند و اتصال کوتاه می شوند. قطعاتی که با فناوری فیوزی ساخته می شوند One-Time Programmable یا OTP نامیده می شوند. زیرا وقتی فیوزی سوزانده می شود، برگشت پذیر و قابل جایگزین کردن نیست.

 


مقایسه PLA و PAL

دسته دیگری از مدارهای قابل برنامه ریزی که بعد از PLA ها بوجود آمدند PAL ( مخفف Programmable Array Logic ) ها بودند که توسط شرکت Monolithic Memories در سال 1978 معرفی شد. شکل زیر اولین آی سی 20 پایه MMI PAL16R6 را نشان می دهد.

در این قطعات همانند PLA ها از گیت های AND و OR و سوئیچ های ماتریسی استفاده می شد. اما به جای تکنولوژی فیوزی از یک حافظه PROM کوچک برای سوئیچ های ماتریسی استفاده شد. علاوه بر این تغییر ، سوئیچ های ماتریسی که برای گیت های OR وجود داشت حذف شدند و بدین ترتیب تعداد سوئیچ های ماتریسی کاهش یافت و در نتیجه فضای بیشتری به گیت های AND داده شد. شکل زیر بخشی از معماری داخلی یک PAL نمونه را در مقایسه با معماری PLA نشان می دهد.

 

اما PAL های اولیه به علت استفاده از PROM ها یکبار قابل برنامه ریزی ( OTP ) بودند. اما در ورژن های بعدی PAL ها از EPROM هایی که قابل پاک شدن با اشعه فرابنفش بودند استفاده شد. با توسعه PAL ها تعداد گیت های آن به حداکثر 200 گیت رسید.

 


معماری ساخت CPLD ها

در سال 1984 با ظهور تکنولوژی CMOS دسته دیگری از مدارهای قابل برنامه ریزی به نام CPLD ( مخفف Complex PLD ) توسط شرکت Altera شکل گرفت. با به کارگیری تکنولوژی CMOS در CPLD های شرکت آلترا امکان پیاده سازی مدارهای با پیچیدگی بالا با تراکم گیت زیاد و توان مصرفی پایین بوجود آمد. از نظر پیچیدگی CPLD ها ما بین SPLD ها و FPGA ها قرار می گیرند. CPLD ها دستگاه های قابل برنامه ریزی پیچیده هستند که ترکیبی از آرایه های تماما قابل برنامه ریزی ( یا pia که مخفف Programmable interconnected Array می باشد ) ، گیت های AND/OR ( مشابه PAL ها ) ، بانکی از بلوک های ماکروسل ( Macrocell ) و بلاک کنترل کننده ورودی/خروجی ها ( I/O Control Block ) و همچنین حافظه های SRAM و FLASH می باشند. شکل زیر ساختار کلی یک CPLD را نشان می دهد.

اصلی ترین بلوک تشکیل دهنده CPLD ها ماکروسل ( Macrocell ) می باشد. ماکروسل ها با فراهم کردن اتصالات متفاوت ، به CPLD ها انعطاف پذیری بخشیده است به طوری که علاوه بر مدارهای ترکیبی میتوانند انواع مدارهای ترتیبی و مدارهای دارای فیدبک را بوجود بیاورند. شکل زیر یک بلوک منطقی ( Logic Array Block ) و نحوه ارتباط آن با pia و I/O Block از CPLD ها را نشان می دهد.

همانطور که مشاهده می کنید در هر بلوک آرایه ای از ماکروسل ها وجود دارد. هر ماکروسل ابتدا مجموعه ای از گیت های AND قابل برنامه ریزی و به دنبال آن مجموعه ای از OR های قابل برنامه ریزی را فراهم می کند و سپس خروجی آن را به یک فلیپ فلاپ که قابل تبدیل به انواع فلیپ فلاپ های SR ، D ، JK و T می باشد ، متصل می نماید. شکل زیر مدار داخلی یک ماکروسل را نشان می دهد که از یک سری AND و OR همانند PAL و یک فلیپ فلاپ و یک سری مدارهای فیدبک و یک خروجی تشکیل شده است.

در CPLD ها از حافظه های موقت SRAM به منظور سوئیچ های ماتریسی استفاده می شود و دیتای مربوط به قطع/وصل بودن این سوئیچ های ماتریسی در حافظه های دائمی نظیر EEPROM یا FLASH ذخیره می گردد. هر بار که تغذیه آی سی وصل می شود اطلاعات سوئیچ های ماتریسی که در حافظه دائمی ذخیره شده است روی حافظه موقت SRAM بارگزاری می گردد. شکل زیر سوئیچ های ماتریسی قابل برنامه ریزی SRAM را درون یک CPLD نمونه نشان می دهد.

همانطور که در شکل فوق مشاهده می کنید، حافظه SRAM در CPLD ها دو کاربرد اصلی دارد : یکی برای انتخاب اینکه کدام سیگنال از بخش pia انتخاب شود و به درون بلوک های منطقی وارد شود و دیگری برای اتصال گره های مسیریابی سیگنال در داخل بخش pia می باشد. این موضوع ، مسیریابی و محل قرار گرفتن بلوک های منطقی که به اصطلاع Place & Route نامیده می شود را کاری سخت و دشوار می کند و باعث می شود که برای پیاده سازی از ابزارهای نرم افزاری پیچیده تری استفاده گردد.

 


معماری ساخت FPGA ها

تقریبا در اوایل دهه 1980 مشهود بود که در زنجیره آی سی های دیجیتال یک شکاف ایجاد شده است. از یک سو قطعات برنامه پذیر SPLD ها و CPLD ها بودند که قابلیت پیکربندی بالا و زمان های طراحی و اصلاح سریعی داشتند اما توابع پیچیده یا بزرگ را پشتیبانی نمی کردند. در سمت دیگر این ASIC ها بودند که می توانستند توابع بزرگ و پیچیده را پشتیبانی کنند اما بسیار گران قیمت بوده و پروسه طراحی زمان بری داشتند. علاوه بر این وقتی طرحی به صورت ASIC پیاده شود دیگر قابل تغییر نمی باشد.

به منظور پر کردن این شکاف شرکت Xilinx ( زایلینکس ) یک کلاس جدیدی از آی سی های قابل برنامه ریزی به نام آرایه های منطقی برنامه پذیر یا FPGA توسعه داد که در سال 1984 روانه بازار شد. FPGA ها قطعات سیلیکونی پیش ساخته شده هستند که میتوانند به صورت الکتریکی و با استفاده از ابزارهای کامپیوتری در محل برنامه ریزی شوند و به شکل هر نوعی از مدارها یا سیستم های دیجیتال تبدیل شوند. FPGA ها با دو تکنولوژی سوئیچ ماتریسی عرضه می شوند : یکی دسته قابل برنامه ریزی مجدد ( Re-Programmable )با تکنولوژی SRAM ( مشابه CPLD ها ) و دیگری دسته یکبار قابل برنامه ریزی OTP با تکنولوژی Anty Fuse ( مشابه SPLD ها ). نوع اول به علت قبل برنامه ریزی مجدد بودن اکثرا مورد استفاده است و این آموزش نیز بر اساس آن است.

FPGA های Re-Programmable از نظر معماری ساخت متشکل از 3 بخش اصلی زیر می باشند :

  1. بلاک های منطقی ( Logic Blocks ) : که خود به سه دسته کوچکتر بلاک های منطقی عمومی ( General Logic Blocks ) ، بلاک های حافظه ( Memory Blocks ) و بلاک های ضرب کننده ( Multiplier Blocks ) تقسیم بندی می شوند.
  2. سوئیچ های مسیریابی برنامه ( Program Routing Switches ) : که شامل کانال های مسیریابی عمودی و افقی قابل برنامه ریزی می باشند که بلاک ها و ورودی/خروجی های مختلف را به یکدیگر متصل می نمایند.
  3. بلاک های ورودی/خروجی ( I/O Blocks ) : که آی سی را به محیط خارجی متصل می کند.

شکل زیر بلوک دیاگرام داخلی یک FPGA نمونه را نشان می دهد.

 

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

در FPGA ها برای پیاده سازی جدول درستی یک تابع از روش متفاوتی استفاده می گردد. این روش جدول جستجو یا Look Up Tables ( به اختصار LUT ) نام دارد. هر LUT دارای n ورودی و یک خروجی است. درون هر LUT از یک مالتی پلکسر n حالته و یک حافظه n بیتی استفاده می گردد. برای تشکیل یک LUT کافی است منطق های مختلف خروجی را که میخواهیم پیاده سازی کنیم نظیر به نظیر توسط حافظه به ورودی های مالتی پلکسر بدهیم و بیت های انتخاب ( Select ) مالتی پلکسر را به ورودی های LUT متصل نماییم. شکل زیر نحوه طراحی یک LUT سه حالته نمونه را نشان می دهد.

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

هر LUT در ساده ترین حالت به همراه یک فلیپ فلاپ و یک مالتی پلکسر دو حالته به صورت شکل زیر ، تشکیل یک بلاک منطقی قابل تنظیم یا CLB ( مخفف Configurable Logic Block ) را می دهد.

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

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

 


مقایسه ویژگی های بین CPLD و FPGA

  • هر دو CPLD ها و FPGA ها جزو قطعات منطقی قابل برنامه ریزی با ظرفیت بالا یا HCPLD ( مخفف High-Capacity Programmable Logic Devices ) قرار می گیرند.
  • CPLD ها دارای حافظه فرار ( Volatile ) و غیرفرار ( non-Volatile ) درون خود هستند اما FPGA ها تنها حافظه فرار دارند.
  • سرعت CPLD ها به علت معماری ساخت آن بیشتر از FPGA ها است به طوری که ساده ترین و قدیمی ترین CPLD ها سرعت بالاتری نسبت به جدیدترین FPGA ها دارند.
  • FPGA ها از انعطاف پذیری بیشتری برخوردار هستند و کارایی آن ها به مراتب بیشتر از CPLD ها می باشد.
  • معماری CPLD ها بر اساس PLA می باشد اما معماری FPGA ها بر اساس LUT ها می باشد.
  • تعداد ورودی/خروجی ها در CPLD به مراتب کمتر از تعداد ورودی/خروجی ها در FPGA است.
  • بورد ها و آی سی های FPGA هزینه های سنگینی دارند در حالی که CPLD ها کم هزینه هستند.
  • تنها FPGA ها از زبان های برنامه نویسی توصیف سخت افزار ( HDL ) پشتیبانی می کنند و برای CPLD ها از رسم شماتیک استفاده می شود.
  • تعداد گیت های معادل تشکیل دهنده یک FPGA ( از هزار تا میلیون گیت ) بسیار بیشتر از تعداد گیت های معادل تشکیل دهنده یک CPLD ( حداکثر 12 هزار گیت ) می باشد.

 


مقایسه FPGA و میکروکنترلرهایی نظیر AVR و ARM

یکی از مفاهیم اساسی درک تفاوت های میکروکنترلر و FPGA ها است. ممکن است این سوال برای شما پیش بیاید که وقتی میکروکنترلر هایی مانند AVR و ARM با قیمت ارزان تر در دسترس ما هستند به چه دلیلی باید سراغ FPGA برویم ؟

در پاسخ باید گفت هرگز سعی نکنید در پروژه های غیر تحقیقاتی ، میکروکنترلر را با FPGA مقایسه کنید یا این دو را به جای یکدیگر استفاده کنید ، دلیل این ادعا نیز کاملا مشخص است. میکروکنترلرها دارای واحدهای از پیش ساخته شده نظیر CPU ، جافظه و … هستند که برای کاربرد عمومی ساخته شده است و هر طراح می تواند برنامه دلخواه خود را درون آنها برنامه ریزی کند. این برنامه درون حافظه دائمی میکروکنترلر ذخیره شده و سپس توسط CPU خط به خط اجرا می شود. منابع و دستور العمل های اجرایی یک میکروکنترلر ، همواره ثابت است که می تواند برنامه های مختلف نوشته شده به انواع زبان های برنامه نویسی را روی خود جای دهد.

اما در مورد FPGA ها چنین نیست. در یک FPGA هیچ CPU پیشفرضی وجود ندارد که شما عملیات های مورد نیازتان را با برنامه نویسی انجام دهید ، بلکه شما باید بلوک های مختلف مورد نیاز خود را با استفاده از منابع سخت افزاری تعبیه شده ، در داخل FPGA پیاده سازی کنید و در نهایت از آنها برای رسیدن به نتیجه دلخواهتان استفاده کنید. به عنوان مثال برای اینکه بتوانید در FPGA چند عدد را جمع کنید باید یک بلوک جمع کننده طراحی کنید. این بلوک جمع کننده بخشی از منابع داخلی FPGA را مصرف می کند. بنابراین از منابع باقی مانده میتوان استفاده های موازی دیگری انجام داد یا برای مثال 100 بلوک جمع کننده ساخت که به طور همزمان 200 عدد مختلف را با هم جمع کند !

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

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

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

برخی از FPGA های پیشرفته امروزی علاوه بر گیت های منطقی دارای منابع داخلی دیگری مانند RAM , مبدل آنالوگ به دیجیتال ADC و مبدل دیجیتال به آنالوگ DAC نیز هستند که به کاربر کمک می کند تا در پروژه هایی که به این امکانات نیاز دارد ، از این منابع داخلی استفاده نماید و یک سیستم کامل را در داخل تراشه پیاده سازی نماید که به افزایش کارایی ، سرعت و دقت FPGA ها کمک می کند.

 


شرکت های سازنده FPGA و CPLD

1- شرکت Xilinx : شرکت زایلینکس که با آی سی های بسیار زیاد و نرم افزار قوی خود بدون شک پیشتاز رقابت در این حوزه می باشد با FPGA های سری Spartan ، Virtex ، Kintex ، Artix و Zinq و CPLD های سری XC9500 و CoolRunner

 

2- شرکت Altera : شرکت آلترا که متعلق به Intel می باشد با سه سری FPGA به نام های Stratix ، Cyclone و Arria و یک سری CPLD به نام Max

3- شرکت Actel : شرکت اکتل که توسط شرکت MicroSemi خریداری شده است، ارائه دهنده FPGA و SoC های قابل برنامه ریزی و نیز FPGA های با تکنولوژی ضدفیوز می باشد.

4- شرکت Atmel : شرکت اتمل که توسط شرکت Microchip خریداری شده است، تمرکز زیادی روی FPGA و CPLD نکرده است اما یک سری FPGA و چند سری CPLD و SPLD را عرضه می کند.

5- شرکت Lattice : شرکت لتیس که توسط Silicon image خریداری شده است،  با عرضه FPGA ها و CPLD های مختلفی در عرضه رقابت با شرکت های بزرگ قرار دارد.

6- شرکت Achronix : شرکت اکرونیکس هم شرکت نوپایی در این حوزه می باشد که با معرفی سری جدید eFPGA شناخته شده است.

 


برای رفتن به بخش بعدی روی تصویر زیر کلیک کنید


در صورتی که این مطلب مورد پسندتان واقع شد لایک و اشتراک گذاری فراموش نشود

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

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

بازگشت به آموزشگاه